| author | |
| committer | |
| log | 33c79841832b575c2dacc7ec07ac9536798be4e3 |
| tree | c7cf048b70a09f3e365ac0d36828b4653cc6d457 |
| parent | 6f3e9939d0389539570d4a7cad95b1e96bc8f0d4 |
closes #1760913 files changed, 35 insertions(+), 18 deletions(-)
lib/compiler/build_runner.zig+2-3| ... | ... | @@ -97,7 +97,6 @@ pub fn main() !void { |
| 97 | 97 | var max_rss: u64 = 0; |
| 98 | 98 | var skip_oom_steps = false; |
| 99 | 99 | var color: Color = .auto; |
| 100 | var seed: u32 = 0; | |
| 101 | 100 | var prominent_compile_errors = false; |
| 102 | 101 | var help_menu = false; |
| 103 | 102 | var steps_menu = false; |
| ... | ... | @@ -188,7 +187,7 @@ pub fn main() !void { |
| 188 | 187 | } else if (mem.eql(u8, arg, "--seed")) { |
| 189 | 188 | const next_arg = nextArg(args, &arg_idx) orelse |
| 190 | 189 | fatalWithHint("expected u32 after '{s}'", .{arg}); |
| 191 | seed = std.fmt.parseUnsigned(u32, next_arg, 0) catch |err| { | |
| 190 | graph.random_seed = std.fmt.parseUnsigned(u32, next_arg, 0) catch |err| { | |
| 192 | 191 | fatal("unable to parse seed '{s}' as unsigned 32-bit integer: {s}\n", .{ |
| 193 | 192 | next_arg, @errorName(err), |
| 194 | 193 | }); |
| ... | ... | @@ -371,7 +370,7 @@ pub fn main() !void { |
| 371 | 370 | } |
| 372 | 371 | |
| 373 | 372 | const gpa = arena; |
| 374 | prepare(gpa, arena, builder, targets.items, &run, seed) catch |err| switch (err) { | |
| 373 | prepare(gpa, arena, builder, targets.items, &run, graph.random_seed) catch |err| switch (err) { | |
| 375 | 374 | error.UncleanExit => process.exit(1), |
| 376 | 375 | else => return err, |
| 377 | 376 | }; |
lib/compiler/test_runner.zig+3| ... | ... | @@ -24,6 +24,9 @@ pub fn main() void { |
| 24 | 24 | for (args[1..]) |arg| { |
| 25 | 25 | if (std.mem.eql(u8, arg, "--listen=-")) { |
| 26 | 26 | listen = true; |
| 27 | } else if (std.mem.startsWith(u8, arg, "--seed=")) { | |
| 28 | std.testing.random_seed = std.fmt.parseUnsigned(u32, arg["--seed=".len..], 0) catch | |
| 29 | @panic("unable to parse --seed command line argument"); | |
| 27 | 30 | } else { |
| 28 | 31 | @panic("unrecognized command line argument"); |
| 29 | 32 | } |
lib/std/Build.zig+1| ... | ... | @@ -121,6 +121,7 @@ pub const Graph = struct { |
| 121 | 121 | /// Information about the native target. Computed before build() is invoked. |
| 122 | 122 | host: ResolvedTarget, |
| 123 | 123 | incremental: ?bool = null, |
| 124 | random_seed: u32 = 0, | |
| 124 | 125 | }; |
| 125 | 126 | |
| 126 | 127 | const AvailableDeps = []const struct { []const u8, []const u8 }; |
lib/std/Build/Step/Run.zig+6-1| ... | ... | @@ -185,8 +185,13 @@ pub fn setName(run: *Run, name: []const u8) void { |
| 185 | 185 | } |
| 186 | 186 | |
| 187 | 187 | pub fn enableTestRunnerMode(run: *Run) void { |
| 188 | const b = run.step.owner; | |
| 189 | const arena = b.allocator; | |
| 188 | 190 | run.stdio = .zig_test; |
| 189 | run.addArgs(&.{"--listen=-"}); | |
| 191 | run.addArgs(&.{ | |
| 192 | std.fmt.allocPrint(arena, "--seed=0x{x}", .{b.graph.random_seed}) catch @panic("OOM"), | |
| 193 | "--listen=-", | |
| 194 | }); | |
| 190 | 195 | } |
| 191 | 196 | |
| 192 | 197 | pub fn addArtifactArg(run: *Run, artifact: *Step.Compile) void { |
lib/std/Random/ziggurat.zig+3-1| ... | ... | @@ -126,7 +126,9 @@ pub fn norm_zero_case(random: Random, u: f64) f64 { |
| 126 | 126 | } |
| 127 | 127 | } |
| 128 | 128 | |
| 129 | test "normal dist sanity" { | |
| 129 | test "normal dist smoke test" { | |
| 130 | // Hardcode 0 as the seed because it's possible a seed exists that fails | |
| 131 | // this test. | |
| 130 | 132 | var prng = Random.DefaultPrng.init(0); |
| 131 | 133 | const random = prng.random(); |
| 132 | 134 |
lib/std/hash_map.zig+2-2| ... | ... | @@ -1935,7 +1935,7 @@ test "put and remove loop in random order" { |
| 1935 | 1935 | while (i < size) : (i += 1) { |
| 1936 | 1936 | try keys.append(i); |
| 1937 | 1937 | } |
| 1938 | var prng = std.Random.DefaultPrng.init(0); | |
| 1938 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 1939 | 1939 | const random = prng.random(); |
| 1940 | 1940 | |
| 1941 | 1941 | while (i < iterations) : (i += 1) { |
| ... | ... | @@ -1967,7 +1967,7 @@ test "remove one million elements in random order" { |
| 1967 | 1967 | keys.append(i) catch unreachable; |
| 1968 | 1968 | } |
| 1969 | 1969 | |
| 1970 | var prng = std.Random.DefaultPrng.init(0); | |
| 1970 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 1971 | 1971 | const random = prng.random(); |
| 1972 | 1972 | random.shuffle(u32, keys.items); |
| 1973 | 1973 |
lib/std/heap/arena_allocator.zig+1-1| ... | ... | @@ -250,7 +250,7 @@ test "reset with preheating" { |
| 250 | 250 | var arena_allocator = ArenaAllocator.init(std.testing.allocator); |
| 251 | 251 | defer arena_allocator.deinit(); |
| 252 | 252 | // provides some variance in the allocated data |
| 253 | var rng_src = std.Random.DefaultPrng.init(19930913); | |
| 253 | var rng_src = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 254 | 254 | const random = rng_src.random(); |
| 255 | 255 | var rounds: usize = 25; |
| 256 | 256 | while (rounds > 0) { |
lib/std/math/big/rational.zig+1-1| ... | ... | @@ -594,7 +594,7 @@ test "toFloat" { |
| 594 | 594 | test "set/to Float round-trip" { |
| 595 | 595 | var a = try Rational.init(testing.allocator); |
| 596 | 596 | defer a.deinit(); |
| 597 | var prng = std.Random.DefaultPrng.init(0x5EED); | |
| 597 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 598 | 598 | const random = prng.random(); |
| 599 | 599 | var i: usize = 0; |
| 600 | 600 | while (i < 512) : (i += 1) { |
lib/std/os/linux/IoUring.zig+2-2| ... | ... | @@ -3995,7 +3995,7 @@ test "ring mapped buffers recv" { |
| 3995 | 3995 | defer fds.close(); |
| 3996 | 3996 | |
| 3997 | 3997 | // for random user_data in sqe/cqe |
| 3998 | var Rnd = std.Random.DefaultPrng.init(0); | |
| 3998 | var Rnd = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 3999 | 3999 | var rnd = Rnd.random(); |
| 4000 | 4000 | |
| 4001 | 4001 | var round: usize = 4; // repeat send/recv cycle round times |
| ... | ... | @@ -4081,7 +4081,7 @@ test "ring mapped buffers multishot recv" { |
| 4081 | 4081 | defer fds.close(); |
| 4082 | 4082 | |
| 4083 | 4083 | // for random user_data in sqe/cqe |
| 4084 | var Rnd = std.Random.DefaultPrng.init(0); | |
| 4084 | var Rnd = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 4085 | 4085 | var rnd = Rnd.random(); |
| 4086 | 4086 | |
| 4087 | 4087 | var round: usize = 4; // repeat send/recv cycle round times |
lib/std/priority_dequeue.zig+3-3| ... | ... | @@ -866,7 +866,7 @@ test "shrinkAndFree" { |
| 866 | 866 | } |
| 867 | 867 | |
| 868 | 868 | test "fuzz testing min" { |
| 869 | var prng = std.Random.DefaultPrng.init(0x12345678); | |
| 869 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 870 | 870 | const random = prng.random(); |
| 871 | 871 | |
| 872 | 872 | const test_case_count = 100; |
| ... | ... | @@ -895,7 +895,7 @@ fn fuzzTestMin(rng: std.Random, comptime queue_size: usize) !void { |
| 895 | 895 | } |
| 896 | 896 | |
| 897 | 897 | test "fuzz testing max" { |
| 898 | var prng = std.Random.DefaultPrng.init(0x87654321); | |
| 898 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 899 | 899 | const random = prng.random(); |
| 900 | 900 | |
| 901 | 901 | const test_case_count = 100; |
| ... | ... | @@ -924,7 +924,7 @@ fn fuzzTestMax(rng: std.Random, queue_size: usize) !void { |
| 924 | 924 | } |
| 925 | 925 | |
| 926 | 926 | test "fuzz testing min and max" { |
| 927 | var prng = std.Random.DefaultPrng.init(0x87654321); | |
| 927 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 928 | 928 | const random = prng.random(); |
| 929 | 929 | |
| 930 | 930 | const test_case_count = 100; |
lib/std/sort.zig+2-2| ... | ... | @@ -223,7 +223,7 @@ test "stable sort" { |
| 223 | 223 | } |
| 224 | 224 | |
| 225 | 225 | test "stable sort fuzz testing" { |
| 226 | var prng = std.Random.DefaultPrng.init(0x12345678); | |
| 226 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 227 | 227 | const random = prng.random(); |
| 228 | 228 | const test_case_count = 10; |
| 229 | 229 | |
| ... | ... | @@ -408,7 +408,7 @@ test "sort with context in the middle of a slice" { |
| 408 | 408 | } |
| 409 | 409 | |
| 410 | 410 | test "sort fuzz testing" { |
| 411 | var prng = std.Random.DefaultPrng.init(0x12345678); | |
| 411 | var prng = std.Random.DefaultPrng.init(std.testing.random_seed); | |
| 412 | 412 | const random = prng.random(); |
| 413 | 413 | const test_case_count = 10; |
| 414 | 414 |
lib/std/testing.zig+5-1| ... | ... | @@ -1,8 +1,12 @@ |
| 1 | 1 | const std = @import("std.zig"); |
| 2 | 2 | const builtin = @import("builtin"); |
| 3 | ||
| 3 | const assert = std.debug.assert; | |
| 4 | 4 | const math = std.math; |
| 5 | 5 | |
| 6 | /// Provides deterministic randomness in unit tests. | |
| 7 | /// Initialized on startup. Read-only after that. | |
| 8 | pub var random_seed: u32 = 0; | |
| 9 | ||
| 6 | 10 | pub const FailingAllocator = @import("testing/failing_allocator.zig").FailingAllocator; |
| 7 | 11 | |
| 8 | 12 | /// This should only be used in temporary test programs. |
src/main.zig+4-1| ... | ... | @@ -4282,7 +4282,10 @@ fn runOrTest( |
| 4282 | 4282 | defer argv.deinit(); |
| 4283 | 4283 | |
| 4284 | 4284 | if (test_exec_args.len == 0) { |
| 4285 | try argv.append(exe_path); | |
| 4285 | try argv.appendSlice(&.{ | |
| 4286 | exe_path, | |
| 4287 | try std.fmt.allocPrint(arena, "--seed=0x{x}", .{std.crypto.random.int(u32)}), | |
| 4288 | }); | |
| 4286 | 4289 | } else { |
| 4287 | 4290 | for (test_exec_args) |arg| { |
| 4288 | 4291 | try argv.append(arg orelse exe_path); |