also looking at this
Define stable JSON event protocol
#27
11 files
+442
-177
| @@ -47,8 +47,8 @@ test "reporter dot output" { | ||
| 47 | 47 | try std.testing.expect(std.mem.indexOf(u8, output, "Passed: 1") != null); |
| 48 | 48 | } |
| 49 | 49 | |
| 50 | test "reporter json output" { | |
| 51 | var buffer: [2048]u8 = undefined; | |
| 50 | test "reporter json output uses versioned event envelopes" { | |
| 51 | var buffer: [4096]u8 = undefined; | |
| 52 | 52 | const writer: std.Io.Writer = .fixed(&buffer); |
| 53 | 53 | var reporter = ztf.JsonReporter.init(std.testing.allocator, writer); |
| 54 | 54 | defer reporter.deinit(); |
| @@ -56,20 +56,29 @@ test "reporter json output" { | ||
| 56 | 56 | defer results.deinit(); |
| 57 | 57 | results.total = 1; |
| 58 | 58 | results.passed = 1; |
| 59 | var test_case = ztf.TestCase.init("passes", passingTest); | |
| 59 | var test_case = ztf.TestCase.init("passes \"quoted\"\nname", passingTest); | |
| 60 | 60 | test_case.status = .passed; |
| 61 | 61 | |
| 62 | 62 | try reporter.reporter.onRunStart(1); |
| 63 | try reporter.reporter.onSuiteStart("suite"); | |
| 63 | try reporter.reporter.onSuiteStart("suite\tone"); | |
| 64 | try reporter.reporter.onTestStart(test_case.name); | |
| 64 | 65 | try reporter.reporter.onTestEnd(&test_case); |
| 65 | try reporter.reporter.onSuiteEnd("suite"); | |
| 66 | try reporter.reporter.onSuiteEnd("suite\tone"); | |
| 66 | 67 | try reporter.reporter.onRunEnd(&results); |
| 67 | 68 | |
| 68 | 69 | const output = buffer[0..reporter.writer.end]; |
| 69 | try std.testing.expect(std.mem.indexOf(u8, output, "\"name\":\"passes\"") != null); | |
| 70 | try std.testing.expect(std.mem.indexOf(u8, output, "\"passed\":1") != null); | |
| 71 | 70 | var parsed = try std.json.parseFromSlice(std.json.Value, std.testing.allocator, output, .{}); |
| 72 | 71 | defer parsed.deinit(); |
| 72 | const events = parsed.value.array.items; | |
| 73 | try std.testing.expectEqual(@as(usize, 6), events.len); | |
| 74 | try std.testing.expectEqual(@as(i64, ztf.protocol_version), events[0].object.get("protocol_version").?.integer); | |
| 75 | try std.testing.expectEqualStrings("run_start", events[0].object.get("type").?.string); | |
| 76 | try std.testing.expectEqualStrings("test_start", events[2].object.get("type").?.string); | |
| 77 | const test_data = events[3].object.get("data").?.object; | |
| 78 | try std.testing.expectEqualStrings(test_case.name, test_data.get("name").?.string); | |
| 79 | try std.testing.expectEqualStrings("suite\tone", test_data.get("suite").?.string); | |
| 80 | try std.testing.expectEqualStrings("run_end", events[5].object.get("type").?.string); | |
| 81 | try std.testing.expectEqual(@as(i64, 1), events[5].object.get("data").?.object.get("passed").?.integer); | |
| 73 | 82 | } |
| 74 | 83 | |
| 75 | 84 | test "reporter json output includes flaky attempt history" { |
| @@ -106,10 +115,14 @@ test "reporter json output includes flaky attempt history" { | ||
| 106 | 115 | |
| 107 | 116 | const output = buffer[0..reporter.writer.end]; |
| 108 | 117 | try std.testing.expect(std.mem.indexOf(u8, output, "\"status\":\"flaky\"") != null); |
| 109 | try std.testing.expect(std.mem.indexOf(u8, output, "\"attempts\":[") != null); | |
| 110 | try std.testing.expect(std.mem.indexOf(u8, output, "\"durationNs\":10") != null); | |
| 118 | try std.testing.expect(std.mem.indexOf(u8, output, "\"type\":\"retry\"") != null); | |
| 119 | try std.testing.expect(std.mem.indexOf(u8, output, "\"duration_ns\":10") != null); | |
| 111 | 120 | var parsed = try std.json.parseFromSlice(std.json.Value, allocator, output, .{}); |
| 112 | 121 | defer parsed.deinit(); |
| 122 | const events = parsed.value.array.items; | |
| 123 | try std.testing.expectEqualStrings("retry", events[2].object.get("type").?.string); | |
| 124 | try std.testing.expectEqualStrings("retry", events[3].object.get("type").?.string); | |
| 125 | try std.testing.expectEqualStrings("test_end", events[4].object.get("type").?.string); | |
| 113 | 126 | } |
| 114 | 127 | |
| 115 | 128 | test "reporter set selects the same built-ins for every executor" { |