)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"a0d4e88cd40b91cca39f47c094fedc1e7fed5111","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Liu Qing \u003cliuqing@chinac.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-06-21 17:23:47 +0800"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fix cinder ceph backup driver padding error"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"While restore an extended source, ceph backup driver will padding"},{"line_number":10,"context_line":"0 to the unused space if restore_discard_excess_bytes is True."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5a9d85d2_07ac1c34","line":7,"range":{"start_line":7,"start_character":11,"end_line":7,"end_character":43},"updated":"2016-06-21 10:47:57.000000000","message":"We need a bug report for this patch.","commit_id":"4b7251f8dfa55120caa871deebbbffcb454ae77c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"a0d4e88cd40b91cca39f47c094fedc1e7fed5111","unresolved":false,"context_lines":[{"line_number":9,"context_line":"While restore an extended source, ceph backup driver will padding"},{"line_number":10,"context_line":"0 to the unused space if restore_discard_excess_bytes is True."},{"line_number":11,"context_line":"The original code use total length of the unused space to fill"},{"line_number":12,"context_line":"each chunck. Change to use chunck size to fill each chunck."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: I9658d31a55e5024f5f6d5ccf00939edd668ea451"},{"line_number":15,"context_line":"Signed-off-by: Liu Qing \u003cliuqing@chinac.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"5a9d85d2_e7e8f07e","line":12,"range":{"start_line":12,"start_character":5,"end_line":12,"end_character":11},"updated":"2016-06-21 10:47:57.000000000","message":"chunk, please fix in other places","commit_id":"4b7251f8dfa55120caa871deebbbffcb454ae77c"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"629dc73a2fd3a92b6635e0ae1d0a7b06fe449c5e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"fix cinder ceph backup driver padding error"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"While restore an extended source, ceph backup driver will padding"},{"line_number":10,"context_line":"0 to the unused space if restore_discard_excess_bytes is True."},{"line_number":11,"context_line":"The original code use total length of the unused space to fill"},{"line_number":12,"context_line":"each chunk. Change to use chunk size to fill each chunk."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"3aaa91ec_db9c58c2","line":9,"range":{"start_line":9,"start_character":58,"end_line":9,"end_character":65},"updated":"2016-06-24 08:24:27.000000000","message":"nit: pad","commit_id":"b654e4b732031de882fc213737ad129e65890d8d"}],"cinder/backup/drivers/ceph.py":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"c31e666d3e46170b87b5a059a43deb54966ccecd","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            if self._file_is_rbd(volume):"},{"line_number":284,"context_line":"                volume.rbd_image.discard(offset, length)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                zeroes \u003d \u0027\\0\u0027 * self.chunk_size"},{"line_number":287,"context_line":"                chunks \u003d int(length / self.chunk_size)"},{"line_number":288,"context_line":"                for chunk in range(0, chunks):"},{"line_number":289,"context_line":"                    LOG.debug(\"Writing zeroes chunk %d\", chunk)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_6a7997fc","line":286,"updated":"2016-06-22 07:34:52.000000000","message":"Please update test_discard_bytes in tests/unit/backup/drivers/test_backup_ceph.py to assert that write() is called with zeroes of chunk size.","commit_id":"597368f59509d54b118d5f5f70fc81e0997ac4bf"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"4a0c5b0b8d64bd6d5afb4a3eb39a046735eb00f0","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            if self._file_is_rbd(volume):"},{"line_number":284,"context_line":"                volume.rbd_image.discard(offset, length)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                zeroes \u003d \u0027\\0\u0027 * self.chunk_size"},{"line_number":287,"context_line":"                chunks \u003d int(length / self.chunk_size)"},{"line_number":288,"context_line":"                for chunk in range(0, chunks):"},{"line_number":289,"context_line":"                    LOG.debug(\"Writing zeroes chunk %d\", chunk)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_0edd4be0","line":286,"in_reply_to":"3aaa91ec_4b881a23","updated":"2016-06-23 05:39:38.000000000","message":"Hi Vipin,\nThat\u0027s a good test to catch this issue.\nIt seems image.reset_monk() didn\u0027t reset image._offset to 0. I have to move the test below the first write. \nThe case will fail without the code change. As the write content is much larger than self.chunksize and the second _offset is wrong either.","commit_id":"597368f59509d54b118d5f5f70fc81e0997ac4bf"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"0bb5a7c2fb7157fd4ff21419975028f977ffaf7b","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            if self._file_is_rbd(volume):"},{"line_number":284,"context_line":"                volume.rbd_image.discard(offset, length)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                zeroes \u003d \u0027\\0\u0027 * self.chunk_size"},{"line_number":287,"context_line":"                chunks \u003d int(length / self.chunk_size)"},{"line_number":288,"context_line":"                for chunk in range(0, chunks):"},{"line_number":289,"context_line":"                    LOG.debug(\"Writing zeroes chunk %d\", chunk)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_cd46e2be","line":286,"in_reply_to":"3aaa91ec_6a7997fc","updated":"2016-06-22 08:53:24.000000000","message":"Thanks Vipin.\nWhat do you mean \"write() is called with zeroes of chunk size\"? Could you give some detail. I don\u0027t see why we need to change test_discard_bytes case for now. \nIf offset\u003d0 length\u003d2*chunck_size then the write is called twice.\nIf offset\u003d0 length\u003d2*chunck_size + 1 then the write is called three times.\nI think the test_discard_bytes case is lack of capability to test whether length(for example: 2*chunck_size) is written to rbd image. That\u0027s why this bug exists till now.","commit_id":"597368f59509d54b118d5f5f70fc81e0997ac4bf"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"de7ed3599f28f69f83e6f0eb0b5f9deec69c452c","unresolved":false,"context_lines":[{"line_number":283,"context_line":"            if self._file_is_rbd(volume):"},{"line_number":284,"context_line":"                volume.rbd_image.discard(offset, length)"},{"line_number":285,"context_line":"            else:"},{"line_number":286,"context_line":"                zeroes \u003d \u0027\\0\u0027 * self.chunk_size"},{"line_number":287,"context_line":"                chunks \u003d int(length / self.chunk_size)"},{"line_number":288,"context_line":"                for chunk in range(0, chunks):"},{"line_number":289,"context_line":"                    LOG.debug(\"Writing zeroes chunk %d\", chunk)"}],"source_content_type":"text/x-python","patch_set":2,"id":"3aaa91ec_4b881a23","line":286,"in_reply_to":"3aaa91ec_cd46e2be","updated":"2016-06-22 09:23:35.000000000","message":"Assume that we have the following line in test_discard_bytes line 684:\n\nzeroes \u003d \u0027\\0\u0027 * self.service.chunk_size\n\nimage_write.assert_has_calls([mock.call(zeroes),mock.call(zeroes),mock.call(zeroes)]\n\nWill the test fail without this patch?","commit_id":"597368f59509d54b118d5f5f70fc81e0997ac4bf"}],"cinder/tests/unit/backup/drivers/test_backup_ceph.py":[{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"b121f66d0919fefd6bb13d58db90378080b27e21","unresolved":false,"context_lines":[{"line_number":668,"context_line":"            self.assertEqual(2, image.flush.call_count)"},{"line_number":669,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":670,"context_line":"            zeroes \u003d \u0027\\0\u0027 * self.service.chunk_size"},{"line_number":671,"context_line":"            image.write.assert_has_calls([mock.call(zeroes, 0),"},{"line_number":672,"context_line":"                                         mock.call(zeroes, self.chunk_size)])"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"        image.reset_mock()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_a33fe5d4","line":671,"range":{"start_line":671,"start_character":42,"end_line":671,"end_character":62},"updated":"2016-06-23 09:47:00.000000000","message":"The original call is  volume.write(zeroes). Can we assert for that? Here, the call is different and takes one extra argument.","commit_id":"79d33b6b20950c33d75868ceb2359ff58c6c0c54"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"9a10613e1dfd493e1314e778263afa7fbd2c072e","unresolved":false,"context_lines":[{"line_number":668,"context_line":"            self.assertEqual(2, image.flush.call_count)"},{"line_number":669,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":670,"context_line":"            zeroes \u003d \u0027\\0\u0027 * self.service.chunk_size"},{"line_number":671,"context_line":"            image.write.assert_has_calls([mock.call(zeroes, 0),"},{"line_number":672,"context_line":"                                         mock.call(zeroes, self.chunk_size)])"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"        image.reset_mock()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_9d832104","line":671,"range":{"start_line":671,"start_character":42,"end_line":671,"end_character":62},"in_reply_to":"3aaa91ec_74bdb167","updated":"2016-06-23 11:12:13.000000000","message":"Yes, we can test the offset as well, but then it becomes little difficult to understand the test.","commit_id":"79d33b6b20950c33d75868ceb2359ff58c6c0c54"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"d8be1bf57a91e15f351bf9246fad4fa8e71af6a3","unresolved":false,"context_lines":[{"line_number":668,"context_line":"            self.assertEqual(2, image.flush.call_count)"},{"line_number":669,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":670,"context_line":"            zeroes \u003d \u0027\\0\u0027 * self.service.chunk_size"},{"line_number":671,"context_line":"            image.write.assert_has_calls([mock.call(zeroes, 0),"},{"line_number":672,"context_line":"                                         mock.call(zeroes, self.chunk_size)])"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"        image.reset_mock()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_835c62ee","line":671,"range":{"start_line":671,"start_character":42,"end_line":671,"end_character":62},"in_reply_to":"3aaa91ec_9d832104","updated":"2016-06-23 11:39:59.000000000","message":"This may give some difficult to the reader, but as the the above assert also use image.write to test the call count. If the reader understand the whole test, this won\u0027t be a big problem for him.","commit_id":"79d33b6b20950c33d75868ceb2359ff58c6c0c54"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"4fdb462e66015cc75c524f010d1f69e89c1cf664","unresolved":false,"context_lines":[{"line_number":668,"context_line":"            self.assertEqual(2, image.flush.call_count)"},{"line_number":669,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":670,"context_line":"            zeroes \u003d \u0027\\0\u0027 * self.service.chunk_size"},{"line_number":671,"context_line":"            image.write.assert_has_calls([mock.call(zeroes, 0),"},{"line_number":672,"context_line":"                                         mock.call(zeroes, self.chunk_size)])"},{"line_number":673,"context_line":""},{"line_number":674,"context_line":"        image.reset_mock()"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_74bdb167","line":671,"range":{"start_line":671,"start_character":42,"end_line":671,"end_character":62},"in_reply_to":"3aaa91ec_a33fe5d4","updated":"2016-06-23 10:39:12.000000000","message":"Hi Vipin,\nwrapped_rbd is not a mock instance. wrapped_rbd will call image.write. I think use image.write is better than wrapped_rbd.write, as we could also test whether the _offset is as expected.","commit_id":"79d33b6b20950c33d75868ceb2359ff58c6c0c54"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"b121f66d0919fefd6bb13d58db90378080b27e21","unresolved":false,"context_lines":[{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            self.assertEqual(3, image.write.call_count)"},{"line_number":685,"context_line":"            self.assertEqual(3, image.flush.call_count)"},{"line_number":686,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    @common_mocks"},{"line_number":689,"context_line":"    def test_delete_backup_snapshot(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_5e51b60d","line":686,"updated":"2016-06-23 09:47:00.000000000","message":"-1: Missed the assertion here. We need to assert for the bytes written when there is a remainder. If reset mock is a problem, please create a separate test for this case.","commit_id":"79d33b6b20950c33d75868ceb2359ff58c6c0c54"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"4fdb462e66015cc75c524f010d1f69e89c1cf664","unresolved":false,"context_lines":[{"line_number":683,"context_line":""},{"line_number":684,"context_line":"            self.assertEqual(3, image.write.call_count)"},{"line_number":685,"context_line":"            self.assertEqual(3, image.flush.call_count)"},{"line_number":686,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":687,"context_line":""},{"line_number":688,"context_line":"    @common_mocks"},{"line_number":689,"context_line":"    def test_delete_backup_snapshot(self):"}],"source_content_type":"text/x-python","patch_set":3,"id":"3aaa91ec_14554d1c","line":686,"in_reply_to":"3aaa91ec_5e51b60d","updated":"2016-06-23 10:39:12.000000000","message":"I have some mis-understanding about the image.reset_mock(). image.reset_mock() should not reset _offset. So I move the test back to the tail of this case. It\u0027s working as expected now.","commit_id":"79d33b6b20950c33d75868ceb2359ff58c6c0c54"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"e81c2c9c77876e3165cb6def71f30a17cc426c1e","unresolved":false,"context_lines":[{"line_number":666,"context_line":""},{"line_number":667,"context_line":"            self.assertEqual(2, image.write.call_count)"},{"line_number":668,"context_line":"            self.assertEqual(2, image.flush.call_count)"},{"line_number":669,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"        image.reset_mock()"},{"line_number":672,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_9d0de192","line":669,"updated":"2016-06-23 11:11:42.000000000","message":"We need the image.write.assert_has_calls here also. I think you should add image.write.reset_mock() after the assertion here along with image.reset_mock().","commit_id":"a37c2d094fe859dfba771cf7b3bf91b24d0df615"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"adeb9b492b5ebf9befd98a372c0c5ade3f6d26f7","unresolved":false,"context_lines":[{"line_number":666,"context_line":""},{"line_number":667,"context_line":"            self.assertEqual(2, image.write.call_count)"},{"line_number":668,"context_line":"            self.assertEqual(2, image.flush.call_count)"},{"line_number":669,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":670,"context_line":""},{"line_number":671,"context_line":"        image.reset_mock()"},{"line_number":672,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"3aaa91ec_8372a2ab","line":669,"in_reply_to":"3aaa91ec_9d0de192","updated":"2016-06-23 11:40:23.000000000","message":"Done","commit_id":"a37c2d094fe859dfba771cf7b3bf91b24d0df615"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"6726a46d73231e13dac15e419a52ea733e349c27","unresolved":false,"context_lines":[{"line_number":686,"context_line":"            self.assertEqual(3, image.flush.call_count)"},{"line_number":687,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":688,"context_line":"            zeroes \u003d \u0027\\0\u0027 * self.service.chunk_size"},{"line_number":689,"context_line":"            image.write.assert_has_calls([mock.call(zeroes, self.chunk_size*2),"},{"line_number":690,"context_line":"                                         mock.call(zeroes, self.chunk_size*3),"},{"line_number":691,"context_line":"                                         mock.call(\u0027\\0\u0027, self.chunk_size*4)])"},{"line_number":692,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_e4f8c94b","line":689,"range":{"start_line":689,"start_character":75,"end_line":689,"end_character":76},"updated":"2016-06-23 13:09:17.000000000","message":"pep8 is failing because we need whitespace around *","commit_id":"76b105d7a02361cde438b3e2fb6648e8949a6f44"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"9c6776b190b384ffaefc1807595eebb5d7035d38","unresolved":false,"context_lines":[{"line_number":686,"context_line":"            self.assertEqual(3, image.flush.call_count)"},{"line_number":687,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":688,"context_line":"            zeroes \u003d \u0027\\0\u0027 * self.service.chunk_size"},{"line_number":689,"context_line":"            image.write.assert_has_calls([mock.call(zeroes, self.chunk_size*2),"},{"line_number":690,"context_line":"                                         mock.call(zeroes, self.chunk_size*3),"},{"line_number":691,"context_line":"                                         mock.call(\u0027\\0\u0027, self.chunk_size*4)])"},{"line_number":692,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"3aaa91ec_f0787ff4","line":689,"range":{"start_line":689,"start_character":75,"end_line":689,"end_character":76},"in_reply_to":"3aaa91ec_e4f8c94b","updated":"2016-06-23 14:02:19.000000000","message":"Thanks Vipin. Interesting, CI didn\u0027t catch this at first time.","commit_id":"76b105d7a02361cde438b3e2fb6648e8949a6f44"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"629dc73a2fd3a92b6635e0ae1d0a7b06fe449c5e","unresolved":false,"context_lines":[{"line_number":686,"context_line":"            self.assertEqual(3, image.flush.call_count)"},{"line_number":687,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":688,"context_line":"            image.write.assert_has_calls([mock.call(zeroes,"},{"line_number":689,"context_line":"                                                    self.chunk_size * 2),"},{"line_number":690,"context_line":"                                          mock.call(zeroes,"},{"line_number":691,"context_line":"                                                    self.chunk_size * 3),"},{"line_number":692,"context_line":"                                          mock.call(\u0027\\0\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_bbefcc1c","line":689,"range":{"start_line":689,"start_character":52,"end_line":689,"end_character":71},"updated":"2016-06-24 08:24:27.000000000","message":"Why the offset is not zero here? Can we reset the offset after image.write.reset_mock()?","commit_id":"b654e4b732031de882fc213737ad129e65890d8d"},{"author":{"_account_id":9171,"name":"Vipin Balachandran","email":"vipin.bl@gmail.com","username":"vbala"},"change_message_id":"fa04a2a223b74c108fc6d05abb5b052e5de24600","unresolved":false,"context_lines":[{"line_number":686,"context_line":"            self.assertEqual(3, image.flush.call_count)"},{"line_number":687,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":688,"context_line":"            image.write.assert_has_calls([mock.call(zeroes,"},{"line_number":689,"context_line":"                                                    self.chunk_size * 2),"},{"line_number":690,"context_line":"                                          mock.call(zeroes,"},{"line_number":691,"context_line":"                                                    self.chunk_size * 3),"},{"line_number":692,"context_line":"                                          mock.call(\u0027\\0\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_0f65f01c","line":689,"range":{"start_line":689,"start_character":52,"end_line":689,"end_character":71},"in_reply_to":"3aaa91ec_16a35501","updated":"2016-06-24 13:38:18.000000000","message":"I understand that. I was asking to explicitly reset the offset *after* reset_mock(). \n\nCan we fix this if we create image and wrapped_rbd before each case?\n\nAnother option is to split the cases into different tests.","commit_id":"b654e4b732031de882fc213737ad129e65890d8d"},{"author":{"_account_id":21999,"name":"Liu Qing","email":"liuqing@chinac.com","username":"liuqing"},"change_message_id":"c12052523b974cc027e2ed8083fc9ed48d805633","unresolved":false,"context_lines":[{"line_number":686,"context_line":"            self.assertEqual(3, image.flush.call_count)"},{"line_number":687,"context_line":"            self.assertFalse(image.discard.called)"},{"line_number":688,"context_line":"            image.write.assert_has_calls([mock.call(zeroes,"},{"line_number":689,"context_line":"                                                    self.chunk_size * 2),"},{"line_number":690,"context_line":"                                          mock.call(zeroes,"},{"line_number":691,"context_line":"                                                    self.chunk_size * 3),"},{"line_number":692,"context_line":"                                          mock.call(\u0027\\0\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"3aaa91ec_16a35501","line":689,"range":{"start_line":689,"start_character":52,"end_line":689,"end_character":71},"in_reply_to":"3aaa91ec_bbefcc1c","updated":"2016-06-24 08:40:20.000000000","message":"I think mock.reset_mock() only reset the state of mock itself. For example the call count/whether mock is called. But offset belonged to the Image object. That\u0027s my understanding about mock. If you have any other concerns, please let me know. Thanks.","commit_id":"b654e4b732031de882fc213737ad129e65890d8d"}]}
