From ba6ef88d10eec5a1f7d57d12d96ac9f5fe14184d Mon Sep 17 00:00:00 2001 From: Bernie Hackett Date: Tue, 15 Nov 2016 15:25:04 -0800 Subject: [PATCH] PYTHON-1026 - Single member replica set testing --- test/__init__.py | 13 +++++++++++++ test/test_collection.py | 4 ++-- test/test_gridfs.py | 5 +++++ test/test_gridfs_bucket.py | 5 +++++ test/test_monitoring.py | 1 + test/test_read_preferences.py | 7 +++++++ test/test_replica_set_client.py | 4 ++++ 7 files changed, 37 insertions(+), 2 deletions(-) diff --git a/test/__init__.py b/test/__init__.py index 2c7b563b5..be0eea8de 100644 --- a/test/__init__.py +++ b/test/__init__.py @@ -257,6 +257,10 @@ class ClientContext(object): def pair(self): return "%s:%d" % (self.host, self.port) + @property + def has_secondaries(self): + return bool(len(self.client.secondaries)) + def _check_user_provided(self): try: self.client.admin.authenticate(db_user, db_pwd) @@ -367,6 +371,15 @@ class ClientContext(object): "Not connected to a replica set", func=func) + def require_secondaries_count(self, count): + """Run a test only if the client is connected to a replica set that has + `count` secondaries. + """ + sec_count = len(self.client.secondaries) + return self._require(sec_count >= count, + "Need %d secondaries, %d available" + % (count, sec_count)) + def require_no_replica_set(self, func): """Run a test if the client is *not* connected to a replica set.""" return self._require( diff --git a/test/test_collection.py b/test/test_collection.py index 254477ac6..c8076b622 100644 --- a/test/test_collection.py +++ b/test/test_collection.py @@ -1524,7 +1524,7 @@ class TestCollection(IntegrationTest): @client_context.require_version_min(2, 5, 1) def test_aggregation_cursor(self): db = self.db - if client_context.replica_set_name: + if client_context.has_secondaries: # Test that getMore messages are sent to the right server. db = self.client.get_database( db.name, @@ -1580,7 +1580,7 @@ class TestCollection(IntegrationTest): def test_parallel_scan(self): db = self.db db.drop_collection("test") - if client_context.replica_set_name: + if client_context.has_secondaries: # Test that getMore messages are sent to the right server. db = self.client.get_database( db.name, diff --git a/test/test_gridfs.py b/test/test_gridfs.py index 8d8fc4e2f..a71c3a3a2 100644 --- a/test/test_gridfs.py +++ b/test/test_gridfs.py @@ -459,6 +459,11 @@ class TestGridfs(IntegrationTest): class TestGridfsReplicaSet(TestReplicaSetClientBase): + @classmethod + @client_context.require_secondaries_count(1) + def setUpClass(cls): + super(TestGridfsReplicaSet, cls).setUpClass() + def test_gridfs_replica_set(self): rsc = rs_client( w=self.w, diff --git a/test/test_gridfs_bucket.py b/test/test_gridfs_bucket.py index a22d61ad2..edf255c93 100644 --- a/test/test_gridfs_bucket.py +++ b/test/test_gridfs_bucket.py @@ -444,6 +444,11 @@ class TestGridfs(IntegrationTest): class TestGridfsBucketReplicaSet(TestReplicaSetClientBase): + @classmethod + @client_context.require_secondaries_count(1) + def setUpClass(cls): + super(TestGridfsBucketReplicaSet, cls).setUpClass() + def test_gridfs_replica_set(self): rsc = rs_client( w=self.w, diff --git a/test/test_monitoring.py b/test/test_monitoring.py index 2568d2373..bdd13bf2c 100644 --- a/test/test_monitoring.py +++ b/test/test_monitoring.py @@ -386,6 +386,7 @@ class TestCommandMonitoring(unittest.TestCase): self.assertEqual(0, failed.failure.get("ok")) @client_context.require_replica_set + @client_context.require_secondaries_count(1) def test_not_master_error(self): address = next(iter(client_context.client.secondaries)) client = single_client(*address, event_listeners=[self.listener]) diff --git a/test/test_read_preferences.py b/test/test_read_preferences.py index 9f6759c8b..91f79ca47 100644 --- a/test/test_read_preferences.py +++ b/test/test_read_preferences.py @@ -77,6 +77,11 @@ class TestReadPreferenceObjects(unittest.TestCase): class TestReadPreferencesBase(TestReplicaSetClientBase): + @classmethod + @client_context.require_secondaries_count(1) + def setUpClass(cls): + super(TestReadPreferencesBase, cls).setUpClass() + def setUp(self): super(TestReadPreferencesBase, self).setUp() # Insert some data so we can use cursors in read_from_which_host @@ -158,6 +163,7 @@ class TestSingleSlaveOk(TestReadPreferencesBase): class TestReadPreferences(TestReadPreferencesBase): + def test_mode_validation(self): for mode in (ReadPreference.PRIMARY, ReadPreference.PRIMARY_PREFERRED, @@ -322,6 +328,7 @@ _PREF_MAP = [ class TestCommandAndReadPreference(TestReplicaSetClientBase): @classmethod + @client_context.require_secondaries_count(1) def setUpClass(cls): super(TestCommandAndReadPreference, cls).setUpClass() cls.c = ReadPrefTester( diff --git a/test/test_replica_set_client.py b/test/test_replica_set_client.py index b5e600f1f..1fcbf108d 100644 --- a/test/test_replica_set_client.py +++ b/test/test_replica_set_client.py @@ -160,6 +160,7 @@ class TestReplicaSetClient(TestReplicaSetClientBase): self.assertEqual(c.max_bson_size, 16777216) c.close() + @client_context.require_secondaries_count(1) def test_auto_reconnect_exception_when_read_preference_is_secondary(self): c = MongoClient( client_context.pair, @@ -180,6 +181,7 @@ class TestReplicaSetClient(TestReplicaSetClientBase): finally: socket.socket.sendall = old_sendall + @client_context.require_secondaries_count(1) def test_timeout_does_not_mark_member_down(self): # If a query times out, the client shouldn't mark the member "down". @@ -285,9 +287,11 @@ class TestReplicaSetClient(TestReplicaSetClientBase): def test_kill_cursor_explicit_primary(self): self._test_kill_cursor_explicit(ReadPreference.PRIMARY) + @client_context.require_secondaries_count(1) def test_kill_cursor_explicit_secondary(self): self._test_kill_cursor_explicit(ReadPreference.SECONDARY) + @client_context.require_secondaries_count(1) def test_not_master_error(self): secondary_address = one(self.secondaries) direct_client = single_client(*secondary_address)