|
46 | 46 | unittest,
|
47 | 47 | IntegrationTest)
|
48 | 48 | from test.utils import (EventListener,
|
| 49 | + OvertCommandListener, |
49 | 50 | ignore_deprecations,
|
50 | 51 | rs_or_single_client,
|
51 | 52 | WhiteListEventListener)
|
@@ -1478,6 +1479,76 @@ def test_manipulate(self):
|
1478 | 1479 | with self.assertRaises(InvalidOperation):
|
1479 | 1480 | c.find_raw_batches(manipulate=True)
|
1480 | 1481 |
|
| 1482 | + @client_context.require_transactions |
| 1483 | + def test_find_raw_transaction(self): |
| 1484 | + c = self.db.test |
| 1485 | + c.drop() |
| 1486 | + docs = [{'_id': i, 'x': 3.0 * i} for i in range(10)] |
| 1487 | + c.insert_many(docs) |
| 1488 | + |
| 1489 | + listener = OvertCommandListener() |
| 1490 | + client = rs_or_single_client(event_listeners=[listener]) |
| 1491 | + with client.start_session() as session: |
| 1492 | + with session.start_transaction(): |
| 1493 | + batches = list(client[self.db.name].test.find_raw_batches( |
| 1494 | + session=session).sort('_id')) |
| 1495 | + cmd = listener.results['started'][0] |
| 1496 | + self.assertEqual(cmd.command_name, 'find') |
| 1497 | + self.assertEqual(cmd.command['$clusterTime'], |
| 1498 | + decode_all(session.cluster_time.raw)[0]) |
| 1499 | + self.assertEqual(cmd.command['startTransaction'], True) |
| 1500 | + self.assertEqual(cmd.command['txnNumber'], 1) |
| 1501 | + |
| 1502 | + self.assertEqual(1, len(batches)) |
| 1503 | + self.assertEqual(docs, decode_all(batches[0])) |
| 1504 | + |
| 1505 | + @client_context.require_sessions |
| 1506 | + @client_context.require_failCommand_fail_point |
| 1507 | + def test_find_raw_retryable_reads(self): |
| 1508 | + c = self.db.test |
| 1509 | + c.drop() |
| 1510 | + docs = [{'_id': i, 'x': 3.0 * i} for i in range(10)] |
| 1511 | + c.insert_many(docs) |
| 1512 | + |
| 1513 | + listener = OvertCommandListener() |
| 1514 | + client = rs_or_single_client(event_listeners=[listener], |
| 1515 | + retryReads=True) |
| 1516 | + with self.fail_point({ |
| 1517 | + 'mode': {'times': 1}, 'data': {'failCommands': ['find'], |
| 1518 | + 'closeConnection': True}}): |
| 1519 | + batches = list( |
| 1520 | + client[self.db.name].test.find_raw_batches().sort('_id')) |
| 1521 | + |
| 1522 | + self.assertEqual(1, len(batches)) |
| 1523 | + self.assertEqual(docs, decode_all(batches[0])) |
| 1524 | + self.assertEqual(len(listener.results['started']), 2) |
| 1525 | + for cmd in listener.results['started']: |
| 1526 | + self.assertEqual(cmd.command_name, 'find') |
| 1527 | + |
| 1528 | + @client_context.require_version_min(5, 0, 0) |
| 1529 | + @client_context.require_no_standalone |
| 1530 | + def test_find_raw_snapshot_reads(self): |
| 1531 | + c = self.db.get_collection( |
| 1532 | + "test", write_concern=WriteConcern(w="majority")) |
| 1533 | + c.drop() |
| 1534 | + docs = [{'_id': i, 'x': 3.0 * i} for i in range(10)] |
| 1535 | + c.insert_many(docs) |
| 1536 | + |
| 1537 | + listener = OvertCommandListener() |
| 1538 | + client = rs_or_single_client(event_listeners=[listener], |
| 1539 | + retryReads=True) |
| 1540 | + db = client[self.db.name] |
| 1541 | + with client.start_session(snapshot=True) as session: |
| 1542 | + db.test.distinct('x', {}, session=session) |
| 1543 | + batches = list(db.test.find_raw_batches( |
| 1544 | + session=session).sort('_id')) |
| 1545 | + self.assertEqual(1, len(batches)) |
| 1546 | + self.assertEqual(docs, decode_all(batches[0])) |
| 1547 | + |
| 1548 | + find_cmd = listener.results['started'][1].command |
| 1549 | + self.assertEqual(find_cmd['readConcern']['level'], 'snapshot') |
| 1550 | + self.assertIsNotNone(find_cmd['readConcern']['atClusterTime']) |
| 1551 | + |
1481 | 1552 | def test_explain(self):
|
1482 | 1553 | c = self.db.test
|
1483 | 1554 | c.insert_one({})
|
@@ -1602,6 +1673,75 @@ def test_aggregate_raw(self):
|
1602 | 1673 | self.assertEqual(1, len(batches))
|
1603 | 1674 | self.assertEqual(docs, decode_all(batches[0]))
|
1604 | 1675 |
|
| 1676 | + @client_context.require_transactions |
| 1677 | + def test_aggregate_raw_transaction(self): |
| 1678 | + c = self.db.test |
| 1679 | + c.drop() |
| 1680 | + docs = [{'_id': i, 'x': 3.0 * i} for i in range(10)] |
| 1681 | + c.insert_many(docs) |
| 1682 | + |
| 1683 | + listener = OvertCommandListener() |
| 1684 | + client = rs_or_single_client(event_listeners=[listener]) |
| 1685 | + with client.start_session() as session: |
| 1686 | + with session.start_transaction(): |
| 1687 | + batches = list(client[self.db.name].test.aggregate_raw_batches( |
| 1688 | + [{'$sort': {'_id': 1}}], session=session)) |
| 1689 | + cmd = listener.results['started'][0] |
| 1690 | + self.assertEqual(cmd.command_name, 'aggregate') |
| 1691 | + self.assertEqual(cmd.command['$clusterTime'], session.cluster_time) |
| 1692 | + self.assertEqual(cmd.command['startTransaction'], True) |
| 1693 | + self.assertEqual(cmd.command['txnNumber'], 1) |
| 1694 | + self.assertEqual(1, len(batches)) |
| 1695 | + self.assertEqual(docs, decode_all(batches[0])) |
| 1696 | + |
| 1697 | + @client_context.require_sessions |
| 1698 | + @client_context.require_failCommand_fail_point |
| 1699 | + def test_aggregate_raw_retryable_reads(self): |
| 1700 | + c = self.db.test |
| 1701 | + c.drop() |
| 1702 | + docs = [{'_id': i, 'x': 3.0 * i} for i in range(10)] |
| 1703 | + c.insert_many(docs) |
| 1704 | + |
| 1705 | + listener = OvertCommandListener() |
| 1706 | + client = rs_or_single_client(event_listeners=[listener], |
| 1707 | + retryReads=True) |
| 1708 | + with self.fail_point({ |
| 1709 | + 'mode': {'times': 1}, 'data': {'failCommands': ['aggregate'], |
| 1710 | + 'closeConnection': True}}): |
| 1711 | + batches = list(client[self.db.name].test.aggregate_raw_batches( |
| 1712 | + [{'$sort': {'_id': 1}}])) |
| 1713 | + |
| 1714 | + self.assertEqual(1, len(batches)) |
| 1715 | + self.assertEqual(docs, decode_all(batches[0])) |
| 1716 | + self.assertEqual(len(listener.results['started']), 3) |
| 1717 | + cmds = listener.results['started'] |
| 1718 | + self.assertEqual(cmds[0].command_name, 'aggregate') |
| 1719 | + self.assertEqual(cmds[1].command_name, 'aggregate') |
| 1720 | + |
| 1721 | + @client_context.require_version_min(5, 0, -1) |
| 1722 | + @client_context.require_no_standalone |
| 1723 | + def test_aggregate_raw_snapshot_reads(self): |
| 1724 | + c = self.db.get_collection( |
| 1725 | + "test", write_concern=WriteConcern(w="majority")) |
| 1726 | + c.drop() |
| 1727 | + docs = [{'_id': i, 'x': 3.0 * i} for i in range(10)] |
| 1728 | + c.insert_many(docs) |
| 1729 | + |
| 1730 | + listener = OvertCommandListener() |
| 1731 | + client = rs_or_single_client(event_listeners=[listener], |
| 1732 | + retryReads=True) |
| 1733 | + db = client[self.db.name] |
| 1734 | + with client.start_session(snapshot=True) as session: |
| 1735 | + db.test.distinct('x', {}, session=session) |
| 1736 | + batches = list(db.test.aggregate_raw_batches( |
| 1737 | + [{'$sort': {'_id': 1}}], session=session)) |
| 1738 | + self.assertEqual(1, len(batches)) |
| 1739 | + self.assertEqual(docs, decode_all(batches[0])) |
| 1740 | + |
| 1741 | + find_cmd = listener.results['started'][1].command |
| 1742 | + self.assertEqual(find_cmd['readConcern']['level'], 'snapshot') |
| 1743 | + self.assertIsNotNone(find_cmd['readConcern']['atClusterTime']) |
| 1744 | + |
1605 | 1745 | def test_server_error(self):
|
1606 | 1746 | c = self.db.test
|
1607 | 1747 | c.drop()
|
|
0 commit comments