61 lines
3.3 KiB
C
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;
|
|
}
|