add unit tests for padding
This commit is contained in:
parent
623060dac3
commit
ca28332126
@ -1,7 +1,7 @@
|
|||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const shell = @import("shell.zig");
|
const shell = @import("shell.zig");
|
||||||
|
|
||||||
const HeaderSize = @sizeOf(Header);
|
const HeaderSize = @divExact(@bitSizeOf(Header), 8);
|
||||||
const Magic = [4]u8{ 0xf0, 0x9f, 0xa4, 0xb7 };
|
const Magic = [4]u8{ 0xf0, 0x9f, 0xa4, 0xb7 };
|
||||||
const Version = 0;
|
const Version = 0;
|
||||||
const Bom = 0x1234;
|
const Bom = 0x1234;
|
||||||
@ -73,10 +73,6 @@ const Header = packed struct {
|
|||||||
|
|
||||||
const testing = std.testing;
|
const testing = std.testing;
|
||||||
|
|
||||||
test "header is byte-aligned" {
|
|
||||||
try testing.expectEqual(HeaderSize * 8, @bitSizeOf(Header));
|
|
||||||
}
|
|
||||||
|
|
||||||
test "Section length is a power of two" {
|
test "Section length is a power of two" {
|
||||||
try testing.expect(std.math.isPowerOfTwo(SectionLength));
|
try testing.expect(std.math.isPowerOfTwo(SectionLength));
|
||||||
}
|
}
|
||||||
|
@ -170,7 +170,12 @@ pub const ShellWriter = struct {
|
|||||||
// rounds up a u12 to the nearest factor of 4 and returns the difference
|
// rounds up a u12 to the nearest factor of 4 and returns the difference
|
||||||
// (padding)
|
// (padding)
|
||||||
inline fn roundUp4Padding(n: u12) u12 {
|
inline fn roundUp4Padding(n: u12) u12 {
|
||||||
return ((n + 3) & ~@intCast(u12, 3)) - n;
|
return roundUp4(n) - n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// rounds up a u12 to the nearest factor of 4.
|
||||||
|
inline fn roundUp4(n: u12) u12 {
|
||||||
|
return ((n + 3) & ~@intCast(u12, 3));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ShellIndex is an index to the shell strings. As shell can be up to 64 bytes
|
// ShellIndex is an index to the shell strings. As shell can be up to 64 bytes
|
||||||
@ -192,12 +197,12 @@ test "basic shellpopcon" {
|
|||||||
|
|
||||||
const bash = "/bin/bash"; // 9 chars
|
const bash = "/bin/bash"; // 9 chars
|
||||||
const zsh = "/bin/zsh"; // 8 chars
|
const zsh = "/bin/zsh"; // 8 chars
|
||||||
|
const long = "/bin/very-long-shell-name-ought-to-be-first"; // 43 chars
|
||||||
const nobody = "/bin/nobody"; // only 1 instance, ought to ignore
|
const nobody = "/bin/nobody"; // only 1 instance, ought to ignore
|
||||||
const long = "/bin/very-long-shell-name-ought-to-be-first";
|
|
||||||
const input = [_][]const u8{
|
const input = [_][]const u8{
|
||||||
zsh, zsh, zsh, zsh, // zsh score 8*4=32
|
zsh, zsh, zsh, zsh, // zsh score 8*4=32
|
||||||
bash, bash, bash, nobody, // bash score 3*9=27
|
bash, bash, bash, nobody, // bash score 3*9=27
|
||||||
long, long, // long score 2*42=84
|
long, long, // long score 2*43=86
|
||||||
};
|
};
|
||||||
|
|
||||||
for (input) |shell| {
|
for (input) |shell| {
|
||||||
@ -212,6 +217,10 @@ test "basic shellpopcon" {
|
|||||||
try testing.expectEqual(sections.getIndex(zsh).?, 1);
|
try testing.expectEqual(sections.getIndex(zsh).?, 1);
|
||||||
try testing.expectEqual(sections.getIndex(bash).?, 2);
|
try testing.expectEqual(sections.getIndex(bash).?, 2);
|
||||||
try testing.expectEqual(sections.getIndex(nobody), null);
|
try testing.expectEqual(sections.getIndex(nobody), null);
|
||||||
|
try testing.expectEqual(
|
||||||
|
sections.sectionBlob().len,
|
||||||
|
roundUp4(bash.len) + roundUp4(zsh.len) + roundUp4(long.len),
|
||||||
|
);
|
||||||
|
|
||||||
const shellReader = ShellReader.init(
|
const shellReader = ShellReader.init(
|
||||||
sections.sectionIndex(),
|
sections.sectionIndex(),
|
||||||
@ -220,6 +229,8 @@ test "basic shellpopcon" {
|
|||||||
try testing.expectEqualStrings(shellReader.get(0), long);
|
try testing.expectEqualStrings(shellReader.get(0), long);
|
||||||
try testing.expectEqualStrings(shellReader.get(1), zsh);
|
try testing.expectEqualStrings(shellReader.get(1), zsh);
|
||||||
try testing.expectEqualStrings(shellReader.get(2), bash);
|
try testing.expectEqualStrings(shellReader.get(2), bash);
|
||||||
|
|
||||||
|
try testing.expectEqual(shellReader.sectionIndex.len, 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
test "padding" {
|
test "padding" {
|
||||||
|
@ -3,7 +3,7 @@ const std = @import("std");
|
|||||||
const Allocator = std.mem.Allocator;
|
const Allocator = std.mem.Allocator;
|
||||||
const cast = std.math.cast;
|
const cast = std.math.cast;
|
||||||
|
|
||||||
pub const PackedUserSize = @sizeOf(PackedUser);
|
pub const PackedUserSize = @divExact(@bitSizeOf(PackedUser), 8);
|
||||||
pub const PackedUser = packed struct {
|
pub const PackedUser = packed struct {
|
||||||
uid: u32,
|
uid: u32,
|
||||||
gid: u32,
|
gid: u32,
|
||||||
|
Loading…
Reference in New Issue
Block a user