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 {
103103 }
104104
105105 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 {
106113 const held = self.mutex.acquire();
107114 defer held.release();
108115
109 std.debug.warn("head: ");
110 dumpRecursive(self.head, 0);
111 std.debug.warn("tail: ");
112 dumpRecursive(self.tail, 0);
116 try stream.print("head: ");
117 try dumpRecursive(stream, self.head, 0);
118 try stream.print("tail: ");
119 try dumpRecursive(stream, self.tail, 0);
113120 }
114121
115 fn dumpRecursive(optional_node: ?*Node, indent: usize) void {
116 var stderr_file = std.io.getStdErr() catch return;
117 const stderr = &std.io.FileOutStream.init(stderr_file).stream;
118 stderr.writeByteNTimes(' ', indent) catch return;
122 fn dumpRecursive(stream: var, optional_node: ?*Node, indent: usize) error!void {
123 try stream.writeByteNTimes(' ', indent);
119124 if (optional_node) |node| {
120 std.debug.warn("0x{x}={}\n", @ptrToInt(node), node.data);
121 dumpRecursive(node.next, indent + 1);
125 try stream.print("0x{x}={}\n", @ptrToInt(node), node.data);
126 try dumpRecursive(stream, node.next, indent + 1);
122127 } else {
123 std.debug.warn("(null)\n");
128 try stream.print("(null)\n");
124129 }
125130 }
126131 };
......@@ -274,3 +279,63 @@ test "std.atomic.Queue single-threaded" {
274279
275280 assert(queue.get() == null);
276281}
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 {
461461
462462 pub stream: Stream,
463463
464 pos: usize,
464 pub pos: usize,
465465 slice: []u8,
466466
467467 pub fn init(slice: []u8) SliceOutStream {