)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"2fdd80cd07711a6d8cf205f1dbb3e7059d59f01b","unresolved":true,"context_lines":[{"line_number":26,"context_line":"bother reading/draining them (even when they might be empty/small)."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Drive-By: expand FakeSwift to enable test authors to extend the"},{"line_number":29,"context_line":"registered response for a request key from a common test setup setup into"},{"line_number":30,"context_line":"a \"list of registered responses\" by using \"register_next_response\" to"},{"line_number":31,"context_line":"just add the new/next response rather than forcing them to duplicate the"},{"line_number":32,"context_line":"initial response in the explicit list passed to \"register_responses\"."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"5c96b6c9_8d95ff43","line":29,"updated":"2023-10-24 05:15:22.000000000","message":"remove one from \"setup setup\"?","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1e1ee2a927c6a7241fc773e748d4910abbffcf15","unresolved":false,"context_lines":[{"line_number":26,"context_line":"bother reading/draining them (even when they might be empty/small)."},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Drive-By: expand FakeSwift to enable test authors to extend the"},{"line_number":29,"context_line":"registered response for a request key from a common test setup setup into"},{"line_number":30,"context_line":"a \"list of registered responses\" by using \"register_next_response\" to"},{"line_number":31,"context_line":"just add the new/next response rather than forcing them to duplicate the"},{"line_number":32,"context_line":"initial response in the explicit list passed to \"register_responses\"."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"22722223_4ae0ee06","line":29,"in_reply_to":"5c96b6c9_8d95ff43","updated":"2023-10-24 22:33:05.000000000","message":"Done","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"e6519029_d12ae8a6","updated":"2023-09-25 22:32:53.000000000","message":"I think there\u0027s some helpful stuff going on here?  The standardization of the json_etag vs slo_etag might be the least insane; in theory it should make it easier to add new tests:\n\nhttps://review.opendev.org/c/openstack/swift/+/894570","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"244fc1c156bc98424e37807deb9f42bfa0852bc5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"612dffa9_7394f759","updated":"2023-09-27 19:27:43.000000000","message":"i think the latest version is maybe ok-ish - it does what I want anyway; but I may do more.","commit_id":"66a0767aa57799a55ec0ad01cfe3efb68fed7c5c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"201dc257_62d5c90b","updated":"2023-09-28 16:03:51.000000000","message":"I feel like I need to find some way to wrangle this diff such that I can see what\u0027s actually changed between the new `_setup` helpers and the old monolithic `setUp` -- but maybe the fact that the edited tests do in fact pass is sufficient? This probably *is* a better general direction for SLO testing.","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"5b7c9c73_c8c891ee","updated":"2023-09-29 04:36:25.000000000","message":"I think the fact we\u0027re finding bugs is very encouraging!  nice work Tim!","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"afdc41ef_cb3f666c","in_reply_to":"201dc257_62d5c90b","updated":"2023-09-29 04:36:25.000000000","message":"yes, i think \"tests still pass; code didn\u0027t change\" says *something* - maybe a good deal since I didn\u0027t actually rip out any asserts and spot checking the asserts that DID change is actually finding BUGS by making the assertions more obvious.\n\nI\u0027ll kicked out the json_etag \u003d\u003e json_md5 change\n\ntomorrow I\u0027ll have a play with re-working the _setup methods to be independent and better named in an out-of-line follow-up.  Thanks for the encouragement!","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"d62f889ade8a7566507c7aae367624be3ffd7a28","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"14a77635_072a6f11","updated":"2023-10-06 20:41:52.000000000","message":"see 897468: sq: fix conditional non-slo after refetch | https://review.opendev.org/c/openstack/swift/+/897468 as example of how this cleanup is pointless and un-enforceable.  Maybe there\u0027s a better way than hoping for cultural absorpoint and adoption of test patterns?","commit_id":"80d0395514a5e45981483c84bfbdf5b40e5a58be"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"f5427d75e3de25ce54a064f99f6cc6b8564adad9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"4c83e44b_6531f2e2","updated":"2023-10-11 00:11:25.000000000","message":"I think I\u0027m only about half way done; but I think I\u0027ve got the new conditional tests squashed in from Al\u0027s follow-on to the refactor.  Still needs some more cleanup.","commit_id":"98c3642c0e6b787b98153d935c8373e8f38f860b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7271de42472ff93b6635a8017ce8468dd9885a79","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"934ddffc_1e807a76","updated":"2023-10-23 18:57:48.000000000","message":"i think we\u0027re getting there!","commit_id":"1a58470642da33a96d72a914c1d5a74dc1e19282"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ce4caf21d55d643e4fb9f69153adf9a94e21f7c1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"a766f2d7_1608cffe","updated":"2023-10-24 17:05:33.000000000","message":"thanks jian!\n\nwe discovered I added the register_responses interface a long time ago, but didn\u0027t originally use it I5ea62eb77ddcbc7cfebf903429f2ee4c098771c9 - then Tim picked it up for slo tests in I106b94c77da220c762869aa800c31b87c3dffeeb - but after this refactor it\u0027s no longer used!\n\nAl suggested it might be reasonable to dump the \"list of responses runs out\" behavior and just have FakeSwift always return the last registered response forever.  This would be consistent with the existing register interface if you only register one response.","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1e1ee2a927c6a7241fc773e748d4910abbffcf15","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"475a54e3_f684653b","updated":"2023-10-24 22:33:05.000000000","message":"I like removing register_reponses!  Let me know what you think.","commit_id":"fed2b3a511d2a681f481cbbc7f4ad5ebf444a7d4"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ec55234dc4b02dac5dd7f5998d40cacd0b909414","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"014861cc_47981e5c","updated":"2023-10-26 17:06:09.000000000","message":"This refactor patch looks great! All legacy format and new manifest format test cases got consolidated, much easier to read and maintain in future. I checked all previous test cases got refactored into the new patch and new patch adds more test cases too.","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"2cf0bc9b_4c70c864","updated":"2023-10-30 20:59:14.000000000","message":"I\u0027m really tempted to just merge this so it doesn\u0027t get *even **more*** unwieldy...","commit_id":"423a32924e43478bf587c48fc6f9cb71ab5e8ef7"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"dd476090_6de909ed","updated":"2023-11-01 17:12:05.000000000","message":"OK, I\u0027m close now -- couple lingering questions, but I *think* I\u0027ve convinced myself that we\u0027ve covered (almost) everything we covered before.","commit_id":"284bcc6802e63722881769426f358fd319629d3b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":15,"id":"90c743ae_fdf3caf0","updated":"2023-10-31 16:07:05.000000000","message":"sorry forgot to post these!","commit_id":"284bcc6802e63722881769426f358fd319629d3b"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"730ab919c098eda0072b6281609fbe749521b297","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"ca2b0b08_fa0316d1","updated":"2023-11-03 22:00:03.000000000","message":"recheck","commit_id":"3dab88bdf83eba339cd1a2d391b9e421ff2c5cf0"}],"swift/common/request_helpers.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"730ab919c098eda0072b6281609fbe749521b297","unresolved":true,"context_lines":[{"line_number":469,"context_line":""},{"line_number":470,"context_line":"        If ``bytes`` is None, no length verification will be done."},{"line_number":471,"context_line":""},{"line_number":472,"context_line":"        If ``first-byte`` and ``last-byte`` are None, then the entire object"},{"line_number":473,"context_line":"        will be fetched."},{"line_number":474,"context_line":""},{"line_number":475,"context_line":"    :param max_get_time: maximum permitted duration of a GET request (seconds)"}],"source_content_type":"text/x-python","patch_set":16,"id":"8f63b2f3_e4ec8784","line":472,"updated":"2023-11-03 22:00:03.000000000","message":"nit: when reading this line, I wonder what if only ``last-byte`` is None but ``first-byte`` is not. Probably iterator won\u0027t return this case.","commit_id":"3dab88bdf83eba339cd1a2d391b9e421ff2c5cf0"}],"test/unit/common/middleware/helpers.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"61d31b1f6013c9caf7a2cc4c9d5e2bdac43edfe2","unresolved":true,"context_lines":[{"line_number":338,"context_line":"                               response_class, headers, body\u003db\u0027\u0027):"},{"line_number":339,"context_line":"        path \u003d normalize_path(path)"},{"line_number":340,"context_line":"        next_response \u003d (response_class, headers, body)"},{"line_number":341,"context_line":"        self._responses[(method, path)].append(next_response)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"class FakeAppThatExcepts(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"54685b72_f2a3207d","line":341,"updated":"2023-10-25 04:34:56.000000000","message":"How about enhance this function a little bit, then it could be called before any register() gets called?\n\n if (method, path) not in self._responses:\n     self._responses[(method, path)] \u003d []\n self._responses[(method, path)].append(next_response)","commit_id":"fed2b3a511d2a681f481cbbc7f4ad5ebf444a7d4"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"b53c2db0bf4b45b316d3a44dcf7c9926dea0e2b2","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                               response_class, headers, body\u003db\u0027\u0027):"},{"line_number":339,"context_line":"        path \u003d normalize_path(path)"},{"line_number":340,"context_line":"        next_response \u003d (response_class, headers, body)"},{"line_number":341,"context_line":"        self._responses[(method, path)].append(next_response)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":""},{"line_number":344,"context_line":"class FakeAppThatExcepts(object):"}],"source_content_type":"text/x-python","patch_set":11,"id":"36f7ac16_ffe850ac","line":341,"in_reply_to":"54685b72_f2a3207d","updated":"2023-10-25 22:48:47.000000000","message":"not needed, since register() will be always called first.","commit_id":"fed2b3a511d2a681f481cbbc7f4ad5ebf444a7d4"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"9ea4bd663b3378507d8a710b5d6e72cb561a566d","unresolved":false,"context_lines":[{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def register(self, method, path, response_class, headers, body\u003db\u0027\u0027):"},{"line_number":338,"context_line":"        path \u003d normalize_path(path)"},{"line_number":339,"context_line":"        # many historical tests assume this is \"private\" attribute is a simple"},{"line_number":340,"context_line":"        # map of tuple \u003d\u003e tuple that they can go grubbing around in"},{"line_number":341,"context_line":"        self._responses[(method, path)] \u003d (response_class, headers, body)"},{"line_number":342,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"f01ba6ef_b7292ccb","line":339,"updated":"2023-10-26 05:47:38.000000000","message":"Got it, this is needed to maintain backward compatibility.","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    def register(self, method, path, response_class, headers, body\u003db\u0027\u0027):"},{"line_number":338,"context_line":"        path \u003d normalize_path(path)"},{"line_number":339,"context_line":"        # many historical tests assume this is \"private\" attribute is a simple"},{"line_number":340,"context_line":"        # map of tuple \u003d\u003e tuple that they can go grubbing around in"},{"line_number":341,"context_line":"        self._responses[(method, path)] \u003d (response_class, headers, body)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def register_next_response(self, method, path,"}],"source_content_type":"text/x-python","patch_set":13,"id":"e1981618_c191ecfc","line":340,"updated":"2023-10-30 20:59:14.000000000","message":"Good comment -- I was going to ask why we don\u0027t just say\n```\nself._responses[(method, path)] \u003d [(response_class, headers, body)]\n```\nI might still try that (it\u0027d simplify `_find_response` a bit, let us get rid of the `resp_or_resps` var entirely, and take all the weirdness out of `register_next_response`) but it needs to be a follow-up.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":337,"context_line":"    def register(self, method, path, response_class, headers, body\u003db\u0027\u0027):"},{"line_number":338,"context_line":"        path \u003d normalize_path(path)"},{"line_number":339,"context_line":"        # many historical tests assume this is \"private\" attribute is a simple"},{"line_number":340,"context_line":"        # map of tuple \u003d\u003e tuple that they can go grubbing around in"},{"line_number":341,"context_line":"        self._responses[(method, path)] \u003d (response_class, headers, body)"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"    def register_next_response(self, method, path,"}],"source_content_type":"text/x-python","patch_set":13,"id":"533e44b6_6a41aaef","line":340,"in_reply_to":"e1981618_c191ecfc","updated":"2023-10-31 16:07:05.000000000","message":"yeah, I say \"many historical\" ... but it\u0027s probalby like less than 10.  And they would probably all *benifit* from a \"update_next_response_headers\" iterface\n\n... but scope.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"}],"test/unit/common/middleware/test_helpers.py":[{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"2fdd80cd07711a6d8cf205f1dbb3e7059d59f01b","unresolved":true,"context_lines":[{"line_number":559,"context_line":"        self.assertEqual(\u0027Bar\u0027, resp.headers[\u0027X-Foo\u0027])"},{"line_number":560,"context_line":"        resp \u003d req.get_response(swift)"},{"line_number":561,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":562,"context_line":"        self.assertEqual(\u0027Baz\u0027, resp.headers[\u0027X-Foo\u0027])"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        with self.assertRaises(IndexError) as ctx:"},{"line_number":565,"context_line":"            resp \u003d req.get_response(swift)"}],"source_content_type":"text/x-python","patch_set":10,"id":"57666fa7_ad346ee7","line":562,"updated":"2023-10-24 05:15:22.000000000","message":"The description of this patch says: \"Drive-By: expand FakeSwift to enable test authors to extend the registered response for a request key from a common test setup setup into a \"list of registered responses\"...\"\n\nBut from this test case, it seems to me that register_responses() can already do this without the new added register_next_response()?","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1e1ee2a927c6a7241fc773e748d4910abbffcf15","unresolved":false,"context_lines":[{"line_number":559,"context_line":"        self.assertEqual(\u0027Bar\u0027, resp.headers[\u0027X-Foo\u0027])"},{"line_number":560,"context_line":"        resp \u003d req.get_response(swift)"},{"line_number":561,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":562,"context_line":"        self.assertEqual(\u0027Baz\u0027, resp.headers[\u0027X-Foo\u0027])"},{"line_number":563,"context_line":""},{"line_number":564,"context_line":"        with self.assertRaises(IndexError) as ctx:"},{"line_number":565,"context_line":"            resp \u003d req.get_response(swift)"}],"source_content_type":"text/x-python","patch_set":10,"id":"7131445b_1276c8d0","line":562,"in_reply_to":"57666fa7_ad346ee7","updated":"2023-10-24 22:33:05.000000000","message":"Ack","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"2fdd80cd07711a6d8cf205f1dbb3e7059d59f01b","unresolved":true,"context_lines":[{"line_number":572,"context_line":"        swift.register("},{"line_number":573,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":574,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Bar\u0027}, b\u0027stuff\u0027)"},{"line_number":575,"context_line":"        swift.register_next_response("},{"line_number":576,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":577,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Baz\u0027}, b\u0027other\u0027)"},{"line_number":578,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"f03fe989_37e07cc0","line":575,"updated":"2023-10-24 05:15:22.000000000","message":"I guess I really have fresh eyes on this patch, register() will return same response forever, register_next_response() is supposed to return registered response once, but when we call register() with register_next_response() followed, then register() becomes one time response too. It\u0027s not clear to me why this is intended behavior, I feel we should have those behaviors reflected on function names or FakeSwift class definitions.\n\nWhile I am not sure what\u0027s the intended changes for the new API yet, I feel we need more test cases, maybe in a follow-up patch?\n1. only call register_next_response(), make sure its responses will run out.\n2. call register_next_response() first, then call register()\n3. call register() and then call register_responses(); and vice verse.\n3. call register_responses() and then call register_next_response(); and vice verse.\n4. mixed usages of register(), register_responses() and register_next_response()","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"61d31b1f6013c9caf7a2cc4c9d5e2bdac43edfe2","unresolved":true,"context_lines":[{"line_number":572,"context_line":"        swift.register("},{"line_number":573,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":574,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Bar\u0027}, b\u0027stuff\u0027)"},{"line_number":575,"context_line":"        swift.register_next_response("},{"line_number":576,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":577,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Baz\u0027}, b\u0027other\u0027)"},{"line_number":578,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"f6f8c9ed_8e0356fb","line":575,"in_reply_to":"4d12a83f_8e98bbd3","updated":"2023-10-25 04:34:56.000000000","message":"the new interface looks great! and it doesn\u0027t need those many mixed test cases too. If we allow someone to call register_next_response() before calling any register(), we need another test case to cover that; otherwise, I am fine with leaving a comment on top of new API to ask users to always call register() first.","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"1e1ee2a927c6a7241fc773e748d4910abbffcf15","unresolved":true,"context_lines":[{"line_number":572,"context_line":"        swift.register("},{"line_number":573,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":574,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Bar\u0027}, b\u0027stuff\u0027)"},{"line_number":575,"context_line":"        swift.register_next_response("},{"line_number":576,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":577,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Baz\u0027}, b\u0027other\u0027)"},{"line_number":578,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"4d12a83f_8e98bbd3","line":575,"in_reply_to":"f03fe989_37e07cc0","updated":"2023-10-24 22:33:05.000000000","message":"@jian after rewriting this I only left the most basic FakeSwift/test_helpers checks for the multiple response handling, but you may still want to write up some additional test cases to convince yourself the behavior is obvious and works as expected - if you do I\u0027d be happy to squash them and if you spot a bug I\u0027ll definitely rework with more tests.","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"b53c2db0bf4b45b316d3a44dcf7c9926dea0e2b2","unresolved":false,"context_lines":[{"line_number":572,"context_line":"        swift.register("},{"line_number":573,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":574,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Bar\u0027}, b\u0027stuff\u0027)"},{"line_number":575,"context_line":"        swift.register_next_response("},{"line_number":576,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"},{"line_number":577,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Baz\u0027}, b\u0027other\u0027)"},{"line_number":578,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"91a038f6_36b83a30","line":575,"in_reply_to":"f6f8c9ed_8e0356fb","updated":"2023-10-25 22:48:47.000000000","message":"Ack","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"9ea4bd663b3378507d8a710b5d6e72cb561a566d","unresolved":false,"context_lines":[{"line_number":597,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":598,"context_line":"        self.assertEqual(\u0027Baz\u0027, resp.headers[\u0027X-Foo\u0027])"},{"line_number":599,"context_line":""},{"line_number":600,"context_line":"    def test_register_next_response_first(self):"},{"line_number":601,"context_line":"        # you can just use register_next_response"},{"line_number":602,"context_line":"        swift \u003d FakeSwift()"},{"line_number":603,"context_line":"        swift.register_next_response("}],"source_content_type":"text/x-python","patch_set":12,"id":"481ad9a3_214e947f","line":600,"updated":"2023-10-26 05:47:38.000000000","message":"Very complete tests! And it\u0027s flexible for authors to use too that they can call \u0027\u0027swift.register_next_response\u0027\u0027 first now.","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":546,"context_line":"            self.assertEqual(200, resp.status_int)"},{"line_number":547,"context_line":"            self.assertEqual(\u0027Baz\u0027, resp.headers[\u0027X-Foo\u0027])"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    def test_register_next_response_is_last_response_wins(self):"},{"line_number":550,"context_line":"        swift \u003d FakeSwift()"},{"line_number":551,"context_line":"        swift.register("},{"line_number":552,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"f94b3075_e5f14586","line":549,"updated":"2023-10-30 20:59:14.000000000","message":"Does this get us anything that isn\u0027t already covered by `test_register_next_response_keeps_current_registered_response` and `test_register_next_response_first`?\n\n¯\\\\\\_(ツ)\\_/¯ w/e","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":546,"context_line":"            self.assertEqual(200, resp.status_int)"},{"line_number":547,"context_line":"            self.assertEqual(\u0027Baz\u0027, resp.headers[\u0027X-Foo\u0027])"},{"line_number":548,"context_line":""},{"line_number":549,"context_line":"    def test_register_next_response_is_last_response_wins(self):"},{"line_number":550,"context_line":"        swift \u003d FakeSwift()"},{"line_number":551,"context_line":"        swift.register("},{"line_number":552,"context_line":"            \u0027GET\u0027, \u0027/v1/a/c/o\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"75572336_9e569daf","line":549,"in_reply_to":"f94b3075_e5f14586","updated":"2023-10-31 16:07:05.000000000","message":"Ack","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":577,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Bar\u0027}, b\u0027stuff\u0027)"},{"line_number":578,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"        # we get the registered response, obvoiusly"},{"line_number":581,"context_line":"        resp \u003d req.get_response(swift)"},{"line_number":582,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":583,"context_line":"        self.assertEqual(\u0027Bar\u0027, resp.headers[\u0027X-Foo\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"c24f7f88_e74df817","line":580,"range":{"start_line":580,"start_character":42,"end_line":580,"end_character":51},"updated":"2023-10-30 20:59:14.000000000","message":"nit: \"obviously\"","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":false,"context_lines":[{"line_number":577,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Bar\u0027}, b\u0027stuff\u0027)"},{"line_number":578,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"        # we get the registered response, obvoiusly"},{"line_number":581,"context_line":"        resp \u003d req.get_response(swift)"},{"line_number":582,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":583,"context_line":"        self.assertEqual(\u0027Bar\u0027, resp.headers[\u0027X-Foo\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"65cb09df_6325dbc3","line":580,"range":{"start_line":580,"start_character":42,"end_line":580,"end_character":51},"in_reply_to":"c24f7f88_e74df817","updated":"2023-10-31 03:50:07.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":577,"context_line":"            HTTPOk, {\u0027X-Foo\u0027: \u0027Bar\u0027}, b\u0027stuff\u0027)"},{"line_number":578,"context_line":"        req \u003d Request.blank(\u0027/v1/a/c/o\u0027)"},{"line_number":579,"context_line":""},{"line_number":580,"context_line":"        # we get the registered response, obvoiusly"},{"line_number":581,"context_line":"        resp \u003d req.get_response(swift)"},{"line_number":582,"context_line":"        self.assertEqual(200, resp.status_int)"},{"line_number":583,"context_line":"        self.assertEqual(\u0027Bar\u0027, resp.headers[\u0027X-Foo\u0027])"}],"source_content_type":"text/x-python","patch_set":13,"id":"aa25de39_96e58637","line":580,"range":{"start_line":580,"start_character":42,"end_line":580,"end_character":51},"in_reply_to":"c24f7f88_e74df817","updated":"2023-10-31 16:07:05.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"}],"test/unit/common/middleware/test_slo.py":[{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2016,"context_line":"              \u0027last_modified\u0027: \u00271970-01-01T00:00:00.000000\u0027}])"},{"line_number":2017,"context_line":"        self.bc_etag \u003d md5hex(_bc_manifest_json)"},{"line_number":2018,"context_line":"        self.app.register("},{"line_number":2019,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-bc\u0027,"},{"line_number":2020,"context_line":"            # proxy obj controller removes swift_bytes from content-type"},{"line_number":2021,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027text/plain\u0027,"},{"line_number":2022,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"c1754c8c_391b16c5","side":"PARENT","line":2019,"updated":"2023-09-25 22:32:53.000000000","message":"N.B. this manifest-bc had an extra sub-slo named d_10 (which in the other test was just a regular object)","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2042,"context_line":""},{"line_number":2043,"context_line":"    def test_get_raw_manifest(self):"},{"line_number":2044,"context_line":"        req \u003d Request.blank("},{"line_number":2045,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-bc\u0027"},{"line_number":2046,"context_line":"            \u0027?multipart-manifest\u003dget\u0026format\u003draw\u0027,"},{"line_number":2047,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027,"},{"line_number":2048,"context_line":"                     \u0027HTTP_ACCEPT\u0027: \u0027application/json\u0027})"}],"source_content_type":"text/x-python","patch_set":1,"id":"86b0dddf_34450ee3","side":"PARENT","line":2045,"updated":"2023-09-25 22:32:53.000000000","message":"definately did not love THIS manifest-bc being different from the OTHER manifest-bc","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2578,"context_line":"        self.assertEqual(status, \u0027206 Partial Content\u0027)"},{"line_number":2579,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u002715\u0027)"},{"line_number":2580,"context_line":"        self.assertEqual(headers[\u0027Content-Range\u0027], \u0027bytes 3-17/50\u0027)"},{"line_number":2581,"context_line":"        self.assertEqual(headers[\u0027Etag\u0027], \u0027\"%s\"\u0027 % self.manifest_abcd_etag)"},{"line_number":2582,"context_line":"        self.assertEqual(body, b\u0027aabbbbbbbbbbccc\u0027)"},{"line_number":2583,"context_line":""},{"line_number":2584,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":1,"id":"f4337058_6694bace","side":"PARENT","line":2581,"updated":"2023-09-25 22:32:53.000000000","message":"I don\u0027t love that this variable name has \"manifest\" and \"etag\" but is actually the \"slo_etag\"","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7271de42472ff93b6635a8017ce8468dd9885a79","unresolved":false,"context_lines":[{"line_number":2578,"context_line":"        self.assertEqual(status, \u0027206 Partial Content\u0027)"},{"line_number":2579,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u002715\u0027)"},{"line_number":2580,"context_line":"        self.assertEqual(headers[\u0027Content-Range\u0027], \u0027bytes 3-17/50\u0027)"},{"line_number":2581,"context_line":"        self.assertEqual(headers[\u0027Etag\u0027], \u0027\"%s\"\u0027 % self.manifest_abcd_etag)"},{"line_number":2582,"context_line":"        self.assertEqual(body, b\u0027aabbbbbbbbbbccc\u0027)"},{"line_number":2583,"context_line":""},{"line_number":2584,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":1,"id":"cd0f6003_9bef4809","side":"PARENT","line":2581,"in_reply_to":"64c4d18f_487ce92d","updated":"2023-10-23 18:57:48.000000000","message":"Done","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":true,"context_lines":[{"line_number":2578,"context_line":"        self.assertEqual(status, \u0027206 Partial Content\u0027)"},{"line_number":2579,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u002715\u0027)"},{"line_number":2580,"context_line":"        self.assertEqual(headers[\u0027Content-Range\u0027], \u0027bytes 3-17/50\u0027)"},{"line_number":2581,"context_line":"        self.assertEqual(headers[\u0027Etag\u0027], \u0027\"%s\"\u0027 % self.manifest_abcd_etag)"},{"line_number":2582,"context_line":"        self.assertEqual(body, b\u0027aabbbbbbbbbbccc\u0027)"},{"line_number":2583,"context_line":""},{"line_number":2584,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":1,"id":"64c4d18f_487ce92d","side":"PARENT","line":2581,"in_reply_to":"8c8ba2a1_8842c2e7","updated":"2023-09-29 04:36:25.000000000","message":"so slo_etag and json_md5 to make it super obvious which is which - i\u0027m onboard with that!","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":true,"context_lines":[{"line_number":2578,"context_line":"        self.assertEqual(status, \u0027206 Partial Content\u0027)"},{"line_number":2579,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u002715\u0027)"},{"line_number":2580,"context_line":"        self.assertEqual(headers[\u0027Content-Range\u0027], \u0027bytes 3-17/50\u0027)"},{"line_number":2581,"context_line":"        self.assertEqual(headers[\u0027Etag\u0027], \u0027\"%s\"\u0027 % self.manifest_abcd_etag)"},{"line_number":2582,"context_line":"        self.assertEqual(body, b\u0027aabbbbbbbbbbccc\u0027)"},{"line_number":2583,"context_line":""},{"line_number":2584,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":1,"id":"8c8ba2a1_8842c2e7","side":"PARENT","line":2581,"in_reply_to":"f4337058_6694bace","updated":"2023-09-28 16:03:51.000000000","message":"I think the idea was that it\u0027s the \"etag\" for the object \"manifest-abcd\" -- there\u0027s no `Slo-Etag` header.\n\nBut trying to make the difference more clear with `slo_etag` vs `json_etag` is probably good. Maybe I\u0027d even go with `json_md5`, and rely on it being generally understood that \"etag is the md5 of content (for non-large-objects)\"","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":4276,"context_line":"         \u0027bytes\u0027: 25},"},{"line_number":4277,"context_line":"        {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"},{"line_number":4278,"context_line":"         \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u002720\u0027}]"},{"line_number":4279,"context_line":"    slo_etag \u003d md5hex(\u0027\u0027.join(seg[\u0027hash\u0027] for seg in slo_data))"},{"line_number":4280,"context_line":""},{"line_number":4281,"context_line":"    def setUp(self):"},{"line_number":4282,"context_line":"        super(TestSloConditionalGetOldManifest, self).setUp()"}],"source_content_type":"text/x-python","patch_set":1,"id":"8df0bc80_80f74bbb","side":"PARENT","line":4279,"updated":"2023-09-25 22:32:53.000000000","message":"I find using a single TestCase class attribute very limiting, and this TestCase was later extended with an additional manifest setup as well.  I think we should avoid a TestCase being tied to a single manifest.","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":4314,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":4315,"context_line":"                          \u0027X-Object-Meta-Plant\u0027: \u0027Ficus\u0027,"},{"line_number":4316,"context_line":"                          \u0027Etag\u0027: md5hex(_bc_manifest_json)},"},{"line_number":4317,"context_line":"            _bc_manifest_json)"},{"line_number":4318,"context_line":""},{"line_number":4319,"context_line":"        _abcd_manifest_json \u003d json.dumps(self.slo_data)"},{"line_number":4320,"context_line":"        self.abcd_manifest_json_etag \u003d md5hex(_abcd_manifest_json)"}],"source_content_type":"text/x-python","patch_set":1,"id":"4fd8b9a4_2f306285","side":"PARENT","line":4317,"updated":"2023-09-25 22:32:53.000000000","message":"N.B. manifest-bc was never got with the new-style extra metadata; it might be useful to have an explicit manifest-legacy that NEVER has new-style metadata if a test wants to validate calculated_etag/size checks for legacy sub-slos on new manifests.","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":4316,"context_line":"                          \u0027Etag\u0027: md5hex(_bc_manifest_json)},"},{"line_number":4317,"context_line":"            _bc_manifest_json)"},{"line_number":4318,"context_line":""},{"line_number":4319,"context_line":"        _abcd_manifest_json \u003d json.dumps(self.slo_data)"},{"line_number":4320,"context_line":"        self.abcd_manifest_json_etag \u003d md5hex(_abcd_manifest_json)"},{"line_number":4321,"context_line":"        manifest_headers \u003d {"},{"line_number":4322,"context_line":"            \u0027Content-Length\u0027: str(len(_abcd_manifest_json)),"}],"source_content_type":"text/x-python","patch_set":1,"id":"e9d3ac91_ab5e53be","side":"PARENT","line":4319,"updated":"2023-09-25 22:32:53.000000000","message":"N.B. manifest-abcd was coupled with the class attr slo_data","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":4660,"context_line":"class TestSloConditionalGetNewManifest(TestSloConditionalGetOldManifest):"},{"line_number":4661,"context_line":"    def setUp(self):"},{"line_number":4662,"context_line":"        self.extra_manifest_headers \u003d {"},{"line_number":4663,"context_line":"            \u0027X-Object-Sysmeta-Slo-Etag\u0027: self.slo_etag,"},{"line_number":4664,"context_line":"            \u0027X-Object-Sysmeta-Slo-Size\u0027: \u002750\u0027,"},{"line_number":4665,"context_line":"        }"},{"line_number":4666,"context_line":"        super(TestSloConditionalGetNewManifest, self).setUp()"}],"source_content_type":"text/x-python","patch_set":1,"id":"1cd69f29_22627138","side":"PARENT","line":4663,"updated":"2023-09-25 22:32:53.000000000","message":"N.B. the weird coupling with the parent TestCase class attribute for manifest-abcd","commit_id":"fe30715d973581386a6838cc87311ad09314d1c4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":1904,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":1905,"context_line":"             # N.B. sub-slo-segments use slo-etag \u0026 slo-size"},{"line_number":1906,"context_line":"             \u0027hash\u0027: self.manifest_bc_slo_etag,"},{"line_number":1907,"context_line":"             \u0027bytes\u0027: self.manifest_bc_slo_size},"},{"line_number":1908,"context_line":"            {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"},{"line_number":1909,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u002720\u0027},"},{"line_number":1910,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":1,"id":"7d4d6d93_3a74cd4a","line":1907,"updated":"2023-09-25 22:32:53.000000000","message":"there\u0027s still a lot of coupling between these manifests, and the names don\u0027t do a good a great job describing what they are.","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":true,"context_lines":[{"line_number":1904,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":1905,"context_line":"             # N.B. sub-slo-segments use slo-etag \u0026 slo-size"},{"line_number":1906,"context_line":"             \u0027hash\u0027: self.manifest_bc_slo_etag,"},{"line_number":1907,"context_line":"             \u0027bytes\u0027: self.manifest_bc_slo_size},"},{"line_number":1908,"context_line":"            {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"},{"line_number":1909,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u002720\u0027},"},{"line_number":1910,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":1,"id":"8e527752_8d7fd5e7","line":1907,"in_reply_to":"7d4d6d93_3a74cd4a","updated":"2023-09-28 16:03:51.000000000","message":"Should we have `_setup_manifest_abcd` start off by calling `_setup_manifest_bc` to make that relationship/coupling more explicit?","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":true,"context_lines":[{"line_number":1904,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":1905,"context_line":"             # N.B. sub-slo-segments use slo-etag \u0026 slo-size"},{"line_number":1906,"context_line":"             \u0027hash\u0027: self.manifest_bc_slo_etag,"},{"line_number":1907,"context_line":"             \u0027bytes\u0027: self.manifest_bc_slo_size},"},{"line_number":1908,"context_line":"            {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"},{"line_number":1909,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u002720\u0027},"},{"line_number":1910,"context_line":"        ]"}],"source_content_type":"text/x-python","patch_set":1,"id":"60edc2ca_9e60204f","line":1907,"in_reply_to":"8e527752_8d7fd5e7","updated":"2023-09-29 04:36:25.000000000","message":"i debated this!  I was thinking the compromise would be something like:\n\n```\nif not getattr(self, \u0027manifest_bc_slo_size\u0027): _setup_manifest_bc\n```\n\nbut in actually working with this test code it often seemed to turn out what I really wanted was for the test setUp that was asking for _manifest_abcd to just also call _setup_manifest_bc\n\nI think I\u0027d be more likly to come around on \"the setups should be independent\"\n\nlike if you want a _setup_manifest_with_sub_slo\n\nit calls a _setup_manifest(\u0027sub-manifest\u0027, [\u0027b\u0027, \u0027c\u0027]), then creates a manifest with that new key as the sub-slo - independent from if the test case also needs it\u0027s own basic _setup_manifest(\u0027test\u0027, [\u0027b\u0027, \u0027c\u0027])","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2141,"context_line":"            \u0027X-Object-Sysmeta-Artisanal-Etag\u0027: \u0027bespoke\u0027,"},{"line_number":2142,"context_line":"            \u0027Etag\u0027: self.manifest_json_etag}"},{"line_number":2143,"context_line":"        self.slo_etag, self.slo_size \u003d self.maybe_add_modern_manifest_headers("},{"line_number":2144,"context_line":"            manifest_headers, manifest)"},{"line_number":2145,"context_line":"        self.app.register("},{"line_number":2146,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":2147,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"ad95da3d_9303b7f9","line":2144,"updated":"2023-09-25 22:32:53.000000000","message":"this is a pretty straight forward manifest, it could easily be ported to use one of the pre-existing `_setup_manifest_*` methods","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"244fc1c156bc98424e37807deb9f42bfa0852bc5","unresolved":false,"context_lines":[{"line_number":2141,"context_line":"            \u0027X-Object-Sysmeta-Artisanal-Etag\u0027: \u0027bespoke\u0027,"},{"line_number":2142,"context_line":"            \u0027Etag\u0027: self.manifest_json_etag}"},{"line_number":2143,"context_line":"        self.slo_etag, self.slo_size \u003d self.maybe_add_modern_manifest_headers("},{"line_number":2144,"context_line":"            manifest_headers, manifest)"},{"line_number":2145,"context_line":"        self.app.register("},{"line_number":2146,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027,"},{"line_number":2147,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"}],"source_content_type":"text/x-python","patch_set":1,"id":"b425c652_c886b8cc","line":2144,"in_reply_to":"ad95da3d_9303b7f9","updated":"2023-09-27 19:27:43.000000000","message":"I\u0027m going to pull it out as is; like I did for the raw manifest setups; and then in a follow-up I\u0027ll try to conslidate tests and rename manifests - see what folks think","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2267,"context_line":"    def setUp(self):"},{"line_number":2268,"context_line":"        super(TestSloGetRawManifest, self).setUp()"},{"line_number":2269,"context_line":"        self._setup_manifest_raw()"},{"line_number":2270,"context_line":"        self._setup_manifest_raw_ranges()"},{"line_number":2271,"context_line":""},{"line_number":2272,"context_line":"    def test_get_raw_manifest(self):"},{"line_number":2273,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":1,"id":"a4fd52a6_edba3f81","line":2270,"updated":"2023-09-25 22:32:53.000000000","message":"these are only used by this TestCase, they could have easily be ported to use a couple of the pre-eixisting `_setup_manifest_*` methods","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2436,"context_line":"            \u0027Etag\u0027: md5hex(_abcdefghijkl_manifest_json),"},{"line_number":2437,"context_line":"        }"},{"line_number":2438,"context_line":"        self.maybe_add_modern_manifest_headers(manifest_headers,"},{"line_number":2439,"context_line":"                                               _abcdefghijkl_manifest)"},{"line_number":2440,"context_line":"        self.app.register("},{"line_number":2441,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-abcdefghijkl\u0027,"},{"line_number":2442,"context_line":"            swob.HTTPOk, manifest_headers,"}],"source_content_type":"text/x-python","patch_set":1,"id":"465d629e_753c6a2a","line":2439,"updated":"2023-09-25 22:32:53.000000000","message":"since this is all green anyway in order to support the call to the setup headers helper maybe go ahead and extract it to a `_setup_manifest_*` method as well?","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"244fc1c156bc98424e37807deb9f42bfa0852bc5","unresolved":false,"context_lines":[{"line_number":2436,"context_line":"            \u0027Etag\u0027: md5hex(_abcdefghijkl_manifest_json),"},{"line_number":2437,"context_line":"        }"},{"line_number":2438,"context_line":"        self.maybe_add_modern_manifest_headers(manifest_headers,"},{"line_number":2439,"context_line":"                                               _abcdefghijkl_manifest)"},{"line_number":2440,"context_line":"        self.app.register("},{"line_number":2441,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-abcdefghijkl\u0027,"},{"line_number":2442,"context_line":"            swob.HTTPOk, manifest_headers,"}],"source_content_type":"text/x-python","patch_set":1,"id":"24543cac_91c8bff3","line":2439,"in_reply_to":"465d629e_753c6a2a","updated":"2023-09-27 19:27:43.000000000","message":"Done","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2444,"context_line":""},{"line_number":2445,"context_line":"        self._setup_manifest_bc_ranges()"},{"line_number":2446,"context_line":"        self._setup_manifest_abcd_ranges()"},{"line_number":2447,"context_line":"        self._setup_manifest_abcd_subranges()"},{"line_number":2448,"context_line":""},{"line_number":2449,"context_line":"        self.app.register("},{"line_number":2450,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-badjson\u0027,"}],"source_content_type":"text/x-python","patch_set":1,"id":"8f2dad88_7071ab36","line":2447,"updated":"2023-09-25 22:32:53.000000000","message":"the difference between manifest_abcd_ranges and manifest_abcd_subranges is NOT very clear from the names, nor the significiance that manifest_abcd means it has uses a sub-slo-segment (i.e. one segment is from manifest-bc)","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2688,"context_line":"            swob.HTTPOk, {\u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":2689,"context_line":"                          \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":2690,"context_line":"                          \u0027Etag\u0027: md5hex(_abcd_manifest_json_alt)},"},{"line_number":2691,"context_line":"            _abcd_manifest_json_alt)"},{"line_number":2692,"context_line":"        # verify correct content-length when the sub-slo segment in the"},{"line_number":2693,"context_line":"        # manifest has its actual object content-length appended as swift_bytes"},{"line_number":2694,"context_line":"        # to the content-type, and the submanifest length in the bytes field."}],"source_content_type":"text/x-python","patch_set":1,"id":"3307915d_0c7e47d8","line":2691,"updated":"2023-09-25 22:32:53.000000000","message":"I think it would largely be a good thing for individual `test_*` methods to call their own `_setup_manifest_*` methods for only which ever manifests they need.","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":2715,"context_line":"        self.assertEqual(status, \u0027206 Partial Content\u0027)"},{"line_number":2716,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u002715\u0027)"},{"line_number":2717,"context_line":"        self.assertEqual(headers[\u0027Content-Range\u0027], \u0027bytes 3-17/50\u0027)"},{"line_number":2718,"context_line":"        self.assertEqual(headers[\u0027Etag\u0027], \u0027\"%s\"\u0027 % self.manifest_abcd_slo_etag)"},{"line_number":2719,"context_line":"        self.assertEqual(body, b\u0027aabbbbbbbbbbccc\u0027)"},{"line_number":2720,"context_line":""},{"line_number":2721,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":1,"id":"60a9e7c2_a70978a2","line":2718,"updated":"2023-09-25 22:32:53.000000000","message":"... but at least the consistent naming means you can match the request object name (i.e. `manifest-abcd`) with what it is (i.e. `manifest-abcd`\u0027s \"slo_etag\")","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":3605,"context_line":"        expected_calls \u003d ["},{"line_number":3606,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027),"},{"line_number":3607,"context_line":"        ]"},{"line_number":3608,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":3609,"context_line":"            # Note the lack of recursive descent into manifest-bc. We know the"},{"line_number":3610,"context_line":"            # content-length from the outer manifest, so there\u0027s no need for"},{"line_number":3611,"context_line":"            # any submanifest fetching here, but a naïve implementation might"}],"source_content_type":"text/x-python","patch_set":1,"id":"e26c081d_51d44bb8","line":3608,"updated":"2023-09-25 22:32:53.000000000","message":"very few of the GET tests are effected by the [lack of] modern manifest headers - more of the tests may benifit from expected calls assertions tho","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"82f6b74672d4620374126ae22c9772f523d7265d","unresolved":true,"context_lines":[{"line_number":4442,"context_line":"            b\u0027d\u0027 * 20)"},{"line_number":4443,"context_line":""},{"line_number":4444,"context_line":"        self._setup_manifest_bc()"},{"line_number":4445,"context_line":"        self._setup_manifest_abcd()"},{"line_number":4446,"context_line":""},{"line_number":4447,"context_line":"    def test_if_none_match_matches(self):"},{"line_number":4448,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":1,"id":"5fdff7cf_3e2eb88a","line":4445,"updated":"2023-09-25 22:32:53.000000000","message":"finally a TestCase where the base class setup can be more-or-less re-used as is!","commit_id":"3f0fc2e70832d2f6192967b4852205c26d61c9bf"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"244fc1c156bc98424e37807deb9f42bfa0852bc5","unresolved":true,"context_lines":[{"line_number":3326,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:0-3;\u0027,"},{"line_number":3327,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:1-4;\u0027,"},{"line_number":3328,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:8-15;\u0027,"},{"line_number":3329,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:0-7;\u0027,"},{"line_number":3330,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:0-3;\u0027,"},{"line_number":3331,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:8-11;\u0027,"},{"line_number":3332,"context_line":"        ])), headers[\u0027Etag\u0027].strip(\u0027\"\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"3181e76c_d2dbb005","line":3329,"updated":"2023-09-27 19:27:43.000000000","message":"this looks weird to me, but the orignal definately test setup definately said:\n\n    self.bc_ranges_etag \u003d md5hex(_bc_ranges_manifest_json)\n    \n... and the test fails if I change it to the slo_etag.  Maybe sub-slo\u0027s (even ranged-sub-slo-segments) use the hash of the manifest?!","commit_id":"66a0767aa57799a55ec0ad01cfe3efb68fed7c5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7271de42472ff93b6635a8017ce8468dd9885a79","unresolved":false,"context_lines":[{"line_number":3326,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:0-3;\u0027,"},{"line_number":3327,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:1-4;\u0027,"},{"line_number":3328,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:8-15;\u0027,"},{"line_number":3329,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:0-7;\u0027,"},{"line_number":3330,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:0-3;\u0027,"},{"line_number":3331,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:8-11;\u0027,"},{"line_number":3332,"context_line":"        ])), headers[\u0027Etag\u0027].strip(\u0027\"\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"ed54de34_ed0a9774","line":3329,"in_reply_to":"2c4dd3d9_0214f496","updated":"2023-10-23 18:57:48.000000000","message":"Ack","commit_id":"66a0767aa57799a55ec0ad01cfe3efb68fed7c5c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":true,"context_lines":[{"line_number":3326,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:0-3;\u0027,"},{"line_number":3327,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:1-4;\u0027,"},{"line_number":3328,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:8-15;\u0027,"},{"line_number":3329,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:0-7;\u0027,"},{"line_number":3330,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:0-3;\u0027,"},{"line_number":3331,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:8-11;\u0027,"},{"line_number":3332,"context_line":"        ])), headers[\u0027Etag\u0027].strip(\u0027\"\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"ab849358_6cd8e5a4","line":3329,"in_reply_to":"3181e76c_d2dbb005","updated":"2023-09-28 16:03:51.000000000","message":"It\u0027s not clear to me that anyone really *uses* sub-slos, or sloranges for that matter...","commit_id":"66a0767aa57799a55ec0ad01cfe3efb68fed7c5c"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":true,"context_lines":[{"line_number":3326,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:0-3;\u0027,"},{"line_number":3327,"context_line":"            md5hex(\u0027a\u0027 * 5), \u0027:1-4;\u0027,"},{"line_number":3328,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:8-15;\u0027,"},{"line_number":3329,"context_line":"            self.manifest_bc_ranges_json_etag, \u0027:0-7;\u0027,"},{"line_number":3330,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:0-3;\u0027,"},{"line_number":3331,"context_line":"            md5hex(\u0027d\u0027 * 20), \u0027:8-11;\u0027,"},{"line_number":3332,"context_line":"        ])), headers[\u0027Etag\u0027].strip(\u0027\"\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"2c4dd3d9_0214f496","line":3329,"in_reply_to":"ab849358_6cd8e5a4","updated":"2023-09-29 04:36:25.000000000","message":"maybe you\u0027re right!","commit_id":"66a0767aa57799a55ec0ad01cfe3efb68fed7c5c"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":true,"context_lines":[{"line_number":1860,"context_line":"                segment_length \u003d int(seg_dict[\u0027bytes\u0027])"},{"line_number":1861,"context_line":"            calculated_size +\u003d segment_length"},{"line_number":1862,"context_line":"            hasher.update(segment_etag.encode())"},{"line_number":1863,"context_line":"        calculated_etag \u003d hasher.hexdigest()"},{"line_number":1864,"context_line":"        if self.modern_manifest_headers:"},{"line_number":1865,"context_line":"            headers.update({"},{"line_number":1866,"context_line":"                \u0027X-Object-Sysmeta-Slo-Etag\u0027: calculated_etag,"}],"source_content_type":"text/x-python","patch_set":3,"id":"350426e8_47099105","line":1863,"updated":"2023-09-28 16:03:51.000000000","message":"OK, so now tests have a less complete copy of https://github.com/openstack/swift/blob/2.32.0/swift/common/middleware/slo.py#L1353-L1364\n\nI\u0027m sure there are other (probably more egregious) examples of this in our tests, though... it just always bugs me a little. At least there are a few tests that will still blow up even if you apply something like\n```\ndiff --git a/swift/common/middleware/slo.py b/swift/common/middleware/slo.py\nindex 0f4a7b0a2..538c1aba8 100644\n--- a/swift/common/middleware/slo.py\n+++ b/swift/common/middleware/slo.py\n@@ -982,7 +982,7 @@ class SloGetContext(WSGIContext):\n                     r \u003d md5(seg_dict[\u0027raw_data\u0027],\n                             usedforsecurity\u003dFalse).hexdigest()\n                 elif seg_dict.get(\u0027range\u0027):\n-                    r \u003d \u0027%s:%s;\u0027 % (seg_dict[\u0027hash\u0027], seg_dict[\u0027range\u0027])\n+                    r \u003d \u0027%s:%s#\u0027 % (seg_dict[\u0027hash\u0027], seg_dict[\u0027range\u0027])\n                 else:\n                     r \u003d seg_dict[\u0027hash\u0027]\n                 calculated_etag.update(r.encode(\u0027ascii\u0027))\n@@ -1356,7 +1356,7 @@ class StaticLargeObject(object):\n                     raw_data \u003d base64.b64decode(seg_data[\u0027data\u0027])\n                     r \u003d md5(raw_data, usedforsecurity\u003dFalse).hexdigest()\n                 elif seg_data.get(\u0027range\u0027):\n-                    r \u003d \u0027%s:%s;\u0027 % (seg_data[\u0027hash\u0027], seg_data[\u0027range\u0027])\n+                    r \u003d \u0027%s:%s#\u0027 % (seg_data[\u0027hash\u0027], seg_data[\u0027range\u0027])\n                 else:\n                     r \u003d seg_data[\u0027hash\u0027]\n                 slo_etag.update(r.encode(\u0027ascii\u0027) if six.PY3 else r)\ndiff --git a/test/unit/common/middleware/test_slo.py b/test/unit/common/middleware/test_slo.py\nindex 03624019c..974cc6eb5 100644\n--- a/test/unit/common/middleware/test_slo.py\n+++ b/test/unit/common/middleware/test_slo.py\n@@ -1853,7 +1853,7 @@ class SloGETorHEADTestCase(SloTestCase):\n         for seg_dict in manifest:\n             segment_etag \u003d seg_dict[\u0027hash\u0027]\n             if \u0027range\u0027 in seg_dict:\n-                segment_etag +\u003d \u0027:%s;\u0027 % seg_dict[\u0027range\u0027]\n+                segment_etag +\u003d \u0027:%s#\u0027 % seg_dict[\u0027range\u0027]\n                 start, end \u003d seg_dict[\u0027range\u0027].split(\u0027-\u0027)\n                 segment_length \u003d int(end) - int(start) + 1\n             else:\n```","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":true,"context_lines":[{"line_number":1860,"context_line":"                segment_length \u003d int(seg_dict[\u0027bytes\u0027])"},{"line_number":1861,"context_line":"            calculated_size +\u003d segment_length"},{"line_number":1862,"context_line":"            hasher.update(segment_etag.encode())"},{"line_number":1863,"context_line":"        calculated_etag \u003d hasher.hexdigest()"},{"line_number":1864,"context_line":"        if self.modern_manifest_headers:"},{"line_number":1865,"context_line":"            headers.update({"},{"line_number":1866,"context_line":"                \u0027X-Object-Sysmeta-Slo-Etag\u0027: calculated_etag,"}],"source_content_type":"text/x-python","patch_set":3,"id":"26217d58_aa0b85ce","line":1863,"in_reply_to":"350426e8_47099105","updated":"2023-09-29 04:36:25.000000000","message":"I actually wouldn\u0027t be opposed to pulling the manifest hash calculation into it\u0027s on tested helper and then re-using in these tests - very few of them are really about getting the etag correct (they more often are just making sure we have the manifest\u0027s json_etag or slo_etag - and in many cases had written down stub values)","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":true,"context_lines":[{"line_number":1869,"context_line":"        return calculated_etag, calculated_size"},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":"    def tearDown(self):"},{"line_number":1872,"context_line":"        # SloTestCase always has an app"},{"line_number":1873,"context_line":"        self.assertEqual(self.app.unclosed_requests, {})"},{"line_number":1874,"context_line":""},{"line_number":1875,"context_line":"    def _setup_manifest_bc(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"57e165ed_49453119","line":1872,"updated":"2023-09-28 16:03:51.000000000","message":"I take it `SloTestCase` *sometimes* leaves a request to 499? I wonder if it\u0027d look better to put something like\n```\n    def tearDown(self):\n        self.assertEqual(self.app.unclosed_requests,\n                         self.expected_unclosed_requests)\n\n    def expectToLeaveOpen(self, method, path):\n        self.expected_unclosed_requests.setdefault((method, path), 0)\n        self.expected_unclosed_requests[(method, path)] +\u003d 1\n```\nin `SloTestCase` and have the tests that exercise it register their expectations...","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":true,"context_lines":[{"line_number":1869,"context_line":"        return calculated_etag, calculated_size"},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":"    def tearDown(self):"},{"line_number":1872,"context_line":"        # SloTestCase always has an app"},{"line_number":1873,"context_line":"        self.assertEqual(self.app.unclosed_requests, {})"},{"line_number":1874,"context_line":""},{"line_number":1875,"context_line":"    def _setup_manifest_bc(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7d9e8e0e_68421d93","line":1872,"in_reply_to":"57e165ed_49453119","updated":"2023-09-29 04:36:25.000000000","message":"actually ALL tests already close requests - as they should, as any un-closed request is bug - but now we have an assert to keep us honest.\n\nyou\u0027re thinking of un-read requests - which do show up in the follow up about \"drain more manifests\" and the few cases that log 499s handle their exceptions basically as you describe.","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7271de42472ff93b6635a8017ce8468dd9885a79","unresolved":false,"context_lines":[{"line_number":1869,"context_line":"        return calculated_etag, calculated_size"},{"line_number":1870,"context_line":""},{"line_number":1871,"context_line":"    def tearDown(self):"},{"line_number":1872,"context_line":"        # SloTestCase always has an app"},{"line_number":1873,"context_line":"        self.assertEqual(self.app.unclosed_requests, {})"},{"line_number":1874,"context_line":""},{"line_number":1875,"context_line":"    def _setup_manifest_bc(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"2fc9be6e_4ba7f775","line":1872,"in_reply_to":"7d9e8e0e_68421d93","updated":"2023-10-23 18:57:48.000000000","message":"Done","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":true,"context_lines":[{"line_number":2025,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2026,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":2027,"context_line":"             # XXX why does this use the json_etag!?"},{"line_number":2028,"context_line":"             \u0027hash\u0027: self.manifest_bc_ranges_json_etag,"},{"line_number":2029,"context_line":"             \u0027bytes\u0027: 16,"},{"line_number":2030,"context_line":"             \u0027range\u0027: \u00278-15\u0027},"},{"line_number":2031,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"}],"source_content_type":"text/x-python","patch_set":3,"id":"18511eb4_1ea526cb","line":2028,"updated":"2023-09-28 16:03:51.000000000","message":"Yeah, that\u0027s a red flag -- especially given how manifest-abcd segment referring to manifest-bc uses the SLO\u0027s etag (not the manifest\u0027s)\n\nhttps://bugs.launchpad.net/swift/+bug/2037662","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"4bfb967dc75f7c33497004f4ddfc7de571fcfdb5","unresolved":true,"context_lines":[{"line_number":2025,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2026,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":2027,"context_line":"             # XXX why does this use the json_etag!?"},{"line_number":2028,"context_line":"             \u0027hash\u0027: self.manifest_bc_ranges_json_etag,"},{"line_number":2029,"context_line":"             \u0027bytes\u0027: 16,"},{"line_number":2030,"context_line":"             \u0027range\u0027: \u00278-15\u0027},"},{"line_number":2031,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"}],"source_content_type":"text/x-python","patch_set":3,"id":"2f604f93_f5eda067","line":2028,"in_reply_to":"18511eb4_1ea526cb","updated":"2023-09-29 04:36:25.000000000","message":"gah, good eye - nice catch","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7271de42472ff93b6635a8017ce8468dd9885a79","unresolved":false,"context_lines":[{"line_number":2025,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2026,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":2027,"context_line":"             # XXX why does this use the json_etag!?"},{"line_number":2028,"context_line":"             \u0027hash\u0027: self.manifest_bc_ranges_json_etag,"},{"line_number":2029,"context_line":"             \u0027bytes\u0027: 16,"},{"line_number":2030,"context_line":"             \u0027range\u0027: \u00278-15\u0027},"},{"line_number":2031,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"}],"source_content_type":"text/x-python","patch_set":3,"id":"e65b07b2_8e934b52","line":2028,"in_reply_to":"2f604f93_f5eda067","updated":"2023-10-23 18:57:48.000000000","message":"Ack","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"122ecd052d969d1548b0f7d0a64c80dec6624d32","unresolved":true,"context_lines":[{"line_number":2031,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2032,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":2033,"context_line":"             \u0027hash\u0027: self.manifest_bc_ranges_json_etag,"},{"line_number":2034,"context_line":"             \u0027bytes\u0027: self.manifest_bc_ranges_json_size,"},{"line_number":2035,"context_line":"             \u0027range\u0027: \u00270-7\u0027},"},{"line_number":2036,"context_line":"            {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"},{"line_number":2037,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u002720\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"aebb4bca_ab05aa3a","line":2034,"updated":"2023-09-28 16:03:51.000000000","message":"Another red flag...","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7271de42472ff93b6635a8017ce8468dd9885a79","unresolved":false,"context_lines":[{"line_number":2031,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc-ranges\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2032,"context_line":"             \u0027content_type\u0027: \u0027application/json\u0027,"},{"line_number":2033,"context_line":"             \u0027hash\u0027: self.manifest_bc_ranges_json_etag,"},{"line_number":2034,"context_line":"             \u0027bytes\u0027: self.manifest_bc_ranges_json_size,"},{"line_number":2035,"context_line":"             \u0027range\u0027: \u00270-7\u0027},"},{"line_number":2036,"context_line":"            {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"},{"line_number":2037,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u002720\u0027,"}],"source_content_type":"text/x-python","patch_set":3,"id":"241872c5_2aed5f56","line":2034,"in_reply_to":"aebb4bca_ab05aa3a","updated":"2023-10-23 18:57:48.000000000","message":"Ack","commit_id":"fb30f6803920075cd006009c2618a67aec32815d"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d1946f60689a8ca570c650ac94095853798a42c6","unresolved":true,"context_lines":[{"line_number":1910,"context_line":"        manifest_headers \u003d {"},{"line_number":1911,"context_line":"            \u0027Content-Length\u0027: str(len(manifest_json)),"},{"line_number":1912,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1913,"context_line":"            \u0027Etag\u0027: json_md5,"},{"line_number":1914,"context_line":"        }"},{"line_number":1915,"context_line":"        if extra_headers is not None:"},{"line_number":1916,"context_line":"            manifest_headers.update(extra_headers)"}],"source_content_type":"text/x-python","patch_set":6,"id":"805a6b87_a8f65a51","line":1913,"updated":"2023-10-14 00:06:51.000000000","message":"We should probably register *some* kind of `Content-Type` for the large object -- otherwise it looks like `swob.Response` [will default it to `text/html`](https://github.com/openstack/swift/blob/master/swift/common/swob.py#L1261-L1262) which seems like a strange default...","commit_id":"e2728c190faed546fe3667d189d3c01d78a06fb5"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"7271de42472ff93b6635a8017ce8468dd9885a79","unresolved":false,"context_lines":[{"line_number":1910,"context_line":"        manifest_headers \u003d {"},{"line_number":1911,"context_line":"            \u0027Content-Length\u0027: str(len(manifest_json)),"},{"line_number":1912,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"},{"line_number":1913,"context_line":"            \u0027Etag\u0027: json_md5,"},{"line_number":1914,"context_line":"        }"},{"line_number":1915,"context_line":"        if extra_headers is not None:"},{"line_number":1916,"context_line":"            manifest_headers.update(extra_headers)"}],"source_content_type":"text/x-python","patch_set":6,"id":"4b1b9472_09d037ef","line":1913,"in_reply_to":"805a6b87_a8f65a51","updated":"2023-10-23 18:57:48.000000000","message":"Done","commit_id":"e2728c190faed546fe3667d189d3c01d78a06fb5"},{"author":{"_account_id":34892,"name":"ASHWIN A NAIR","display_name":"indianwhocodes","email":"nairashwin952013@gmail.com","username":"indianwhocodes","status":"Nvidia"},"change_message_id":"6eb4961761e6e0626d210cba8d19f7d35a47ed3a","unresolved":false,"context_lines":[{"line_number":1960,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/%s/%s\u0027 % (container, obj_key),"},{"line_number":1961,"context_line":"            swob.HTTPOk, manifest_headers, manifest_json.encode(\u0027ascii\u0027))"},{"line_number":1962,"context_line":""},{"line_number":1963,"context_line":"    def _setup_manifest_bc(self):"},{"line_number":1964,"context_line":"        \"\"\""},{"line_number":1965,"context_line":"        This manifest\u0027s segments are all regular objects."},{"line_number":1966,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":10,"id":"c8d1e85a_d788b505","line":1963,"updated":"2023-10-24 20:57:02.000000000","message":"Thse helper manigfest methods are immensely helpful, I have leveraged parts of them in my part-num api support patch , ref: https://review.opendev.org/c/openstack/swift/+/894570/36/test/unit/common/middleware/test_slo.py#5582","commit_id":"a9ea4dab195a6b1d8c5322ba543ecade90047e24"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"9ea4bd663b3378507d8a710b5d6e72cb561a566d","unresolved":false,"context_lines":[{"line_number":1914,"context_line":"        \"\"\""},{"line_number":1915,"context_line":"        This helper should be used to create manifests that have descriptive"},{"line_number":1916,"context_line":"        names you can reference in tests.  Think of manifests as having"},{"line_number":1917,"context_line":"        \"personalities\" - you should get to known them over the course of a few"},{"line_number":1918,"context_line":"        test methods; you can share them between TestCases.  When you want to"},{"line_number":1919,"context_line":"        test something on a SLO with a slightly different manifest resist the"},{"line_number":1920,"context_line":"        temptation to update an existing manifest; just create a new"}],"source_content_type":"text/x-python","patch_set":12,"id":"2d633ce5_d141a51b","line":1917,"updated":"2023-10-26 05:47:38.000000000","message":"I like those comments, clear and delightful to read.","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"9ea4bd663b3378507d8a710b5d6e72cb561a566d","unresolved":false,"context_lines":[{"line_number":2223,"context_line":""},{"line_number":2224,"context_line":"    def setUp(self):"},{"line_number":2225,"context_line":"        super(TestSloHeadOldManifest, self).setUp()"},{"line_number":2226,"context_line":"        self._setup_alphabet_objects(\u0027abcd\u0027)"},{"line_number":2227,"context_line":"        self._setup_manifest_bc()"},{"line_number":2228,"context_line":"        self._setup_manifest_abcd()"},{"line_number":2229,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"d292cda6_43a087e7","line":2226,"updated":"2023-10-26 05:47:38.000000000","message":"Wow, this is so much better in terms of readability!","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"9ea4bd663b3378507d8a710b5d6e72cb561a566d","unresolved":false,"context_lines":[{"line_number":2243,"context_line":"        self.assertEqual(headers[\u0027X-Manifest-Etag\u0027], self.manifest_json_etag)"},{"line_number":2244,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u0027300\u0027)"},{"line_number":2245,"context_line":"        self.assertEqual(headers[\u0027Content-Type\u0027], \u0027test/data\u0027)"},{"line_number":2246,"context_line":"        self.assertEqual(headers[\u0027X-Static-Large-Object\u0027], \u0027true\u0027)"},{"line_number":2247,"context_line":"        self.assertEqual(body, b\u0027\u0027)  # it\u0027s a HEAD request, after all"},{"line_number":2248,"context_line":""},{"line_number":2249,"context_line":"        expected_app_calls \u003d [(\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)]"}],"source_content_type":"text/x-python","patch_set":12,"id":"c10f824a_2ac2ccfc","line":2246,"updated":"2023-10-26 05:47:38.000000000","message":"good catch.","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"9ea4bd663b3378507d8a710b5d6e72cb561a566d","unresolved":true,"context_lines":[{"line_number":2249,"context_line":"        expected_app_calls \u003d [(\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)]"},{"line_number":2250,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":2251,"context_line":"            expected_app_calls.append((\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027))"},{"line_number":2252,"context_line":"            # XXX slo isn\u0027t draining the orig resp_iter after refetch"},{"line_number":2253,"context_line":"            self.expected_unread_requests["},{"line_number":2254,"context_line":"                (\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)] \u003d 1"},{"line_number":2255,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"}],"source_content_type":"text/x-python","patch_set":12,"id":"1ff97da5_3cfefa2d","line":2252,"updated":"2023-10-26 05:47:38.000000000","message":"if ``expected_unread_requests`` is removed, test will fail. I wonder why original test case didn\u0027t need this?\n\n```Traceback (most recent call last):\n  File \"/vagrant/swift/test/unit/common/middleware/test_slo.py\", line 1885, in tearDown\n    self.assertEqual(self.app.unread_requests,\nAssertionError: {(\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027): 1} !\u003d {}```\n```- {(\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027): 1}```\n```+ {}```","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":2249,"context_line":"        expected_app_calls \u003d [(\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)]"},{"line_number":2250,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":2251,"context_line":"            expected_app_calls.append((\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027))"},{"line_number":2252,"context_line":"            # XXX slo isn\u0027t draining the orig resp_iter after refetch"},{"line_number":2253,"context_line":"            self.expected_unread_requests["},{"line_number":2254,"context_line":"                (\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)] \u003d 1"},{"line_number":2255,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"}],"source_content_type":"text/x-python","patch_set":12,"id":"7c02867d_c07ddc4e","line":2252,"in_reply_to":"1ff97da5_3cfefa2d","updated":"2023-10-30 20:59:14.000000000","message":"We only just added the assertions on `self.app.unread_requests` to `tearDwon` in this patch.","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":2249,"context_line":"        expected_app_calls \u003d [(\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)]"},{"line_number":2250,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":2251,"context_line":"            expected_app_calls.append((\u0027GET\u0027, \u0027/v1/AUTH_test/headtest/man\u0027))"},{"line_number":2252,"context_line":"            # XXX slo isn\u0027t draining the orig resp_iter after refetch"},{"line_number":2253,"context_line":"            self.expected_unread_requests["},{"line_number":2254,"context_line":"                (\u0027HEAD\u0027, \u0027/v1/AUTH_test/headtest/man\u0027)] \u003d 1"},{"line_number":2255,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"}],"source_content_type":"text/x-python","patch_set":12,"id":"97323ab3_c7bd26f0","line":2252,"in_reply_to":"7c02867d_c07ddc4e","updated":"2023-10-31 16:07:05.000000000","message":"Ack","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":34930,"name":"Jianjian Huo","email":"jhuo@nvidia.com","username":"jhuo"},"change_message_id":"ec55234dc4b02dac5dd7f5998d40cacd0b909414","unresolved":false,"context_lines":[{"line_number":3043,"context_line":"        # new swift would have ignored the range and got the whole"},{"line_number":3044,"context_line":"        # manifest on the first try and therefore never have attempted"},{"line_number":3045,"context_line":"        # this second refetch which fails"},{"line_number":3046,"context_line":"        self.app.register_next_response("},{"line_number":3047,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/big_manifest\u0027,"},{"line_number":3048,"context_line":"            swob.HTTPNotFound, {}, None)"},{"line_number":3049,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3ede902c_fc558e8f","line":3046,"updated":"2023-10-26 17:06:09.000000000","message":"register_next_response() can be used alone, nice!","commit_id":"c369279574715f5490fc753adc3a2d649e73a31b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":2369,"context_line":"        self.assertIn((\u0027Etag\u0027, md5hex(body)), headers)"},{"line_number":2370,"context_line":""},{"line_number":2371,"context_line":"    def test_get_nonmanifest_passthrough(self):"},{"line_number":2372,"context_line":"        req \u003d Request.blank("},{"line_number":2373,"context_line":"            \u0027/v1/AUTH_test/gettest/a_5\u0027,"},{"line_number":2374,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":2375,"context_line":"        status, headers, body \u003d self.call_slo(req)"}],"source_content_type":"text/x-python","patch_set":13,"id":"9ecc2ab4_3a834c96","side":"PARENT","line":2372,"updated":"2023-10-30 20:59:14.000000000","message":"Moved to `TestSloConditionalGetOldManifest.test_get_nonmanifest_passthrough`","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":2377,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":2378,"context_line":"        self.assertEqual(body, b\u0027aaaaa\u0027)"},{"line_number":2379,"context_line":""},{"line_number":2380,"context_line":"    def test_get_invalid_sysmeta_passthrough(self):"},{"line_number":2381,"context_line":"        # in an attempt to workaround lp bug#2035158 s3api used to set some"},{"line_number":2382,"context_line":"        # invalid slo/s3api sysmeta, we will always have some data stored with"},{"line_number":2383,"context_line":"        # empty values for these headers, but they\u0027re not SLOs and are missing"}],"source_content_type":"text/x-python","patch_set":13,"id":"49679da8_310578c1","side":"PARENT","line":2380,"updated":"2023-10-30 20:59:14.000000000","message":"OK, this moved to `TestSloErrors.test_get_invalid_sysmeta_passthrough`","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":2422,"context_line":"        self.assertFalse("},{"line_number":2423,"context_line":"            \"SLO MultipartGET\" in first_ua)"},{"line_number":2424,"context_line":""},{"line_number":2425,"context_line":"    def test_get_manifest_repeated_segments(self):"},{"line_number":2426,"context_line":"        _aabbccdd_manifest_json \u003d json.dumps("},{"line_number":2427,"context_line":"            [{\u0027name\u0027: \u0027/gettest/a_5\u0027, \u0027hash\u0027: md5hex(\"a\" * 5),"},{"line_number":2428,"context_line":"              \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u00275\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"6291d420_614a3118","side":"PARENT","line":2425,"updated":"2023-10-30 20:59:14.000000000","message":"Just a rename","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":2455,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-aabbccdd\u0027,"},{"line_number":2456,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027})"},{"line_number":2457,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":2458,"context_line":"        headers \u003d HeaderKeyDict(headers)"},{"line_number":2459,"context_line":""},{"line_number":2460,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":2461,"context_line":"        self.assertEqual(body, ("}],"source_content_type":"text/x-python","patch_set":13,"id":"5ea9ec05_c028690c","side":"PARENT","line":2458,"updated":"2023-10-30 20:59:14.000000000","message":"Oh, funny -- looks like we never used this previously, but the conversion to `HeaderKeyDict` prevented flake8 from complaining about the unused var?","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":2551,"context_line":"        self.assertEqual("},{"line_number":2552,"context_line":"            body, b\u0027aaaaabbbbbbbbbbcccccccccccccccdddddddddddddddddddd\u0027)"},{"line_number":2553,"context_line":""},{"line_number":2554,"context_line":"    def test_get_manifest_with_submanifest_bytes_in_content_type(self):"},{"line_number":2555,"context_line":"        # verify correct content-length when the sub-slo segment in the"},{"line_number":2556,"context_line":"        # manifest has its actual object content-length appended as swift_bytes"},{"line_number":2557,"context_line":"        # to the content-type, and the submanifest length in the bytes field."}],"source_content_type":"text/x-python","patch_set":13,"id":"4fc14524_858f1c18","side":"PARENT","line":2554,"updated":"2023-10-30 20:59:14.000000000","message":"OK, moved to `TestSloGetOldManifests.test_get_manifest_with_submanifest_bytes_in_content_type` (though, see notes there)","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":3315,"context_line":"        self.assertEqual(self.app.swift_sources[1:],"},{"line_number":3316,"context_line":"                         [\u0027SLO\u0027] * (len(self.app.swift_sources) - 1))"},{"line_number":3317,"context_line":""},{"line_number":3318,"context_line":"    def test_old_swift_range_get_includes_whole_range_manifest(self):"},{"line_number":3319,"context_line":"        self.app.can_ignore_range \u003d False"},{"line_number":3320,"context_line":"        # If the first range GET results in retrieval of the entire manifest"},{"line_number":3321,"context_line":"        # body (and not because of X-Backend-Ignore-Range-If-Metadata-Present,"}],"source_content_type":"text/x-python","patch_set":13,"id":"17189433_af2e7ba7","side":"PARENT","line":3318,"updated":"2023-10-30 20:59:14.000000000","message":"Moved to `TestOldSwiftWithRanges.test_old_swift_range_get_includes_whole_range_manifest`","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":3452,"context_line":"        close_method()"},{"line_number":3453,"context_line":"        self.assertEqual(0, leaks[0])"},{"line_number":3454,"context_line":""},{"line_number":3455,"context_line":"    def test_head_manifest_is_efficient(self):"},{"line_number":3456,"context_line":"        req \u003d Request.blank("},{"line_number":3457,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":3458,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027HEAD\u0027})"}],"source_content_type":"text/x-python","patch_set":13,"id":"63bfe1b5_42cc5254","side":"PARENT","line":3455,"updated":"2023-10-30 20:59:14.000000000","message":"Moved to `TestSloHeadOldManifest.test_head_manifest_is_efficient`","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":3649,"context_line":"            \"max recursion depth was exceeded\""},{"line_number":3650,"context_line":"        ])"},{"line_number":3651,"context_line":""},{"line_number":3652,"context_line":"    def test_get_with_if_modified_since(self):"},{"line_number":3653,"context_line":"        # It\u0027s important not to pass the If-[Un]Modified-Since header to the"},{"line_number":3654,"context_line":"        # proxy for segment or submanifest GET requests, as it may result in"},{"line_number":3655,"context_line":"        # 304 Not Modified responses, and those don\u0027t contain any useful data."}],"source_content_type":"text/x-python","patch_set":13,"id":"015e327b_2a83181f","side":"PARENT","line":3652,"updated":"2023-10-30 20:59:14.000000000","message":"Moved to `TestSloConditionalGetOldManifest.test_get_with_if_modified_since` (I think)","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":4355,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4356,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4357,"context_line":""},{"line_number":4358,"context_line":"    def test_if_none_match_does_not_match(self):"},{"line_number":4359,"context_line":"        req \u003d Request.blank("},{"line_number":4360,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4361,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"c038afb8_28d4a024","side":"PARENT","line":4358,"updated":"2023-10-30 20:59:14.000000000","message":"Just renamed.","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":4409,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4410,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4411,"context_line":""},{"line_number":4412,"context_line":"    def test_if_match_does_not_match(self):"},{"line_number":4413,"context_line":"        req \u003d Request.blank("},{"line_number":4414,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4415,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"d0182c2a_c4f3df04","side":"PARENT","line":4412,"updated":"2023-10-30 20:59:14.000000000","message":"Renamed.","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":4434,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4435,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4436,"context_line":""},{"line_number":4437,"context_line":"    def test_if_none_match_matches_with_override(self):"},{"line_number":4438,"context_line":"        req \u003d Request.blank("},{"line_number":4439,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4440,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"0e072a63_531e69e5","side":"PARENT","line":4437,"updated":"2023-10-30 20:59:14.000000000","message":"Where\u0027d this go?","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":4434,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4435,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4436,"context_line":""},{"line_number":4437,"context_line":"    def test_if_none_match_matches_with_override(self):"},{"line_number":4438,"context_line":"        req \u003d Request.blank("},{"line_number":4439,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4440,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"f2b99913_af3e2edc","side":"PARENT","line":4437,"in_reply_to":"0e072a63_531e69e5","updated":"2023-10-31 16:07:05.000000000","message":"test_if_none_match_matches_alternate_etag","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4434,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4435,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4436,"context_line":""},{"line_number":4437,"context_line":"    def test_if_none_match_matches_with_override(self):"},{"line_number":4438,"context_line":"        req \u003d Request.blank("},{"line_number":4439,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4440,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"65176516_a9e0beab","side":"PARENT","line":4437,"in_reply_to":"f2b99913_af3e2edc","updated":"2023-11-01 17:12:05.000000000","message":"Ack.","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":4466,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4467,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4468,"context_line":""},{"line_number":4469,"context_line":"    def test_if_none_match_does_not_match_with_override(self):"},{"line_number":4470,"context_line":"        req \u003d Request.blank("},{"line_number":4471,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4472,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"2339fd3a_458f0e81","side":"PARENT","line":4469,"updated":"2023-10-30 20:59:14.000000000","message":"And this","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":4466,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4467,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4468,"context_line":""},{"line_number":4469,"context_line":"    def test_if_none_match_does_not_match_with_override(self):"},{"line_number":4470,"context_line":"        req \u003d Request.blank("},{"line_number":4471,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4472,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"66be2716_162cb0cc","side":"PARENT","line":4469,"in_reply_to":"2339fd3a_458f0e81","updated":"2023-10-31 16:07:05.000000000","message":"test_if_none_match_mismatches_alternate_etag","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4466,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4467,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4468,"context_line":""},{"line_number":4469,"context_line":"    def test_if_none_match_does_not_match_with_override(self):"},{"line_number":4470,"context_line":"        req \u003d Request.blank("},{"line_number":4471,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4472,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"c9ada5ad_ca82959d","side":"PARENT","line":4469,"in_reply_to":"66be2716_162cb0cc","updated":"2023-11-01 17:12:05.000000000","message":"Ack.","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":4495,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4496,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4497,"context_line":""},{"line_number":4498,"context_line":"    def test_if_match_matches_with_override(self):"},{"line_number":4499,"context_line":"        req \u003d Request.blank("},{"line_number":4500,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4501,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"fb0b622b_0eb2c9aa","side":"PARENT","line":4498,"updated":"2023-10-30 20:59:14.000000000","message":"And this","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4495,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4496,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4497,"context_line":""},{"line_number":4498,"context_line":"    def test_if_match_matches_with_override(self):"},{"line_number":4499,"context_line":"        req \u003d Request.blank("},{"line_number":4500,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4501,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"a245ea9b_3f0e5d2a","side":"PARENT","line":4498,"in_reply_to":"e87a3e39_6d7594ca","updated":"2023-11-01 17:12:05.000000000","message":"Ack.","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":4495,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4496,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4497,"context_line":""},{"line_number":4498,"context_line":"    def test_if_match_matches_with_override(self):"},{"line_number":4499,"context_line":"        req \u003d Request.blank("},{"line_number":4500,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4501,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"e87a3e39_6d7594ca","side":"PARENT","line":4498,"in_reply_to":"fb0b622b_0eb2c9aa","updated":"2023-10-31 16:07:05.000000000","message":"test_if_match_matches_alternate_etag","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":4525,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4526,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4527,"context_line":""},{"line_number":4528,"context_line":"    def test_if_match_does_not_match_with_override(self):"},{"line_number":4529,"context_line":"        req \u003d Request.blank("},{"line_number":4530,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4531,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"c25c15ac_a19095da","side":"PARENT","line":4528,"updated":"2023-10-30 20:59:14.000000000","message":"And this","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":4525,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4526,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4527,"context_line":""},{"line_number":4528,"context_line":"    def test_if_match_does_not_match_with_override(self):"},{"line_number":4529,"context_line":"        req \u003d Request.blank("},{"line_number":4530,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4531,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"f370e7d4_deba2dae","side":"PARENT","line":4528,"in_reply_to":"c25c15ac_a19095da","updated":"2023-10-31 16:07:05.000000000","message":"test_if_match_mismatches_alternate_etag","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4525,"context_line":"            self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4526,"context_line":"            \u0027X-Object-Sysmeta-Custom-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":4527,"context_line":""},{"line_number":4528,"context_line":"    def test_if_match_does_not_match_with_override(self):"},{"line_number":4529,"context_line":"        req \u003d Request.blank("},{"line_number":4530,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4531,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"28983fe9_7cfc8fb0","side":"PARENT","line":4528,"in_reply_to":"f370e7d4_deba2dae","updated":"2023-11-01 17:12:05.000000000","message":"Ack.","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":false,"context_lines":[{"line_number":4584,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4585,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4586,"context_line":""},{"line_number":4587,"context_line":"    def test_if_match_matches_and_range(self):"},{"line_number":4588,"context_line":"        req \u003d Request.blank("},{"line_number":4589,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027,"},{"line_number":4590,"context_line":"            environ\u003d{\u0027REQUEST_METHOD\u0027: \u0027GET\u0027},"}],"source_content_type":"text/x-python","patch_set":13,"id":"d87158fd_5497e03f","side":"PARENT","line":4587,"updated":"2023-10-30 20:59:14.000000000","message":"Moved to `TestSloConditionalGetOldManifest.test_if_match_matches_and_range` (I think)","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":4616,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4617,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4618,"context_line":""},{"line_number":4619,"context_line":"    def test_if_match_matches_passthrough(self):"},{"line_number":4620,"context_line":"        # first fetch and stash the manifest etag"},{"line_number":4621,"context_line":"        req \u003d Request.blank("},{"line_number":4622,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd?multipart-manifest\u003dget\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"d0f27ffd_05e04319","side":"PARENT","line":4619,"updated":"2023-10-30 20:59:14.000000000","message":"But where\u0027d this go?","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4616,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4617,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4618,"context_line":""},{"line_number":4619,"context_line":"    def test_if_match_matches_passthrough(self):"},{"line_number":4620,"context_line":"        # first fetch and stash the manifest etag"},{"line_number":4621,"context_line":"        req \u003d Request.blank("},{"line_number":4622,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd?multipart-manifest\u003dget\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"bb5d02b4_45f70c5f","side":"PARENT","line":4619,"in_reply_to":"8a81508e_6815d969","updated":"2023-11-01 17:12:05.000000000","message":"Ack.","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":4616,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":4617,"context_line":"                         \u0027x-object-sysmeta-slo-etag\u0027)"},{"line_number":4618,"context_line":""},{"line_number":4619,"context_line":"    def test_if_match_matches_passthrough(self):"},{"line_number":4620,"context_line":"        # first fetch and stash the manifest etag"},{"line_number":4621,"context_line":"        req \u003d Request.blank("},{"line_number":4622,"context_line":"            \u0027/v1/AUTH_test/gettest/manifest-abcd?multipart-manifest\u003dget\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"8a81508e_6815d969","side":"PARENT","line":4619,"in_reply_to":"d0f27ffd_05e04319","updated":"2023-10-31 16:07:05.000000000","message":"test_manifest_get_if_match_matches\n\nit doesn\u0027t do the read-then-re-use-etag trick - it just uses the manifest etag directly\n\ntook me a minute; i thought passthrough in the original context was \"non_slo\"","commit_id":"0bee335c6ec3773542d080fe6a8d4c56ac6a11e2"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":1847,"context_line":"    respond to HEAD requests."},{"line_number":1848,"context_line":"    \"\"\""},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"    modern_manifest_headers \u003d True"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    def maybe_add_modern_manifest_headers(self, headers, manifest):"},{"line_number":1853,"context_line":"        hasher \u003d md5(usedforsecurity\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"0c4db560_7a0ac274","line":1850,"updated":"2023-10-30 20:59:14.000000000","message":"I feel like this name is going to rust the next time we go and add more meta... not that the previous name was any better.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":true,"context_lines":[{"line_number":1847,"context_line":"    respond to HEAD requests."},{"line_number":1848,"context_line":"    \"\"\""},{"line_number":1849,"context_line":""},{"line_number":1850,"context_line":"    modern_manifest_headers \u003d True"},{"line_number":1851,"context_line":""},{"line_number":1852,"context_line":"    def maybe_add_modern_manifest_headers(self, headers, manifest):"},{"line_number":1853,"context_line":"        hasher \u003d md5(usedforsecurity\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":13,"id":"144f6ee4_09234171","line":1850,"in_reply_to":"0c4db560_7a0ac274","updated":"2023-10-31 16:07:05.000000000","message":"i thought about that too at somepoint; maybe just \"has_size_and_etag_sysmeta\"???","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":1892,"context_line":"        # HeaderKeyDict but at the time was considered unrelated to the"},{"line_number":1893,"context_line":"        # GETorHEAD TestCase refactor"},{"line_number":1894,"context_line":"        status, headers, body \u003d super(SloGETorHEADTestCase, self).call_slo(req)"},{"line_number":1895,"context_line":"        return status, HeaderKeyDict(headers), body"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def _setup_alphabet_objects(self, letters, container\u003d\u0027gettest\u0027):"},{"line_number":1898,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"411efce4_012e8aab","line":1895,"range":{"start_line":1895,"start_character":23,"end_line":1895,"end_character":45},"updated":"2023-10-30 20:59:14.000000000","message":"We should never get any duplicated header names, right? Might be good to add an assertion like\n```\nself.assertEqual(len(HeaderKeyDict(headers)), len(headers),\n                 \u0027Got duplicate names in response headers: %r\u0027 % headers)\n```\njust in case...","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":false,"context_lines":[{"line_number":1892,"context_line":"        # HeaderKeyDict but at the time was considered unrelated to the"},{"line_number":1893,"context_line":"        # GETorHEAD TestCase refactor"},{"line_number":1894,"context_line":"        status, headers, body \u003d super(SloGETorHEADTestCase, self).call_slo(req)"},{"line_number":1895,"context_line":"        return status, HeaderKeyDict(headers), body"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def _setup_alphabet_objects(self, letters, container\u003d\u0027gettest\u0027):"},{"line_number":1898,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"552f15a0_841d550f","line":1895,"range":{"start_line":1895,"start_character":23,"end_line":1895,"end_character":45},"in_reply_to":"411efce4_012e8aab","updated":"2023-10-31 03:50:07.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":1892,"context_line":"        # HeaderKeyDict but at the time was considered unrelated to the"},{"line_number":1893,"context_line":"        # GETorHEAD TestCase refactor"},{"line_number":1894,"context_line":"        status, headers, body \u003d super(SloGETorHEADTestCase, self).call_slo(req)"},{"line_number":1895,"context_line":"        return status, HeaderKeyDict(headers), body"},{"line_number":1896,"context_line":""},{"line_number":1897,"context_line":"    def _setup_alphabet_objects(self, letters, container\u003d\u0027gettest\u0027):"},{"line_number":1898,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"8ee9eba3_de12500a","line":1895,"range":{"start_line":1895,"start_character":23,"end_line":1895,"end_character":45},"in_reply_to":"411efce4_012e8aab","updated":"2023-10-31 16:07:05.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":1918,"context_line":"        test methods; you can share them between TestCases.  When you want to"},{"line_number":1919,"context_line":"        test something on a SLO with a slightly different manifest resist the"},{"line_number":1920,"context_line":"        temptation to update an existing manifest; just create a new"},{"line_number":1921,"context_line":"        personality - and give it a name that recognizes it\u0027s heritage and"},{"line_number":1922,"context_line":"        follows existing patterns - don\u0027t worry we won\u0027t run out of memory"},{"line_number":1923,"context_line":"        having too many similar but different manifests setup in our tests."},{"line_number":1924,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"b792635b_58ad8abe","line":1921,"range":{"start_line":1921,"start_character":57,"end_line":1921,"end_character":61},"updated":"2023-10-30 20:59:14.000000000","message":"nit: \"its\"","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"        test methods; you can share them between TestCases.  When you want to"},{"line_number":1919,"context_line":"        test something on a SLO with a slightly different manifest resist the"},{"line_number":1920,"context_line":"        temptation to update an existing manifest; just create a new"},{"line_number":1921,"context_line":"        personality - and give it a name that recognizes it\u0027s heritage and"},{"line_number":1922,"context_line":"        follows existing patterns - don\u0027t worry we won\u0027t run out of memory"},{"line_number":1923,"context_line":"        having too many similar but different manifests setup in our tests."},{"line_number":1924,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"95a658ed_c9c781a8","line":1921,"range":{"start_line":1921,"start_character":57,"end_line":1921,"end_character":61},"in_reply_to":"b792635b_58ad8abe","updated":"2023-10-31 03:50:07.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":1918,"context_line":"        test methods; you can share them between TestCases.  When you want to"},{"line_number":1919,"context_line":"        test something on a SLO with a slightly different manifest resist the"},{"line_number":1920,"context_line":"        temptation to update an existing manifest; just create a new"},{"line_number":1921,"context_line":"        personality - and give it a name that recognizes it\u0027s heritage and"},{"line_number":1922,"context_line":"        follows existing patterns - don\u0027t worry we won\u0027t run out of memory"},{"line_number":1923,"context_line":"        having too many similar but different manifests setup in our tests."},{"line_number":1924,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"b19f4892_8b3bd1ef","line":1921,"range":{"start_line":1921,"start_character":57,"end_line":1921,"end_character":61},"in_reply_to":"b792635b_58ad8abe","updated":"2023-10-31 16:07:05.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":1934,"context_line":"            # object name however you want."},{"line_number":1935,"context_line":"            obj_key \u003d \u0027manifest-%s\u0027 % name"},{"line_number":1936,"context_line":"        manifest_json \u003d json.dumps(manifest)"},{"line_number":1937,"context_line":"        setattr(self, \u0027manifest_%s_json_size\u0027 % attr_key, len(manifest_json))"},{"line_number":1938,"context_line":"        json_md5 \u003d md5hex(manifest_json)"},{"line_number":1939,"context_line":"        setattr(self, \u0027manifest_%s_json_md5\u0027 % attr_key, json_md5)"},{"line_number":1940,"context_line":"        manifest_headers \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"95de90b2_6a56a9ce","line":1937,"updated":"2023-10-30 20:59:14.000000000","message":"I\u0027m a little torn about the ✨magic✨ -- if I\u0027m reading a test and see `self.manifest_abcd_ranges_slo_etag` (say), I typically expect to be able to grep for `manifest_abcd_ranges_slo_etag \u003d` to see how it\u0027s defined.\n\nI should probably just get over it, though.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":true,"context_lines":[{"line_number":1934,"context_line":"            # object name however you want."},{"line_number":1935,"context_line":"            obj_key \u003d \u0027manifest-%s\u0027 % name"},{"line_number":1936,"context_line":"        manifest_json \u003d json.dumps(manifest)"},{"line_number":1937,"context_line":"        setattr(self, \u0027manifest_%s_json_size\u0027 % attr_key, len(manifest_json))"},{"line_number":1938,"context_line":"        json_md5 \u003d md5hex(manifest_json)"},{"line_number":1939,"context_line":"        setattr(self, \u0027manifest_%s_json_md5\u0027 % attr_key, json_md5)"},{"line_number":1940,"context_line":"        manifest_headers \u003d {"}],"source_content_type":"text/x-python","patch_set":13,"id":"229ddddf_61c2086b","line":1937,"in_reply_to":"95de90b2_6a56a9ce","updated":"2023-10-31 16:07:05.000000000","message":"100% agree setattr is dirty sneaky bad!  But ... i REALLY want to enforce the consistent names; and i think there\u0027s some hinting that these _setup_manifest things a bit magic/wonky.  So I decided I could live with it lacking a better option.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":2388,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027),"},{"line_number":2389,"context_line":"        ]"},{"line_number":2390,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":2391,"context_line":"            # Note we dont\u0027 call validate first segment on HEAD. We know the"},{"line_number":2392,"context_line":"            # slo size/etag from the manifest, so there\u0027s no need for any"},{"line_number":2393,"context_line":"            # segment or submanifest fetching here, but a naïve implementation"},{"line_number":2394,"context_line":"            # might do it anyway."}],"source_content_type":"text/x-python","patch_set":13,"id":"c6f2d189_a763392d","line":2391,"updated":"2023-10-30 20:59:14.000000000","message":"nit: \"don\u0027t\"","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":false,"context_lines":[{"line_number":2388,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027),"},{"line_number":2389,"context_line":"        ]"},{"line_number":2390,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":2391,"context_line":"            # Note we dont\u0027 call validate first segment on HEAD. We know the"},{"line_number":2392,"context_line":"            # slo size/etag from the manifest, so there\u0027s no need for any"},{"line_number":2393,"context_line":"            # segment or submanifest fetching here, but a naïve implementation"},{"line_number":2394,"context_line":"            # might do it anyway."}],"source_content_type":"text/x-python","patch_set":13,"id":"c6478bce_73936069","line":2391,"in_reply_to":"c6f2d189_a763392d","updated":"2023-10-31 03:50:07.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":2388,"context_line":"            (\u0027HEAD\u0027, \u0027/v1/AUTH_test/gettest/manifest-abcd\u0027),"},{"line_number":2389,"context_line":"        ]"},{"line_number":2390,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":2391,"context_line":"            # Note we dont\u0027 call validate first segment on HEAD. We know the"},{"line_number":2392,"context_line":"            # slo size/etag from the manifest, so there\u0027s no need for any"},{"line_number":2393,"context_line":"            # segment or submanifest fetching here, but a naïve implementation"},{"line_number":2394,"context_line":"            # might do it anyway."}],"source_content_type":"text/x-python","patch_set":13,"id":"fdbcd065_0827e670","line":2391,"in_reply_to":"c6f2d189_a763392d","updated":"2023-10-31 16:07:05.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":2892,"context_line":"            {\u0027name\u0027: \u0027/gettest/a_5\u0027, \u0027hash\u0027: md5hex(\"a\" * 5),"},{"line_number":2893,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u00275\u0027},"},{"line_number":2894,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2895,"context_line":"             # if some old swift let this sub-slo manifest get created with"},{"line_number":2896,"context_line":"             # invalid hash/bytes the sub-request SLO GET should still work"},{"line_number":2897,"context_line":"             \u0027content_type\u0027: \u0027application/json; swift_bytes\u003d25\u0027,"},{"line_number":2898,"context_line":"             \u0027hash\u0027: self.manifest_bc_json_md5,"}],"source_content_type":"text/x-python","patch_set":13,"id":"6deef181_9838a9c1","line":2895,"updated":"2023-10-30 20:59:14.000000000","message":"OK, I did a bit of leg-work -- \"old swift\" here means 1.9.1 through 1.12.0 (specifically, https://github.com/openstack/swift/commit/9f942b12 through https://github.com/openstack/swift/commit/19017195).","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":2892,"context_line":"            {\u0027name\u0027: \u0027/gettest/a_5\u0027, \u0027hash\u0027: md5hex(\"a\" * 5),"},{"line_number":2893,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u00275\u0027},"},{"line_number":2894,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2895,"context_line":"             # if some old swift let this sub-slo manifest get created with"},{"line_number":2896,"context_line":"             # invalid hash/bytes the sub-request SLO GET should still work"},{"line_number":2897,"context_line":"             \u0027content_type\u0027: \u0027application/json; swift_bytes\u003d25\u0027,"},{"line_number":2898,"context_line":"             \u0027hash\u0027: self.manifest_bc_json_md5,"}],"source_content_type":"text/x-python","patch_set":13,"id":"0fb82f7e_06d7484d","line":2895,"in_reply_to":"6deef181_9838a9c1","updated":"2023-10-31 16:07:05.000000000","message":"Ack","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":2917,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":2918,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u002750\u0027)"},{"line_number":2919,"context_line":"        self.assertEqual(headers[\u0027Etag\u0027],"},{"line_number":2920,"context_line":"                         \u0027\"%s\"\u0027 % self.manifest_abcd_alt_slo_etag)"},{"line_number":2921,"context_line":"        self.assertEqual(headers[\u0027X-Manifest-Etag\u0027],"},{"line_number":2922,"context_line":"                         self.manifest_abcd_alt_json_md5)"},{"line_number":2923,"context_line":"        self.assertEqual(headers[\u0027X-Static-Large-Object\u0027], \u0027true\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"5e0edea6_949f8670","line":2920,"updated":"2023-10-30 20:59:14.000000000","message":"It\u0027s not clear to me that this is the same assertion we had in the old test. Should we have a\n```\nself.assertEqual(self.manifest_abcd_alt_slo_etag, self.manifest_abcd_slo_etag)\n```\n?","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":2917,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":2918,"context_line":"        self.assertEqual(headers[\u0027Content-Length\u0027], \u002750\u0027)"},{"line_number":2919,"context_line":"        self.assertEqual(headers[\u0027Etag\u0027],"},{"line_number":2920,"context_line":"                         \u0027\"%s\"\u0027 % self.manifest_abcd_alt_slo_etag)"},{"line_number":2921,"context_line":"        self.assertEqual(headers[\u0027X-Manifest-Etag\u0027],"},{"line_number":2922,"context_line":"                         self.manifest_abcd_alt_json_md5)"},{"line_number":2923,"context_line":"        self.assertEqual(headers[\u0027X-Static-Large-Object\u0027], \u0027true\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"0c54d05e_60e6c7f1","line":2920,"in_reply_to":"5e0edea6_949f8670","updated":"2023-10-31 16:07:05.000000000","message":"E       AssertionError: \u0027bb82732516941a2f0e7ab0b187b91cea\u0027 !\u003d \u0027c03dc4199c02e328898178ccd5834735\u0027\n\nah, it\u0027s cause I used json_md5 in the hash next to json_size (which apparently *also* works); original test mixed slo_etag w/ json_size:\n\n    -              \u0027hash\u0027: md5hex(md5hex(\"b\" * 10) + md5hex(\"c\" * 15)),\n    -              \u0027bytes\u0027: len(_bc_manifest_json)},\n\n#willfix","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":3262,"context_line":""},{"line_number":3263,"context_line":"class TestOldSwiftWithRangesOldManifests(TestOldSwiftWithRanges):"},{"line_number":3264,"context_line":""},{"line_number":3265,"context_line":"    # Proxies have been writing moden slo-sysmeta since 2016; object servers"},{"line_number":3266,"context_line":"    # only started ignoring Range headers on x-static-large-object in 2020 and"},{"line_number":3267,"context_line":"    # it works on legacy manifests."},{"line_number":3268,"context_line":"    modern_manifest_headers \u003d False"}],"source_content_type":"text/x-python","patch_set":13,"id":"5766d266_fd94022e","line":3265,"range":{"start_line":3265,"start_character":32,"end_line":3265,"end_character":37},"updated":"2023-10-30 20:59:14.000000000","message":"nit: \"modern\"","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":3262,"context_line":""},{"line_number":3263,"context_line":"class TestOldSwiftWithRangesOldManifests(TestOldSwiftWithRanges):"},{"line_number":3264,"context_line":""},{"line_number":3265,"context_line":"    # Proxies have been writing moden slo-sysmeta since 2016; object servers"},{"line_number":3266,"context_line":"    # only started ignoring Range headers on x-static-large-object in 2020 and"},{"line_number":3267,"context_line":"    # it works on legacy manifests."},{"line_number":3268,"context_line":"    modern_manifest_headers \u003d False"}],"source_content_type":"text/x-python","patch_set":13,"id":"1832163f_19fe4031","line":3265,"range":{"start_line":3265,"start_character":32,"end_line":3265,"end_character":37},"in_reply_to":"5766d266_fd94022e","updated":"2023-10-31 16:07:05.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":false,"context_lines":[{"line_number":3262,"context_line":""},{"line_number":3263,"context_line":"class TestOldSwiftWithRangesOldManifests(TestOldSwiftWithRanges):"},{"line_number":3264,"context_line":""},{"line_number":3265,"context_line":"    # Proxies have been writing moden slo-sysmeta since 2016; object servers"},{"line_number":3266,"context_line":"    # only started ignoring Range headers on x-static-large-object in 2020 and"},{"line_number":3267,"context_line":"    # it works on legacy manifests."},{"line_number":3268,"context_line":"    modern_manifest_headers \u003d False"}],"source_content_type":"text/x-python","patch_set":13,"id":"597967c1_c245fa6d","line":3265,"range":{"start_line":3265,"start_character":32,"end_line":3265,"end_character":37},"in_reply_to":"5766d266_fd94022e","updated":"2023-10-31 03:50:07.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":3598,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u0027999999\u0027},"},{"line_number":3599,"context_line":"        ], container\u003d\u0027gettest\u0027)"},{"line_number":3600,"context_line":""},{"line_number":3601,"context_line":"    def test_slo_sysmeta_on_error(self):"},{"line_number":3602,"context_line":"        headers \u003d {"},{"line_number":3603,"context_line":"            \u0027Content-Type\u0027: \u0027application/octet-stream\u0027,"},{"line_number":3604,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"31edecd3_77cbec70","line":3601,"updated":"2023-10-30 20:59:14.000000000","message":"All-new, yeah?","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":3598,"context_line":"             \u0027content_type\u0027: \u0027text/plain\u0027, \u0027bytes\u0027: \u0027999999\u0027},"},{"line_number":3599,"context_line":"        ], container\u003d\u0027gettest\u0027)"},{"line_number":3600,"context_line":""},{"line_number":3601,"context_line":"    def test_slo_sysmeta_on_error(self):"},{"line_number":3602,"context_line":"        headers \u003d {"},{"line_number":3603,"context_line":"            \u0027Content-Type\u0027: \u0027application/octet-stream\u0027,"},{"line_number":3604,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"7683d735_21ad3948","line":3601,"in_reply_to":"31edecd3_77cbec70","updated":"2023-10-31 16:07:05.000000000","message":"yes, this is an existing behavior that already existed; documented here in this test as we didn\u0027t want to make it any worse in the refactor.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":3611,"context_line":"            })"},{"line_number":3612,"context_line":"        self.app.register("},{"line_number":3613,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027,"},{"line_number":3614,"context_line":"            swob.HTTPNotFound, headers)"},{"line_number":3615,"context_line":"        req \u003d Request.blank(\u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027)"},{"line_number":3616,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":3617,"context_line":"        # slo metadata on error response!?  there\u0027s a bug somewhere."}],"source_content_type":"text/x-python","patch_set":13,"id":"810c15c8_64fe5a1c","line":3614,"range":{"start_line":3614,"start_character":31,"end_line":3614,"end_character":38},"updated":"2023-10-30 20:59:14.000000000","message":"I don\u0027t think we *ever* return sysmeta on a 404... I guess it would have to be on the tombstone??","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":3611,"context_line":"            })"},{"line_number":3612,"context_line":"        self.app.register("},{"line_number":3613,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027,"},{"line_number":3614,"context_line":"            swob.HTTPNotFound, headers)"},{"line_number":3615,"context_line":"        req \u003d Request.blank(\u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027)"},{"line_number":3616,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":3617,"context_line":"        # slo metadata on error response!?  there\u0027s a bug somewhere."}],"source_content_type":"text/x-python","patch_set":13,"id":"e39da329_42ba261e","line":3614,"range":{"start_line":3614,"start_character":31,"end_line":3614,"end_character":38},"in_reply_to":"586f306d_2ac01c2f","updated":"2023-11-01 17:12:05.000000000","message":"But... we *can\u0027t* have an error that says `is_slo \u003d True` -- yes? Seems like classic undefined behavior -- it *can\u0027t* come up, so it doesn\u0027t really matter *how* it\u0027s handled and so there isn\u0027t much point in trying to ensure any kind of consistency through the refactor...","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":3611,"context_line":"            })"},{"line_number":3612,"context_line":"        self.app.register("},{"line_number":3613,"context_line":"            \u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027,"},{"line_number":3614,"context_line":"            swob.HTTPNotFound, headers)"},{"line_number":3615,"context_line":"        req \u003d Request.blank(\u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027)"},{"line_number":3616,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":3617,"context_line":"        # slo metadata on error response!?  there\u0027s a bug somewhere."}],"source_content_type":"text/x-python","patch_set":13,"id":"586f306d_2ac01c2f","line":3614,"range":{"start_line":3614,"start_character":31,"end_line":3614,"end_character":38},"in_reply_to":"810c15c8_64fe5a1c","updated":"2023-10-31 16:07:05.000000000","message":"basically the code assumes \"anything that says \u0027is_slo \u003d True\u0027 must not be an error\" - this check explores what the failure mode would look like.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":3621,"context_line":"        self.assertEqual(self.app.calls, ["},{"line_number":3622,"context_line":"            (\u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027)])"},{"line_number":3623,"context_line":""},{"line_number":3624,"context_line":"    def test_get_bogus_manifest(self):"},{"line_number":3625,"context_line":"        headers \u003d {"},{"line_number":3626,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":3627,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"151276f4_2efab587","line":3624,"updated":"2023-10-30 20:59:14.000000000","message":"Off-topic: The name of this test reminds me of the sad story in https://bugs.launchpad.net/swift/+bug/1680083 ... and how I don\u0027t remember what happens when you add SLO to the pipeline after having written such an object...","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":3621,"context_line":"        self.assertEqual(self.app.calls, ["},{"line_number":3622,"context_line":"            (\u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027)])"},{"line_number":3623,"context_line":""},{"line_number":3624,"context_line":"    def test_get_bogus_manifest(self):"},{"line_number":3625,"context_line":"        headers \u003d {"},{"line_number":3626,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":3627,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"6df5d1c8_ed809f5d","line":3624,"in_reply_to":"151276f4_2efab587","updated":"2023-10-31 16:07:05.000000000","message":"good times.  slo is still not auto-inserted and the object server still supports the header as pass through AFAIK","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":3621,"context_line":"        self.assertEqual(self.app.calls, ["},{"line_number":3622,"context_line":"            (\u0027GET\u0027, \u0027/v1/AUTH_test/gettest/manifest-badmeta\u0027)])"},{"line_number":3623,"context_line":""},{"line_number":3624,"context_line":"    def test_get_bogus_manifest(self):"},{"line_number":3625,"context_line":"        headers \u003d {"},{"line_number":3626,"context_line":"            \u0027Content-Type\u0027: \u0027application/json\u0027,"},{"line_number":3627,"context_line":"            \u0027X-Static-Large-Object\u0027: \u0027true\u0027,"}],"source_content_type":"text/x-python","patch_set":13,"id":"26cddfa0_a91c5b7c","line":3624,"in_reply_to":"6df5d1c8_ed809f5d","updated":"2023-11-01 17:12:05.000000000","message":"Right -- I still want to look at\n\n\u003e what happens when you add SLO to the pipeline after having written such an object\n\nthough","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":3986,"context_line":""},{"line_number":3987,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":3988,"context_line":"        self.assertEqual(b\"aaaaabbbbbbbbbb\", body)"},{"line_number":3989,"context_line":"        self.assertEqual(self.app.unread_requests, {})"},{"line_number":3990,"context_line":"        self.assertEqual(self.slo.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":3991,"context_line":"            \u0027While processing manifest /v1/AUTH_test/gettest/manifest-abcd, \u0027"},{"line_number":3992,"context_line":"            \u0027got 401 (\u003chtml\u003e\u003ch1\u003eUnauthorized\u003c/h1\u003e\u003cp\u003eThis server could not \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"e382f536_927da2b2","line":3989,"updated":"2023-10-30 20:59:14.000000000","message":"Should we get rid of these now that they\u0027re duplicated in `tearDown`?","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":3986,"context_line":""},{"line_number":3987,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":3988,"context_line":"        self.assertEqual(b\"aaaaabbbbbbbbbb\", body)"},{"line_number":3989,"context_line":"        self.assertEqual(self.app.unread_requests, {})"},{"line_number":3990,"context_line":"        self.assertEqual(self.slo.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":3991,"context_line":"            \u0027While processing manifest /v1/AUTH_test/gettest/manifest-abcd, \u0027"},{"line_number":3992,"context_line":"            \u0027got 401 (\u003chtml\u003e\u003ch1\u003eUnauthorized\u003c/h1\u003e\u003cp\u003eThis server could not \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"4a43f9bb_a93351ea","line":3989,"in_reply_to":"e382f536_927da2b2","updated":"2023-10-31 16:07:05.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":false,"context_lines":[{"line_number":3986,"context_line":""},{"line_number":3987,"context_line":"        self.assertEqual(status, \u0027200 OK\u0027)"},{"line_number":3988,"context_line":"        self.assertEqual(b\"aaaaabbbbbbbbbb\", body)"},{"line_number":3989,"context_line":"        self.assertEqual(self.app.unread_requests, {})"},{"line_number":3990,"context_line":"        self.assertEqual(self.slo.logger.get_lines_for_level(\u0027error\u0027), ["},{"line_number":3991,"context_line":"            \u0027While processing manifest /v1/AUTH_test/gettest/manifest-abcd, \u0027"},{"line_number":3992,"context_line":"            \u0027got 401 (\u003chtml\u003e\u003ch1\u003eUnauthorized\u003c/h1\u003e\u003cp\u003eThis server could not \u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"d21efc71_32e97681","line":3989,"in_reply_to":"e382f536_927da2b2","updated":"2023-10-31 03:50:07.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4797,"context_line":""},{"line_number":4798,"context_line":"    def test_if_none_match_matches_alternate_etag(self):"},{"line_number":4799,"context_line":"        req \u003d Request.blank("},{"line_number":4800,"context_line":"            \u0027/v1/AUTH_test/c/manifest-alt\u0027,"},{"line_number":4801,"context_line":"            headers\u003d{\u0027If-None-Match\u0027: \u0027\"alt-etag-1\"\u0027})"},{"line_number":4802,"context_line":"        update_etag_is_at_header(req, \u0027X-Object-Sysmeta-Alt-Etag\u0027)"},{"line_number":4803,"context_line":"        status, headers, body \u003d self.call_slo(req)"}],"source_content_type":"text/x-python","patch_set":13,"id":"e222439d_c5757dc8","line":4800,"updated":"2023-11-01 17:12:05.000000000","message":"*Not* `gettest/manifest-abcd` -- but that was an unfortunate, horrible name collision before, right?","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4798,"context_line":"    def test_if_none_match_matches_alternate_etag(self):"},{"line_number":4799,"context_line":"        req \u003d Request.blank("},{"line_number":4800,"context_line":"            \u0027/v1/AUTH_test/c/manifest-alt\u0027,"},{"line_number":4801,"context_line":"            headers\u003d{\u0027If-None-Match\u0027: \u0027\"alt-etag-1\"\u0027})"},{"line_number":4802,"context_line":"        update_etag_is_at_header(req, \u0027X-Object-Sysmeta-Alt-Etag\u0027)"},{"line_number":4803,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":4804,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"79a9266f_f2dfac01","line":4801,"range":{"start_line":4801,"start_character":40,"end_line":4801,"end_character":50},"updated":"2023-11-01 17:12:05.000000000","message":"Instead of `a custom etag`","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4799,"context_line":"        req \u003d Request.blank("},{"line_number":4800,"context_line":"            \u0027/v1/AUTH_test/c/manifest-alt\u0027,"},{"line_number":4801,"context_line":"            headers\u003d{\u0027If-None-Match\u0027: \u0027\"alt-etag-1\"\u0027})"},{"line_number":4802,"context_line":"        update_etag_is_at_header(req, \u0027X-Object-Sysmeta-Alt-Etag\u0027)"},{"line_number":4803,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":4804,"context_line":""},{"line_number":4805,"context_line":"        self.assertEqual(status, \u0027304 Not Modified\u0027)"}],"source_content_type":"text/x-python","patch_set":13,"id":"f21b98e3_31b033e1","line":4802,"range":{"start_line":4802,"start_character":39,"end_line":4802,"end_character":64},"updated":"2023-11-01 17:12:05.000000000","message":"Instead of `X-Object-Sysmeta-Custom-Etag`","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4820,"context_line":"                # for legacy manifests we don\u0027t know if swob will return a"},{"line_number":4821,"context_line":"                # successful response or conditional error so we validate the"},{"line_number":4822,"context_line":"                # first segment to avoid a 2XX when we should 5XX"},{"line_number":4823,"context_line":"                (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_1?multipart-manifest\u003dget\u0027),"},{"line_number":4824,"context_line":"            ])"},{"line_number":4825,"context_line":"            # when swob decides to error it closes our SegmentedIterable"},{"line_number":4826,"context_line":"            # and we don\u0027t drain the (possibly large) segment."}],"source_content_type":"text/x-python","patch_set":13,"id":"7f8be649_34d7ffd8","line":4823,"range":{"start_line":4823,"start_character":41,"end_line":4823,"end_character":46},"updated":"2023-11-01 17:12:05.000000000","message":"So this a normal segment then, not a submanifest as in the old test? Probably more representative of what we\u0027re likely to get in prod.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":true,"context_lines":[{"line_number":4841,"context_line":"    def test_if_none_match_mismatches_alternate_etag(self):"},{"line_number":4842,"context_line":"        req \u003d Request.blank("},{"line_number":4843,"context_line":"            \u0027/v1/AUTH_test/c/manifest-alt\u0027,"},{"line_number":4844,"context_line":"            headers\u003d{\u0027If-None-Match\u0027: \u0027\"not-alt-etag-1\"\u0027})"},{"line_number":4845,"context_line":"        update_etag_is_at_header(req, \u0027X-Object-Sysmeta-Alt-Etag\u0027)"},{"line_number":4846,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":4847,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"bf8c7475_59ab6841","line":4844,"range":{"start_line":4844,"start_character":40,"end_line":4844,"end_character":54},"updated":"2023-11-01 17:12:05.000000000","message":"Not using `manifest_alt_slo_etag`? I found that to be a very interesting test before, demonstrating that despite sending `If-None-Match: X` you could get back a 200 with `ETag: X` because of the ordering of `X-Backend-Etag-Is-At`","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"00ced7e72290888b490c14dc8294181e7c3f9dc6","unresolved":false,"context_lines":[{"line_number":4841,"context_line":"    def test_if_none_match_mismatches_alternate_etag(self):"},{"line_number":4842,"context_line":"        req \u003d Request.blank("},{"line_number":4843,"context_line":"            \u0027/v1/AUTH_test/c/manifest-alt\u0027,"},{"line_number":4844,"context_line":"            headers\u003d{\u0027If-None-Match\u0027: \u0027\"not-alt-etag-1\"\u0027})"},{"line_number":4845,"context_line":"        update_etag_is_at_header(req, \u0027X-Object-Sysmeta-Alt-Etag\u0027)"},{"line_number":4846,"context_line":"        status, headers, body \u003d self.call_slo(req)"},{"line_number":4847,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"fabd60e5_ff49ab80","line":4844,"range":{"start_line":4844,"start_character":40,"end_line":4844,"end_character":54},"in_reply_to":"bf8c7475_59ab6841","updated":"2023-11-01 23:32:44.000000000","message":"oh that\u0027s neat - yeah, we can use if-none-match: slo_etag in this test - anything not the alt-etag from test_if_none_match_matches_alternate_etag should 200\n\ni ended up adding a test_if_none_match_matches_no_alternate_etag as a kind of sanity that does NOT update_etag_is_at_header - where as \u0027not-alt-etag-1\u0027 was *obviously* 200, i felt testing if-none-match: slo-etag \u003d\u003e 200 deserved a sanity that it *would* be 304 (besides just test_if_none_match_matches, which uses a different manifest)","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":true,"context_lines":[{"line_number":4855,"context_line":""},{"line_number":4856,"context_line":"        expected_app_calls \u003d ["},{"line_number":4857,"context_line":"            (\u0027GET\u0027, \u0027/v1/AUTH_test/c/manifest-alt\u0027),"},{"line_number":4858,"context_line":"            (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_1?multipart-manifest\u003dget\u0027),"},{"line_number":4859,"context_line":"        ]"},{"line_number":4860,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":4861,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":13,"id":"236028ec_a6d9fb87","line":4858,"updated":"2023-11-01 17:12:05.000000000","message":"OK, simpler call list -- I wonder if we should have at least two segments for this manifest, though, so it\u0027s clear that when `not self.modern_manifest_headers` we really _are_ only validating the first segment up in `test_if_none_match_matches_alternate_etag`","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"00ced7e72290888b490c14dc8294181e7c3f9dc6","unresolved":false,"context_lines":[{"line_number":4855,"context_line":""},{"line_number":4856,"context_line":"        expected_app_calls \u003d ["},{"line_number":4857,"context_line":"            (\u0027GET\u0027, \u0027/v1/AUTH_test/c/manifest-alt\u0027),"},{"line_number":4858,"context_line":"            (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_1?multipart-manifest\u003dget\u0027),"},{"line_number":4859,"context_line":"        ]"},{"line_number":4860,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":4861,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":13,"id":"33d063e1_fa4a58a2","line":4858,"in_reply_to":"236028ec_a6d9fb87","updated":"2023-11-01 23:32:44.000000000","message":"I guess my thinking was the \"validate first segment\" behavior wrt to unmet_condition responses for legacy manifests was pretty well covered.  For the 200 case I\u0027m pretty sure we have lots of tests that demonstrate slo will get all the segments?\n\nBut I refactored the setup of the alt segments to have a num_segment var anyway in case future matainers want to change it and notice only the 200 assert lists change:\n\n\tE       AssertionError: Lists differ: [(\u0027GE[146 chars]get\u0027), (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_02?multipa[13 chars]et\u0027)] !\u003d [(\u0027GE[146 chars]get\u0027)]\n\tE       \n\tE       First list contains 1 additional elements.\n\tE       First extra element 3:\n\tE       (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_02?multipart-manifest\u003dget\u0027)\n\tE       \n\tE         [(\u0027GET\u0027, \u0027/v1/AUTH_test/c/manifest-alt\u0027),\n\tE          (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_00?multipart-manifest\u003dget\u0027),\n\tE       -  (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_01?multipart-manifest\u003dget\u0027),\n\tE       ?                                                          ^\n\tE       \n\tE       +  (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_01?multipart-manifest\u003dget\u0027)]\n\tE       ?                                                          ^\n\tE       \n\tE       -  (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_02?multipart-manifest\u003dget\u0027)]\n\n\tswift/test/unit/common/middleware/test_slo.py:4917: AssertionError\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d short test summary info \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\tFAILED swift/test/unit/common/middleware/test_slo.py::TestSloConditionalGetOldManifest::test_if_match_matches_alternate_etag - AssertionError: Lists differ: [(\u0027GE[146 chars]get\u0027), (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_02?multipa[13 chars]et\u0027)] !\u003d [(\u0027GE[146 chars]get\u0027)]\n\tFAILED swift/test/unit/common/middleware/test_slo.py::TestSloConditionalGetOldManifest::test_if_none_match_mismatches_alternate_etag - AssertionError: Lists differ: [(\u0027GE[146 chars]get\u0027), (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_02?multipa[13 chars]et\u0027)] !\u003d [(\u0027GE[146 chars]get\u0027)]\n\tFAILED swift/test/unit/common/middleware/test_slo.py::TestSloConditionalGetNewManifest::test_if_match_matches_alternate_etag - AssertionError: Lists differ: [(\u0027GE[146 chars]get\u0027), (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_02?multipa[13 chars]et\u0027)] !\u003d [(\u0027GE[146 chars]get\u0027)]\n\tFAILED swift/test/unit/common/middleware/test_slo.py::TestSloConditionalGetNewManifest::test_if_none_match_mismatches_alternate_etag - AssertionError: Lists differ: [(\u0027GE[146 chars]get\u0027), (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_02?multipa[13 chars]et\u0027)] !\u003d [(\u0027GE[146 chars]get\u0027)]\n\t\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d 4 failed, 269 passed in 4.70s \u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4973,"context_line":""},{"line_number":4974,"context_line":"    def test_if_match_matches_alternate_etag(self):"},{"line_number":4975,"context_line":"        req \u003d Request.blank("},{"line_number":4976,"context_line":"            \u0027/v1/AUTH_test/c/manifest-alt\u0027,"},{"line_number":4977,"context_line":"            headers\u003d{\u0027If-Match\u0027: \u0027\"alt-etag-1\"\u0027})"},{"line_number":4978,"context_line":"        update_etag_is_at_header(req, \u0027X-Object-Sysmeta-Alt-Etag\u0027)"},{"line_number":4979,"context_line":"        status, headers, body \u003d self.call_slo(req)"}],"source_content_type":"text/x-python","patch_set":13,"id":"db4c5ce3_3957f068","line":4976,"updated":"2023-11-01 17:12:05.000000000","message":"Like the `If-None-Match` version, using this instead of `gettest/manifest-abcd`","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":true,"context_lines":[{"line_number":5027,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":5028,"context_line":"                         \u0027X-Object-Sysmeta-Alt-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":5029,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":5030,"context_line":"            for headers in self.app.headers[1:]:"},{"line_number":5031,"context_line":"                self.assertNotIn(\u0027If-Match\u0027, headers)"},{"line_number":5032,"context_line":"                self.assertNotIn(\u0027X-Backend-Etag-Is-At\u0027, headers)"},{"line_number":5033,"context_line":"        # XXX swob doesn\u0027t drain the resp_iter on conditional error"}],"source_content_type":"text/x-python","patch_set":13,"id":"43245e8a_c8806cab","line":5030,"updated":"2023-11-01 17:12:05.000000000","message":"nit: The `if not self.modern_manifest_headers:` isn\u0027t really needed; if we have slo etag/content-length in sysmeta, `self.app.headers[1:] \u003d\u003d []`","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"00ced7e72290888b490c14dc8294181e7c3f9dc6","unresolved":false,"context_lines":[{"line_number":5027,"context_line":"        self.assertEqual(self.app.headers[0].get(\u0027X-Backend-Etag-Is-At\u0027),"},{"line_number":5028,"context_line":"                         \u0027X-Object-Sysmeta-Alt-Etag,x-object-sysmeta-slo-etag\u0027)"},{"line_number":5029,"context_line":"        if not self.modern_manifest_headers:"},{"line_number":5030,"context_line":"            for headers in self.app.headers[1:]:"},{"line_number":5031,"context_line":"                self.assertNotIn(\u0027If-Match\u0027, headers)"},{"line_number":5032,"context_line":"                self.assertNotIn(\u0027X-Backend-Etag-Is-At\u0027, headers)"},{"line_number":5033,"context_line":"        # XXX swob doesn\u0027t drain the resp_iter on conditional error"}],"source_content_type":"text/x-python","patch_set":13,"id":"43d2687f_216b4337","line":5030,"in_reply_to":"43245e8a_c8806cab","updated":"2023-11-01 23:32:44.000000000","message":"oh interesting; I think the way it\u0027s written more explicitly states that we only expect legacy manifests to have more than one call but it\u0027s annoying the asserts keep interleaving - I\u0027ll try to reword so we only go under `not modern` once.\n\nAlso, I\u0027m realizing I may have written some things funny in this patch so they come out cleaner in the follow-on patch!","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":true,"context_lines":[{"line_number":5041,"context_line":"            # (possibly large) segment."},{"line_number":5042,"context_line":"            self.expected_unread_requests["},{"line_number":5043,"context_line":"                (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_1\u0027"},{"line_number":5044,"context_line":"                 \u0027?multipart-manifest\u003dget\u0027)] \u003d 1"},{"line_number":5045,"context_line":""},{"line_number":5046,"context_line":"    def test_manifest_get_if_none_match_matches(self):"},{"line_number":5047,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":13,"id":"02da58ad_53928d80","line":5044,"updated":"2023-11-01 17:12:05.000000000","message":"Didn\u0027t we already do this when we were extending `expected_app_calls`?","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"00ced7e72290888b490c14dc8294181e7c3f9dc6","unresolved":false,"context_lines":[{"line_number":5041,"context_line":"            # (possibly large) segment."},{"line_number":5042,"context_line":"            self.expected_unread_requests["},{"line_number":5043,"context_line":"                (\u0027GET\u0027, \u0027/v1/AUTH_test/c/alt_1\u0027"},{"line_number":5044,"context_line":"                 \u0027?multipart-manifest\u003dget\u0027)] \u003d 1"},{"line_number":5045,"context_line":""},{"line_number":5046,"context_line":"    def test_manifest_get_if_none_match_matches(self):"},{"line_number":5047,"context_line":"        req \u003d Request.blank("}],"source_content_type":"text/x-python","patch_set":13,"id":"9a6e4197_5c42acc0","line":5044,"in_reply_to":"02da58ad_53928d80","updated":"2023-11-01 23:32:44.000000000","message":"yes, looks like it got doubled up in some rebase/reorg - both harmless and useless to repeat #willfix","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":5141,"context_line":"        self.assertEqual(self.manifest_abcd_json_md5, headers[\u0027Etag\u0027])"},{"line_number":5142,"context_line":"        expected_app_calls \u003d ["},{"line_number":5143,"context_line":"            (\u0027GET\u0027,"},{"line_number":5144,"context_line":"             \u0027/v1/AUTH_test/gettest/manifest-abcd?multipart-manifest\u003dget\u0027)]"},{"line_number":5145,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":5146,"context_line":"        self.assertNotIn(\u0027X-Backend-Etag-Is-At\u0027, self.app.headers[0])"},{"line_number":5147,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"1cf6b64b_b5846512","line":5144,"updated":"2023-11-01 17:12:05.000000000","message":"Right, just one call now because we aren\u0027t doing the funky fetch-and-stash thing.","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":true,"context_lines":[{"line_number":5143,"context_line":"            (\u0027GET\u0027,"},{"line_number":5144,"context_line":"             \u0027/v1/AUTH_test/gettest/manifest-abcd?multipart-manifest\u003dget\u0027)]"},{"line_number":5145,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":5146,"context_line":"        self.assertNotIn(\u0027X-Backend-Etag-Is-At\u0027, self.app.headers[0])"},{"line_number":5147,"context_line":""},{"line_number":5148,"context_line":"    def test_manifest_get_if_match_mismatches(self):"},{"line_number":5149,"context_line":"        # use if-match condition and expect to mismatch"}],"source_content_type":"text/x-python","patch_set":13,"id":"b76bba97_fb83f941","line":5146,"updated":"2023-11-01 17:12:05.000000000","message":"The old test included an assertion that a non-conditional GET did not include `X-Backend-Etag-Is-At` -- do we already test that somewhere else?","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"00ced7e72290888b490c14dc8294181e7c3f9dc6","unresolved":false,"context_lines":[{"line_number":5143,"context_line":"            (\u0027GET\u0027,"},{"line_number":5144,"context_line":"             \u0027/v1/AUTH_test/gettest/manifest-abcd?multipart-manifest\u003dget\u0027)]"},{"line_number":5145,"context_line":"        self.assertEqual(self.app.calls, expected_app_calls)"},{"line_number":5146,"context_line":"        self.assertNotIn(\u0027X-Backend-Etag-Is-At\u0027, self.app.headers[0])"},{"line_number":5147,"context_line":""},{"line_number":5148,"context_line":"    def test_manifest_get_if_match_mismatches(self):"},{"line_number":5149,"context_line":"        # use if-match condition and expect to mismatch"}],"source_content_type":"text/x-python","patch_set":13,"id":"83792b46_925c309d","line":5146,"in_reply_to":"b76bba97_fb83f941","updated":"2023-11-01 23:32:44.000000000","message":"I feel like that\u0027s kind of covered in test_manifest_get_if_match_matches_alternate_etag where we show if an upstream middleware had called update_etag_is_at_header the value gets passed through ?multipart-manifest\u003dget unmolested - but I hadn\u0027t considered a bug where we only DON\u0027T call update_etag_is_at IF the request is conditional...\n\nso I added an assert that there is NO etag-is-at header in test_get_manifest_passthrough explaining that if another middleware set it it\u0027d be there; but WE don\u0027t add it.\n\nI guess LOTS of tests *could* assert something about this header; but it starts to feel like testing the implementation instead of the behavior.  The point here is:\n\nif-match: slo_etag \u003d\u003e 200\nif-match: slo_etag + manifest\u003dget \u003d\u003e 412","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"0163944392b6ee55eda77c7eb8b7855b9be6caf4","unresolved":true,"context_lines":[{"line_number":5501,"context_line":"        # 304 Not Modified responses, and those don\u0027t contain any useful data."},{"line_number":5502,"context_line":"        for _, _, hdrs in self.app.calls_with_headers[1:]:"},{"line_number":5503,"context_line":"            self.assertFalse(\u0027If-Modified-Since\u0027 in hdrs)"},{"line_number":5504,"context_line":"            self.assertFalse(\u0027If-Unmodified-Since\u0027 in hdrs)"},{"line_number":5505,"context_line":""},{"line_number":5506,"context_line":"    def test_if_modified_since_ancient_date(self):"},{"line_number":5507,"context_line":"        req \u003d swob.Request.blank("}],"source_content_type":"text/x-python","patch_set":13,"id":"8237c4c1_7acb058d","line":5504,"updated":"2023-10-30 20:59:14.000000000","message":"As long as we\u0027re updating the test/assertions, may as well use `assertNotIn`","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":1179,"name":"Clay Gerrard","email":"clay.gerrard@gmail.com","username":"clay-gerrard"},"change_message_id":"ae31721eec02a0435b5f74175080b1503939eb16","unresolved":false,"context_lines":[{"line_number":5501,"context_line":"        # 304 Not Modified responses, and those don\u0027t contain any useful data."},{"line_number":5502,"context_line":"        for _, _, hdrs in self.app.calls_with_headers[1:]:"},{"line_number":5503,"context_line":"            self.assertFalse(\u0027If-Modified-Since\u0027 in hdrs)"},{"line_number":5504,"context_line":"            self.assertFalse(\u0027If-Unmodified-Since\u0027 in hdrs)"},{"line_number":5505,"context_line":""},{"line_number":5506,"context_line":"    def test_if_modified_since_ancient_date(self):"},{"line_number":5507,"context_line":"        req \u003d swob.Request.blank("}],"source_content_type":"text/x-python","patch_set":13,"id":"93035c55_c66c254d","line":5504,"in_reply_to":"8237c4c1_7acb058d","updated":"2023-10-31 16:07:05.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":false,"context_lines":[{"line_number":5501,"context_line":"        # 304 Not Modified responses, and those don\u0027t contain any useful data."},{"line_number":5502,"context_line":"        for _, _, hdrs in self.app.calls_with_headers[1:]:"},{"line_number":5503,"context_line":"            self.assertFalse(\u0027If-Modified-Since\u0027 in hdrs)"},{"line_number":5504,"context_line":"            self.assertFalse(\u0027If-Unmodified-Since\u0027 in hdrs)"},{"line_number":5505,"context_line":""},{"line_number":5506,"context_line":"    def test_if_modified_since_ancient_date(self):"},{"line_number":5507,"context_line":"        req \u003d swob.Request.blank("}],"source_content_type":"text/x-python","patch_set":13,"id":"d6c8827a_36288f5b","line":5504,"in_reply_to":"8237c4c1_7acb058d","updated":"2023-10-31 03:50:07.000000000","message":"Done","commit_id":"3f266c9201e8475d9f0d8b1daf31b8e7bbc38ba4"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"f2fc0054ffbc892c75ce3d54cce06dc033704ed3","unresolved":true,"context_lines":[{"line_number":2904,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2905,"context_line":"             \u0027hash\u0027: self.manifest_bc_slo_etag,"},{"line_number":2906,"context_line":"             # if swift 1.9.1 thru 1.12.0 let this sub-slo manifest get created"},{"line_number":2907,"context_line":"             # with invalid hash/bytes the sub-request SLO GET will still work"},{"line_number":2908,"context_line":"             \u0027content_type\u0027: \u0027application/json; swift_bytes\u003d25\u0027,"},{"line_number":2909,"context_line":"             \u0027bytes\u0027: self.manifest_bc_json_size},"},{"line_number":2910,"context_line":"            {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"}],"source_content_type":"text/x-python","patch_set":15,"id":"687bc896_0460d337","line":2907,"range":{"start_line":2907,"start_character":28,"end_line":2907,"end_character":32},"updated":"2023-10-31 03:50:07.000000000","message":"But ... we\u0027re back to using the `slo_etag` ... what *actually* gets written down, and what *actually* gets sent back to the client, and has that last part changed over time?\n\nLooks like I need to spin up a super-old swift tomorrow... I feel like we may have uncovered another bug ... like if we detect one of these wrong-hash sub_slos, maybe we need to actually fetch it to determine the real etag-of-etags? Or, have we just always been misrepresenting the ground-truth of the situation in this test?","commit_id":"284bcc6802e63722881769426f358fd319629d3b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":2904,"context_line":"            {\u0027name\u0027: \u0027/gettest/manifest-bc\u0027, \u0027sub_slo\u0027: True,"},{"line_number":2905,"context_line":"             \u0027hash\u0027: self.manifest_bc_slo_etag,"},{"line_number":2906,"context_line":"             # if swift 1.9.1 thru 1.12.0 let this sub-slo manifest get created"},{"line_number":2907,"context_line":"             # with invalid hash/bytes the sub-request SLO GET will still work"},{"line_number":2908,"context_line":"             \u0027content_type\u0027: \u0027application/json; swift_bytes\u003d25\u0027,"},{"line_number":2909,"context_line":"             \u0027bytes\u0027: self.manifest_bc_json_size},"},{"line_number":2910,"context_line":"            {\u0027name\u0027: \u0027/gettest/d_20\u0027, \u0027hash\u0027: md5hex(\"d\" * 20),"}],"source_content_type":"text/x-python","patch_set":15,"id":"ad9f6e3e_6253fdbc","line":2907,"range":{"start_line":2907,"start_character":28,"end_line":2907,"end_character":32},"in_reply_to":"687bc896_0460d337","updated":"2023-11-01 17:12:05.000000000","message":"OK, at any rate, the test is back to looking like it does on master, so this certainly shouldn\u0027t hold up merging, even if I want to run it down a little more to put notes on https://bugs.launchpad.net/swift/+bug/2037662 before setting this down.","commit_id":"284bcc6802e63722881769426f358fd319629d3b"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"d44daddb6cb7434af119457bf75e587ef7cbab1c","unresolved":false,"context_lines":[{"line_number":4692,"context_line":"            \u0027hash\u0027: self.alt_1_etag,"},{"line_number":4693,"context_line":"            \u0027content_type\u0027: \u0027text/plain\u0027,"},{"line_number":4694,"context_line":"        }], extra_headers\u003d{"},{"line_number":4695,"context_line":"            \u0027X-Object-Sysmeta-Alt-Etag\u0027: \u0027\"alt-etag-1\"\u0027,"},{"line_number":4696,"context_line":"        })"},{"line_number":4697,"context_line":""},{"line_number":4698,"context_line":"        self._setup_manifest(\u0027last-modified\u0027, ["}],"source_content_type":"text/x-python","patch_set":15,"id":"72da79a7_e9a29d4f","line":4695,"updated":"2023-11-01 17:12:05.000000000","message":"Does it matter that we\u0027ve got this custom etag with quotes now? If a client send an `If-Match` without quotes, does it still match?\n\nMeh, probably a better question for the `X-Backend-Etag-Is-At` tests.","commit_id":"284bcc6802e63722881769426f358fd319629d3b"}]}
