/* Test that generated Cap'n Proto types for persistence exist and have correct * fields. This is a compile-time / linkage test — the real assertion is that * ninja succeeds with the new schema additions. */ #include #include #include #include #include "controller.capnp.h" /* ------------------------------------------------------------------ */ /* PersistConfig */ /* ------------------------------------------------------------------ */ static void test_persist_config_schema_fields(void) { /* Verify struct is defined and has the expected word/byte counts. * c-capnproto generates _struct_bytes_count constants. */ (void)PersistConfig_struct_bytes_count; printf("test_persist_config_schema_fields: PASS\n"); } /* ------------------------------------------------------------------ */ /* SnapshotHeader */ /* ------------------------------------------------------------------ */ static void test_snapshot_header_schema_fields(void) { (void)SnapshotHeader_struct_bytes_count; printf("test_snapshot_header_schema_fields: PASS\n"); } /* ------------------------------------------------------------------ */ /* WALEntry */ /* ------------------------------------------------------------------ */ static void test_wal_entry_schema_fields(void) { /* Schema struct is named ReplEnvelope to avoid collision with the * on-disk wal_entry_hdr_t C type and the WALEntry_ generator symbol. */ (void)ReplEnvelope_struct_bytes_count; printf("test_wal_entry_schema_fields: PASS\n"); } /* ------------------------------------------------------------------ */ /* Replication opcodes */ /* ------------------------------------------------------------------ */ static void test_repl_opcodes_exist(void) { /* These enum values must be present in the generated header. */ int repl_entry = OPCode_replEntry; int repl_ack = OPCode_replAck; int redirect_op = OPCode_redirect; int heartbeat_op = OPCode_heartbeat; int stepping = OPCode_steppingDown; int repl_snap = OPCode_replSnapshot; int catchup_done = OPCode_replCatchUpDone; /* All values must be > 21 (highest existing opcode clrpreason=21). */ TEST_ASSERT_TRUE(repl_entry > 21); TEST_ASSERT_TRUE(repl_ack > 21); TEST_ASSERT_TRUE(redirect_op > 21); TEST_ASSERT_TRUE(heartbeat_op > 21); TEST_ASSERT_TRUE(stepping > 21); TEST_ASSERT_TRUE(repl_snap > 21); TEST_ASSERT_TRUE(catchup_done > 21); printf("test_repl_opcodes_exist: PASS\n"); } /* ------------------------------------------------------------------ */ /* Job.transientSince and Worker.deadSince fields */ /* ------------------------------------------------------------------ */ static void test_job_transient_since_field(void) { /* c-capnproto preserves camelCase field names from the schema directly. */ struct Job j; memset(&j, 0, sizeof(j)); j.transientSince = 12345ULL; TEST_ASSERT_EQUAL_UINT64(12345ULL, j.transientSince); printf("test_job_transient_since_field: PASS\n"); } static void test_worker_dead_since_field(void) { struct Worker w; memset(&w, 0, sizeof(w)); w.deadSince = 99999ULL; TEST_ASSERT_EQUAL_UINT64(99999ULL, w.deadSince); printf("test_worker_dead_since_field: PASS\n"); } /* ------------------------------------------------------------------ */ /* Suite entry point (called from controller_test.c) */ /* ------------------------------------------------------------------ */ void test_persist_schema(void) { printf("\n>> persist Cap'n Proto schema test\n\n"); RUN_TEST(test_persist_config_schema_fields); RUN_TEST(test_snapshot_header_schema_fields); RUN_TEST(test_wal_entry_schema_fields); RUN_TEST(test_repl_opcodes_exist); RUN_TEST(test_job_transient_since_field); RUN_TEST(test_worker_dead_since_field); }