|
|
|
|
@ -70,7 +70,7 @@ int main(void) {
|
|
|
|
|
puts("PASS: message identity is deterministic and binds channel, timestamp and signature"); |
|
|
|
|
|
|
|
|
|
uint64_t ver; struct chat_feedback_record first, second, cancelled, actual; |
|
|
|
|
uint8_t a[] = {1}, b[] = {1, 2}; |
|
|
|
|
uint8_t a[] = {1, 0}, b[] = {2, 0, 1}, answer_data[] = {1, 0, 0, 0}; |
|
|
|
|
assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_REACTION, a, sizeof(a), &ver) == 1 && ver == 1); |
|
|
|
|
assert(chat_feedback_get(&source, "1001", message, source.node_id, CHAT_FEEDBACK_REACTION, &first) == 1); |
|
|
|
|
int saved_events = events; |
|
|
|
|
@ -98,17 +98,18 @@ int main(void) {
|
|
|
|
|
puts("PASS: signature binds version, channel and author; rejection preserves tree and events"); |
|
|
|
|
|
|
|
|
|
struct chat_feedback_record low = first, high = first; |
|
|
|
|
low.ver = high.ver = 4; low.data[0] = 3; high.data[0] = 4; |
|
|
|
|
low.ver = high.ver = 4; low.data[1] = 3; high.data[1] = 4; |
|
|
|
|
sign_record(&source, 1001, &low); sign_record(&source, 1001, &high); |
|
|
|
|
assert(chat_feedback_apply(&source, "1001", &low) == 1 && chat_feedback_apply(&source, "1001", &high) == 1); |
|
|
|
|
assert(chat_feedback_apply(&target, "1001", &high) == 1 && chat_feedback_apply(&target, "1001", &low) == 0); |
|
|
|
|
root(&source, expected); root(&target, received); assert(!memcmp(expected, received, 32)); |
|
|
|
|
assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_ANSWER, b, sizeof(b), &ver) == 1 && ver == 1); |
|
|
|
|
assert(chat_feedback_set(&source, "1001", message, CHAT_FEEDBACK_ANSWER, answer_data, sizeof(answer_data), &ver) == 1 && ver == 1); |
|
|
|
|
puts("PASS: equal-version conflicts converge in both orders; answer and reaction have independent versions"); |
|
|
|
|
|
|
|
|
|
struct chat_feedback_record newer = high, answer = first; |
|
|
|
|
newer.ver = 5; newer.data[0] = 5; sign_record(&source, 1001, &newer); |
|
|
|
|
answer.kind = CHAT_FEEDBACK_ANSWER; answer.ver = 2; sign_record(&source, 1001, &answer); |
|
|
|
|
newer.ver = 5; newer.data[1] = 5; sign_record(&source, 1001, &newer); |
|
|
|
|
answer.kind = CHAT_FEEDBACK_ANSWER; answer.ver = 2; answer.data_len = sizeof(answer_data); |
|
|
|
|
memcpy(answer.data, answer_data, sizeof(answer_data)); sign_record(&source, 1001, &answer); |
|
|
|
|
uint8_t page[2 + 2 * FB_WIRE_MAX]; page[0] = 0; page[1] = 2; |
|
|
|
|
int n = fb_encode(&newer, page + 2); assert(n > 0); |
|
|
|
|
int m = fb_encode(&answer, page + 2 + n); assert(m > 0); |
|
|
|
|
@ -132,7 +133,7 @@ int main(void) {
|
|
|
|
|
&cursor, page, &bytes, &next, &more) == 0 && !more); |
|
|
|
|
assert(bytes >= 2 + FB_FIXED_SIZE && page[1] >= 1); |
|
|
|
|
struct chat_feedback_record decoded; assert(fb_decode(page + 2, bytes - 2, &decoded) > 0); |
|
|
|
|
assert(decoded.ver == 5 && decoded.data[0] == 5); |
|
|
|
|
assert(decoded.ver == 5 && decoded.data[1] == 5); |
|
|
|
|
assert(chat_feedback_set(&target, "1001", message, CHAT_FEEDBACK_REACTION, NULL, 0, &ver) == 1 && ver == 1); |
|
|
|
|
assert(chat_feedback_set(&target, "1001", message, CHAT_FEEDBACK_REACTION, a, sizeof(a), &ver) == 1 && ver == 2); |
|
|
|
|
assert(chat_feedback_set(&target, "1001", message, CHAT_FEEDBACK_REACTION, NULL, 0, &ver) == 1 && ver == 3); |
|
|
|
|
|