From bdd972f0e99acc259254d33e665d09e0ae2001db Mon Sep 17 00:00:00 2001 From: Adnan Choudhury Date: Wed, 22 Feb 2017 11:40:01 -0500 Subject: [PATCH] [FAB-2388] Fix intermittent CouchDB failures https://jira.hyperledger.org/browse/FAB-2388 Instead of creating/deleting same database multiple times, the unit-tests now use different databases for each test. This should avoid hitting the database deletion async issue in Couch 2.x. Activating statecouchdb unit-tests. Change-Id: Iba6eff9e259098971cf9063f467350a478ff2dab Signed-off-by: Adnan Choudhury --- .../txmgmt/statedb/commontests/test_common.go | 12 ++--- .../statedb/statecouchdb/statecouchdb_test.go | 33 ++++++------- .../statecouchdb/statecouchdb_test_export.go | 4 +- core/ledger/util/couchdb/couchdb_test.go | 46 ++++++++++--------- core/ledger/util/couchdb/couchdbutil_test.go | 5 +- 5 files changed, 53 insertions(+), 47 deletions(-) diff --git a/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go b/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go index 7f779c27630..2049702b96d 100644 --- a/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go +++ b/core/ledger/kvledger/txmgmt/statedb/commontests/test_common.go @@ -27,7 +27,7 @@ import ( // TestBasicRW tests basic read-write func TestBasicRW(t *testing.T, dbProvider statedb.VersionedDBProvider) { - db, err := dbProvider.GetDBHandle("TestDB") + db, err := dbProvider.GetDBHandle("testbasicrw") testutil.AssertNoError(t, err, "") // Test retrieval of non-existent key - returns nil rather than error @@ -61,10 +61,10 @@ func TestBasicRW(t *testing.T, dbProvider statedb.VersionedDBProvider) { // TestMultiDBBasicRW tests basic read-write on multiple dbs func TestMultiDBBasicRW(t *testing.T, dbProvider statedb.VersionedDBProvider) { - db1, err := dbProvider.GetDBHandle("TestDB1") + db1, err := dbProvider.GetDBHandle("testmultidbbasicrw") testutil.AssertNoError(t, err, "") - db2, err := dbProvider.GetDBHandle("TestDB2") + db2, err := dbProvider.GetDBHandle("testmultidbbasicrw2") testutil.AssertNoError(t, err, "") batch1 := statedb.NewUpdateBatch() @@ -100,7 +100,7 @@ func TestMultiDBBasicRW(t *testing.T, dbProvider statedb.VersionedDBProvider) { // TestDeletes tests deteles func TestDeletes(t *testing.T, dbProvider statedb.VersionedDBProvider) { - db, err := dbProvider.GetDBHandle("TestDB") + db, err := dbProvider.GetDBHandle("testdeletes") testutil.AssertNoError(t, err, "") batch := statedb.NewUpdateBatch() @@ -135,7 +135,7 @@ func TestDeletes(t *testing.T, dbProvider statedb.VersionedDBProvider) { // TestIterator tests the iterator func TestIterator(t *testing.T, dbProvider statedb.VersionedDBProvider) { - db, err := dbProvider.GetDBHandle("TestDB") + db, err := dbProvider.GetDBHandle("testiterator") testutil.AssertNoError(t, err, "") db.Open() defer db.Close() @@ -178,7 +178,7 @@ func testItr(t *testing.T, itr statedb.ResultsIterator, expectedKeys []string) { // TestQuery tests queries func TestQuery(t *testing.T, dbProvider statedb.VersionedDBProvider) { - db, err := dbProvider.GetDBHandle("TestDB") + db, err := dbProvider.GetDBHandle("testquery") testutil.AssertNoError(t, err, "") db.Open() defer db.Close() diff --git a/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test.go b/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test.go index c8d9dc5c65e..4b023232d64 100644 --- a/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test.go +++ b/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test.go @@ -33,19 +33,20 @@ func TestMain(m *testing.M) { //call a helper method to load the core.yaml, will be used to detect if CouchDB is enabled ledgertestutil.SetupCoreYAMLConfig("./../../../../../../peer") - - viper.Set("ledger.state.couchDBConfig.couchDBAddress", "127.0.0.1:5984") + viper.Set("ledger.state.stateDatabase", "CouchDB") + viper.Set("ledger.state.couchDBConfig.couchDBAddress", "couchdb:5984") viper.Set("peer.fileSystemPath", "/tmp/fabric/ledgertests/kvledger/txmgmt/statedb/statecouchdb") - - os.Exit(m.Run()) + result := m.Run() + viper.Set("ledger.state.stateDatabase", "goleveldb") + os.Exit(result) } func TestBasicRW(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { env := NewTestVDBEnv(t) - env.Cleanup("TestDB") - defer env.Cleanup("TestDB") + env.Cleanup("testbasicrw") + defer env.Cleanup("testbasicrw") commontests.TestBasicRW(t, env.DBProvider) } @@ -55,10 +56,10 @@ func TestMultiDBBasicRW(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { env := NewTestVDBEnv(t) - env.Cleanup("TestDB1") - env.Cleanup("TestDB2") - defer env.Cleanup("TestDB1") - defer env.Cleanup("TestDB2") + env.Cleanup("testmultidbbasicrw") + env.Cleanup("testmultidbbasicrw2") + defer env.Cleanup("testmultidbbasicrw") + defer env.Cleanup("testmultidbbasicrw2") commontests.TestMultiDBBasicRW(t, env.DBProvider) } @@ -67,8 +68,8 @@ func TestMultiDBBasicRW(t *testing.T) { func TestDeletes(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { env := NewTestVDBEnv(t) - env.Cleanup("TestDB") - defer env.Cleanup("TestDB") + env.Cleanup("testdeletes") + defer env.Cleanup("testdeletes") commontests.TestDeletes(t, env.DBProvider) } } @@ -77,8 +78,8 @@ func TestIterator(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { env := NewTestVDBEnv(t) - env.Cleanup("TestDB") - defer env.Cleanup("TestDB") + env.Cleanup("testiterator") + defer env.Cleanup("testiterator") commontests.TestIterator(t, env.DBProvider) } @@ -119,8 +120,8 @@ func TestQuery(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { env := NewTestVDBEnv(t) - env.Cleanup("TestDB") - defer env.Cleanup("TestDB") + env.Cleanup("testquery") + defer env.Cleanup("testquery") commontests.TestQuery(t, env.DBProvider) } diff --git a/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test_export.go b/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test_export.go index b59f3f9c3f3..dec3cc33103 100644 --- a/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test_export.go +++ b/core/ledger/kvledger/txmgmt/statedb/statecouchdb/statecouchdb_test_export.go @@ -25,8 +25,8 @@ import ( ) //Basic setup to test couch -var connectURL = "localhost:5984" -var badConnectURL = "localhost:5990" +var connectURL = "couchdb:5984" +var badConnectURL = "couchdb:5990" var username = "" var password = "" diff --git a/core/ledger/util/couchdb/couchdb_test.go b/core/ledger/util/couchdb/couchdb_test.go index 4cc5d73758c..5507da42e04 100644 --- a/core/ledger/util/couchdb/couchdb_test.go +++ b/core/ledger/util/couchdb/couchdb_test.go @@ -32,18 +32,17 @@ import ( //Basic setup to test couch var connectURL = "couchdb:5984" var badConnectURL = "couchdb:5990" -var database = "couch_util_testdb" var username = "" var password = "" -func cleanup() error { +func cleanup(database string) error { //create a new connection - couchInstance, _ := CreateCouchInstance(connectURL, username, password) - db, err := CreateCouchDatabase(*couchInstance, database) + couchInstance, err := CreateCouchInstance(connectURL, username, password) if err != nil { fmt.Println("Unexpected error", err) return err } + db := CouchDatabase{couchInstance: *couchInstance, dbName: database} //drop the test database db.DropDatabase() return nil @@ -62,8 +61,7 @@ var assetJSON = []byte(`{"asset_name":"marble1","color":"blue","size":"35","owne func TestMain(m *testing.M) { ledgertestutil.SetupCoreYAMLConfig("./../../../../peer") - //TODO CouchDB tests are disabled. Re-enable once intermittent failures are resolved. - //viper.Set("ledger.state.stateDatabase", "CouchDB") + viper.Set("ledger.state.stateDatabase", "CouchDB") result := m.Run() viper.Set("ledger.state.stateDatabase", "goleveldb") os.Exit(result) @@ -92,9 +90,10 @@ func TestDBCreateSaveWithoutRevision(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { - err := cleanup() + database := "testdbcreatesavewithoutrevision" + err := cleanup(database) testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to cleanup Error: %s", err)) - defer cleanup() + defer cleanup(database) if err == nil { //create a new instance and database object @@ -162,9 +161,10 @@ func TestDBCreateDatabaseAndPersist(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { - err := cleanup() + database := "testdbcreatedatabaseandpersist" + err := cleanup(database) testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to cleanup Error: %s", err)) - defer cleanup() + defer cleanup(database) if err == nil { //create a new instance and database object @@ -250,9 +250,10 @@ func TestDBBadJSON(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { - err := cleanup() + database := "testdbbadjson" + err := cleanup(database) testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to cleanup Error: %s", err)) - defer cleanup() + defer cleanup(database) if err == nil { @@ -286,9 +287,10 @@ func TestPrefixScan(t *testing.T) { if !ledgerconfig.IsCouchDBEnabled() { return } - err := cleanup() + database := "testprefixscan" + err := cleanup(database) testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to cleanup Error: %s", err)) - defer cleanup() + defer cleanup(database) if err == nil { //create a new instance and database object @@ -339,7 +341,6 @@ func TestPrefixScan(t *testing.T) { //Retrieve the info for the new database and make sure the name matches _, _, errdbinfo := db.GetDatabaseInfo() testutil.AssertError(t, errdbinfo, fmt.Sprintf("Error should have been thrown for missing database")) - } } @@ -347,9 +348,10 @@ func TestDBSaveAttachment(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { - err := cleanup() + database := "testdbsaveattachment" + err := cleanup(database) testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to cleanup Error: %s", err)) - defer cleanup() + defer cleanup(database) if err == nil { @@ -390,9 +392,10 @@ func TestDBDeleteDocument(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { - err := cleanup() + database := "testdbdeletedocument" + err := cleanup(database) testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to cleanup Error: %s", err)) - defer cleanup() + defer cleanup(database) if err == nil { //create a new instance and database object @@ -427,9 +430,10 @@ func TestDBDeleteNonExistingDocument(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { - err := cleanup() + database := "testdbdeletenonexistingdocument" + err := cleanup(database) testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to cleanup Error: %s", err)) - defer cleanup() + defer cleanup(database) if err == nil { //create a new instance and database object diff --git a/core/ledger/util/couchdb/couchdbutil_test.go b/core/ledger/util/couchdb/couchdbutil_test.go index 3670ad9e780..ee532dbe9df 100644 --- a/core/ledger/util/couchdb/couchdbutil_test.go +++ b/core/ledger/util/couchdb/couchdbutil_test.go @@ -28,8 +28,9 @@ import ( func TestCreateCouchDBConnectionAndDB(t *testing.T) { if ledgerconfig.IsCouchDBEnabled() == true { - cleanup() - defer cleanup() + database := "testcreatecouchdbconnectionanddb" + cleanup(database) + defer cleanup(database) //create a new connection couchInstance, err := CreateCouchInstance(connectURL, "", "") testutil.AssertNoError(t, err, fmt.Sprintf("Error when trying to CreateCouchInstance"))