#define _POSIX_C_SOURCE 200809L #include "rgb_state.h" #include #include #include #include #include #include #include #include int main(void) { char root[] = "/tmp/labfy-rgb-state-XXXXXX"; assert(mkdtemp(root)); int dir = rgb_state_open_at(root); assert(dir >= 0); struct rgb_state s = {.inode = UINT64_C(0x1020304050607080), .device = UINT64_C(0x8877665544332211), .rgb = {180, 190, 254}, .percent = 60, .mode = 1, .has_color = true}, out; assert(rgb_state_load(dir, s.inode, s.device, &out) == -1 && errno == ENODATA); assert(rgb_state_save(dir, &s) == 0); assert(rgb_state_load(dir, s.inode, s.device, &out) == 0 && out.inode == s.inode && out.device == s.device && !memcmp(out.rgb, s.rgb, 3) && out.percent == 60); assert(rgb_state_load(dir, s.inode+1, s.device, &out) == -1 && errno == ENODATA); assert(rgb_state_load(dir, s.inode, s.device+1, &out) == -1 && errno == ENODATA); s.percent = 0; assert(rgb_state_save(dir, &s) == 0); assert(rgb_state_load(dir, s.inode, s.device, &out) == 0 && !out.percent); int fd = openat(dir, "state.bin", O_RDWR); assert(fd >= 0); uint8_t bytes[32]; assert(read(fd, bytes, 32) == 32); assert(!memcmp(bytes, "LFRGB003", 8) && bytes[8] == 0x80 && bytes[15] == 0x10 && bytes[24] == 180 && bytes[26] == 254); assert(fchmod(fd, 0644) == 0); assert(rgb_state_load(dir, s.inode, s.device, &out) == -1 && errno == EPROTO); assert(fchmod(fd, 0600) == 0); bytes[27] = 101; assert(pwrite(fd, bytes, 32, 0) == 32); assert(rgb_state_load(dir, s.inode, s.device, &out) == -1 && errno == EPROTO); bytes[27] = 60; bytes[31] = 1; assert(pwrite(fd, bytes, 32, 0) == 32); assert(rgb_state_load(dir, s.inode, s.device, &out) == -1 && errno == EPROTO); assert(ftruncate(fd, 31) == 0); assert(rgb_state_load(dir, s.inode, s.device, &out) == -1 && errno == EPROTO); assert(close(fd) == 0); assert(rgb_state_invalidate(dir) == 0 && rgb_state_invalidate(dir) == 0); assert(symlinkat("/dev/null", dir, "state.bin") == 0); assert(rgb_state_load(dir, s.inode, s.device, &out) == -1 && errno == ELOOP); assert(rgb_state_invalidate(dir) == 0); s.percent = 101; assert(rgb_state_save(dir, &s) == -1 && errno == EINVAL); assert(chmod(root, 0777) == 0); assert(rgb_state_open_at(root) == -1 && errno == EPERM); assert(chmod(root, 0700) == 0); assert(setenv("XDG_RUNTIME_DIR", root, 1) == 0); int runtime = rgb_state_open(); assert(runtime >= 0); struct stat private_st; assert(fstat(runtime, &private_st) == 0 && (private_st.st_mode & 0777) == 0700); assert(close(runtime) == 0); char child[256]; (void)snprintf(child, sizeof child, "%s/%s", root, geteuid() == 0 ? "labfy-rgb-root" : "labfy-rgb"); assert(chmod(child, 0755) == 0); assert(rgb_state_open() == -1 && errno == EPERM); assert(chmod(child, 0700) == 0 && rmdir(child) == 0); assert(symlink("/tmp", child) == 0); assert(rgb_state_open() == -1); assert(unlink(child) == 0); assert(setenv("XDG_RUNTIME_DIR", "relative/path", 1) == 0); assert(rgb_state_open() == -1 && errno == EINVAL); assert(close(dir) == 0 && rmdir(root) == 0); puts("Volatile cache encoding, atomic replacement, corruption, identity and permission tests passed."); return 0; }