authorgravatar for wink@saville.comWink Saville <wink@saville.com> 2018-09-14 14:14:58-07:00
committergravatar for wink@saville.comWink Saville <wink@saville.com> 2018-09-14 14:14:58-07:00
logd9ed3d186dc09cab05b841b924664fc886077275
tree0d6b76d47453575ce8fec7b02aec58e63198d7dc
parent639c3811288b65173b3d9706b8e2001ee2419233
signature Commit is signed but in an unrecognized format.

Add test for Queue.dump

To make dump testable added dumpToSteam which takes a stream as input and added the stream as a paraemter to dumpRecursive. Added test "std.atomic.Queue dump" And to make the test more robust SliceOutStream.pos is now public. This allows the user of SliceOutStream to know the length of the data captured.

2 files changed, 77 insertions(+), 12 deletions(-)

std/atomic/queue.zig+76-11
...@@ -103,24 +103,29 @@ pub fn Queue(comptime T: type) type {...@@ -103,24 +103,29 @@ pub fn Queue(comptime T: type) type {
103 }103 }
104104
105 pub fn dump(self: *Self) void {105 pub fn dump(self: *Self) void {
106 var stderr_file = std.io.getStdErr() catch return;
107 const stderr = &std.io.FileOutStream.init(stderr_file).stream;
108
109 self.dumpToStream(stderr) catch return;
110 }
111
112 pub fn dumpToStream(self: *Self, stream: var) !void {
106 const held = self.mutex.acquire();113 const held = self.mutex.acquire();
107 defer held.release();114 defer held.release();
108115
109 std.debug.warn("head: ");116 try stream.print("head: ");
110 dumpRecursive(self.head, 0);117 try dumpRecursive(stream, self.head, 0);
111 std.debug.warn("tail: ");118 try stream.print("tail: ");
112 dumpRecursive(self.tail, 0);119 try dumpRecursive(stream, self.tail, 0);
113 }120 }
114121
115 fn dumpRecursive(optional_node: ?*Node, indent: usize) void {122 fn dumpRecursive(stream: var, optional_node: ?*Node, indent: usize) error!void {
116 var stderr_file = std.io.getStdErr() catch return;123 try stream.writeByteNTimes(' ', indent);
117 const stderr = &std.io.FileOutStream.init(stderr_file).stream;
118 stderr.writeByteNTimes(' ', indent) catch return;
119 if (optional_node) |node| {124 if (optional_node) |node| {
120 std.debug.warn("0x{x}={}\n", @ptrToInt(node), node.data);125 try stream.print("0x{x}={}\n", @ptrToInt(node), node.data);
121 dumpRecursive(node.next, indent + 1);126 try dumpRecursive(stream, node.next, indent + 1);
122 } else {127 } else {
123 std.debug.warn("(null)\n");128 try stream.print("(null)\n");
124 }129 }
125 }130 }
126 };131 };
...@@ -274,3 +279,63 @@ test "std.atomic.Queue single-threaded" {...@@ -274,3 +279,63 @@ test "std.atomic.Queue single-threaded" {
274279
275 assert(queue.get() == null);280 assert(queue.get() == null);
276}281}
282
283test "std.atomic.Queue dump" {
284 const mem = std.mem;
285 const SliceOutStream = std.io.SliceOutStream;
286 var buffer: [1024]u8 = undefined;
287 var expected_buffer: [1024]u8 = undefined;
288 var sos = SliceOutStream.init(buffer[0..]);
289
290 var queue = Queue(i32).init();
291
292 // Test empty stream
293 sos.reset();
294 try queue.dumpToStream(&sos.stream);
295 assert(mem.eql(u8, buffer[0..sos.pos],
296 \\head: (null)
297 \\tail: (null)
298 \\
299 ));
300
301 // Test a stream with one element
302 var node_0 = Queue(i32).Node {
303 .data = 1,
304 .next = undefined,
305 .prev = undefined,
306 };
307 queue.put(&node_0);
308
309 sos.reset();
310 try queue.dumpToStream(&sos.stream);
311
312 var expected = try std.fmt.bufPrint(expected_buffer[0..],
313 \\head: 0x{x}=1
314 \\ (null)
315 \\tail: 0x{x}=1
316 \\ (null)
317 \\
318 , @ptrToInt(queue.head), @ptrToInt(queue.tail));
319 assert(mem.eql(u8, buffer[0..sos.pos], expected));
320
321 // Test a stream with two elements
322 var node_1 = Queue(i32).Node {
323 .data = 2,
324 .next = undefined,
325 .prev = undefined,
326 };
327 queue.put(&node_1);
328
329 sos.reset();
330 try queue.dumpToStream(&sos.stream);
331
332 expected = try std.fmt.bufPrint(expected_buffer[0..],
333 \\head: 0x{x}=1
334 \\ 0x{x}=2
335 \\ (null)
336 \\tail: 0x{x}=2
337 \\ (null)
338 \\
339 , @ptrToInt(queue.head), @ptrToInt(queue.head.?.next), @ptrToInt(queue.tail));
340 assert(mem.eql(u8, buffer[0..sos.pos], expected));
341}
std/io.zig+1-1
...@@ -461,7 +461,7 @@ pub const SliceOutStream = struct {...@@ -461,7 +461,7 @@ pub const SliceOutStream = struct {
461461
462 pub stream: Stream,462 pub stream: Stream,
463463
464 pos: usize,464 pub pos: usize,
465 slice: []u8,465 slice: []u8,
466466
467 pub fn init(slice: []u8) SliceOutStream {467 pub fn init(slice: []u8) SliceOutStream {