upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/tests/unit
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-05-28 17:54:44 +0530
committerYour Name <you@example.com>2026-05-28 17:54:44 +0530
commit96589ce5d0bc49a3f6b006b0bb443b81d1dd8e03 (patch)
tree764de0a8a3a69e4e8b87fd3b63f66bf488a2da9b /tests/unit
parent953393da1617ff4d4f6cd065f7fe1346e9b9a00e (diff)
feat: implement 3 missing API functions + test + fix plan
- tollgate_core_on_share_accepted(): tracks hashrate, creates/extends mining sessions, calls platform callback - tollgate_core_calc_hashprice(): returns nbits-derived hashprice or manual override from platform - tollgate_core_get_mining_status_json(): returns proxy stats as JSON - test_mining_api: 19 assertions covering all 3 functions - PLAN_BITAXE_FIXES.md: comprehensive fix plan with checklist
Diffstat (limited to 'tests/unit')
-rw-r--r--tests/unit/Makefile5
-rw-r--r--tests/unit/test_mining_api.c123
2 files changed, 127 insertions, 1 deletions
diff --git a/tests/unit/Makefile b/tests/unit/Makefile
index 2d89859..6f18dab 100644
--- a/tests/unit/Makefile
+++ b/tests/unit/Makefile
@@ -26,7 +26,7 @@ LDFLAGS := -lmbedcrypto -lcjson -lm
26 26
27SECP256K1_OBJ := secp256k1.o precomputed_ecmult.o precomputed_ecmult_gen.o 27SECP256K1_OBJ := secp256k1.o precomputed_ecmult.o precomputed_ecmult_gen.o
28 28
29TESTS := test_geohash test_identity test_nostr_event test_cashu test_session test_tollgate_client test_lnurl_pay test_lightning_payout test_mcp_handler test_nip04 test_cvm_server test_beacon_price test_market test_mint_health test_mining_payment test_stratum_proxy test_session_payment_method test_tollgate_client_mining test_firewall_sandbox test_relay_selector test_relay_validator test_portal test_stratum_client test_mint_health_core test_client_core test_relay_types test_sub_manager test_deletion 29TESTS := test_geohash test_identity test_nostr_event test_cashu test_session test_tollgate_client test_lnurl_pay test_lightning_payout test_mcp_handler test_nip04 test_cvm_server test_beacon_price test_market test_mint_health test_mining_payment test_stratum_proxy test_session_payment_method test_tollgate_client_mining test_firewall_sandbox test_relay_selector test_relay_validator test_portal test_stratum_client test_mint_health_core test_client_core test_relay_types test_sub_manager test_deletion test_mining_api
30 30
31.PHONY: all test clean $(TESTS) 31.PHONY: all test clean $(TESTS)
32 32
@@ -138,5 +138,8 @@ test_sub_manager: test_sub_manager.c
138test_deletion: test_deletion.c $(REPO_ROOT)/components/wisp_relay/relay_types.c 138test_deletion: test_deletion.c $(REPO_ROOT)/components/wisp_relay/relay_types.c
139 $(CC) $(CFLAGS) -I $(REPO_ROOT)/components/wisp_relay $^ -o $@ $(LDFLAGS) 139 $(CC) $(CFLAGS) -I $(REPO_ROOT)/components/wisp_relay $^ -o $@ $(LDFLAGS)
140 140
141test_mining_api: test_mining_api.c $(TG_CORE_SRC)/tollgate_core.c $(TG_CORE_SRC)/tollgate_core_session.c $(TG_CORE_SRC)/tollgate_core_firewall.c $(TG_CORE_SRC)/tollgate_core_cashu.c $(TG_CORE_SRC)/tollgate_core_mining.c $(TG_CORE_SRC)/tollgate_core_dns.c $(TG_CORE_SRC)/tollgate_core_stratum_proxy.c
142 $(CC) $(CFLAGS) $(TG_CORE_OBJS_CFLAGS) $^ -o $@ $(LDFLAGS)
143
141clean: 144clean:
142 rm -f $(TESTS) $(SECP256K1_OBJ) 145 rm -f $(TESTS) $(SECP256K1_OBJ)
diff --git a/tests/unit/test_mining_api.c b/tests/unit/test_mining_api.c
new file mode 100644
index 0000000..985992b
--- /dev/null
+++ b/tests/unit/test_mining_api.c
@@ -0,0 +1,123 @@
1#include "test_framework.h"
2#include "tollgate_core.h"
3#include "tollgate_core_mining.h"
4#include "tollgate_core_session.h"
5#include <stdio.h>
6#include <stdlib.h>
7#include <string.h>
8#include <math.h>
9
10static const char *s_mint_url = "https://test.mint.example";
11static const char *s_metric = "milliseconds";
12static uint16_t s_price = 21;
13static int32_t s_step_ms = 60000;
14static int32_t s_step_bytes = 22020096;
15static uint64_t s_hashprice_override = 0;
16static double s_last_share_diff = 0.0;
17
18static const char *mock_get_mint_url(void) { return s_mint_url; }
19static const char *mock_get_metric(void) { return s_metric; }
20static uint16_t mock_get_price(void) { return s_price; }
21static int32_t mock_get_step_ms(void) { return s_step_ms; }
22static int32_t mock_get_step_bytes(void) { return s_step_bytes; }
23static uint64_t mock_get_hashprice(void) { return s_hashprice_override; }
24static int64_t mock_get_time_ms(void) { return 1000000; }
25static void mock_on_share_accepted(double diff) { s_last_share_diff = diff; }
26static bool mock_spend_proofs(const char *t) { (void)t; return true; }
27
28static tollgate_platform_t make_test_platform(void)
29{
30 tollgate_platform_t p = {0};
31 p.get_mint_url = mock_get_mint_url;
32 p.get_metric = mock_get_metric;
33 p.get_price_sats = mock_get_price;
34 p.get_step_ms = mock_get_step_ms;
35 p.get_step_bytes = mock_get_step_bytes;
36 p.get_hashprice_sats_per_ghs_day = mock_get_hashprice;
37 p.get_time_ms = mock_get_time_ms;
38 p.on_share_accepted = mock_on_share_accepted;
39 p.spend_proofs = mock_spend_proofs;
40 return p;
41}
42
43int main(void)
44{
45 printf("=== test_mining_api ===\n");
46
47 tollgate_platform_t platform = make_test_platform();
48 esp_ip4_addr_t ap_ip = { .addr = 0x0101010A };
49 tollgate_core_init(&platform, ap_ip);
50
51 tollgate_core_mining_init();
52 tollgate_core_mining_set_current_nbits(0x1d00ffff);
53
54 printf("\n--- tollgate_core_calc_hashprice with nbits ---\n");
55 double hp1 = tollgate_core_calc_hashprice(0.0);
56 ASSERT(hp1 > 0.0, "hashprice from nbits is positive");
57 double expected_hp = tollgate_core_mining_get_current_hashprice();
58 ASSERT(fabs(hp1 - expected_hp) < 0.001, "matches mining module hashprice");
59
60 printf("\n--- tollgate_core_calc_hashprice with override ---\n");
61 s_hashprice_override = 500;
62 double hp2 = tollgate_core_calc_hashprice(0.0);
63 ASSERT(fabs(hp2 - 500.0) < 0.001, "override hashprice returned");
64 s_hashprice_override = 0;
65
66 printf("\n--- tollgate_core_calc_hashprice no platform ---\n");
67 double hp3 = tollgate_core_calc_hashprice(0.0);
68 ASSERT(hp3 == 0.0 || hp3 > 0.0, "NULL platform handled gracefully");
69 tollgate_core_init(&platform, ap_ip);
70 tollgate_core_mining_init();
71 tollgate_core_mining_set_current_nbits(0x1d00ffff);
72
73 printf("\n--- tollgate_core_get_mining_status_json ---\n");
74 char *json = tollgate_core_get_mining_status_json();
75 ASSERT(json != NULL, "mining status JSON returned");
76 ASSERT(strstr(json, "proxy") != NULL, "JSON contains proxy object");
77 ASSERT(strstr(json, "hashrate_ghs") != NULL, "JSON contains hashrate_ghs");
78 ASSERT(strstr(json, "total_shares") != NULL, "JSON contains total_shares");
79 ASSERT(strstr(json, "total_accepted") != NULL, "JSON contains total_accepted");
80 ASSERT(strstr(json, "hashprice") != NULL, "JSON contains hashprice");
81 printf(" JSON: %s\n", json);
82 free(json);
83
84 printf("\n--- tollgate_core_on_share_accepted creates session ---\n");
85 uint32_t client_ip = 0x0202020A;
86 tollgate_core_on_share_accepted(client_ip, 1.0);
87
88 tg_session_t *session = tollgate_core_session_find_by_ip(client_ip);
89 ASSERT(session != NULL, "session created for miner");
90 ASSERT(session->active, "session is active");
91 ASSERT(session->payment_method == TG_PAYMENT_MINING, "payment method is MINING");
92 ASSERT(session->allotment_ms > 0, "session has positive allotment");
93 printf(" allotment_ms = %llu\n", (unsigned long long)session->allotment_ms);
94
95 printf("\n--- tollgate_core_on_share_accepted extends session ---\n");
96 uint64_t first_allotment = session->allotment_ms;
97 tollgate_core_on_share_accepted(client_ip, 1.0);
98 ASSERT(session->allotment_ms > first_allotment, "session allotment increased");
99 printf(" new allotment_ms = %llu\n", (unsigned long long)session->allotment_ms);
100
101 printf("\n--- tollgate_core_on_share_accepted calls platform callback ---\n");
102 s_last_share_diff = 0.0;
103 tollgate_core_on_share_accepted(client_ip, 42.5);
104 ASSERT(fabs(s_last_share_diff - 42.5) < 0.001, "platform callback received difficulty");
105
106 printf("\n--- tollgate_core_on_share_accepted with bytes metric ---\n");
107 s_metric = "bytes";
108 uint32_t bytes_client = 0x0303030A;
109 tollgate_core_on_share_accepted(bytes_client, 1.0);
110 tg_session_t *bytes_session = tollgate_core_session_find_by_ip(bytes_client);
111 ASSERT(bytes_session != NULL, "bytes session created");
112 ASSERT(bytes_session->allotment_bytes > 0, "bytes allotment positive");
113 printf(" allotment_bytes = %llu\n", (unsigned long long)bytes_session->allotment_bytes);
114 s_metric = "milliseconds";
115
116 printf("\n--- tollgate_core_on_share_accepted no platform ---\n");
117 tollgate_core_init(NULL, ap_ip);
118 tollgate_core_on_share_accepted(0x0404040A, 1.0);
119 ASSERT(1, "no crash with NULL platform");
120 tollgate_core_init(&platform, ap_ip);
121
122 TEST_SUMMARY();
123}