diff --git a/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Lists.xml b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Lists.xml new file mode 100644 index 000000000000..0a70aed1a300 --- /dev/null +++ b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Lists.xml @@ -0,0 +1,32 @@ + + + + 1 Path List + ["/path1"] + + + 000000000000000000000000A6C6298A + B499FD5198AE0F1EB6B77F6E428D2FF0 + + + + + 2 Path List + ["/path1","/path2"] + + + 000000000000000000000000A6C6298A0000000000000000000000009D008F2C + B499FD5198AE0F1EB6B77F6E428D2FF0E7A1848BD1102A3B65AFF266874D0FF5 + + + + + 3 Path List + ["/path1","/path2","/path3"] + + + 000000000000000000000000A6C6298A0000000000000000000000009D008F2C0000000000000000000000003E47FEA2 + B499FD5198AE0F1EB6B77F6E428D2FF0E7A1848BD1102A3B65AFF266874D0FF5ECA5ABC953544CF9BD94776DA5E6EA52 + + + diff --git a/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Numbers.xml b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Numbers.xml new file mode 100644 index 000000000000..9c06566a13cf --- /dev/null +++ b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Numbers.xml @@ -0,0 +1,162 @@ + + + + positive zero + 0 + + + 0000000000000000000000001EDA80A6 + 555B95BEDAC4B1E9EC1CDC9BB0DDDE58 + + + + + negative zero + -0 + + + 000000000000000000000000B03DA650 + 3D018BB1DF3DB27235766E81FD10406E + + + + + positive number + 1 + + + 000000000000000000000000E1655A93 + A0CD98B339BA78A5D0CF6953B87070B0 + + + + + negative number + -1 + + + 000000000000000000000000452BDBE7 + 59938E7A936C1C5B9E3AE842BBC16839 + + + + + Epsilon + 5E-324 + + + 000000000000000000000000AC83D318 + 0E6CBA63A280927DE485DEF865800139 + + + + + MaxValue + 1.7976931348623157E+308 + + + 000000000000000000000000378B3C46 + 71424D996457102634591FF245DBCC4D + + + + + MinValue + -1.7976931348623157E+308 + + + 000000000000000000000000E38DD8A1 + 27050CC4910CFD9DACE1283D3801DF25 + + + + + NaN + "NaN" + + + 000000000000000000000000AF04DA37 + 5AA4222583D70ECAA0922D8CA8EDFCB1 + + + + + long NegativeInfinity + "-Infinity" + + + 0000000000000000000000000F5A6CC5 + 5B63B3FB266DB3B6CD3BC79FE893CDE8 + + + + + long PositiveInfinity + "Infinity" + + + 000000000000000000000000D2F84F93 + 3889F7F08A8CE2A5C9829BBB1944B4FF + + + + + long MaxValue + 9223372036854775807 + + + 0000000000000000000000001732A96D + 6EDB959178DFCCA18983F89384D1629B + + + + + long MaxValue minus 1 + 9223372036854775806 + + + 0000000000000000000000001732A96D + 6EDB959178DFCCA18983F89384D1629B + + + + + long MinValue + -9223372036854775808 + + + 00000000000000000000000069AF2787 + 63D5C6395512BDFEAFADAD15328AD2BB + + + + + MaxSafeInteger + 9007199254740991 + + + 00000000000000000000000013F69B8A + 12C221C7032CED1F9E6693CE1428E6CF + + + + + MaxSafeInteger Minus 1 + 9007199254740990 + + + 000000000000000000000000E5744366 + 8FEA3467D94AA6E4628EF0B248C1FD9B + + + + + MaxSafeInteger Plus 1 + 9007199254740992 + + + 000000000000000000000000A30CCE12 + 55335910D01122E3D99DA5DE569B065D + + + diff --git a/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Singletons.xml b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Singletons.xml new file mode 100644 index 000000000000..d05b53598e89 --- /dev/null +++ b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Singletons.xml @@ -0,0 +1,42 @@ + + + + Undefined + UNDEFINED + + + 000000000000000000000000514E28B7 + 51622DAA78F835834610ABE56EFF5CB5 + + + + + null + null + + + 000000000000000000000000E45AD1AB + 778867E4430E67857ACE5C908374FE16 + + + + + true + true + + + 0000000000000000000000005E2A8076 + 4E711127C5B5A8E4726AC6DD306A3E59 + + + + + false + false + + + 0000000000000000000000006C27D09F + EFE1BE91E90A3439635E0E9E37361EF2 + + + diff --git a/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Strings.xml b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Strings.xml new file mode 100644 index 000000000000..27ee685cad5b --- /dev/null +++ b/sdk/cosmos/azure-cosmos/tests/test_data/partition_key_hash_baseline/PartitionKeyHashBaselineTest.Strings.xml @@ -0,0 +1,62 @@ + + + + Empty String + "" + + + 0000000000000000000000003CCCB0FF + B2E9366E637A71B4E710384B2F4970A0 + + + + + short string + "asdf" + + + 000000000000000000000000B02BABC2 + 608BF1D598F5B63AD5520F04FE58C5E8 + + + + + 99 byte string + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + + 000000000000000000000000CCC122D9 + 3C02F609961C32AAC2B912B940D1209A + + + + + 100 byte string + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + + 000000000000000000000000D5843D83 + 8DBD7D229437BB665DE6417747994D57 + + + + + 101 byte string + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + + 0000000000000000000000003B1B5D8D + 88042541D30C8BF90D7092B1519AE0BC + + + + + 2kb byte string + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa" + + + 0000000000000000000000009C91058D + B3E0AE996F53F2CD5DD5574ACAB3BF19 + + + diff --git a/sdk/cosmos/azure-cosmos/tests/test_partition_key_hash_baseline.py b/sdk/cosmos/azure-cosmos/tests/test_partition_key_hash_baseline.py new file mode 100644 index 000000000000..84eadcfda628 --- /dev/null +++ b/sdk/cosmos/azure-cosmos/tests/test_partition_key_hash_baseline.py @@ -0,0 +1,264 @@ +# The MIT License (MIT) +# Copyright (c) Microsoft Corporation. All rights reserved. + +"""Tests validating Python SDK partition key hash computation against baselines. + +Uses the production code path (PartitionKey._write_for_hashing / +_write_for_hashing_v2) which includes the string suffix byte (0x00 for V1, +0xFF for V2), then feeds the serialised bytes into MurmurHash3. + +Baseline XML files live in tests/test_data/partition_key_hash_baseline/. +To regenerate them after intentional changes to the hashing logic, run:: + + UPDATE_BASELINE=1 python -m pytest tests/test_partition_key_hash_baseline.py +""" + +import json +import os +import struct +from io import BytesIO +from xml.etree import ElementTree +from xml.dom import minidom + +import pytest + +from azure.cosmos._cosmos_integers import _UInt128 +from azure.cosmos._cosmos_murmurhash3 import murmurhash3_128, murmurhash3_32 +from azure.cosmos.partition_key import PartitionKey, _Undefined + +TEST_DATA_DIR = os.path.join( + os.path.dirname(__file__), "test_data", "partition_key_hash_baseline" +) + +# .NET double.NaN has bit pattern 0xFFF8000000000000 (negative quiet NaN), +# while Python float('nan') uses 0x7FF8000000000000 (positive quiet NaN). +_DOTNET_NAN = struct.unpack('