Skip to content

Commit

Permalink
[FAB-6773] Improve configtxgen UT coverage
Browse files Browse the repository at this point in the history
This CR improves the unit test coverage for the configtxgen tool.

Change-Id: Ic837838e98bf95847d3dd03a28e312b42d032cda
Signed-off-by: Will Lahti <[email protected]>
  • Loading branch information
wlahti committed Nov 15, 2017
1 parent decb95f commit a4112fc
Show file tree
Hide file tree
Showing 4 changed files with 150 additions and 10 deletions.
96 changes: 96 additions & 0 deletions common/tools/configtxgen/encoder/encoder_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,9 +45,11 @@ func TestConfigParsing(t *testing.T) {
for _, profile := range []string{
genesisconfig.SampleInsecureSoloProfile,
genesisconfig.SampleSingleMSPSoloProfile,
genesisconfig.SampleSingleMSPSoloV11Profile,
genesisconfig.SampleDevModeSoloProfile,
genesisconfig.SampleInsecureKafkaProfile,
genesisconfig.SampleSingleMSPKafkaProfile,
genesisconfig.SampleSingleMSPKafkaV11Profile,
genesisconfig.SampleDevModeKafkaProfile,
} {
t.Run(profile, func(t *testing.T) {
Expand Down Expand Up @@ -164,3 +166,97 @@ func TestMakeChannelCreationTransactionNoSigner(t *testing.T) {
assert.NoError(t, err, "Unmarshaling SignatureHeader")
assert.Empty(t, sigHeader.Creator, "No creator specified")
}

func TestNewApplicationGroup(t *testing.T) {
t.Run("Application with capabilities", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelV11Profile)
group, err := NewApplicationGroup(config.Application)
assert.NoError(t, err)
assert.NotNil(t, group)
})

t.Run("Application unknown MSP", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelV11Profile)
config.Application.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
group, err := NewApplicationGroup(config.Application)
assert.Error(t, err)
assert.Nil(t, group)
})
}

func TestNewChannelGroup(t *testing.T) {
t.Run("Nil orderer", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
config.Orderer = nil
group, err := NewChannelGroup(config)
assert.Error(t, err)
assert.Nil(t, group)
})

t.Run("Add test consortium", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
config.Consortium = "Test"
group, err := NewChannelGroup(config)
assert.NoError(t, err)
assert.NotNil(t, group)
})

t.Run("Add application unknown MSP", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
config.Application = &genesisconfig.Application{Organizations: []*genesisconfig.Organization{&genesisconfig.Organization{Name: "FakeOrg"}}}
group, err := NewChannelGroup(config)
assert.Error(t, err)
assert.Nil(t, group)
})

t.Run("Add consortiums unknown MSP", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
config.Consortiums["fakeorg"] = &genesisconfig.Consortium{Organizations: []*genesisconfig.Organization{&genesisconfig.Organization{Name: "FakeOrg"}}}
group, err := NewChannelGroup(config)
assert.Error(t, err)
assert.Nil(t, group)
})

t.Run("Add orderer unknown MSP", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
config.Orderer = &genesisconfig.Orderer{Organizations: []*genesisconfig.Organization{&genesisconfig.Organization{Name: "FakeOrg"}}}
group, err := NewChannelGroup(config)
assert.Error(t, err)
assert.Nil(t, group)
})
}

func TestNewOrdererGroup(t *testing.T) {
t.Run("Unknown orderer type", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
config.Orderer.OrdererType = "TestOrderer"
group, err := NewOrdererGroup(config.Orderer)
assert.Error(t, err)
assert.Nil(t, group)
})

t.Run("Unknown MSP org", func(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
config.Orderer.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
group, err := NewOrdererGroup(config.Orderer)
assert.Error(t, err)
assert.Nil(t, group)
})
}

func TestBootstrapper(t *testing.T) {
config := genesisconfig.Load(genesisconfig.SampleDevModeSoloProfile)
t.Run("New bootstrapper", func(t *testing.T) {
bootstrapper := New(config)
assert.NotNil(t, bootstrapper.GenesisBlock(), "genesis block should not be nil")
assert.NotNil(t, bootstrapper.GenesisBlockForChannel("channelID"), "genesis block for channel should not be nil")
})

t.Run("New bootstrapper nil orderer", func(t *testing.T) {
config.Orderer = nil
newBootstrapperNilOrderer := func() {
New(config)
}
assert.Panics(t, newBootstrapperNilOrderer)
})
}
3 changes: 0 additions & 3 deletions common/tools/configtxgen/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,6 @@ var logger = flogging.MustGetLogger("common/tools/configtxgen")
func doOutputBlock(config *genesisconfig.Profile, channelID string, outputBlock string) error {
pgen := encoder.New(config)
logger.Info("Generating genesis block")
if config.Orderer == nil {
return fmt.Errorf("config does not contain an Orderers section, necessary for all config blocks, aborting")
}
if config.Consortiums == nil {
logger.Warning("Genesis block does not contain a consortiums group definition. This block cannot be used for orderer bootstrap.")
}
Expand Down
41 changes: 41 additions & 0 deletions common/tools/configtxgen/main_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,16 @@ func TestMissingOrdererSection(t *testing.T) {
assert.Panics(t, func() { doOutputBlock(config, "foo", blockDest) }, "Missing orderer section")
}

func TestMissingConsortiumSection(t *testing.T) {
blockDest := tmpDir + string(os.PathSeparator) + "block"

factory.InitFactories(nil)
config := genesisconfig.Load(genesisconfig.SampleInsecureSoloProfile)
config.Consortiums = nil

assert.NoError(t, doOutputBlock(config, "foo", blockDest), "Missing consortiums section")
}

func TestMissingConsortiumValue(t *testing.T) {
configTxDest := tmpDir + string(os.PathSeparator) + "configtx"

Expand All @@ -76,6 +86,15 @@ func TestMissingConsortiumValue(t *testing.T) {
assert.Error(t, doOutputChannelCreateTx(config, "foo", configTxDest), "Missing Consortium value in Application Profile definition")
}

func TestMissingApplicationValue(t *testing.T) {
configTxDest := tmpDir + string(os.PathSeparator) + "configtx"

factory.InitFactories(nil)
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile)
config.Application = nil

assert.Error(t, doOutputChannelCreateTx(config, "foo", configTxDest), "Missing Application value in Application Profile definition")
}
func TestInspectMissingConfigTx(t *testing.T) {
assert.Error(t, doInspectChannelCreateTx("ChannelCreateTxFileWhichDoesn'tReallyExist"), "Missing channel create tx file")
}
Expand All @@ -99,6 +118,23 @@ func TestGenerateAnchorPeersUpdate(t *testing.T) {
assert.NoError(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Good anchorPeerUpdate request")
}

func TestBadAnchorPeersUpdates(t *testing.T) {
configTxDest := tmpDir + string(os.PathSeparator) + "anchorPeerUpdate"

factory.InitFactories(nil)
config := genesisconfig.Load(genesisconfig.SampleSingleMSPChannelProfile)

assert.Error(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, ""), "Bad anchorPeerUpdate request - asOrg empty")

backupApplication := config.Application
config.Application = nil
assert.Error(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Bad anchorPeerUpdate request")
config.Application = backupApplication

config.Application.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
assert.Error(t, doOutputAnchorPeersUpdate(config, "foo", configTxDest, genesisconfig.SampleOrgName), "Bad anchorPeerUpdate request - fake org")
}

func TestConfigTxFlags(t *testing.T) {
configTxDest := tmpDir + string(os.PathSeparator) + "configtx"
configTxDestAnchorPeers := tmpDir + string(os.PathSeparator) + "configtxAnchorPeers"
Expand Down Expand Up @@ -151,4 +187,9 @@ func TestPrintOrg(t *testing.T) {
err := doPrintOrg(config, genesisconfig.SampleOrgName+".wrong")
assert.Error(t, err, "Bad org name")
assert.Regexp(t, "organization [^ ]* not found", err.Error())

config.Organizations[0] = &genesisconfig.Organization{Name: "FakeOrg", ID: "FakeOrg"}
err = doPrintOrg(config, "FakeOrg")
assert.Error(t, err, "Fake org")
assert.Regexp(t, "bad org definition", err.Error())
}
20 changes: 13 additions & 7 deletions common/tools/configtxgen/metadata/metadata_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,17 @@ import (
)

func TestGetVersionInfo(t *testing.T) {
testVersion := "TestVersion"
metadata.Version = testVersion

expected := fmt.Sprintf("%s:\n Version: %s\n Go version: %s\n OS/Arch: %s",
metadata.ProgramName, testVersion, runtime.Version(),
fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH))
assert.Equal(t, expected, metadata.GetVersionInfo())
testVersions := []string{"", "TestVersion"}

for _, version := range testVersions {
metadata.Version = version
if version == "" {
version = "development build"
}

expected := fmt.Sprintf("%s:\n Version: %s\n Go version: %s\n OS/Arch: %s",
metadata.ProgramName, version, runtime.Version(),
fmt.Sprintf("%s/%s", runtime.GOOS, runtime.GOARCH))
assert.Equal(t, expected, metadata.GetVersionInfo())
}
}

0 comments on commit a4112fc

Please sign in to comment.