Skip to content

Commit 71de21f

Browse files
authored
Merge branch 'master' into PYTHON-4069-1
2 parents 56fafb8 + 044d92c commit 71de21f

File tree

11 files changed

+1415
-47
lines changed

11 files changed

+1415
-47
lines changed

.evergreen/config.yml

Lines changed: 64 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -284,14 +284,67 @@ functions:
284284
PYTHON_BINARY=${PYTHON_BINARY} bash ${PROJECT_DIRECTORY}/.evergreen/hatch.sh doctest:test
285285
286286
"run tests":
287-
- command: subprocess.exec
287+
- command: shell.exec
288288
type: test
289289
params:
290290
include_expansions_in_env: ["AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY", "AWS_SESSION_TOKEN"]
291291
working_dir: "src"
292-
binary: bash
293-
args:
294-
- .evergreen/scripts/run-tests.sh
292+
shell: bash
293+
script: |
294+
# Disable xtrace
295+
set +x
296+
. .evergreen/scripts/env.sh
297+
if [ -n "${MONGODB_STARTED}" ]; then
298+
export PYMONGO_MUST_CONNECT=true
299+
fi
300+
if [ -n "${DISABLE_TEST_COMMANDS}" ]; then
301+
export PYMONGO_DISABLE_TEST_COMMANDS=1
302+
fi
303+
if [ -n "${test_encryption}" ]; then
304+
# Disable xtrace (just in case it was accidentally set).
305+
set +x
306+
bash ${DRIVERS_TOOLS}/.evergreen/csfle/await-servers.sh
307+
export TEST_ENCRYPTION=1
308+
if [ -n "${test_encryption_pyopenssl}" ]; then
309+
export TEST_ENCRYPTION_PYOPENSSL=1
310+
fi
311+
fi
312+
if [ -n "${test_crypt_shared}" ]; then
313+
export TEST_CRYPT_SHARED=1
314+
export CRYPT_SHARED_LIB_PATH=${CRYPT_SHARED_LIB_PATH}
315+
fi
316+
if [ -n "${test_pyopenssl}" ]; then
317+
export TEST_PYOPENSSL=1
318+
fi
319+
if [ -n "${SETDEFAULTENCODING}" ]; then
320+
export SETDEFAULTENCODING="${SETDEFAULTENCODING}"
321+
fi
322+
if [ -n "${test_loadbalancer}" ]; then
323+
export TEST_LOADBALANCER=1
324+
export SINGLE_MONGOS_LB_URI="${SINGLE_MONGOS_LB_URI}"
325+
export MULTI_MONGOS_LB_URI="${MULTI_MONGOS_LB_URI}"
326+
fi
327+
if [ -n "${test_serverless}" ]; then
328+
export TEST_SERVERLESS=1
329+
fi
330+
if [ -n "${TEST_INDEX_MANAGEMENT}" ]; then
331+
export TEST_INDEX_MANAGEMENT=1
332+
fi
333+
if [ -n "${SKIP_CSOT_TESTS}" ]; then
334+
export SKIP_CSOT_TESTS=1
335+
fi
336+
337+
GREEN_FRAMEWORK=${GREEN_FRAMEWORK} \
338+
PYTHON_BINARY=${PYTHON_BINARY} \
339+
NO_EXT=${NO_EXT} \
340+
COVERAGE=${COVERAGE} \
341+
COMPRESSORS=${COMPRESSORS} \
342+
AUTH=${AUTH} \
343+
SSL=${SSL} \
344+
TEST_DATA_LAKE=${TEST_DATA_LAKE} \
345+
MONGODB_API_VERSION=${MONGODB_API_VERSION} \
346+
SKIP_HATCH=${SKIP_HATCH} \
347+
bash ${PROJECT_DIRECTORY}/.evergreen/hatch.sh test:test-eg
295348
296349
"run enterprise auth tests":
297350
- command: shell.exec
@@ -430,7 +483,9 @@ functions:
430483
working_dir: "src"
431484
script: |
432485
. .evergreen/scripts/env.sh
433-
. .evergreen/hatch.sh encryption:teardown
486+
if [ -f $DRIVERS_TOOLS/.evergreen/csfle/secrets-export.sh ]; then
487+
. .evergreen/hatch.sh encryption:teardown
488+
fi
434489
rm -rf ${DRIVERS_TOOLS} || true
435490
rm -f ./secrets-export.sh || true
436491
@@ -1931,10 +1986,14 @@ axes:
19311986
display_name: "RHEL 8.3 (zSeries)"
19321987
run_on: rhel83-zseries-small
19331988
batchtime: 10080 # 7 days
1989+
variables:
1990+
SKIP_HATCH: true
19341991
- id: rhel81-power8
19351992
display_name: "RHEL 8.1 (POWER8)"
19361993
run_on: rhel81-power8-small
19371994
batchtime: 10080 # 7 days
1995+
variables:
1996+
SKIP_HATCH: true
19381997
- id: rhel82-arm64
19391998
display_name: "RHEL 8.2 (ARM64)"
19401999
run_on: rhel82-arm64-small

.evergreen/hatch.sh

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,17 @@ if [ -z "$PYTHON_BINARY" ]; then
88
PYTHON_BINARY=$(find_python3)
99
fi
1010

11-
if $PYTHON_BINARY -m hatch --version; then
11+
# Check if we should skip hatch and run the tests directly.
12+
if [ -n "$SKIP_HATCH" ]; then
13+
ENV_NAME=testenv-$RANDOM
14+
createvirtualenv "$PYTHON_BINARY" $ENV_NAME
15+
# shellcheck disable=SC2064
16+
trap "deactivate; rm -rf $ENV_NAME" EXIT HUP
17+
python -m pip install -e ".[test]"
18+
run_hatch() {
19+
bash ./.evergreen/run-tests.sh
20+
}
21+
elif $PYTHON_BINARY -m hatch --version; then
1222
run_hatch() {
1323
$PYTHON_BINARY -m hatch run "$@"
1424
}

bson/_cbsonmodule.c

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -383,10 +383,11 @@ static int millis_from_datetime_ms(PyObject* dt, long long* out){
383383
static PyObject* decode_datetime(PyObject* self, long long millis, const codec_options_t* options){
384384
PyObject* naive = NULL;
385385
PyObject* replace = NULL;
386-
PyObject* args = NULL;
387-
PyObject* kwargs = NULL;
388386
PyObject* value = NULL;
389387
struct module_state *state = GETSTATE(self);
388+
if (!state) {
389+
goto invalid;
390+
}
390391
if (options->datetime_conversion == DATETIME_MS){
391392
return datetime_ms_from_millis(self, millis);
392393
}
@@ -414,8 +415,8 @@ static PyObject* decode_datetime(PyObject* self, long long millis, const codec_o
414415
Py_DECREF(utcoffset);
415416
return 0;
416417
}
417-
min_millis_offset = (PyDateTime_DELTA_GET_DAYS(utcoffset) * 86400 +
418-
PyDateTime_DELTA_GET_SECONDS(utcoffset)) * 1000 +
418+
min_millis_offset = (PyDateTime_DELTA_GET_DAYS(utcoffset) * (int64_t)86400 +
419+
PyDateTime_DELTA_GET_SECONDS(utcoffset)) * (int64_t)1000 +
419420
(PyDateTime_DELTA_GET_MICROSECONDS(utcoffset) / 1000);
420421
}
421422
Py_DECREF(utcoffset);
@@ -433,8 +434,8 @@ static PyObject* decode_datetime(PyObject* self, long long millis, const codec_o
433434
Py_DECREF(utcoffset);
434435
return 0;
435436
}
436-
max_millis_offset = (PyDateTime_DELTA_GET_DAYS(utcoffset) * 86400 +
437-
PyDateTime_DELTA_GET_SECONDS(utcoffset)) * 1000 +
437+
max_millis_offset = (PyDateTime_DELTA_GET_DAYS(utcoffset) * (int64_t)86400 +
438+
PyDateTime_DELTA_GET_SECONDS(utcoffset)) * (int64_t)1000 +
438439
(PyDateTime_DELTA_GET_MICROSECONDS(utcoffset) / 1000);
439440
}
440441
Py_DECREF(utcoffset);
@@ -487,8 +488,6 @@ static PyObject* decode_datetime(PyObject* self, long long millis, const codec_o
487488
invalid:
488489
Py_XDECREF(naive);
489490
Py_XDECREF(replace);
490-
Py_XDECREF(args);
491-
Py_XDECREF(kwargs);
492491
return value;
493492
}
494493

test/asynchronous/test_client.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -617,7 +617,7 @@ def test_detected_environment_logging(self, mock_get_hosts):
617617
mock_get_hosts.return_value = [(host, 1)]
618618
AsyncMongoClient(host)
619619
AsyncMongoClient(multi_host)
620-
logs = [record.message for record in cm.records if record.name == "pymongo.client"]
620+
logs = [record.getMessage() for record in cm.records if record.name == "pymongo.client"]
621621
self.assertEqual(len(logs), 7)
622622

623623
@patch("pymongo.srv_resolver._SrvResolver.get_hosts")

test/asynchronous/test_logger.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ async def test_default_truncation_limit(self):
3737
with self.assertLogs("pymongo.command", level="DEBUG") as cm:
3838
await db.test.insert_many(docs)
3939

40-
cmd_started_log = json_util.loads(cm.records[0].message)
40+
cmd_started_log = json_util.loads(cm.records[0].getMessage())
4141
self.assertEqual(len(cmd_started_log["command"]), _DEFAULT_DOCUMENT_LENGTH + 3)
4242

43-
cmd_succeeded_log = json_util.loads(cm.records[1].message)
43+
cmd_succeeded_log = json_util.loads(cm.records[1].getMessage())
4444
self.assertLessEqual(len(cmd_succeeded_log["reply"]), _DEFAULT_DOCUMENT_LENGTH + 3)
4545

4646
with self.assertLogs("pymongo.command", level="DEBUG") as cm:
4747
await db.test.find({}).to_list()
48-
cmd_succeeded_log = json_util.loads(cm.records[1].message)
48+
cmd_succeeded_log = json_util.loads(cm.records[1].getMessage())
4949
self.assertEqual(len(cmd_succeeded_log["reply"]), _DEFAULT_DOCUMENT_LENGTH + 3)
5050

5151
async def test_configured_truncation_limit(self):
@@ -55,14 +55,14 @@ async def test_configured_truncation_limit(self):
5555
with self.assertLogs("pymongo.command", level="DEBUG") as cm:
5656
await db.command(cmd)
5757

58-
cmd_started_log = json_util.loads(cm.records[0].message)
58+
cmd_started_log = json_util.loads(cm.records[0].getMessage())
5959
self.assertEqual(len(cmd_started_log["command"]), 5 + 3)
6060

61-
cmd_succeeded_log = json_util.loads(cm.records[1].message)
61+
cmd_succeeded_log = json_util.loads(cm.records[1].getMessage())
6262
self.assertLessEqual(len(cmd_succeeded_log["reply"]), 5 + 3)
6363
with self.assertRaises(OperationFailure):
6464
await db.command({"notARealCommand": True})
65-
cmd_failed_log = json_util.loads(cm.records[-1].message)
65+
cmd_failed_log = json_util.loads(cm.records[-1].getMessage())
6666
self.assertEqual(len(cmd_failed_log["failure"]), 5 + 3)
6767

6868
async def test_truncation_multi_byte_codepoints(self):
@@ -78,7 +78,7 @@ async def test_truncation_multi_byte_codepoints(self):
7878
with patch.dict("os.environ", {"MONGOB_LOG_MAX_DOCUMENT_LENGTH": length}):
7979
with self.assertLogs("pymongo.command", level="DEBUG") as cm:
8080
await self.db.test.insert_one({"x": multi_byte_char_str})
81-
cmd_started_log = json_util.loads(cm.records[0].message)["command"]
81+
cmd_started_log = json_util.loads(cm.records[0].getMessage())["command"]
8282

8383
cmd_started_log = cmd_started_log[:-3]
8484
last_3_bytes = cmd_started_log.encode()[-3:].decode()

0 commit comments

Comments
 (0)