1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#include "test_framework.h"
#include "tollgate_core_session.h"
#include "tollgate_core_firewall.h"
#include "tollgate_core_cashu.h"
#include "tollgate_core.h"
#include "../../main/config.h"
#include <string.h>
#include <stdio.h>
static tollgate_config_t g_test_config;
const tollgate_config_t *tollgate_config_get(void) {
return &g_test_config;
}
static void test_sessions(void)
{
printf("=== test_session ===\n");
memset(&g_test_config, 0, sizeof(g_test_config));
strncpy(g_test_config.metric, "milliseconds", sizeof(g_test_config.metric) - 1);
printf("\n--- tollgate_core_session_init ---\n");
esp_err_t ret = tollgate_core_session_init();
ASSERT_EQ_INT(0, ret, "tollgate_core_session_init succeeds");
ASSERT_EQ_INT(0, tollgate_core_session_active_count(), "No sessions after init");
printf("\n--- tollgate_core_session_create ---\n");
tg_session_t *s = tollgate_core_session_create(0x0A01A8C0, 60000);
ASSERT(s != NULL, "session_create returns non-NULL");
ASSERT_EQ_INT(1, tollgate_core_session_active_count(), "1 session after create");
printf("\n--- tollgate_core_session_find_by_ip ---\n");
tg_session_t *found = tollgate_core_session_find_by_ip(0x0A01A8C0);
ASSERT(found == s, "tollgate_core_session_find_by_ip returns the created session");
ASSERT(tollgate_core_session_find_by_ip(0x01020304) == NULL, "tollgate_core_session_find_by_ip returns NULL for unknown IP");
printf("\n--- tollgate_core_session_extend ---\n");
uint64_t old_allotment = s->allotment_ms;
tollgate_core_session_extend(s, 30000);
ASSERT(s->allotment_ms == old_allotment + 30000, "Allotment extended by 30000ms");
printf("\n--- tollgate_core_session_extend for existing client ---\n");
tg_session_t *s2 = tollgate_core_session_create(0x0A01A8C0, 30000);
ASSERT(s2 == s, "same IP returns existing session");
ASSERT(s->allotment_ms == old_allotment + 60000, "allotment extended by 30000ms on re-pay");
printf("\n--- tollgate_core_session_revoke ---\n");
tollgate_core_session_revoke(s);
ASSERT_EQ_INT(0, tollgate_core_session_active_count(), "No active sessions after revoke");
printf("\n--- tollgate_core_session_revoke_all ---\n");
tollgate_core_session_create(0x01000001, 60000);
tollgate_core_session_create(0x01000002, 60000);
ASSERT_EQ_INT(2, tollgate_core_session_active_count(), "2 sessions created");
tollgate_core_session_revoke_all();
ASSERT_EQ_INT(0, tollgate_core_session_active_count(), "No sessions after revoke_all");
printf("\n--- session_tick does not crash ---\n");
tollgate_core_session_init();
tollgate_core_session_create(0x0A000001, 60000);
tollgate_core_session_tick();
ASSERT_EQ_INT(1, tollgate_core_session_active_count(), "Session still active after tick (not expired)");
}
void test_bytes_sessions(void)
{
printf("\n=== Bytes-based sessions ===\n");
tollgate_core_session_init();
memset(&g_test_config, 0, sizeof(g_test_config));
strncpy(g_test_config.metric, "bytes", sizeof(g_test_config.metric) - 1);
uint64_t allotment = 22020096;
tg_session_t *s = tollgate_core_session_create_bytes(0x0A010001, allotment);
ASSERT(s != NULL, "bytes session created");
ASSERT_EQ_INT(1, tollgate_core_session_active_count(), "1 active bytes session");
ASSERT(!tollgate_core_session_is_expired(s), "not expired at 0 consumed");
tollgate_core_session_add_bytes(0x0A010001, 10000000);
ASSERT(!tollgate_core_session_is_expired(s), "not expired at 10MB of 21MB");
ASSERT_EQ_UINT64(10000000, s->bytes_consumed, "consumed 10MB");
tollgate_core_session_add_bytes(0x0A010001, 12200996);
ASSERT(tollgate_core_session_is_expired(s), "expired after consuming all allotment");
ASSERT_EQ_UINT64(22200996, s->bytes_consumed, "consumed 22.2MB");
tollgate_core_session_add_bytes(0x0A010001, 1000);
ASSERT_EQ_UINT64(22201996, s->bytes_consumed, "consumption keeps growing past expiry");
printf("\n--- Bytes session for unknown IP does nothing ---\n");
tollgate_core_session_add_bytes(0x0B0B0B0B, 9999);
ASSERT_EQ_UINT64(22201996, s->bytes_consumed, "unknown IP no effect");
printf("\n--- Mixed metric: milliseconds still works ---\n");
tollgate_core_session_init();
memset(&g_test_config, 0, sizeof(g_test_config));
strncpy(g_test_config.metric, "milliseconds", sizeof(g_test_config.metric) - 1);
tg_session_t *ms = tollgate_core_session_create(0x0A020001, 60000);
ASSERT(ms != NULL, "ms session created");
ASSERT(!tollgate_core_session_is_expired(ms), "ms session not expired immediately");
printf("\n--- tollgate_core_cashu_calculate_allotment dispatch ---\n");
uint64_t a = tollgate_core_cashu_calculate_allotment(21, 21, 60000);
ASSERT_EQ_UINT64(60000, a, "21 sats / 21 per step * 60000ms = 60000ms");
printf("\n=== ALL BYTES SESSION TESTS PASSED ===\n");
}
int main(void)
{
test_sessions();
test_bytes_sessions();
return g_tests_failed > 0 ? 1 : 0;
}
|