diff options
| author | Jesper Jensen <jesper@jnsn.dev> | 2024-01-28 09:01:22 +0100 |
|---|---|---|
| committer | Jesper Jensen <jesper@jnsn.dev> | 2025-04-12 10:21:20 +0200 |
| commit | cd622b745254baafa21adf4b1b724e079652321a (patch) | |
| tree | b1faf03808a5f8729cf8a69f971c00cb9d662683 /test | |
| parent | 47d4780eb448f839fc6b0644135395f879080ba4 (diff) | |
I don't know
Diffstat (limited to 'test')
| -rw-r--r-- | test/proto.c | 113 | ||||
| -rw-r--r-- | test/query.c | 46 |
2 files changed, 123 insertions, 36 deletions
diff --git a/test/proto.c b/test/proto.c index 49a77b9..c69a293 100644 --- a/test/proto.c +++ b/test/proto.c @@ -8,6 +8,56 @@ #define IP(a, b, c, d) htonl(a << 24 | b << 16 | c << 8 | d) +void test_create_first_ticket() { + time_t now = TOKEN_VTMO; + struct tokens tokens = {0}; + char hash[SHA256_BLOCK_SIZE] = {0}; + struct addr addr = (struct addr){.ip = IP(128,0,0,1), .port = 6881}; + struct addr addr2 = (struct addr){.ip = IP(128,0,0,2), .port = 6881}; + int rc; + + // First token create should create a new ticket + token_create(&tokens, now, &addr, hash); + + // It should be valid for the address it was issued for + rc = token_validate(&tokens, now, &addr, hash); + TEST_ASSERT_EQUAL(TOK_VALI, rc); + + // But not for some other addr + rc = token_validate(&tokens, now, &addr2, hash); + TEST_ASSERT_EQUAL(TOK_INVA, rc); + + // Time passes and our ticket becomes invalid for issuance + now += TOKEN_ITMO; + + char hash2[SHA256_BLOCK_SIZE]; + token_create(&tokens, now, &addr, hash2); + + // We should get a different token, since we have a new ticket + if(memcmp(hash, hash2, SHA256_BLOCK_SIZE) == 0) { + TEST_FAIL(); + } + + // Which should be valid + rc = token_validate(&tokens, now, &addr, hash2); + TEST_ASSERT_EQUAL(TOK_VALI, rc); + + // And so should the old one (since it's not timed out for validation) + rc = token_validate(&tokens, now, &addr, hash); + TEST_ASSERT_EQUAL(TOK_VALI, rc); + + // More time passes and the original token becomes invalid for validation + now += TOKEN_VTMO - TOKEN_ITMO; + + // Old token should now no longer be validated + rc = token_validate(&tokens, now, &addr, hash); + TEST_ASSERT_EQUAL(TOK_INVA, rc); + + // New token should + rc = token_validate(&tokens, now, &addr, hash2); + TEST_ASSERT_EQUAL(TOK_VALI, rc); +} + void test_begin_pings_bootstrap_node() { struct message outbuff[10] = {0}; @@ -48,6 +98,11 @@ void test_response_from_initial_probe() { TEST_ASSERT_EQUAL_PTR_MESSAGE(message_cursor, outbuff+1, "Sends one packet"); TEST_ASSERT_EQUAL(91, outbuff[0].payload_len); TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:ad2:id20:BBBBBBBBBBBBBBBBBBBB6:target20:", outbuff[0].payload, 43); + + struct nodeid target; + memcpy(&target, outbuff[0].payload+43, sizeof(struct nodeid)); + TEST_ASSERT_EQUAL_MEMORY_MESSAGE(&dht.self, &target, sizeof(struct nodeid), "Target should be our own id"); + TEST_ASSERT_EQUAL_CHAR_ARRAY("e1:q9:find_node1:t1:11:y1:qe", outbuff[0].payload+63, 28); // The queried node gets added to the routing table @@ -116,7 +171,7 @@ void test_ping() { TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+1); TEST_ASSERT_EQUAL(47, outbuff[0].payload_len); - TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:t2:aa1:y1:r1:rd2:id20:BBBBBBBBBBBBBBBBBBBBee", outbuff[0].payload, 47); + TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:rd2:id20:BBBBBBBBBBBBBBBBBBBBe1:t2:aa1:y1:re", outbuff[0].payload, 47); } void test_unknown_method() { @@ -143,7 +198,7 @@ void test_unknown_method() { TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+1); TEST_ASSERT_EQUAL(42, outbuff[0].payload_len); - TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:t2:aa1:y1:e1:eli204e14:Unknown Methodee", outbuff[0].payload, 42); + TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:eli204e14:Unknown Methode1:t2:aa1:y1:ee", outbuff[0].payload, 42); } void test_note_times_out() { @@ -164,7 +219,7 @@ void test_note_times_out() { // The node responds to the ping at t=5 { - char buff[] = "d1:y1:r1:t1:01:rd2:id20:aaaaaaaaaaaaaaaaaaaa5:nodes26:bbbbbbbbbbbbbbbbbbbb\xFF\xFF\xFF\xFF\x00\x00""ee"; + char buff[] = "d1:y1:r1:t1:01:rd2:id20:BB\x5F""aaaaaaaaaaaaaaaaa5:nodes26:bbbbbbbbbbbbbbbbbbbb\xFF\xFF\xFF\xFF\x00\x00""ee"; struct message* message_cursor = outbuff; proto_run(&dht, buff, sizeof(buff), (struct sockaddr_in*)&remote, remote_len, 5, &message_cursor, outbuff+2); } @@ -177,6 +232,12 @@ void test_note_times_out() { TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+2); TEST_ASSERT_EQUAL(91, outbuff[1].payload_len); TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:ad2:id20:BBBBBBBBBBBBBBBBBBBB6:target20:", outbuff[1].payload, 43); + + // The target should be in the same bucket as the queried node + struct nodeid target; + memcpy(&target, outbuff[1].payload+43, sizeof(struct nodeid)); + TEST_ASSERT_GREATER_THAN(19, prefix(&dht.self, &target)); + TEST_ASSERT_EQUAL_CHAR_ARRAY("e1:q9:find_node1:t1:01:y1:qe", outbuff[1].payload+63, 28); } @@ -199,6 +260,11 @@ void test_response_after_retry() { TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+1); TEST_ASSERT_EQUAL(91, outbuff[0].payload_len); TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:ad2:id20:BBBBBBBBBBBBBBBBBBBB6:target20:", outbuff[0].payload, 43); + + struct nodeid target; + memcpy(&target, outbuff[0].payload+43, sizeof(struct nodeid)); + TEST_ASSERT_EQUAL_MEMORY_MESSAGE(&dht.self, &target, sizeof(struct nodeid), "Target should be our own id"); + TEST_ASSERT_EQUAL_CHAR_ARRAY("e1:q9:find_node1:t1:01:y1:qe", outbuff[0].payload+63, 28); } @@ -367,10 +433,10 @@ void test_query_find_node() { TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+1); TEST_ASSERT_EQUAL(83, outbuff[0].payload_len); - TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:t2:aa1:y1:r1:rd2:id20:BBBBBBBBBBBBBBBBBBBB5:nodes26:aaaaaaaaaaaaaaaaaaaa", outbuff[0].payload, 75); - TEST_ASSERT_EQUAL_MEMORY(&((struct sockaddr_in*)&remote)->sin_addr.s_addr, outbuff[0].payload+75, 4); - TEST_ASSERT_EQUAL_MEMORY(&((struct sockaddr_in*)&remote)->sin_port, outbuff[0].payload+79, 2); - TEST_ASSERT_EQUAL_CHAR_ARRAY("ee", outbuff[0].payload+81, 2); + TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:rd2:id20:BBBBBBBBBBBBBBBBBBBB5:nodes26:aaaaaaaaaaaaaaaaaaaa", outbuff[0].payload, 62); + TEST_ASSERT_EQUAL_MEMORY(&((struct sockaddr_in*)&remote)->sin_addr.s_addr, outbuff[0].payload+62, 4); + TEST_ASSERT_EQUAL_MEMORY(&((struct sockaddr_in*)&remote)->sin_port, outbuff[0].payload+66, 2); + TEST_ASSERT_EQUAL_CHAR_ARRAY("e1:t2:aa1:y1:re", outbuff[0].payload+68, 15); } } @@ -383,7 +449,7 @@ void test_query_get_peers_have_one() { allocate_hashtable(); - struct dht dht; + struct dht dht = {0}; dht.self = (struct nodeid){.inner={0x42424242, 0x42424242, 0x42424242, 0x42424242, 0x42424242}}; routing_init(&dht.self); @@ -405,6 +471,7 @@ void test_query_get_peers_have_one() { now += 1; // Some other node then asks for peers + char token[SHA256_BLOCK_SIZE]; { struct sockaddr_in other; other.sin_family = AF_INET; @@ -419,16 +486,20 @@ void test_query_get_peers_have_one() { // We should have sent a response TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+1); - TEST_ASSERT_EQUAL(93, outbuff[0].payload_len); + TEST_ASSERT_EQUAL(125, outbuff[0].payload_len); char* cursor = outbuff[0].payload; - TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:t2:aa1:y1:r1:rd2:id20:BBBBBBBBBBBBBBBBBBBB5:token1:t5:nodes26:aaaaaaaaaaaaaaaaaaaa", cursor, 85); - cursor+=85; + TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:rd2:id20:BBBBBBBBBBBBBBBBBBBB5:nodes26:aaaaaaaaaaaaaaaaaaaa", cursor, 62); + cursor+=62; TEST_ASSERT_EQUAL_MEMORY(&((struct sockaddr_in*)&remote)->sin_addr.s_addr, cursor, 4); cursor+=4; TEST_ASSERT_EQUAL_MEMORY(&((struct sockaddr_in*)&remote)->sin_port, cursor, 2); cursor+=2; - TEST_ASSERT_EQUAL_CHAR_ARRAY("ee", cursor, 2); - cursor+=2; + TEST_ASSERT_EQUAL_CHAR_ARRAY("5:token32:", cursor, 10); + cursor+=10; + memcpy(token, cursor, SHA256_BLOCK_SIZE); + cursor+=SHA256_BLOCK_SIZE; + TEST_ASSERT_EQUAL_CHAR_ARRAY("e1:t2:aa1:y1:re", cursor, 15); + cursor+=15; } now += 1; @@ -440,14 +511,16 @@ void test_query_get_peers_have_one() { other.sin_port = htons(9090); // Node announces that it's a peer for that torrent - char buff[] = "d1:ad2:id20:abcdefghij012345678912:implied_porti1e9:info_hash20:aaaaaaaaaaaaaaaaaaaa4:porti1337e5:token1:te1:q13:announce_peer1:t2:aa1:y1:qe"; + char buff[] = "d1:ad2:id20:abcdefghij012345678912:implied_porti1e9:info_hash20:aaaaaaaaaaaaaaaaaaaa4:porti1337e5:token32: e1:q13:announce_peer1:t2:aa1:y1:qe"; + memcpy(buff+106, token, SHA256_BLOCK_SIZE); + dbg("PKT %s", buff); struct message* message_cursor = outbuff; proto_run(&dht, buff, sizeof(buff), (struct sockaddr_in*)&other, sizeof(other), now, &message_cursor, outbuff+2); TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+1); TEST_ASSERT_EQUAL(47, outbuff[0].payload_len); char* cursor = outbuff[0].payload; - TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:t2:aa1:y1:r1:rd2:id20:BBBBBBBBBBBBBBBBBBBBee", cursor, 47); + TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:rd2:id20:BBBBBBBBBBBBBBBBBBBBe1:t2:aa1:y1:re", cursor, 47); cursor+=47; } now += 1; @@ -466,9 +539,13 @@ void test_query_get_peers_have_one() { // We should have sent a response TEST_ASSERT_EQUAL_PTR(message_cursor, outbuff+1); - TEST_ASSERT_EQUAL(75, outbuff[0].payload_len); + TEST_ASSERT_EQUAL(107, outbuff[0].payload_len); char* cursor = outbuff[0].payload; - TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:t2:aa1:y1:r1:rd2:id20:BBBBBBBBBBBBBBBBBBBB5:token1:t6:valuesl6:\x80\x00\x00\x01\x23\x82""eee", cursor, 75); - cursor+=75; + TEST_ASSERT_EQUAL_CHAR_ARRAY("d1:rd2:id20:BBBBBBBBBBBBBBBBBBBB5:token32:", cursor, 42); + cursor+=42; + // Don't care what the token is + cursor+=32; + TEST_ASSERT_EQUAL_CHAR_ARRAY("6:valuesl6:\x80\x00\x00\x01\x23\x82""ee1:t2:aa1:y1:re", cursor, 33); + cursor+=33; } } diff --git a/test/query.c b/test/query.c index a3d3bb9..81fd09b 100644 --- a/test/query.c +++ b/test/query.c @@ -1,5 +1,6 @@ #include <unity.h> +#include "proto.h" #include "query.h" #include <string.h> @@ -8,7 +9,8 @@ #define IP(a, b, c, d) htonl(a << 24 | b << 16 | c << 8 | d) void test_malformed_empty() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -23,13 +25,14 @@ void test_malformed_empty() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EBADQ, rc); } void test_malformed_only_dict_start() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -44,13 +47,14 @@ void test_malformed_only_dict_start() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EBADQ, rc); } void test_malformed_empty_args_key() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -65,13 +69,14 @@ void test_malformed_empty_args_key() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EBADQ, rc); } void test_malformed_wrong_args_type() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -86,13 +91,14 @@ void test_malformed_wrong_args_type() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EBADQ, rc); } void test_malformed_empty_args() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -107,13 +113,14 @@ void test_malformed_empty_args() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EBADQ, rc); } void test_malformed_wrong_id_arg_type() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -128,13 +135,14 @@ void test_malformed_wrong_id_arg_type() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EBADQ, rc); } void test_malformed_wrong_id_length() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -149,13 +157,14 @@ void test_malformed_wrong_id_length() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EBADQ, rc); } void test_ping() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -170,7 +179,7 @@ void test_ping() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "ping", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(0, rc); TEST_ASSERT_EQUAL(29, response_cursor - response); @@ -178,7 +187,8 @@ void test_ping() { } void test_bad_method() { - + time_t now = 120; + struct tokens tokens = {0}; struct sockaddr_in src = { .sin_family = AF_INET, .sin_addr.s_addr = IP(255, 0, 0, 1), @@ -193,7 +203,7 @@ void test_bad_method() { char* response_cursor = response; char* response_end = response + sizeof(response); - int rc = handle_request(&self, "someWrongMethod", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); + int rc = handle_request(&self, &tokens, now, "someWrongMethod", (struct sockaddr*)&src, sizeof(src), packet, packet_len, &response_cursor, response_end-response_cursor); TEST_ASSERT_EQUAL(QUERY_EUNK, rc); } |
