var data = {lines:[ {"lineNum":" 1","line":"const std = @import(\"../std.zig\");"}, {"lineNum":" 2","line":"const builtin = std.builtin;"}, {"lineNum":" 3","line":"const fs = std.fs;"}, {"lineNum":" 4","line":"const File = std.fs.File;"}, {"lineNum":" 5","line":""}, {"lineNum":" 6","line":"test \"openSelfExe\" {","class":"lineCov","hits":"2","order":"13671","possible_hits":"2",}, {"lineNum":" 7","line":" if (builtin.os.tag == .wasi) return error.SkipZigTest;"}, {"lineNum":" 8","line":""}, {"lineNum":" 9","line":" const self_exe_file = try std.fs.openSelfExe();","class":"lineCov","hits":"1","order":"13672","possible_hits":"1",}, {"lineNum":" 10","line":" self_exe_file.close();","class":"lineCov","hits":"1","order":"13699","possible_hits":"1",}, {"lineNum":" 11","line":"}"}, {"lineNum":" 12","line":""}, {"lineNum":" 13","line":"const FILE_LOCK_TEST_SLEEP_TIME = 5 * std.time.millisecond;"}, {"lineNum":" 14","line":""}, {"lineNum":" 15","line":"test \"open file with exclusive nonblocking lock twice\" {","class":"lineCov","hits":"3","order":"13711","possible_hits":"3",}, {"lineNum":" 16","line":" if (builtin.os.tag == .wasi) return error.SkipZigTest;"}, {"lineNum":" 17","line":""}, {"lineNum":" 18","line":" const dir = fs.cwd();","class":"lineCov","hits":"1","order":"13712","possible_hits":"1",}, {"lineNum":" 19","line":" const filename = \"file_nonblocking_lock_test.txt\";"}, {"lineNum":" 20","line":""}, {"lineNum":" 21","line":" const file1 = try dir.createFile(filename, .{ .lock = .Exclusive, .lock_nonblocking = true });","class":"lineCov","hits":"1","order":"13713","possible_hits":"1",}, {"lineNum":" 22","line":" defer file1.close();","class":"linePartCov","hits":"1","order":"13750","possible_hits":"2",}, {"lineNum":" 23","line":""}, {"lineNum":" 24","line":" const file2 = dir.createFile(filename, .{ .lock = .Exclusive, .lock_nonblocking = true });","class":"lineCov","hits":"1","order":"13736","possible_hits":"1",}, {"lineNum":" 25","line":" std.debug.assert(std.meta.eql(file2, error.WouldBlock));","class":"lineCov","hits":"1","order":"13738","possible_hits":"1",}, {"lineNum":" 26","line":""}, {"lineNum":" 27","line":" dir.deleteFile(filename) catch |err| switch (err) {","class":"linePartCov","hits":"1","order":"13739","possible_hits":"2",}, {"lineNum":" 28","line":" error.FileNotFound => {},"}, {"lineNum":" 29","line":" else => return err,","class":"lineNoCov","hits":"0","possible_hits":"2",}, {"lineNum":" 30","line":" };"}, {"lineNum":" 31","line":"}"}, {"lineNum":" 32","line":""}, {"lineNum":" 33","line":"test \"open file with lock twice, make sure it wasn\'t open at the same time\" {","class":"lineCov","hits":"2","order":"13751","possible_hits":"2",}, {"lineNum":" 34","line":" if (builtin.single_threaded) return error.SkipZigTest;"}, {"lineNum":" 35","line":""}, {"lineNum":" 36","line":" if (std.io.is_async) {"}, {"lineNum":" 37","line":" // This test starts its own threads and is not compatible with async I/O."}, {"lineNum":" 38","line":" return error.SkipZigTest;"}, {"lineNum":" 39","line":" }"}, {"lineNum":" 40","line":""}, {"lineNum":" 41","line":" const filename = \"file_lock_test.txt\";"}, {"lineNum":" 42","line":" var contexts = [_]FileLockTestContext{","class":"lineCov","hits":"1","order":"13752","possible_hits":"1",}, {"lineNum":" 43","line":" .{ .filename = filename, .create = true, .lock = .Exclusive },"}, {"lineNum":" 44","line":" .{ .filename = filename, .create = true, .lock = .Exclusive },"}, {"lineNum":" 45","line":" };"}, {"lineNum":" 46","line":" try run_lock_file_test(&contexts);","class":"lineCov","hits":"1","order":"13753","possible_hits":"1",}, {"lineNum":" 47","line":""}, {"lineNum":" 48","line":" // Check for an error"}, {"lineNum":" 49","line":" var was_error = false;","class":"lineCov","hits":"1","order":"13770","possible_hits":"1",}, {"lineNum":" 50","line":" for (contexts) |context, idx| {","class":"lineCov","hits":"2","order":"13771","possible_hits":"2",}, {"lineNum":" 51","line":" if (context.err) |err| {","class":"linePartCov","hits":"1","order":"13772","possible_hits":"2",}, {"lineNum":" 52","line":" was_error = true;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 53","line":" std.debug.warn(\"\\nError in context {}: {}\\n\", .{ idx, err });","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 54","line":" }"}, {"lineNum":" 55","line":" }"}, {"lineNum":" 56","line":" if (was_error) builtin.panic(\"There was an error in contexts\", null);","class":"lineCov","hits":"1","order":"13773","possible_hits":"1",}, {"lineNum":" 57","line":""}, {"lineNum":" 58","line":" std.debug.assert(!contexts[0].overlaps(&contexts[1]));","class":"lineCov","hits":"1","order":"13774","possible_hits":"1",}, {"lineNum":" 59","line":""}, {"lineNum":" 60","line":" fs.cwd().deleteFile(filename) catch |err| switch (err) {","class":"linePartCov","hits":"1","order":"13777","possible_hits":"2",}, {"lineNum":" 61","line":" error.FileNotFound => {},"}, {"lineNum":" 62","line":" else => return err,","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 63","line":" };"}, {"lineNum":" 64","line":"}"}, {"lineNum":" 65","line":""}, {"lineNum":" 66","line":"test \"create file, lock and read from multiple process at once\" {","class":"lineCov","hits":"1","order":"13778","possible_hits":"1",}, {"lineNum":" 67","line":" if (builtin.single_threaded) return error.SkipZigTest;"}, {"lineNum":" 68","line":""}, {"lineNum":" 69","line":" if (std.io.is_async) {"}, {"lineNum":" 70","line":" // This test starts its own threads and is not compatible with async I/O."}, {"lineNum":" 71","line":" return error.SkipZigTest;"}, {"lineNum":" 72","line":" }"}, {"lineNum":" 73","line":""}, {"lineNum":" 74","line":" if (true) {"}, {"lineNum":" 75","line":" // https://github.com/ziglang/zig/issues/5006"}, {"lineNum":" 76","line":" return error.SkipZigTest;","class":"lineCov","hits":"1","order":"13779","possible_hits":"1",}, {"lineNum":" 77","line":" }"}, {"lineNum":" 78","line":""}, {"lineNum":" 79","line":" const filename = \"file_read_lock_test.txt\";"}, {"lineNum":" 80","line":" const filedata = \"Hello, world!\\n\";"}, {"lineNum":" 81","line":""}, {"lineNum":" 82","line":" try fs.cwd().writeFile(filename, filedata);"}, {"lineNum":" 83","line":""}, {"lineNum":" 84","line":" var contexts = [_]FileLockTestContext{"}, {"lineNum":" 85","line":" .{ .filename = filename, .create = false, .lock = .Shared },"}, {"lineNum":" 86","line":" .{ .filename = filename, .create = false, .lock = .Shared },"}, {"lineNum":" 87","line":" .{ .filename = filename, .create = false, .lock = .Exclusive },"}, {"lineNum":" 88","line":" };"}, {"lineNum":" 89","line":""}, {"lineNum":" 90","line":" try run_lock_file_test(&contexts);"}, {"lineNum":" 91","line":""}, {"lineNum":" 92","line":" var was_error = false;"}, {"lineNum":" 93","line":" for (contexts) |context, idx| {"}, {"lineNum":" 94","line":" if (context.err) |err| {"}, {"lineNum":" 95","line":" was_error = true;"}, {"lineNum":" 96","line":" std.debug.warn(\"\\nError in context {}: {}\\n\", .{ idx, err });"}, {"lineNum":" 97","line":" }"}, {"lineNum":" 98","line":" }"}, {"lineNum":" 99","line":" if (was_error) builtin.panic(\"There was an error in contexts\", null);"}, {"lineNum":" 100","line":""}, {"lineNum":" 101","line":" std.debug.assert(contexts[0].overlaps(&contexts[1]));"}, {"lineNum":" 102","line":" std.debug.assert(!contexts[2].overlaps(&contexts[0]));"}, {"lineNum":" 103","line":" std.debug.assert(!contexts[2].overlaps(&contexts[1]));"}, {"lineNum":" 104","line":" if (contexts[0].bytes_read.? != filedata.len) {"}, {"lineNum":" 105","line":" std.debug.warn(\"\\n bytes_read: {}, expected: {} \\n\", .{ contexts[0].bytes_read, filedata.len });"}, {"lineNum":" 106","line":" }"}, {"lineNum":" 107","line":" std.debug.assert(contexts[0].bytes_read.? == filedata.len);"}, {"lineNum":" 108","line":" std.debug.assert(contexts[1].bytes_read.? == filedata.len);"}, {"lineNum":" 109","line":""}, {"lineNum":" 110","line":" fs.cwd().deleteFile(filename) catch |err| switch (err) {"}, {"lineNum":" 111","line":" error.FileNotFound => {},"}, {"lineNum":" 112","line":" else => return err,"}, {"lineNum":" 113","line":" };"}, {"lineNum":" 114","line":"}"}, {"lineNum":" 115","line":""}, {"lineNum":" 116","line":"test \"open file with exclusive nonblocking lock twice (absolute paths)\" {","class":"lineCov","hits":"3","order":"13780","possible_hits":"3",}, {"lineNum":" 117","line":" if (builtin.os.tag == .wasi) return error.SkipZigTest;"}, {"lineNum":" 118","line":""}, {"lineNum":" 119","line":" const allocator = std.testing.allocator;"}, {"lineNum":" 120","line":""}, {"lineNum":" 121","line":" const file_paths: [1][]const u8 = .{\"zig-test-absolute-paths.txt\"};"}, {"lineNum":" 122","line":" const filename = try fs.path.resolve(allocator, &file_paths);","class":"lineCov","hits":"1","order":"13781","possible_hits":"1",}, {"lineNum":" 123","line":" defer allocator.free(filename);","class":"linePartCov","hits":"1","order":"13797","possible_hits":"3",}, {"lineNum":" 124","line":""}, {"lineNum":" 125","line":" const file1 = try fs.createFileAbsolute(filename, .{ .lock = .Exclusive, .lock_nonblocking = true });","class":"linePartCov","hits":"1","order":"13784","possible_hits":"2",}, {"lineNum":" 126","line":""}, {"lineNum":" 127","line":" const file2 = fs.createFileAbsolute(filename, .{ .lock = .Exclusive, .lock_nonblocking = true });","class":"lineCov","hits":"1","order":"13790","possible_hits":"1",}, {"lineNum":" 128","line":" file1.close();","class":"lineCov","hits":"1","order":"13791","possible_hits":"1",}, {"lineNum":" 129","line":" std.testing.expectError(error.WouldBlock, file2);","class":"lineCov","hits":"1","order":"13792","possible_hits":"1",}, {"lineNum":" 130","line":""}, {"lineNum":" 131","line":" try fs.deleteFileAbsolute(filename);","class":"linePartCov","hits":"1","order":"13793","possible_hits":"2",}, {"lineNum":" 132","line":"}"}, {"lineNum":" 133","line":""}, {"lineNum":" 134","line":"const FileLockTestContext = struct {"}, {"lineNum":" 135","line":" filename: []const u8,"}, {"lineNum":" 136","line":" pid: if (builtin.os.tag == .windows) ?void else ?std.os.pid_t = null,"}, {"lineNum":" 137","line":""}, {"lineNum":" 138","line":" // use file.createFile"}, {"lineNum":" 139","line":" create: bool,"}, {"lineNum":" 140","line":" // the type of lock to use"}, {"lineNum":" 141","line":" lock: File.Lock,"}, {"lineNum":" 142","line":""}, {"lineNum":" 143","line":" // Output variables"}, {"lineNum":" 144","line":" err: ?(File.OpenError || std.os.ReadError) = null,"}, {"lineNum":" 145","line":" start_time: u64 = 0,"}, {"lineNum":" 146","line":" end_time: u64 = 0,"}, {"lineNum":" 147","line":" bytes_read: ?usize = null,"}, {"lineNum":" 148","line":""}, {"lineNum":" 149","line":" fn overlaps(self: *const @This(), other: *const @This()) bool {","class":"lineCov","hits":"1","order":"13775","possible_hits":"1",}, {"lineNum":" 150","line":" return (self.start_time < other.end_time) and (self.end_time > other.start_time);","class":"lineCov","hits":"1","order":"13776","possible_hits":"1",}, {"lineNum":" 151","line":" }"}, {"lineNum":" 152","line":""}, {"lineNum":" 153","line":" fn run(ctx: *@This()) void {","class":"lineCov","hits":"2","order":"13760","possible_hits":"2",}, {"lineNum":" 154","line":" var file: File = undefined;","class":"lineCov","hits":"1","order":"13761","possible_hits":"1",}, {"lineNum":" 155","line":" if (ctx.create) {","class":"lineCov","hits":"2","order":"13762","possible_hits":"2",}, {"lineNum":" 156","line":" file = fs.cwd().createFile(ctx.filename, .{ .lock = ctx.lock }) catch |err| {","class":"lineCov","hits":"2","order":"13763","possible_hits":"2",}, {"lineNum":" 157","line":" ctx.err = err;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 158","line":" return;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 159","line":" };"}, {"lineNum":" 160","line":" } else {"}, {"lineNum":" 161","line":" file = fs.cwd().openFile(ctx.filename, .{ .lock = ctx.lock }) catch |err| {","class":"lineNoCov","hits":"0","possible_hits":"2",}, {"lineNum":" 162","line":" ctx.err = err;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 163","line":" return;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 164","line":" };"}, {"lineNum":" 165","line":" }"}, {"lineNum":" 166","line":" defer file.close();","class":"linePartCov","hits":"1","order":"13768","possible_hits":"2",}, {"lineNum":" 167","line":""}, {"lineNum":" 168","line":" ctx.start_time = std.time.milliTimestamp();","class":"lineCov","hits":"1","order":"13764","possible_hits":"1",}, {"lineNum":" 169","line":""}, {"lineNum":" 170","line":" if (!ctx.create) {","class":"linePartCov","hits":"1","order":"13765","possible_hits":"2",}, {"lineNum":" 171","line":" var buffer: [100]u8 = undefined;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 172","line":" ctx.bytes_read = 0;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 173","line":" while (true) {","class":"lineNoCov","hits":"0","possible_hits":"2",}, {"lineNum":" 174","line":" const amt = file.read(buffer[0..]) catch |err| {","class":"lineNoCov","hits":"0","possible_hits":"3",}, {"lineNum":" 175","line":" ctx.err = err;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 176","line":" return;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 177","line":" };"}, {"lineNum":" 178","line":" if (amt == 0) break;","class":"lineNoCov","hits":"0","possible_hits":"1",}, {"lineNum":" 179","line":" ctx.bytes_read.? += amt;","class":"lineNoCov","hits":"0","possible_hits":"2",}, {"lineNum":" 180","line":" }"}, {"lineNum":" 181","line":" }"}, {"lineNum":" 182","line":""}, {"lineNum":" 183","line":" std.time.sleep(FILE_LOCK_TEST_SLEEP_TIME);","class":"lineCov","hits":"1","order":"13766","possible_hits":"1",}, {"lineNum":" 184","line":""}, {"lineNum":" 185","line":" ctx.end_time = std.time.milliTimestamp();","class":"lineCov","hits":"1","order":"13767","possible_hits":"1",}, {"lineNum":" 186","line":" }"}, {"lineNum":" 187","line":"};"}, {"lineNum":" 188","line":""}, {"lineNum":" 189","line":"fn run_lock_file_test(contexts: []FileLockTestContext) !void {","class":"lineCov","hits":"3","order":"13754","possible_hits":"3",}, {"lineNum":" 190","line":" var threads = std.ArrayList(*std.Thread).init(std.testing.allocator);","class":"lineCov","hits":"1","order":"13755","possible_hits":"1",}, {"lineNum":" 191","line":" defer {"}, {"lineNum":" 192","line":" for (threads.items) |thread| {","class":"linePartCov","hits":"2","order":"13758","possible_hits":"6",}, {"lineNum":" 193","line":" thread.wait();","class":"linePartCov","hits":"1","order":"13759","possible_hits":"3",}, {"lineNum":" 194","line":" }"}, {"lineNum":" 195","line":" threads.deinit();","class":"linePartCov","hits":"1","order":"13769","possible_hits":"3",}, {"lineNum":" 196","line":" }"}, {"lineNum":" 197","line":" for (contexts) |*ctx, idx| {","class":"lineCov","hits":"2","order":"13756","possible_hits":"2",}, {"lineNum":" 198","line":" try threads.append(try std.Thread.spawn(ctx, FileLockTestContext.run));","class":"linePartCov","hits":"1","order":"13757","possible_hits":"3",}, {"lineNum":" 199","line":" }"}, {"lineNum":" 200","line":"}"}, ]}; var percent_low = 25;var percent_high = 75; var header = { "command" : "test", "date" : "2020-05-19 01:29:25", "instrumented" : 64, "covered" : 47,}; var merged_data = [];