labfy-rgb/tests/test_state.c
2026-11-09 19:01:00 +01:00

61 lines
3.3 KiB
C

#define _POSIX_C_SOURCE 200809L
#include "rgb_state.h"
#include <assert.h>
#include <errno.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>
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;
}