)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"d3686dd8c625e9ab4ac253c67a382644b6a7b726","unresolved":false,"context_lines":[{"line_number":10,"context_line":"tests have correct conventions applied."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"* T117: Check negative test classes should exist in filenames"},{"line_number":13,"context_line":"  ending with _negative"},{"line_number":14,"context_line":"* T118: Check that each negative test has the"},{"line_number":15,"context_line":"  ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f7c97a3_218be922","line":13,"updated":"2018-07-23 06:04:06.000000000","message":"I\u0027m not sure we should force this or not. I was thinking we may want to put some negative test classes with normal tests together?","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ccddbc73a9281457492197d780936b47494a6501","unresolved":false,"context_lines":[{"line_number":10,"context_line":"tests have correct conventions applied."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"* T117: Check negative test classes should exist in filenames"},{"line_number":13,"context_line":"  ending with _negative"},{"line_number":14,"context_line":"* T118: Check that each negative test has the"},{"line_number":15,"context_line":"  ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied"},{"line_number":16,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f7c97a3_f23d33e6","line":13,"in_reply_to":"5f7c97a3_218be922","updated":"2018-07-29 01:35:21.000000000","message":"Done","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"d3686dd8c625e9ab4ac253c67a382644b6a7b726","unresolved":false,"context_lines":[{"line_number":12,"context_line":"* T117: Check negative test classes should exist in filenames"},{"line_number":13,"context_line":"  ending with _negative"},{"line_number":14,"context_line":"* T118: Check that each negative test has the"},{"line_number":15,"context_line":"  ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This patch set adds both hacking checks, adds unit tests"},{"line_number":18,"context_line":"and updates HACKING.rst documentation with both new checks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f7c97a3_c1979546","line":15,"updated":"2018-07-23 06:04:06.000000000","message":"nit: s/slow/negative","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ccddbc73a9281457492197d780936b47494a6501","unresolved":false,"context_lines":[{"line_number":12,"context_line":"* T117: Check negative test classes should exist in filenames"},{"line_number":13,"context_line":"  ending with _negative"},{"line_number":14,"context_line":"* T118: Check that each negative test has the"},{"line_number":15,"context_line":"  ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"This patch set adds both hacking checks, adds unit tests"},{"line_number":18,"context_line":"and updates HACKING.rst documentation with both new checks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"5f7c97a3_524d0797","line":15,"in_reply_to":"5f7c97a3_c1979546","updated":"2018-07-29 01:35:21.000000000","message":"Done","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"}],"HACKING.rst":[{"author":{"_account_id":20190,"name":"zhufl","email":"zhu.fanglei@zte.com.cn","username":"zhufl"},"change_message_id":"3577ca18e418b988a66ec5a4c3321d78e0b5f91d","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":".. todo::"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  Add a hacking check for ensuring that all classes that contain substring"},{"line_number":152,"context_line":"  \"Negative\" have the negative attribute decorator applied above each test."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Slow Attribute"},{"line_number":155,"context_line":"^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5f7c97a3_8d74b9d1","side":"PARENT","line":152,"range":{"start_line":151,"start_character":1,"end_line":152,"end_character":75},"updated":"2018-07-19 01:47:38.000000000","message":"Why this is removed? This patch seems does not do this thing?","commit_id":"de5f0da10e44a52e5bc5f577e4ec33231add3831"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5c3195bd44ba8b7625a959c8075f4e3729b814e1","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":".. todo::"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  Add a hacking check for ensuring that all classes that contain substring"},{"line_number":152,"context_line":"  \"Negative\" have the negative attribute decorator applied above each test."},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"Slow Attribute"},{"line_number":155,"context_line":"^^^^^^^^^^^^^^"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5f7c97a3_b60b0620","side":"PARENT","line":152,"range":{"start_line":151,"start_character":1,"end_line":152,"end_character":75},"in_reply_to":"5f7c97a3_8d74b9d1","updated":"2018-07-19 03:49:40.000000000","message":"Whoops, let me push up the hacking check for this too.","commit_id":"de5f0da10e44a52e5bc5f577e4ec33231add3831"}],"tempest/hacking/checks.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"d2bbe66219a8f5fed3d279d8cafcccab589271fb","unresolved":false,"context_lines":[{"line_number":345,"context_line":"    register(use_rand_uuid_instead_of_uuid4)"},{"line_number":346,"context_line":"    register(dont_put_admin_tests_on_nonadmin_path)"},{"line_number":347,"context_line":"    register(unsupported_exception_attribute_PY3)"},{"line_number":348,"context_line":"    register(negative_test_classes_must_belong_to_negative_filenames)"}],"source_content_type":"text/x-python","patch_set":1,"id":"5f7c97a3_fe3731e3","line":348,"range":{"start_line":348,"start_character":35,"end_line":348,"end_character":49},"updated":"2018-07-18 06:52:48.000000000","message":"only_in","commit_id":"85b76274ccf1080484c132c5bf3054d93565dbe8"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"d3686dd8c625e9ab4ac253c67a382644b6a7b726","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    # If Negative in test class and _negative not in filename, raise error."},{"line_number":329,"context_line":"    if \u0027Negative\u0027 in logical_line and not re.match("},{"line_number":330,"context_line":"            r\u0027.\\/tempest\\/api\\/.*_negative.*\u0027, filename):"},{"line_number":331,"context_line":"        msg \u003d (\u0027T117: All negative tests should exist in a file ending with \u0027"},{"line_number":332,"context_line":"               \u0027_negative.\u0027)"},{"line_number":333,"context_line":"        yield (0, msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_61a9e18d","line":330,"updated":"2018-07-23 06:04:06.000000000","message":"hmm, I\u0027m wondering we could have a negative test in tempest/scenario. But yeah, I think we don\u0027t need it so far at least.","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ccddbc73a9281457492197d780936b47494a6501","unresolved":false,"context_lines":[{"line_number":327,"context_line":""},{"line_number":328,"context_line":"    # If Negative in test class and _negative not in filename, raise error."},{"line_number":329,"context_line":"    if \u0027Negative\u0027 in logical_line and not re.match("},{"line_number":330,"context_line":"            r\u0027.\\/tempest\\/api\\/.*_negative.*\u0027, filename):"},{"line_number":331,"context_line":"        msg \u003d (\u0027T117: All negative tests should exist in a file ending with \u0027"},{"line_number":332,"context_line":"               \u0027_negative.\u0027)"},{"line_number":333,"context_line":"        yield (0, msg)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_5232e710","line":330,"in_reply_to":"5f7c97a3_61a9e18d","updated":"2018-07-29 01:35:21.000000000","message":"Done. If there\u0027s a desire to add negative tests for scenario testing then we shouldn\u0027t add this, but I thought Tempest isn\u0027t really taking any more negative tests? https://docs.openstack.org/tempest/latest/HACKING.html#negative-tests\n\n\"However, as a black box integration test suite, Tempest is not suitable for handling all negative test cases, as the wide variety and complexity of negative tests can lead to long test runs and knowledge of internal implementation details.\"","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5361250983fd36ddf4f27ccfe21e591e4af7003f","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        yield (0, msg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"def no_negatve_test_attribute_applied_to_negative_test(physical_line,"},{"line_number":337,"context_line":"                                                       filename):"},{"line_number":338,"context_line":"    \"\"\"Check that ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied to negative tests"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_61b2864c","line":336,"range":{"start_line":336,"start_character":30,"end_line":336,"end_character":37},"updated":"2018-07-19 05:20:06.000000000","message":"not_applied","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"5ad535b3da913b28c5d6bd236a4a7105767a446f","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        yield (0, msg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"def no_negatve_test_attribute_applied_to_negative_test(physical_line,"},{"line_number":337,"context_line":"                                                       filename):"},{"line_number":338,"context_line":"    \"\"\"Check that ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied to negative tests"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_a195fe89","line":336,"range":{"start_line":336,"start_character":30,"end_line":336,"end_character":37},"in_reply_to":"5f7c97a3_61b2864c","updated":"2018-07-19 05:20:55.000000000","message":"Maybe do: \u0027negative_test_attribute_always_applied_to_negative_tests\u0027 to avoid double negative","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ccddbc73a9281457492197d780936b47494a6501","unresolved":false,"context_lines":[{"line_number":333,"context_line":"        yield (0, msg)"},{"line_number":334,"context_line":""},{"line_number":335,"context_line":""},{"line_number":336,"context_line":"def no_negatve_test_attribute_applied_to_negative_test(physical_line,"},{"line_number":337,"context_line":"                                                       filename):"},{"line_number":338,"context_line":"    \"\"\"Check that ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied to negative tests"},{"line_number":339,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_f232130e","line":336,"range":{"start_line":336,"start_character":30,"end_line":336,"end_character":37},"in_reply_to":"5f7c97a3_a195fe89","updated":"2018-07-29 01:35:21.000000000","message":"Done","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":5689,"name":"Masayuki Igawa","email":"masayuki@igawa.io","username":"igawa"},"change_message_id":"d3686dd8c625e9ab4ac253c67a382644b6a7b726","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"def no_negatve_test_attribute_applied_to_negative_test(physical_line,"},{"line_number":337,"context_line":"                                                       filename):"},{"line_number":338,"context_line":"    \"\"\"Check that ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied to negative tests"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    T118"},{"line_number":341,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_018eed32","line":338,"updated":"2018-07-23 06:04:06.000000000","message":"s/slow/negative","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ccddbc73a9281457492197d780936b47494a6501","unresolved":false,"context_lines":[{"line_number":335,"context_line":""},{"line_number":336,"context_line":"def no_negatve_test_attribute_applied_to_negative_test(physical_line,"},{"line_number":337,"context_line":"                                                       filename):"},{"line_number":338,"context_line":"    \"\"\"Check that ``@decorators.attr(type\u003d[\u0027slow\u0027])`` applied to negative tests"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    T118"},{"line_number":341,"context_line":"    \"\"\""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_924e3f8e","line":338,"in_reply_to":"5f7c97a3_018eed32","updated":"2018-07-29 01:35:21.000000000","message":"Done","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"}],"tempest/tests/test_hacking.py":[{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"d9b99da86dd65680c6526a654a7a3150a1311f83","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        if with_other_decorators:"},{"line_number":233,"context_line":"            # Include multiple decorators to verify that this check works with"},{"line_number":234,"context_line":"            # arbitrarily many decorators. These insert decorators above the"},{"line_number":235,"context_line":"            # rbac_rule_validation decorator."},{"line_number":236,"context_line":"            for decorator in other_decorators:"},{"line_number":237,"context_line":"                self.assertIsNone(check(\" %s\" % decorator, filename))"},{"line_number":238,"context_line":"        if with_negative_decorator:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_ef994acf","line":235,"range":{"start_line":235,"start_character":14,"end_line":235,"end_character":34},"updated":"2018-07-23 16:19:20.000000000","message":"@decorators.attr(type\u003d[\u0027negative\u0027])","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ccddbc73a9281457492197d780936b47494a6501","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        if with_other_decorators:"},{"line_number":233,"context_line":"            # Include multiple decorators to verify that this check works with"},{"line_number":234,"context_line":"            # arbitrarily many decorators. These insert decorators above the"},{"line_number":235,"context_line":"            # rbac_rule_validation decorator."},{"line_number":236,"context_line":"            for decorator in other_decorators:"},{"line_number":237,"context_line":"                self.assertIsNone(check(\" %s\" % decorator, filename))"},{"line_number":238,"context_line":"        if with_negative_decorator:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_b2201bb3","line":235,"range":{"start_line":235,"start_character":14,"end_line":235,"end_character":34},"in_reply_to":"5f7c97a3_ef994acf","updated":"2018-07-29 01:35:21.000000000","message":"Done","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"d9b99da86dd65680c6526a654a7a3150a1311f83","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        if with_other_decorators:"},{"line_number":242,"context_line":"            # Include multiple decorators to verify that this check works with"},{"line_number":243,"context_line":"            # arbitrarily many decorators. These insert decorators between"},{"line_number":244,"context_line":"            # the test and the @rbac_rule_validation decorator."},{"line_number":245,"context_line":"            for decorator in other_decorators:"},{"line_number":246,"context_line":"                self.assertIsNone(check(\" %s\" % decorator, filename))"},{"line_number":247,"context_line":"        final_result \u003d check(\" def test_some_negative_case\", filename)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_af7cb271","line":244,"range":{"start_line":244,"start_character":32,"end_line":244,"end_character":52},"updated":"2018-07-23 16:19:20.000000000","message":"Ditto","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"},{"author":{"_account_id":23186,"name":"Felipe Monteiro","email":"felipe.carneiro.monteiro@gmail.com","username":"felipe.monteiro"},"change_message_id":"ccddbc73a9281457492197d780936b47494a6501","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        if with_other_decorators:"},{"line_number":242,"context_line":"            # Include multiple decorators to verify that this check works with"},{"line_number":243,"context_line":"            # arbitrarily many decorators. These insert decorators between"},{"line_number":244,"context_line":"            # the test and the @rbac_rule_validation decorator."},{"line_number":245,"context_line":"            for decorator in other_decorators:"},{"line_number":246,"context_line":"                self.assertIsNone(check(\" %s\" % decorator, filename))"},{"line_number":247,"context_line":"        final_result \u003d check(\" def test_some_negative_case\", filename)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_d21d9777","line":244,"range":{"start_line":244,"start_character":32,"end_line":244,"end_character":52},"in_reply_to":"5f7c97a3_af7cb271","updated":"2018-07-29 01:35:21.000000000","message":"Done","commit_id":"96a7a647736bafab0ae37bb5715dfe64e41c64b8"}]}
