)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"30d55c64ddc2a57ddc7281c9f84807b60d0ac591","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"779caf0e_b8ee6327","updated":"2024-08-22 13:47:57.000000000","message":"Pushing this back to you for swapping out sync for fsync at least.","commit_id":"c94f01a4745bb39e32c36faa3e2ba59e969c7c6d"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2189d5a43f3b5e19cbcbe434e70663f64722b142","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":1,"id":"9b626c98_9bb0565d","in_reply_to":"779caf0e_b8ee6327","updated":"2024-08-22 15:44:55.000000000","message":"I updated the test to no longer need a sync call.","commit_id":"c94f01a4745bb39e32c36faa3e2ba59e969c7c6d"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"27b3da4f15ca3cf26bff5b3b9a80b3ac454e0305","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"75425fb7_926d4538","in_reply_to":"9b626c98_9bb0565d","updated":"2024-08-26 11:44:01.000000000","message":"Done","commit_id":"c94f01a4745bb39e32c36faa3e2ba59e969c7c6d"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"27b3da4f15ca3cf26bff5b3b9a80b3ac454e0305","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":2,"id":"90cca265_ea987247","updated":"2024-08-26 11:44:01.000000000","message":"The code changes are good. The tests are IMO too much code, I think the way to go here is to have a blockdev compliance test function and then just call that for every implementation. Then external implementations could also use that.","commit_id":"129a5f0c3d7506e60445419f9e551ba2bacb853b"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"cd793638d1233a982c8d13fb2f78223fdbb5767e","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"1a99a4bc_ae42beb0","in_reply_to":"90cca265_ea987247","updated":"2024-08-27 15:46:28.000000000","message":"Done","commit_id":"129a5f0c3d7506e60445419f9e551ba2bacb853b"}],"osbase/blockdev/blockdev_test.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a86269dd0d80ce80a470f37bd6614ac1abe429a1","unresolved":true,"context_lines":[{"line_number":11,"context_line":"// ValidateBlockDev tests all methods of the BlockDev interface. This way, all"},{"line_number":12,"context_line":"// implementations can be tested without duplicating test code."},{"line_number":13,"context_line":"// writePastEnd can be set to false to disable testing WriteAt past the end of"},{"line_number":14,"context_line":"// the blockdev. This is needed for the Device and File implementations, which"},{"line_number":15,"context_line":"// directly forward WriteAt to the backing file."},{"line_number":16,"context_line":"func ValidateBlockDev(t *testing.T, blk BlockDev, blockCount, blockSize, optimalBlockSize int64, writePastEnd bool) {"},{"line_number":17,"context_line":"\tif blk.BlockCount() !\u003d blockCount {"},{"line_number":18,"context_line":"\t\tt.Errorf(\"Expected block count %d, got %d\", blockCount, blk.BlockCount())"}],"source_content_type":"text/x-go","patch_set":3,"id":"48d6902b_c79bbb39","line":15,"range":{"start_line":14,"start_character":17,"end_line":15,"end_character":48},"updated":"2024-08-28 14:36:52.000000000","message":"Implementations should not expect different behavior from different BlockDev implementations unless they are using a specific instance with extra functionality. Why do we have that distinction?","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"eabe73a80d226f7e7eea384e3d91210e5f60ff44","unresolved":false,"context_lines":[{"line_number":11,"context_line":"// ValidateBlockDev tests all methods of the BlockDev interface. This way, all"},{"line_number":12,"context_line":"// implementations can be tested without duplicating test code."},{"line_number":13,"context_line":"// writePastEnd can be set to false to disable testing WriteAt past the end of"},{"line_number":14,"context_line":"// the blockdev. This is needed for the Device and File implementations, which"},{"line_number":15,"context_line":"// directly forward WriteAt to the backing file."},{"line_number":16,"context_line":"func ValidateBlockDev(t *testing.T, blk BlockDev, blockCount, blockSize, optimalBlockSize int64, writePastEnd bool) {"},{"line_number":17,"context_line":"\tif blk.BlockCount() !\u003d blockCount {"},{"line_number":18,"context_line":"\t\tt.Errorf(\"Expected block count %d, got %d\", blockCount, blk.BlockCount())"}],"source_content_type":"text/x-go","patch_set":3,"id":"7eb0ad61_3953e048","line":15,"range":{"start_line":14,"start_character":17,"end_line":15,"end_character":48},"in_reply_to":"1e2a3bdd_7b7e668c","updated":"2024-09-04 17:29:23.000000000","message":"Done","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"21316ad26d5e2c3618702de67afe153a70d681a0","unresolved":true,"context_lines":[{"line_number":11,"context_line":"// ValidateBlockDev tests all methods of the BlockDev interface. This way, all"},{"line_number":12,"context_line":"// implementations can be tested without duplicating test code."},{"line_number":13,"context_line":"// writePastEnd can be set to false to disable testing WriteAt past the end of"},{"line_number":14,"context_line":"// the blockdev. This is needed for the Device and File implementations, which"},{"line_number":15,"context_line":"// directly forward WriteAt to the backing file."},{"line_number":16,"context_line":"func ValidateBlockDev(t *testing.T, blk BlockDev, blockCount, blockSize, optimalBlockSize int64, writePastEnd bool) {"},{"line_number":17,"context_line":"\tif blk.BlockCount() !\u003d blockCount {"},{"line_number":18,"context_line":"\t\tt.Errorf(\"Expected block count %d, got %d\", blockCount, blk.BlockCount())"}],"source_content_type":"text/x-go","patch_set":3,"id":"5e2adbe6_f64cab10","line":15,"range":{"start_line":14,"start_character":17,"end_line":15,"end_character":48},"in_reply_to":"48d6902b_c79bbb39","updated":"2024-09-02 15:51:25.000000000","message":"The reason is that, for example with a File, writing past the end will increase the file size. I see these options:\n\n1. Skip testing writes past the end for File and Device (currently implemented).\n2. Adjust the WriteAt and ReadAt implementations for File and Device to not just pass through, but truncate the operation when it is past the end.\n3. Remove the write past the end test completely.\n\nShould I implement option 2, or something else?","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5a74f1b9468cbe3e599d7acbee28d1838dc83514","unresolved":true,"context_lines":[{"line_number":11,"context_line":"// ValidateBlockDev tests all methods of the BlockDev interface. This way, all"},{"line_number":12,"context_line":"// implementations can be tested without duplicating test code."},{"line_number":13,"context_line":"// writePastEnd can be set to false to disable testing WriteAt past the end of"},{"line_number":14,"context_line":"// the blockdev. This is needed for the Device and File implementations, which"},{"line_number":15,"context_line":"// directly forward WriteAt to the backing file."},{"line_number":16,"context_line":"func ValidateBlockDev(t *testing.T, blk BlockDev, blockCount, blockSize, optimalBlockSize int64, writePastEnd bool) {"},{"line_number":17,"context_line":"\tif blk.BlockCount() !\u003d blockCount {"},{"line_number":18,"context_line":"\t\tt.Errorf(\"Expected block count %d, got %d\", blockCount, blk.BlockCount())"}],"source_content_type":"text/x-go","patch_set":3,"id":"1e2a3bdd_7b7e668c","line":15,"range":{"start_line":14,"start_character":17,"end_line":15,"end_character":48},"in_reply_to":"5e2adbe6_f64cab10","updated":"2024-09-04 16:04:26.000000000","message":"When designing blockdev I initially considered dynamically-sized blockdevs, indicated by BlockCount -1, but accomodating that in consumers is tricky so I left it out of what we have now. I\u0027d say the right approach is 2.","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a86269dd0d80ce80a470f37bd6614ac1abe429a1","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\t// ReadAt"},{"line_number":29,"context_line":"\tcheckBlockDevOp(t, blk, func(content []byte) {"},{"line_number":30,"context_line":"\t\treadAtTests :\u003d []struct{ offset, len int64 }{"},{"line_number":31,"context_line":"\t\t\t{0, 0},"},{"line_number":32,"context_line":"\t\t\t{size, 0},"},{"line_number":33,"context_line":"\t\t\t{3, 8},"}],"source_content_type":"text/x-go","patch_set":3,"id":"6ff13b94_e2671924","line":30,"range":{"start_line":30,"start_character":44,"end_line":30,"end_character":45},"updated":"2024-08-28 14:36:52.000000000","message":"Move the expected result (at least err !\u003d nil) into the table instead of deriving it. It doesn\u0027t add much code and makes a) the test clearer and b) helps spot mistakes in the expected value. Same goes for the other tests here.","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5a74f1b9468cbe3e599d7acbee28d1838dc83514","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\t// ReadAt"},{"line_number":29,"context_line":"\tcheckBlockDevOp(t, blk, func(content []byte) {"},{"line_number":30,"context_line":"\t\treadAtTests :\u003d []struct{ offset, len int64 }{"},{"line_number":31,"context_line":"\t\t\t{0, 0},"},{"line_number":32,"context_line":"\t\t\t{size, 0},"},{"line_number":33,"context_line":"\t\t\t{3, 8},"}],"source_content_type":"text/x-go","patch_set":3,"id":"ef5e0e64_1cd5d5a6","line":30,"range":{"start_line":30,"start_character":44,"end_line":30,"end_character":45},"in_reply_to":"6af3cb64_eb5fb36a","updated":"2024-09-04 16:04:26.000000000","message":"I do not see any accesses to BlockCount or BlockSize in the code below, how does that influence these tests?","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"21316ad26d5e2c3618702de67afe153a70d681a0","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\t// ReadAt"},{"line_number":29,"context_line":"\tcheckBlockDevOp(t, blk, func(content []byte) {"},{"line_number":30,"context_line":"\t\treadAtTests :\u003d []struct{ offset, len int64 }{"},{"line_number":31,"context_line":"\t\t\t{0, 0},"},{"line_number":32,"context_line":"\t\t\t{size, 0},"},{"line_number":33,"context_line":"\t\t\t{3, 8},"}],"source_content_type":"text/x-go","patch_set":3,"id":"6af3cb64_eb5fb36a","line":30,"range":{"start_line":30,"start_character":44,"end_line":30,"end_character":45},"in_reply_to":"6ff13b94_e2671924","updated":"2024-09-02 15:51:25.000000000","message":"I can\u0027t easily do that here because the result often depends on blockCount and blockSize, which changes for different calls to ValidateBlockDev.","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"b8a66ce4f99a041389b283840b993fa70ce4ea0b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\t// ReadAt"},{"line_number":29,"context_line":"\tcheckBlockDevOp(t, blk, func(content []byte) {"},{"line_number":30,"context_line":"\t\treadAtTests :\u003d []struct{ offset, len int64 }{"},{"line_number":31,"context_line":"\t\t\t{0, 0},"},{"line_number":32,"context_line":"\t\t\t{size, 0},"},{"line_number":33,"context_line":"\t\t\t{3, 8},"}],"source_content_type":"text/x-go","patch_set":3,"id":"22c0e525_c724f9e1","line":30,"range":{"start_line":30,"start_character":44,"end_line":30,"end_character":45},"in_reply_to":"98eb825e_22a0314b","updated":"2024-09-10 10:26:13.000000000","message":"Done","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"eabe73a80d226f7e7eea384e3d91210e5f60ff44","unresolved":true,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"\t// ReadAt"},{"line_number":29,"context_line":"\tcheckBlockDevOp(t, blk, func(content []byte) {"},{"line_number":30,"context_line":"\t\treadAtTests :\u003d []struct{ offset, len int64 }{"},{"line_number":31,"context_line":"\t\t\t{0, 0},"},{"line_number":32,"context_line":"\t\t\t{size, 0},"},{"line_number":33,"context_line":"\t\t\t{3, 8},"}],"source_content_type":"text/x-go","patch_set":3,"id":"98eb825e_22a0314b","line":30,"range":{"start_line":30,"start_character":44,"end_line":30,"end_character":45},"in_reply_to":"ef5e0e64_1cd5d5a6","updated":"2024-09-04 17:29:23.000000000","message":"`size` is calculated as `blockCount * blockSize` and is often used for calculating the expected result. For example, in the ReadAt tests, we expect EOF when reading past the end. So when ValidateBlockDev is called with a small blockdev, we may expect EOF in a test case, but if the blockdev is larger, we expect a nil error in the same test case.","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a86269dd0d80ce80a470f37bd6614ac1abe429a1","unresolved":true,"context_lines":[{"line_number":105,"context_line":"\t\t{-blockSize, blockSize},    // negative start"},{"line_number":106,"context_line":"\t\t{2 * blockSize, blockSize}, // start after end"},{"line_number":107,"context_line":"\t\t{1, blockSize},             // unaligned start"},{"line_number":108,"context_line":"\t\t{0, 1},                     //unaligned end"},{"line_number":109,"context_line":"\t}"},{"line_number":110,"context_line":"\tfor i, tt :\u003d range zeroTests {"},{"line_number":111,"context_line":"\t\tcheckBlockDevOp(t, blk, func(content []byte) {"}],"source_content_type":"text/x-go","patch_set":3,"id":"707ca69a_4fcb61f1","line":108,"range":{"start_line":108,"start_character":32,"end_line":108,"end_character":45},"updated":"2024-08-28 14:36:52.000000000","message":"Consider naming your subtests with a name as the first struct field instead of using comments. Together with t.Run (subtests) this makes test failures much easier to figure out.","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"21316ad26d5e2c3618702de67afe153a70d681a0","unresolved":false,"context_lines":[{"line_number":105,"context_line":"\t\t{-blockSize, blockSize},    // negative start"},{"line_number":106,"context_line":"\t\t{2 * blockSize, blockSize}, // start after end"},{"line_number":107,"context_line":"\t\t{1, blockSize},             // unaligned start"},{"line_number":108,"context_line":"\t\t{0, 1},                     //unaligned end"},{"line_number":109,"context_line":"\t}"},{"line_number":110,"context_line":"\tfor i, tt :\u003d range zeroTests {"},{"line_number":111,"context_line":"\t\tcheckBlockDevOp(t, blk, func(content []byte) {"}],"source_content_type":"text/x-go","patch_set":3,"id":"1f14ad07_37715d8d","line":108,"range":{"start_line":108,"start_character":32,"end_line":108,"end_character":45},"in_reply_to":"707ca69a_4fcb61f1","updated":"2024-09-02 15:51:25.000000000","message":"Done","commit_id":"48ff39f6b052a2380593dd5e10385f8ad80bc089"}]}
