)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cfd4029d3ad9918ecd1dda4817990833f1b7abaa","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                          --------------------------"},{"line_number":37,"context_line":"                          |                        |"},{"line_number":38,"context_line":"                  TestECObjController       TestECDuplicationObjController"},{"line_number":39,"context_line":"                  (for EC policy)           (for EC Duplication Policy)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"TODO:"},{"line_number":42,"context_line":"1. Make sure we could set `unpatch_policies` for TestECObjController and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba2be162_d26c7437","line":39,"updated":"2017-03-02 18:13:03.000000000","message":"+1 this is the class model we discussed in Atlanta.\n\nThe main reason to refactor is that TestObjController has a confusing mix of policy-neutral and EC specific tests. \n\nFWIW, for me a secondary reason to refactor is that I prefer to avoid mixins when possible because it creates noise in my IDE (pycharm). i.e. where the mixin uses for example self.assertEqual, the IDE will complain that assertEqual is not defined (because until the mixin is composed into a class, assertEqual cannot be found by the IDE). That\u0027s a selfish reason to prefer this change!","commit_id":"f1fa4f2ef6e5a859575846aa472fd0d55c9365ed"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"15b0b42de141fe36e24f072ff177cf5968a1342c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"                          --------------------------"},{"line_number":37,"context_line":"                          |                        |"},{"line_number":38,"context_line":"                  TestECObjController       TestECDuplicationObjController"},{"line_number":39,"context_line":"                  (for EC policy)           (for EC Duplication Policy)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"TODO:"},{"line_number":42,"context_line":"1. Make sure we could set `unpatch_policies` for TestECObjController and"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"ba2be162_3b759631","line":39,"in_reply_to":"ba2be162_d26c7437","updated":"2017-03-03 06:22:29.000000000","message":"Er... perhaps, the secondary reason may not be resolved with this change, if i understand the problem correctly?\n\nThat is because unittest.TestCase is inherited by the leaf test controller classes as multiple inherits because if root inherits it, BaseTestECObjectController also start to attempt to test defined inside the class...","commit_id":"f1fa4f2ef6e5a859575846aa472fd0d55c9365ed"}],"test/unit/proxy/test_mem_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    pass"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class TestObjectController(test_server.TestReplicatedObjectController):"},{"line_number":37,"context_line":"    def test_PUT_no_etag_fallocate(self):"},{"line_number":38,"context_line":"        # mem server doesn\u0027t call fallocate(), believe it or not"},{"line_number":39,"context_line":"        pass"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_e276b604","line":36,"updated":"2017-03-22 19:55:47.000000000","message":"nit: would be consistent to rename this TestReplicatedObjectController","commit_id":"b0a30590c29743dcf834b5cc983d283f37e7bfe1"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"92a7ae4a3f9e84909162266d2bf9cae3bae14e07","unresolved":false,"context_lines":[{"line_number":33,"context_line":"    pass"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"class TestReplicatedObjectController("},{"line_number":37,"context_line":"        test_server.TestReplicatedObjectController):"},{"line_number":38,"context_line":"    def test_PUT_no_etag_fallocate(self):"},{"line_number":39,"context_line":"        # mem server doesn\u0027t call fallocate(), believe it or not"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a1ced50_5ac82e55","line":36,"range":{"start_line":36,"start_character":6,"end_line":36,"end_character":37},"updated":"2017-03-23 12:56:28.000000000","message":"Nice!","commit_id":"8fe4bfefaa13d087763f948151b9a82790ef89f0"}],"test/unit/proxy/test_server.py":[{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"cfd4029d3ad9918ecd1dda4817990833f1b7abaa","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"                          --------------------------"},{"line_number":1159,"context_line":"                          |                        |"},{"line_number":1160,"context_line":"                  TestECObjController       TestECDuplicationObjController"},{"line_number":1161,"context_line":"                  (for EC policy)           (for EC Duplication Policy)"},{"line_number":1162,"context_line":"    \"\"\""},{"line_number":1163,"context_line":"    def setUp(self):"},{"line_number":1164,"context_line":"        self.app \u003d proxy_server.Application("}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_729d8809","line":1161,"updated":"2017-03-02 18:13:03.000000000","message":"the comment is helpful for reviewing NOW, but will require maintenance as and when the class model changes. In my IDE (Pycharm) I can hit F4 with BaseTestObjController selected and see the class model, so for me the class diagram here is not necessary.","commit_id":"f1fa4f2ef6e5a859575846aa472fd0d55c9365ed"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"15b0b42de141fe36e24f072ff177cf5968a1342c","unresolved":false,"context_lines":[{"line_number":1158,"context_line":"                          --------------------------"},{"line_number":1159,"context_line":"                          |                        |"},{"line_number":1160,"context_line":"                  TestECObjController       TestECDuplicationObjController"},{"line_number":1161,"context_line":"                  (for EC policy)           (for EC Duplication Policy)"},{"line_number":1162,"context_line":"    \"\"\""},{"line_number":1163,"context_line":"    def setUp(self):"},{"line_number":1164,"context_line":"        self.app \u003d proxy_server.Application("}],"source_content_type":"text/x-python","patch_set":1,"id":"ba2be162_fbb13e48","line":1161,"in_reply_to":"ba2be162_729d8809","updated":"2017-03-03 06:22:29.000000000","message":"Ok, I removed this illustration on the newest patch set. That exists only in commit message.","commit_id":"f1fa4f2ef6e5a859575846aa472fd0d55c9365ed"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":1647,"context_line":"        error_lines \u003d prosrv.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":1648,"context_line":"        warn_lines \u003d prosrv.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":1649,"context_line":"        self.assertEqual(len(error_lines), 0)  # sanity"},{"line_number":1650,"context_line":"        self.assertEqual(len(warn_lines), 0)  # sanity"},{"line_number":1651,"context_line":""},{"line_number":1652,"context_line":"    def _test_conditional_GET(self, policy):"},{"line_number":1653,"context_line":"        container_name \u003d uuid.uuid4().hex"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_7a98b81c","side":"PARENT","line":1650,"updated":"2017-03-22 19:55:47.000000000","message":"ok relocated to BaseTestECObjectController - trivial changes to accessing ec_policy","commit_id":"2dd835726939f79e70af3c4a60112b421c66be96"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":2076,"context_line":"            policy.object_ring._rtime \u003d orig_rtime"},{"line_number":2077,"context_line":"            os.rename(policy.object_ring.serialized_path + \u0027.bak\u0027,"},{"line_number":2078,"context_line":"                      policy.object_ring.serialized_path)"},{"line_number":2079,"context_line":""},{"line_number":2080,"context_line":""},{"line_number":2081,"context_line":"@patch_policies([StoragePolicy(0, \u0027zero\u0027, True,"},{"line_number":2082,"context_line":"                               object_ring\u003dFakeRing(base_port\u003d3000))])"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_bda4ea07","side":"PARENT","line":2079,"updated":"2017-03-22 19:55:47.000000000","message":"ok ^^ copied to BaseTestECObjectController","commit_id":"2dd835726939f79e70af3c4a60112b421c66be96"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":2133,"context_line":"        for sleeptime in (0.1, 1.0):"},{"line_number":2134,"context_line":"            sleep(sleeptime)"},{"line_number":2135,"context_line":"            if condition():"},{"line_number":2136,"context_line":"                break"},{"line_number":2137,"context_line":""},{"line_number":2138,"context_line":"    @unpatch_policies"},{"line_number":2139,"context_line":"    def test_policy_IO(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_ddf526ed","side":"PARENT","line":2136,"updated":"2017-03-22 19:55:47.000000000","message":"ok ^^ relocated with no change to lines 1151-1201","commit_id":"2dd835726939f79e70af3c4a60112b421c66be96"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":5416,"context_line":"            resp.headers[\u0027access-control-expose-headers\u0027].split(\u0027,\u0027))"},{"line_number":5417,"context_line":"        self.assertEqual(default_expected_exposed | set([\u0027x-custom-user\u0027,"},{"line_number":5418,"context_line":"                                                         \u0027x-custom-operator\u0027]),"},{"line_number":5419,"context_line":"                         exposed)"},{"line_number":5420,"context_line":""},{"line_number":5421,"context_line":"    def _gather_x_container_headers(self, controller_call, req, *connect_args,"},{"line_number":5422,"context_line":"                                    **kwargs):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_5dfe96ae","side":"PARENT","line":5419,"updated":"2017-03-22 19:55:47.000000000","message":"ok ^^ copied to TestReplicatedObjectController, but this move doesn\u0027t seem necessary","commit_id":"2dd835726939f79e70af3c4a60112b421c66be96"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":5642,"context_line":"            account_ring\u003dFakeRing(),"},{"line_number":5643,"context_line":"            container_ring\u003dFakeRing())"},{"line_number":5644,"context_line":"        # clear proxy logger result for each test"},{"line_number":5645,"context_line":"        _test_servers[0].logger._clear()"},{"line_number":5646,"context_line":""},{"line_number":5647,"context_line":""},{"line_number":5648,"context_line":"class TestECMismatchedFA(unittest.TestCase):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_dd84460c","side":"PARENT","line":5645,"updated":"2017-03-22 19:55:47.000000000","message":"ok ^^ identical to setup method in BaseTestObjectController","commit_id":"2dd835726939f79e70af3c4a60112b421c66be96"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":1198,"context_line":"        for sleeptime in (0.1, 1.0):"},{"line_number":1199,"context_line":"            sleep(sleeptime)"},{"line_number":1200,"context_line":"            if condition():"},{"line_number":1201,"context_line":"                break"},{"line_number":1202,"context_line":""},{"line_number":1203,"context_line":"    def put_container(self, policy_name, container_name):"},{"line_number":1204,"context_line":"        # Note: only works if called with unpatched policies"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_bac950ae","line":1201,"updated":"2017-03-22 19:55:47.000000000","message":"ok, relocated with no change from TestObjectController","commit_id":"b0a30590c29743dcf834b5cc983d283f37e7bfe1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":4492,"context_line":"            resp.headers[\u0027access-control-expose-headers\u0027].split(\u0027,\u0027))"},{"line_number":4493,"context_line":"        self.assertEqual(default_expected_exposed | set([\u0027x-custom-user\u0027,"},{"line_number":4494,"context_line":"                                                         \u0027x-custom-operator\u0027]),"},{"line_number":4495,"context_line":"                         exposed)"},{"line_number":4496,"context_line":""},{"line_number":4497,"context_line":"    def test_CORS_valid_non_strict(self):"},{"line_number":4498,"context_line":"        # test expose_headers to non-allowed origins"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_3df1dacd","line":4495,"updated":"2017-03-22 19:55:47.000000000","message":"ok relocated from TestObjectController, but did not need to move w.r.t. adjacent tests","commit_id":"b0a30590c29743dcf834b5cc983d283f37e7bfe1"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"c7c78667e86be83bf92f55adfba7f19a2ca1f190","unresolved":false,"context_lines":[{"line_number":4492,"context_line":"            resp.headers[\u0027access-control-expose-headers\u0027].split(\u0027,\u0027))"},{"line_number":4493,"context_line":"        self.assertEqual(default_expected_exposed | set([\u0027x-custom-user\u0027,"},{"line_number":4494,"context_line":"                                                         \u0027x-custom-operator\u0027]),"},{"line_number":4495,"context_line":"                         exposed)"},{"line_number":4496,"context_line":""},{"line_number":4497,"context_line":"    def test_CORS_valid_non_strict(self):"},{"line_number":4498,"context_line":"        # test expose_headers to non-allowed origins"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_9a48e6b4","line":4495,"in_reply_to":"1a1ced50_3df1dacd","updated":"2017-03-23 12:56:44.000000000","message":"Ah, maybe it happens at rebasing the new test, nice catch.","commit_id":"b0a30590c29743dcf834b5cc983d283f37e7bfe1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":4813,"context_line":""},{"line_number":4814,"context_line":"class BaseTestECObjectController(BaseTestObjectController):"},{"line_number":4815,"context_line":""},{"line_number":4816,"context_line":"    @unpatch_policies"},{"line_number":4817,"context_line":"    def test_PUT_ec(self):"},{"line_number":4818,"context_line":"        policy \u003d POLICIES[self.ec_policy_index]"},{"line_number":4819,"context_line":"        self.put_container(policy.name, policy.name)"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_a28cbeda","line":4816,"updated":"2017-03-22 19:55:47.000000000","message":"ok, so unpatch_policies is not necessary but this all gets sorted in the next patch\n\n+1 for restricting this patch to only code movements","commit_id":"b0a30590c29743dcf834b5cc983d283f37e7bfe1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":5299,"context_line":"        error_lines \u003d prosrv.logger.get_lines_for_level(\u0027error\u0027)"},{"line_number":5300,"context_line":"        warn_lines \u003d prosrv.logger.get_lines_for_level(\u0027warning\u0027)"},{"line_number":5301,"context_line":"        self.assertEqual(len(error_lines), 0)  # sanity"},{"line_number":5302,"context_line":"        self.assertEqual(len(warn_lines), 0)  # sanity"},{"line_number":5303,"context_line":""},{"line_number":5304,"context_line":"    @unpatch_policies"},{"line_number":5305,"context_line":"    def test_conditional_GET_ec(self):"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_da460c7a","line":5302,"updated":"2017-03-22 19:55:47.000000000","message":"ok ^^ relocated from ECTestMixin","commit_id":"b0a30590c29743dcf834b5cc983d283f37e7bfe1"},{"author":{"_account_id":7847,"name":"Alistair Coles","email":"alistairncoles@gmail.com","username":"acoles"},"change_message_id":"ce461123a86c6a3f9d56cd855a6db6652d35891a","unresolved":false,"context_lines":[{"line_number":5638,"context_line":"        finally:"},{"line_number":5639,"context_line":"            policy.object_ring._rtime \u003d orig_rtime"},{"line_number":5640,"context_line":"            os.rename(policy.object_ring.serialized_path + \u0027.bak\u0027,"},{"line_number":5641,"context_line":"                      policy.object_ring.serialized_path)"},{"line_number":5642,"context_line":""},{"line_number":5643,"context_line":""},{"line_number":5644,"context_line":"@patch_policies([StoragePolicy(0, \u0027zero\u0027, True,"}],"source_content_type":"text/x-python","patch_set":4,"id":"1a1ced50_fd9902c5","line":5641,"updated":"2017-03-22 19:55:47.000000000","message":"ok ^^ relocated from ECTestMixin","commit_id":"b0a30590c29743dcf834b5cc983d283f37e7bfe1"},{"author":{"_account_id":4608,"name":"Kota Tsuyuzaki","email":"bloodeagle40234@gmail.com","username":"tsuyuzaki-kota"},"change_message_id":"92a7ae4a3f9e84909162266d2bf9cae3bae14e07","unresolved":false,"context_lines":[{"line_number":4527,"context_line":"        self.assertEqual(\u0027x-trans-id\u0027,"},{"line_number":4528,"context_line":"                         resp.headers[\u0027access-control-expose-headers\u0027])"},{"line_number":4529,"context_line":""},{"line_number":4530,"context_line":"    def test_CORS_expose_headers(self):"},{"line_number":4531,"context_line":"        default_expected_exposed \u003d set(["},{"line_number":4532,"context_line":"            \u0027cache-control\u0027, \u0027content-language\u0027, \u0027content-type\u0027, \u0027expires\u0027,"},{"line_number":4533,"context_line":"            \u0027last-modified\u0027, \u0027pragma\u0027, \u0027etag\u0027, \u0027x-timestamp\u0027, \u0027x-trans-id\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"1a1ced50_ba33e212","line":4530,"updated":"2017-03-23 12:56:28.000000000","message":"Ok, current master locates this test method after test_CORS_valid_with_obj_headers. Make sense. Thanks.","commit_id":"8fe4bfefaa13d087763f948151b9a82790ef89f0"},{"author":{"_account_id":15343,"name":"Tim Burke","email":"tburke@nvidia.com","username":"tburke"},"change_message_id":"4456de17bf02f40ffeb349a2b1e967ef94473023","unresolved":false,"context_lines":[{"line_number":5144,"context_line":"        for node in nodes:"},{"line_number":5145,"context_line":"            df \u003d df_mgr.get_diskfile(node[\u0027device\u0027], partition,"},{"line_number":5146,"context_line":"                                     \u0027a\u0027, \u0027ec-con\u0027, \u0027quorum\u0027,"},{"line_number":5147,"context_line":"                                     policy\u003dec_policy)"},{"line_number":5148,"context_line":"            if os.path.exists(df._datadir):"},{"line_number":5149,"context_line":"                self.assertFalse(os.listdir(df._datadir))  # should be empty"},{"line_number":5150,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7ffa3b31_2a727fe4","line":5147,"range":{"start_line":5147,"start_character":44,"end_line":5147,"end_character":53},"updated":"2017-04-18 00:23:55.000000000","message":"Better :-)","commit_id":"8fe4bfefaa13d087763f948151b9a82790ef89f0"}]}
