)]}'
{"keystone/tests/unit/test_v3_os_revoke.py":[{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e018a02964ace8675651baa06471f82cd8f09a88","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"    - A revocation event must always precede token validation, otherwise we can"},{"line_number":159,"context_line":"      safely assume that the token will be valid. Besides, We have plenty of"},{"line_number":160,"context_line":"      tests that validate tokens already."},{"line_number":161,"context_line":""},{"line_number":162,"context_line":"    Given those constraints, there are two possible orderings of these three"},{"line_number":163,"context_line":"    events that could potentially result in a race condition:"}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_3aad7431","line":160,"updated":"2015-09-28 14:46:48.000000000","message":"plenty of revocation tests that validate tokens already?","commit_id":"1b9f2b3a959d910ac5a48c6620e23e4db0d0ebec"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e018a02964ace8675651baa06471f82cd8f09a88","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    Timestamps have finite precision. All possible timestamps of these events"},{"line_number":170,"context_line":"    can be enumerated as follows:"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    - Create \u003d Revoke \u003d Validate: All events occur at the same timestamp."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    - Create \u003d Revoke \u003c Validate: Creation and revocation happen at the same"},{"line_number":175,"context_line":"      timestamp, followed by validation."}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_da07981a","line":172,"updated":"2015-09-28 14:46:48.000000000","message":"do we want to document the expected outcome of each case, or I assume we\u0027ll leave that documented in the tests?","commit_id":"1b9f2b3a959d910ac5a48c6620e23e4db0d0ebec"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"e018a02964ace8675651baa06471f82cd8f09a88","unresolved":false,"context_lines":[{"line_number":317,"context_line":"        self.advance_time_one_second()"},{"line_number":318,"context_line":"        self.revocation_event(token)"},{"line_number":319,"context_line":"        # FIXME(lbragstad): This is transient with Fernet. This should return a"},{"line_number":320,"context_line":"        # 404 but it sometimes returns a 200."},{"line_number":321,"context_line":"        self.validate_token(token, expected_status\u003d("},{"line_number":322,"context_line":"            http_client.OK, http_client.NOT_FOUND))"},{"line_number":323,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"9a1a9d01_1dfbcac2","line":320,"updated":"2015-09-28 14:46:48.000000000","message":"This might be due to a timestamps being generated somewhere in Keystone without timeutils.py (thinking out loud).","commit_id":"1b9f2b3a959d910ac5a48c6620e23e4db0d0ebec"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b6656b1cdd768bae584de940d86703cf30cfa216","unresolved":false,"context_lines":[{"line_number":148,"context_line":"class RaceConditions(object):"},{"line_number":149,"context_line":"    \"\"\"Test race conditions between token creation, revocation and validation."},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"    Token creation and revocation each involve several timestamps, and both"},{"line_number":152,"context_line":"    sets of timestamps are evaluated at the time of token validation. These"},{"line_number":153,"context_line":"    tests assert the behavior of keystone when those timestamps are nearly"},{"line_number":154,"context_line":"    identical or equal to each other by tightly controlling the clock between"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a1a9d01_115145d8","line":151,"updated":"2015-09-29 13:14:01.000000000","message":"both?","commit_id":"95920267cf94302502a38e4f1a9df37bbd79dc49"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b6656b1cdd768bae584de940d86703cf30cfa216","unresolved":false,"context_lines":[{"line_number":162,"context_line":"      token to validate."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"    - A revocation event must always precede token validation, otherwise we can"},{"line_number":165,"context_line":"      safely assume that the token will be valid. Besides, We have plenty of"},{"line_number":166,"context_line":"      tests that validate tokens already."},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    Given those constraints, there are two possible orderings of these three"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a1a9d01_b1d5f91c","line":165,"updated":"2015-09-29 13:14:01.000000000","message":"we*","commit_id":"95920267cf94302502a38e4f1a9df37bbd79dc49"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b6656b1cdd768bae584de940d86703cf30cfa216","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        seconds \u003d (0, 1, 58, 59)"},{"line_number":227,"context_line":"        microseconds \u003d (0, 1, 999998, 999999)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        for second, microsecond in itertools.product(seconds, microseconds):"},{"line_number":230,"context_line":"            yield datetime.datetime("},{"line_number":231,"context_line":"                year\u003d2000, month\u003d6, day\u003d15, hour\u003d12, minute\u003d30, second\u003dsecond,"},{"line_number":232,"context_line":"                microsecond\u003dmicrosecond)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a1a9d01_51f81d7b","line":229,"updated":"2015-09-29 13:14:01.000000000","message":"Just to clarify, itertools.product will take 0 from the seconds set and use it with everything in the microseconds set, right?","commit_id":"95920267cf94302502a38e4f1a9df37bbd79dc49"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1d4b1602ac343ea4599184423d2d99ffd73495f8","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        seconds \u003d (0, 1, 58, 59)"},{"line_number":227,"context_line":"        microseconds \u003d (0, 1, 999998, 999999)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        for second, microsecond in itertools.product(seconds, microseconds):"},{"line_number":230,"context_line":"            yield datetime.datetime("},{"line_number":231,"context_line":"                year\u003d2000, month\u003d6, day\u003d15, hour\u003d12, minute\u003d30, second\u003dsecond,"},{"line_number":232,"context_line":"                microsecond\u003dmicrosecond)"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a1a9d01_c7322f5f","line":229,"in_reply_to":"9a1a9d01_51f81d7b","updated":"2015-09-29 13:40:47.000000000","message":"yeah, i\u0027ll add a comment to demo","commit_id":"95920267cf94302502a38e4f1a9df37bbd79dc49"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"b6656b1cdd768bae584de940d86703cf30cfa216","unresolved":false,"context_lines":[{"line_number":269,"context_line":"                self.validate_token("},{"line_number":270,"context_line":"                    token, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_create_lt_revoke_eq_validate(self):"},{"line_number":273,"context_line":"        for frozen_time in self.start_times:"},{"line_number":274,"context_line":"            with freezegun.freeze_time(frozen_time):"},{"line_number":275,"context_line":"                token \u003d self.create_token()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a1a9d01_b162d93c","line":272,"updated":"2015-09-29 13:14:01.000000000","message":"should we add test doc strings to be consistent with line 263?","commit_id":"95920267cf94302502a38e4f1a9df37bbd79dc49"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"746f9549df3f7a2f5fd26acf32c0960b7a646d8c","unresolved":false,"context_lines":[{"line_number":269,"context_line":"                self.validate_token("},{"line_number":270,"context_line":"                    token, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_create_lt_revoke_eq_validate(self):"},{"line_number":273,"context_line":"        for frozen_time in self.start_times:"},{"line_number":274,"context_line":"            with freezegun.freeze_time(frozen_time):"},{"line_number":275,"context_line":"                token \u003d self.create_token()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a1a9d01_7298bac0","line":272,"in_reply_to":"9a1a9d01_870f5787","updated":"2015-09-29 15:19:41.000000000","message":"++","commit_id":"95920267cf94302502a38e4f1a9df37bbd79dc49"},{"author":{"_account_id":4,"name":"Dolph Mathews","email":"dolph.mathews@gmail.com","username":"dolph"},"change_message_id":"1d4b1602ac343ea4599184423d2d99ffd73495f8","unresolved":false,"context_lines":[{"line_number":269,"context_line":"                self.validate_token("},{"line_number":270,"context_line":"                    token, expected_status\u003dhttp_client.NOT_FOUND)"},{"line_number":271,"context_line":""},{"line_number":272,"context_line":"    def test_create_lt_revoke_eq_validate(self):"},{"line_number":273,"context_line":"        for frozen_time in self.start_times:"},{"line_number":274,"context_line":"            with freezegun.freeze_time(frozen_time):"},{"line_number":275,"context_line":"                token \u003d self.create_token()"}],"source_content_type":"text/x-python","patch_set":10,"id":"9a1a9d01_870f5787","line":272,"in_reply_to":"9a1a9d01_b162d93c","updated":"2015-09-29 13:40:47.000000000","message":"i\u0027ll just remove them, they\u0027re already enumerated quite verbosely in the class docstr","commit_id":"95920267cf94302502a38e4f1a9df37bbd79dc49"},{"author":{"_account_id":5046,"name":"Lance Bragstad","email":"lbragstad@redhat.com","username":"ldbragst"},"change_message_id":"db8e74f770eda63c0d3905eeedfa46875a1d8362","unresolved":false,"context_lines":[{"line_number":226,"context_line":"        seconds \u003d (0, 58, 59)"},{"line_number":227,"context_line":"        microseconds \u003d (0, 999998, 999999)"},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"        # 0.0, 0.999998, 0.999999, 1.0, 1.999998, ..."},{"line_number":230,"context_line":"        for second, microsecond in itertools.product(seconds, microseconds):"},{"line_number":231,"context_line":"            yield datetime.datetime("},{"line_number":232,"context_line":"                year\u003d2000, month\u003d6, day\u003d15, hour\u003d12, minute\u003d30, second\u003dsecond,"}],"source_content_type":"text/x-python","patch_set":11,"id":"9a1a9d01_1265beb3","line":229,"updated":"2015-09-29 15:21:52.000000000","message":"I think this is suppose to be: \n\n    0.0, 0.999998, 0.999999, 58.0, 58.999990, 59.999999, ...\n\n1 doesn\u0027t seem to be in the set.","commit_id":"c2a481035d10661fd7676c9d12ee072f788c1c63"}]}
