Skip to content

Commit 7420245

Browse files
committed
PYTHON-2278 Fix Jython SDAM test failures
1 parent 70fb1cc commit 7420245

File tree

5 files changed

+51
-12
lines changed

5 files changed

+51
-12
lines changed

.evergreen/run-tests.sh

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,7 @@ else
169169
fi
170170

171171
# Don't download unittest-xml-reporting from pypi, which often fails.
172-
HAVE_XMLRUNNER=$($PYTHON -c "import pkgutil, sys; sys.stdout.write('1' if pkgutil.find_loader('xmlrunner') else '0')")
173-
if [ $HAVE_XMLRUNNER = "1" ]; then
172+
if $PYTHON -c "import xmlrunner"; then
174173
# The xunit output dir must be a Python style absolute path.
175174
XUNIT_DIR="$(pwd)/xunit-results"
176175
if [ "Windows_NT" = "$OS" ]; then # Magic variable in cygwin

test/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727
try:
2828
from xmlrunner import XMLTestRunner
2929
HAVE_XML = True
30-
except ImportError:
30+
# ValueError is raised when version 3+ is installed on Jython 2.7.
31+
except (ImportError, ValueError):
3132
HAVE_XML = False
3233

3334
try:

test/test_client.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
from pymongo.server_selectors import (any_server_selector,
6161
writable_server_selector)
6262
from pymongo.server_type import SERVER_TYPE
63+
from pymongo.settings import TOPOLOGY_TYPE
6364
from pymongo.srv_resolver import _HAVE_DNSPYTHON
6465
from pymongo.write_concern import WriteConcern
6566
from test import (client_context,
@@ -1552,6 +1553,25 @@ def stall_connect(*args, **kwargs):
15521553
# Each ping command should not take more than 2 seconds
15531554
self.assertLess(total, 2)
15541555

1556+
@client_context.require_replica_set
1557+
def test_direct_connection(self):
1558+
# direct_connection=True should result in Single topology.
1559+
client = rs_or_single_client(directConnection=True)
1560+
client.admin.command('ping')
1561+
self.assertEqual(len(client.nodes), 1)
1562+
self.assertEqual(client._topology_settings.get_topology_type(),
1563+
TOPOLOGY_TYPE.Single)
1564+
client.close()
1565+
1566+
# direct_connection=False should result in RS topology.
1567+
client = rs_or_single_client(directConnection=False)
1568+
client.admin.command('ping')
1569+
self.assertGreaterEqual(len(client.nodes), 1)
1570+
self.assertIn(client._topology_settings.get_topology_type(),
1571+
[TOPOLOGY_TYPE.ReplicaSetNoPrimary,
1572+
TOPOLOGY_TYPE.ReplicaSetWithPrimary])
1573+
client.close()
1574+
15551575

15561576
class TestExhaustCursor(IntegrationTest):
15571577
"""Test that clients properly handle errors from exhaust cursors."""

test/test_discovery_and_monitoring.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,17 +21,19 @@
2121
sys.path[0:0] = [""]
2222

2323
from bson import json_util, Timestamp
24-
from pymongo import common, MongoClient
24+
from pymongo import common
2525
from pymongo.errors import (AutoReconnect,
2626
ConfigurationError,
2727
NetworkTimeout,
2828
NotMasterError,
2929
OperationFailure)
3030
from pymongo.helpers import _check_command_response
31-
from pymongo.topology import _ErrorContext
32-
from pymongo.topology_description import TOPOLOGY_TYPE
3331
from pymongo.ismaster import IsMaster
3432
from pymongo.server_description import ServerDescription, SERVER_TYPE
33+
from pymongo.settings import TopologySettings
34+
from pymongo.topology import Topology, _ErrorContext
35+
from pymongo.topology_description import TOPOLOGY_TYPE
36+
from pymongo.uri_parser import parse_uri
3537
from test import unittest, IntegrationTest
3638
from test.utils import (assertion_context,
3739
Barrier,
@@ -65,8 +67,23 @@ def request_check(self):
6567

6668

6769
def create_mock_topology(uri, monitor_class=MockMonitor):
68-
mc = MongoClient(uri, _monitor_class=monitor_class)
69-
return mc._get_topology()
70+
parsed_uri = parse_uri(uri)
71+
replica_set_name = None
72+
direct_connection = None
73+
if 'replicaset' in parsed_uri['options']:
74+
replica_set_name = parsed_uri['options']['replicaset']
75+
if 'directConnection' in parsed_uri['options']:
76+
direct_connection = parsed_uri['options']['directConnection']
77+
78+
topology_settings = TopologySettings(
79+
parsed_uri['nodelist'],
80+
replica_set_name=replica_set_name,
81+
monitor_class=monitor_class,
82+
direct_connection=direct_connection)
83+
84+
c = Topology(topology_settings)
85+
c.open()
86+
return c
7087

7188

7289
def got_ismaster(topology, server_address, ismaster_response):

test/utils.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -427,12 +427,13 @@ def _connection_string(h, authenticate):
427427
return "mongodb://%s" % (str(h),)
428428

429429

430-
def _mongo_client(host, port, authenticate=True, direct=False, **kwargs):
430+
def _mongo_client(host, port, authenticate=True, directConnection=False,
431+
**kwargs):
431432
"""Create a new client over SSL/TLS if necessary."""
432433
host = host or client_context.host
433434
port = port or client_context.port
434435
client_options = client_context.default_client_options.copy()
435-
if client_context.replica_set_name and not direct:
436+
if client_context.replica_set_name and not directConnection:
436437
client_options['replicaSet'] = client_context.replica_set_name
437438
client_options.update(kwargs)
438439

@@ -444,12 +445,13 @@ def _mongo_client(host, port, authenticate=True, direct=False, **kwargs):
444445

445446
def single_client_noauth(h=None, p=None, **kwargs):
446447
"""Make a direct connection. Don't authenticate."""
447-
return _mongo_client(h, p, authenticate=False, direct=True, **kwargs)
448+
return _mongo_client(h, p, authenticate=False,
449+
directConnection=True, **kwargs)
448450

449451

450452
def single_client(h=None, p=None, **kwargs):
451453
"""Make a direct connection, and authenticate if necessary."""
452-
return _mongo_client(h, p, direct=True, **kwargs)
454+
return _mongo_client(h, p, directConnection=True, **kwargs)
453455

454456

455457
def rs_client_noauth(h=None, p=None, **kwargs):

0 commit comments

Comments
 (0)