diff --git a/tests/integration/_expected_requests/debug_files/upload/chunk_upload_small_chunks_only_some.bin b/tests/integration/_expected_requests/debug_files/upload/chunk_upload_small_chunks_only_some.bin new file mode 100644 index 0000000000..c9a3749115 Binary files /dev/null and b/tests/integration/_expected_requests/debug_files/upload/chunk_upload_small_chunks_only_some.bin differ diff --git a/tests/integration/_responses/debug_files/assemble-chunk-upload-small-chunks-only-some-missing.json b/tests/integration/_responses/debug_files/assemble-chunk-upload-small-chunks-only-some-missing.json new file mode 100644 index 0000000000..89471a3405 --- /dev/null +++ b/tests/integration/_responses/debug_files/assemble-chunk-upload-small-chunks-only-some-missing.json @@ -0,0 +1,342 @@ +{ + "6e217f035ed538d4d6c14129baad5cb52e680e74": { + "state": "not_found", + "missingChunks": [ + "39aadb58cc14644c975f1341ab6ddfe2107d7b02", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "d9ecea0a22d4a834e2793b45cb86f0c7fbf0f920", + "aaa4a809a0f57a0442245f46472d51cd65b1eba9", + "1d3dae720c27c78abdf96fd0148b7a845e4b5916", + "fe724fe463aac5c4c92293ffeb8d9365a3b4478e", + "bde3e7324116132896fcda47100546dd56cf171f", + "7ab3739d0c131805d3747c4ee1496cf0aedb38a3", + "ec0bd6b9f7645904d903a816958eae8799cff1b5", + "bbdb1cc4b48fac0a42090791256e962f5ac6abe0", + "b004b82bc8886e74d697a854e1f23ad63c6fe0da", + "b5caada9ac4da11b13f5346513f316d399e17924", + "22daba7f39e70e0fbd994a9594a6a5974e04deb9", + "bfb844ffec884f64e1ea7d66d95c39986d825d9e", + "73945a93cc1a002433e0c580351044814ff87db7", + "c07a8fd120f2e909931187d6631db78fb061f2f9", + "c6ae786674b7c4e94df46f811175a53525be3f3e", + "0e61b87d2e86ef7ec23786309443884b9eb06bb1", + "6f325c6cd30c6eec4a4d119e466bfa73fc59039b", + "2017365d440780481db00305d81cb7394c459b6d", + "82204e747f036009614d436da660657ebf70850c", + "eaf5704666e0d39fed4a28cc7ad8e86b5388f3b3", + "f9421aaad9a94eb76910db2f11d2cfea466b68e3", + "8cb5c1b7a698bf7215ce17675992fd8fad6e2694", + "22c2cf0c8ce1e5184c5449650e3973c52b3781bf", + "e82c992b0c0f5226532dd795c6be4e18d4cb8ee4", + "2697cec4b772f50e72e747ac1807e54fe3c22224", + "93859f9b3e602a8e3e69e968078a75e1b70419ae", + "271147f50e92d6f96746107455d07551ea5dcbca", + "10416fb4e5c6eed0c4179547e7fd19bce48ee97c", + "a396d6949fb3426f9d5c7acaf9c1cdf2e06b708d", + "ca2f932b9d45d7ae40426fb80ac7ecf46aee3309", + "3b7fde80fb14be9e5b0b4eca455676110fd771df", + "e8a4d3023af5c288e99369c05935a24bcc69ea45", + "e49c1bb8f8458cea7aaf2a9fd8cb74fce8806d80", + "6745eead28aefb02371e97557ed0465ec758763a", + "f0f9c5672231d9b497fd3d92f17b5b170cf78733", + "ac7962a7e7a1680dcf42cd66e2f78e9def4573aa", + "dae6b6055ebe0d527d313f89c713aeed0b1dc511", + "963dce2433e8888fa82f24ffb6aef887965b3717", + "ee2582c1ea4d53c6ff91d8a562d201e670d1832b", + "ab3faf595e53ec936a4e3b37c6ab75273a0311c7", + "4ab49169c49ab809c910285b56fec455ed8df4d8", + "de8df3032009c14108976d9fb0b1d8084f364781", + "c2a44b5e186e5322fbed825ebc0e194f09c8e88e", + "63816cbc7ba93bc14f77941f3525695585f0102e", + "1e0f2c5e74780618f9977859d5f3c401a95d1cdd", + "d707334fe0ee1ea2b097ff4774418f01a44ceadf", + "569c0c9c67efdb5be683a6176bd426678195ca0e", + "f12c4763378a454adf20f84111500784fc33bb69", + "759bd2e24ca88198f6d3661faefdfda1e09e1bba", + "88b37439d8c708a0ec5c770ce38411d4641ee0a2", + "ed4b467836bb9391ebcad2b070cb67739f95be2c", + "dc89d35cc1f4a186774aecf61692dbe944e8864d", + "6b01a43a949800c46aabdb13c1b0c08e584d2510", + "bcf0c2ca83e528aad99a8b10a264630037c7d8ac", + "9a7ec82a16b2d69bfeb0beb5a714a1e78bb994fa", + "cf88574b00edfcf99eaf0760ece0e44cb6182b1e", + "2cc1cd085b98714595c35318631ffd1db3c06dee", + "a917e8484ef12e28e2992a321ce371e4cec1bc7e", + "0268113353a5ad25177fd5e3b91512828ec92242", + "1b0343bbcd2da9f4a77f1081074082f827da16f0", + "c62275bca5967553643f5712b3b632e37593444c", + "f3d3ab8ed5b0f506f1faf9bb38183ed7b12c6d06", + "cc583b18e8a299c7a80e2a7d8faf5d22f2717c38", + "27030b1b52d6a0160b79bb8200d72f3e50e4617e", + "3ec2c4645890c7dad73058ad817057a6f91a9c58", + "dc320d1f19b5e952948423ac6bab5a6116e9f686", + "24e22af123a808e5e45640854d96fc70fb57e688", + "404f94ec9250885f31dc06e1ae6647783d8ad684", + "9c636ebdda3993b576d9d52dbf8bb9a9b2285b1e", + "e2231624de4be8432ffe96f1e3653b9ea3b2c331", + "51aeb6793fd95f69648d6fab828e26e4a884e4e2", + "c36fabc9a9a3cc4ca0512b09d1e9195f4a5ba0ed", + "377ebf00ebc05da29b10567d5151ec68d0f892ac", + "d7e4a829983859d088db651d870465fca41e13da", + "30001ee593e5a51cc9f3a2ac9d18a24a02dd695a", + "da7d080b845eadb6952c894d0485e1489a257693", + "66cf965467f9ca94a78a8454918ab575e202a11d", + "1251ed6f40f22ce3aaca95d691ad28a160b72821", + "d0146cf22daf0f33e23ed49cc09bec1221fe8d5c", + "b9f1ebef159ffaed6d8ec1138dbd25471d4c4922", + "833b04c9751c7311a10d52a2ec05ef441060c918", + "32c17c139af1c3fc1683e4d955c2bd9130b61432", + "08ff541930a355a97a5c84a44b05a7b9e14e60eb", + "eb2d01d729f38b3936ebdd9d3285fedf3cd7ac83", + "32c43888b3ec9cdf7eff8e7f4c44709d150b5655", + "2d2275b0e1bfcd378e7ef787afbdc7a696c1d0e8", + "6182584a25511e634839060aa83cf1422446559c", + "51d24324d1752e5a9a45c837f0006f929dc0cdac", + "c7ecd485788f99a9ff3bf7999fb014c0414e1a59", + "abe4c7e36a47273a1a61a6c4409cb6e637197480", + "084f98355efd9e78153297dd9d0a6b888a312fbc", + "9d94e1eb926e8ad196ac4f8f2588bc7f5bacc830", + "a75ca630a47c77bf8f4c03cd4a95714b6661f34e", + "00b912d4385df7c5c919a5a4b46faec4a050bc17", + "9141203f3397a1020f5329d0d3a6d466becaaba2", + "9277bf1cb8007bd18d875a32ca7d8f72568fbcaf", + "24b1d3555075566e181f65026dce68530e6e3f57", + "375efd44dca4a09aacd24cdc28d47ca64129b9ef", + "13f0336efd0d545af4bacf6001e8a9a925636f2f", + "81c4f20030ebda480ddddc47e5773a2f4303f310", + "9f0f0170856dd3569bc097cd1007497eaff995b0", + "44981be3a512acc34a18a3c9da6b04f6cb08b714", + "b038cfe591fb0dcef39923513a20beb560c3a158", + "27942978d4eb572ca4fd11286ee54ec02c460253", + "eae04176662cf5106bbd8f816b6b442802e73ab7", + "a02e212875ef8bce0913d11d9a07ed30a397aebe", + "bb1d7edf1635489191bc56cbad8d045c4b0a777f", + "c5aa05e2bc2109e5a963d1deb070cab3adab1ec0", + "095246b39ce3ac6d838a1f855d2118976afa4311", + "92569a5a822955df76c94e1e51b230d3f9e6d4e1", + "c9ce0364355abb085be4eb5809f6142cf2473a6a", + "e269fda7fa54aebbd5b302bfe90ce7b8678b617f", + "d8082f5e9895d6525d4bc82a67603159ca879e23", + "b29dce46d53bc3760743878c24c77ea92d2e3e49", + "ab98d833beb90f929e0f6e63a3bb2f6c2d2cfe53", + "7a40392092bd99a8e273249d3182c74e307ef3aa", + "82477e8dd17c820e360a8a7cee0fc335e0abaf06", + "862619ac2605622a4a1425b94e569218dd8f4ae7", + "4009d52f576b5f73e77814223b8c684e2557bc26", + "f64e211cee2952fbea94932e5f2dede21c057c86", + "2175c54f27f8537a7e3e45f4d37efe3481f869c7", + "0ffcd570d7e637ec1548b503a66344fa19479557", + "5826d8c84284cb7c49ffa9dc0e6f2138fcdac553", + "4ff3b88d2e76d53b426793fd495d2d86f25438e2", + "36cd5256e8dfb1738b7ea6fb5f2c688c55420f51", + "cc928cbe93e15a7b4452f3bc7b019bc5b7bf4e2a", + "2cfe3d749b23c19ea2adcb5fce27f2d25c662dc5", + "cadcabfaad1eac6d097bbf0f394ea4fa1294396f", + "42bd9a872f1b0d83d1fbe76a3dc59ffaa3dd555b", + "f853d4b966b005dd3f302d3e17aad968b235b83e", + "107d4ea9cddedb9292d475bf0f85bf45d3de29d6", + "4704b3451354381731660fc5825aceaef2757150", + "018534951a56d6e5e095fb3721b6f95fab3026f2", + "31096550e21e5628cf2ed97bdafb52c2fcfb3133", + "4ee5b846482141eca90297f5baf23160cb24abff", + "25ed234018fce3e311259aa4ad7f9d9d4d97edc3", + "7b634e3ed42be766e09293e24a65ccb3af4de420", + "8ec296beb2b06caa57be4a65a472cf2abb22d54f", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "9cc6aecea21497009f876b268bcfb4bed415dad2", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "1ae20d28ea0b35e3c0a4e9d2ae90869295e3e8b8", + "493b5ddb3e2e6aa1d0b17faf048cc2a2e0ee4087", + "a0e261f377fd69551843532de8f4ebb1863022eb", + "1231fac07208f2c9cc5427e65f30924601a6fce6", + "12b8cd9ad15deb7b73e8768db50a6176f8b46351", + "a47115a6547f6b7d03eeafc7ef74f94c0dfbbd56", + "37578666f1080a189248c6337b718650b7cb7604", + "6002fb5a1af324592a3e266876c30265152cd58f", + "ec563f5b9ac06354211123c813f6568d7c1e75ca", + "d87275b087c0be45e6983469821181ad6ce98bb0", + "36391d9ad98523da794eebfac2605a0960ab653f", + "500f3e10bfbd48c67fe73801c0a4b090162e58e6", + "e0086a0befaea2be536a89400873b6d676c83253", + "f27e93ad6b00e4582d74be220c7e4d70447edfff", + "04e7120c6798a428d9ac9614fa7d7c50d1a609fc", + "edb262c2c5917ef07799388d6749e800dcbb7a61", + "3692c696ebbc9267e9628af59551b5f57dc3b3dd", + "0e34e008efae378b1cdafd1574796ab245f0b9cc", + "062950cafc9868a77475527151f25997780f28cd", + "e47a143c439b0d3a1119f5c767df3c8848411b30", + "343b098ee65ebf9cb2ad727243b5f9ce5d4bb1ac", + "156f077fca451f4a549a0c60d8c0350b3a46d7d4", + "892265815528c0be3566f2ba3c5e4536c0fe21fa", + "a67dbf884584fd2c4f86675e49b469ad26238f53", + "b9e4a45d3e9a5010f874339ebaec97e5ba52f3be", + "0b1359a139e48d7cec5226755bb19a430e6cba08", + "40ff3398cee25a79f9d3be463f9f51760cf2ea71", + "6611146ec6d7b0f7d66b99da9b55a65145f270b1", + "6191cca73478f16def51dcb112a6a19fd28bc892", + "d864739f0eec548ee2be435f424bd9c6e04a93ff", + "cf408b3c6a8f61f2e5f5f8a4d9831f50d8aba694", + "bd86c428063a7dcb32ec4c211f361eeffb1e9c2c", + "eae645aeddd641bf831ae75a4b812ef9a4e6648e", + "09f5ccfa1416e24984571f4a87045edf2ec0f99a", + "412654ecf4e6424c66c935eff037fe9ced0ea6af", + "0bde079ac5b47f0273ccad81efe59d7a63da1e1f", + "a7cdeacec062c748829f2e05ee5adb40ca002ab4", + "3c0c4922aef5525d17ed4622777bcacd6f5d444f", + "dc2fba7681a3f94a10a32d557d146351945c781d", + "f0d5b1a1c48702aecc9e8ee926569f76b04d721f", + "3c3141a8168a37fa116757473f1f2a5d9b8fe921", + "d9bc44fe94dabba25c628307b53b168295bb216e", + "18b930d86ca27855ef89499b7467002375133a32", + "dd600a94903491c51b4abe15efba0ef7a92b9e3b", + "00bd97199bda980d8342d465a5c910a954508392", + "a94848ce550ff0ac424878ed39f07ce0dcb07627", + "1b99d14e42ad8fffcfe11f5cec375515e1ab8ff7", + "564b576531c5aa0fd8653ff88319c2413281ba82", + "aa732a33845f25ba1c17ac23b5e72f7c7e13ad57", + "49631910bfd74ae32119abb57306907b3d18016e", + "eea27ad6862d68047ab15c91fc25653043196157", + "c6a34f161af68f9886739615f98e8aa2af287a16", + "cb19dfac64931ae4fe389e16ff2ce1d1b0478a7c", + "b4dfaf16e623e36479b804d33e7267a89283da0b" + ] + }, + "500848b7815119669a292f2ae1f44af11d7aa2d3": { + "state": "not_found", + "missingChunks": [ + "99654bf5f8b7960080239edd98d3f8330b710e3b", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "547c1456af1721c219f3e99fc9bf9d125ccab449", + "a1dc610e26fe9a8a890a32e173cc99caef171593", + "50bdc42d0de22adeae5300b04118db96878aac9c", + "1b8e5174d3d37a9de970b4134d2245ff056dbb2a", + "63277f9192a37fd3b08a1f744376cecbbb1f1360", + "0acc9d96c0b2278e22b7e9bc6a5bb647fa4e8a05", + "f3850781083d6bb592f4a460c5892e8800490bff", + "e8fa95f23daa2dea75a328c03c61e160850825e6", + "377db7701edf81f93aa958be61f6aaa9faa72f6f", + "47bbb1181484e136b7f43eec7d29ac1ca92bd863", + "37f67bf6252b40e2fdf41f4cb4e962ccb7e607b9", + "0f6c68df7a65bc450c698b81e25e47d34c3c07dd", + "75e8a2c4eaade8c530a3d4f830420dcf2a5add75", + "39985b9f4f506eca8c5489e9aee724c37134f37b", + "1e53d233f36067d9684aff28e8b56e481ea678b9", + "5a2cb5ecb6f31ad7d89d88ba57e8ab2dccc252b0", + "dcb5cfce0df870f0436b1952ba497cd88a1ae78e", + "e7f2c46b57b12f4df2f927cfca164a38e168b966", + "ab01733751234fd2ed67645a31d9b1640bec9c3f", + "e58af3605189aa52547f10498e5b037c084faa59", + "ff298717d4858c07b80cc9d92b10f29614698d31", + "9ec27d1ce421df315ff269bc21a699d3712a796d", + "a4db38ef5474af0d9cdfdec77e39454e115bfec4", + "cf2101dd26764e083ef0629c6f3b7977380c1195", + "2104dea0c8fb437510f0df54f050786725390165", + "e1d8219830242fb037ee33de21fedd5f6df5e018", + "c8bcc8bd6a5a733ec63d7687fc38b502d7e19cd2", + "7b492c0832fc6f68c5f6b4f648095ec5d7a79f4e", + "8366fd4f7d3a10d19a2a4c532477db0798549e52", + "e7e9f956c3a1d815773135d6863ac10a9b4f983f", + "3c9a94dc328eafeb39e91915f5830a8dd5c6793e", + "2d55e73ccec27d66eb302b673a0aa1a5cfd11b39", + "3d48d688e57593e4b6b24537e4722ff583ad3c21", + "4d000f6f802f43000f4f337ffe4268e042c595d0", + "fa22ebca31f2d52767145e39deeef7913df1b57e", + "5d55a89c09fe1bb51b8da90b1742ae356626c131", + "9d061505bafaa25eb8c4e352b120c3691f6e97f2", + "31e45b5092363e16eed554b9eafb2c75fd2249a6", + "b69aaeb4431f2fbd81c28a9d1d1cee0f932dbfff", + "407320c01554490f1bd0d34055c90ff98a909959", + "e979e0e86e38d21d77cb19b8e32de63f9e87d6bc", + "e39b40933eabca9d00a020cea4f2052cbffb0df1", + "7f75d8a001a5e31164b854f2fc45908ba7bc69ec", + "6b094930798ec0d27ed5dc984a67ae7987b80805", + "6ed73fe6329997cf3e005b1982896cc2db5fd89c", + "6447bdc592753ec0c9bb26b9450d2c88be57f40c", + "1fb71c06d3a630af3c5b1b3ed2a0c917bc568e51", + "c998dc4c67fd2db9e516e12e22eca5e533fab346", + "710de0182a7466cb6bd375f2bca5316894e09f7c", + "ec039dfd1a086cbc5e67d716e2195665af15b6a7", + "fca0a3e10ee7bd466a588a4988afb841d44a8254", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "9cc6aecea21497009f876b268bcfb4bed415dad2", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "605db3fdbaff4ba13729371ad0c4fbab3889378e", + "7995729ea2f92cd667ea7de9a3213d61482f4c9d", + "efe7a87fa31f4704be941d1600febf28ca546782", + "bcb4bcf0e3bef8a12ba5347e2820639cc5ade4f0", + "6a0f41948b5b7a7342ec332bd8804acafa7b048a", + "4728d857fe6b6d6345aeeee52f0940e2a3388074", + "d61f19433cd72480e79b787c20f7c8e562173b87", + "e87cecaac8b3a53ac7ddd5208f59c2dcce79ee9e", + "ca1b100a3c2de8d0746a6f182a1176d68008e2b5", + "50560fad3b55a16489bf45162da566528600edc1", + "e59dd7e5709d8aba454d83e870d265eb060928c2", + "af5950de5dc408189fe1713691fb9c59f9c14b00", + "69292cde395de98d1f41989adc6095d47a345f60", + "7414d47dfdbc7492366296e1c67f3f1976a67f11", + "977ce576f4a4fb8783bce8d25c3f4c97ff970b9c", + "cfe6f6b51ba064fc418405e37bfefc26a6913f41", + "de43bdf5b17e3dbe3f310d30ebd944d637dcff3b", + "fc0d4c97cfb19c479192c0cc787a93b09b0cf8a1", + "269d52efbb49d17a6ee52ad1dc95f3b1533980b2", + "e67718982a9589d91ed30250ecd2777b9cdb2162", + "47228e8bf39d9bcf0fc26c41a7ac64c7ee17abd7", + "76d94bf029f5efb6e4e46028ae7a6258510cd3e9", + "ff3111dd95b51c88369bfa10d59ef3384c474081", + "95b13859036064c3db8881260b60e7940520049a", + "bfc920ef2cbdcc24020a8cbe9d9a5a3b7c2bd6d4", + "4fb994c80da39f4f6fd0ff7f635e68ce08723210", + "592bd37efcb66e800276b712019ffc741b6010f6", + "ad456c0601f322ffaec228308289e38baa1892fd", + "47c2055f4d4d8ec7e4ce563ff1490ea3a705b9e1", + "b8126805b586afd886de92120aa4e24756f55a81", + "a47926fbd8423a68815cd4d510ef03ee136dcb35", + "b456805d55828564b57111e74ee041eee24f4367", + "86a28b48ddb495f5906962730935026723633236", + "835d341e0864af676b9e068a7d328f61a5497061", + "35af5903c03e247d87281f765e7fb9ae886cad34", + "a34b470a40cc7c7cd9ec6a6856c64c4171faacea", + "852a3078db17db902074e01f1c793163628ad6b1", + "3832f3a5ac5b399b9bdf9009ae10c4d509535771", + "ac8438bf9ec094599fb5ade592e214bb00f10491", + "9ec3a2b382630f71e72aaa03f31a88dd0be90a6c", + "95b212c995c7c35b0025a0879e9339528c5cf58b", + "6eea6ff11934d7ba92debfb1e2b79d5523fe31a7", + "06b3deb6022d8ad1efcc61ba4939effd5de8e69c", + "17ec45b50c68059aaaccee346f0bfda5a4bec2dc", + "ade6d78553a281c17ce10851241a178bf4c949aa", + "69808c61a27c8e46fa29c8832f56c135cafe60db", + "4a412a9b74eb6d96f0eba4746ee24a1600a86f12", + "9c9dcd3a11c268ffb93244aaad9e0c0bf2751b7a", + "2775d015b1b1be2929241460fb15c82980408547", + "1efc5de40a9e9597db1a1a0b2041bedf6596e3b9", + "573d09ed3b524af1d3bfe9d38943a0aee52a1143", + "fa6eb94e6f8ac039af58c1e811769ccb161d113e", + "332ec7fad41610531472240682be32b16ba3554d", + "173c415171a1f2a035a9ffb029b40e4524c970b5", + "6f6b2f6eec7b23f22908ba511d38f2818ec33c4a", + "dc2af2d67288eee1f5f1bd0cc1a2b593ea93a9d7" + ] + }, + "fc27d95861d56fe16a2b66150e31652b76e8c678": { + "state": "not_found", + "missingChunks": ["4319cc997e630ebf455e1129a9075098b76a0bc3"] + } +} diff --git a/tests/integration/debug_files/upload.rs b/tests/integration/debug_files/upload.rs index f2aab87ef0..5fb63b4b4d 100644 --- a/tests/integration/debug_files/upload.rs +++ b/tests/integration/debug_files/upload.rs @@ -604,3 +604,130 @@ fn chunk_upload_multiple_files_small_chunks() { "Uploaded chunks differ from the expected chunks" ); } + +#[test] +/// This test is similar to `chunk_upload_multiple_files_small_chunks`, but +/// here, only some of the chunks are missing. +/// Of the three files two be uploaded, one is missing all chunks, and two +/// are missing only some (including one file that is missing only one chunk). +/// We verify that only the missing chunks get uploaded. +fn chunk_upload_multiple_files_small_chunks_only_some() { + /// The chunk upload options specify that a single request should contain + /// at most 64 chunks. + const CHUNKS_PER_REQUEST: usize = 64; + + /// 303 chunks will be uploaded in total. + const TOTAL_CHUNKS: usize = 327; + + /// We expect the smallest number of requests that can be used to upload + /// all chunks, given the maximum number of chunks per request. + const EXPECTED_REQUESTS: usize = TOTAL_CHUNKS.div_ceil(CHUNKS_PER_REQUEST); + + /// This is the boundary used in the expected request file. + /// It was randomly generated when the expected request was recorded. + const EXPECTED_CHUNKS_BOUNDARY: &str = "------------------------7MEblR9wDkWDeus1Jn5Qwy"; + + // Store all chunks received at the chunk upload endpoint. + let received_chunks = Arc::new(Mutex::new(HashSet::>::new())); + let received_chunks_closure = received_chunks.clone(); + + let expected_chunks = fs::read( + "tests/integration/_expected_requests/debug_files/upload/chunk_upload_small_chunks_only_some.bin", + ) + .expect("expected chunks file should be present"); + + let is_first_assemble_call = AtomicBool::new(true); + + TestManager::new() + .mock_endpoint( + MockEndpointBuilder::new("GET", "/api/0/organizations/wat-org/chunk-upload/") + .with_response_file("debug_files/get-chunk-upload-small-chunks.json"), + ) + .mock_endpoint( + MockEndpointBuilder::new( + "POST", + "/api/0/projects/wat-org/wat-project/files/difs/assemble/", + ) + .with_header_matcher("content-type", "application/json") + .with_response_fn(move |_| { + if is_first_assemble_call.swap(false, Ordering::Relaxed) { + fs::read( + "tests/integration/_responses/debug_files/\ + assemble-chunk-upload-small-chunks-only-some-missing.json", + ) + .expect("first assemble response file should be present") + } else { + r#"{ + "6e217f035ed538d4d6c14129baad5cb52e680e74": { + "state": "created", + "missingChunks": [] + }, + "500848b7815119669a292f2ae1f44af11d7aa2d3": { + "state": "created", + "missingChunks": [] + }, + "fc27d95861d56fe16a2b66150e31652b76e8c678": { + "state": "created", + "missingChunks": [] + } + }"# + .into() + } + }) + .expect(2), + ) + .mock_endpoint( + MockEndpointBuilder::new("POST", "/api/0/organizations/wat-org/chunk-upload/") + .with_response_fn(move |request| { + let boundary = chunk_upload::boundary_from_request(request) + .expect("content-type header should be a valid multipart/form-data header"); + + let body = request.body().expect("body should be readable"); + + let chunks = chunk_upload::split_chunk_body(body, boundary) + .expect("body should be a valid multipart/form-data body"); + + // No single request should contain more than CHUNKS_PER_REQUEST chunks. + assert!(chunks.len() <= CHUNKS_PER_REQUEST); + + received_chunks_closure + .lock() + .expect("should be able to lock mutex") + .extend(chunks.into_iter().map(|chunk| chunk.into())); + + vec![] + }) + .expect(EXPECTED_REQUESTS), + ) + .assert_cmd(vec![ + "debug-files", + "upload", + "tests/integration/_fixtures/debug_files/upload/chunk_upload_multiple_files", + ]) + .with_default_token() + .run_and_assert(AssertCommand::Success); + + // For simplicity, even though multiple requests are expected, the expected chunks + // are all stored in a single file, which was generated by setting a larger maximum + // number of chunks per request when generating the expected request. + let expected_chunks = + chunk_upload::split_chunk_body(&expected_chunks, EXPECTED_CHUNKS_BOUNDARY) + .expect("expected chunks file should be a valid multipart/form-data body"); + + // Transform received chunks from a set of vectors to a set of slices. + let received_chunks_guard = received_chunks + .lock() + .expect("should be able to lock mutex"); + + let received_chunks: HashSet<_> = received_chunks_guard + .iter() + .map(|chunk| chunk.as_slice()) + .collect(); + + // Use assert! because in case of failure, the output with assert_eq! + // is too long to be useful. + assert!( + received_chunks == expected_chunks, + "Uploaded chunks differ from the expected chunks" + ); +}