fix bug-1060 bug-1067
This commit is contained in:
parent
6067ba6c94
commit
61e1391cd0
28 changed files with 7021 additions and 2926 deletions
|
|
@ -100,6 +100,59 @@ static void test_add_hook_reuses_null_slot(void)
|
|||
printf("test_add_hook_reuses_null_slot: PASS\n");
|
||||
}
|
||||
|
||||
/* bug-845: re-registering the SAME (fn,data) on a type must be idempotent.
|
||||
* xce_disable_hook removes only ONE matching slot and xce_run_hooks fires ALL
|
||||
* slots, so a duplicate (fn,data) registration would (a) fire twice and (b)
|
||||
* survive a single disable. This is exactly how the controller double-appended
|
||||
* every WAL_JOB_SUBMIT: persist_start() and ha_register_persist_hooks() both
|
||||
* register persist_job_hook_fun with the same persist_t closure. */
|
||||
static void test_add_hook_dedups_same_fn_and_data(void)
|
||||
{
|
||||
hooksys_t hs;
|
||||
int a = 0;
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, xce_hook_init(&hs, 2));
|
||||
|
||||
/* First add registers; the second add with the SAME fn AND data must be a
|
||||
* no-op (still rc=0, still exactly one slot). */
|
||||
TEST_ASSERT_EQUAL_INT(0, xce_add_hook(&hs, HOOK_AFTER_EVENT, counting_fn, &a));
|
||||
TEST_ASSERT_EQUAL_INT(0, xce_add_hook(&hs, HOOK_AFTER_EVENT, counting_fn, &a));
|
||||
TEST_ASSERT_EQUAL_INT(1, hs.hooks[HOOK_AFTER_EVENT].count);
|
||||
|
||||
/* Fires ONCE per event, never twice. */
|
||||
xce_run_hooks(&hs, HOOK_AFTER_EVENT, 0, 0);
|
||||
TEST_ASSERT_EQUAL_INT(1, a);
|
||||
|
||||
/* A single disable fully removes it — no duplicate slot lingers. */
|
||||
TEST_ASSERT_EQUAL_INT(0, xce_disable_hook(&hs, HOOK_AFTER_EVENT, counting_fn));
|
||||
xce_run_hooks(&hs, HOOK_AFTER_EVENT, 0, 0);
|
||||
TEST_ASSERT_EQUAL_INT(1, a); /* unchanged */
|
||||
|
||||
xce_hook_fini(&hs);
|
||||
printf("test_add_hook_dedups_same_fn_and_data: PASS\n");
|
||||
}
|
||||
|
||||
/* The dedup is keyed on (fn,data): the SAME fn with DISTINCT closures is a
|
||||
* legitimate pair of registrations and BOTH must fire. */
|
||||
static void test_add_hook_allows_same_fn_distinct_data(void)
|
||||
{
|
||||
hooksys_t hs;
|
||||
int a = 0, b = 0;
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, xce_hook_init(&hs, 2));
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, xce_add_hook(&hs, HOOK_AFTER_EVENT, counting_fn, &a));
|
||||
TEST_ASSERT_EQUAL_INT(0, xce_add_hook(&hs, HOOK_AFTER_EVENT, counting_fn, &b));
|
||||
TEST_ASSERT_EQUAL_INT(2, hs.hooks[HOOK_AFTER_EVENT].count);
|
||||
|
||||
xce_run_hooks(&hs, HOOK_AFTER_EVENT, 0, 0);
|
||||
TEST_ASSERT_EQUAL_INT(1, a);
|
||||
TEST_ASSERT_EQUAL_INT(1, b);
|
||||
|
||||
xce_hook_fini(&hs);
|
||||
printf("test_add_hook_allows_same_fn_distinct_data: PASS\n");
|
||||
}
|
||||
|
||||
/* --- suite entry point --- */
|
||||
|
||||
void test_hooks(void)
|
||||
|
|
@ -109,4 +162,6 @@ void test_hooks(void)
|
|||
RUN_TEST(test_disable_hook_stops_invocation);
|
||||
RUN_TEST(test_disable_hook_returns_enoent_if_not_found);
|
||||
RUN_TEST(test_add_hook_reuses_null_slot);
|
||||
RUN_TEST(test_add_hook_dedups_same_fn_and_data);
|
||||
RUN_TEST(test_add_hook_allows_same_fn_distinct_data);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -191,8 +191,11 @@ static void test_wal_batch_encode_rejects_invalid_args(void)
|
|||
|
||||
TEST_ASSERT_EQUAL_INT(-EINVAL,
|
||||
xce_wal_batch_encode_raw(NULL, 1, &test_peer, 0, &pkt));
|
||||
/* n_entries == 0 is a valid heartbeat (ha-term-safety task 3.2): a 0-entry AE
|
||||
* carries the AppendEntries metadata (term, prev tuple, leader_commit) on the
|
||||
* top-level container to drive UpdateTerm/logOk. Only n_entries < 0 is invalid. */
|
||||
TEST_ASSERT_EQUAL_INT(-EINVAL,
|
||||
xce_wal_batch_encode_raw(entries, 0, &test_peer, 0, &pkt));
|
||||
xce_wal_batch_encode_raw(entries, -1, &test_peer, 0, &pkt));
|
||||
TEST_ASSERT_EQUAL_INT(-EINVAL,
|
||||
xce_wal_batch_encode_raw(entries, 1, &test_peer, 0, NULL));
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue