upleb.uk

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

summaryrefslogtreecommitdiff
path: root/tests/unit/test_tollgate_client_mining.c
diff options
context:
space:
mode:
authorYour Name <you@example.com>2026-05-19 14:25:18 +0530
committerYour Name <you@example.com>2026-05-19 14:25:18 +0530
commite366ceb336550a72c76efea4c98a2a08cca27bce (patch)
tree4b45ac6f6e97b6763f81aa6d4a9b968d23e41235 /tests/unit/test_tollgate_client_mining.c
parent163b8badec9359373a8fc016c2b1fe9ee38e6406 (diff)
feat(mining): Bitcoin mining-for-bandwidth payment system
New modules: - mining_payment.c/h: hashprice calc (nbits->difficulty->sat/GH/s/day), share validation, client stats, allotment conversion (ms + bytes) - stratum_client.c/h: SV1 upstream pool connection (subscribe/authorize/submit) - stratum_proxy.c/h: Local SV1 TCP server for downstream miners, job broadcast - sw_miner.c/h: Software SHA256d miner (ESP32 CPU fallback) - asic_miner.c/h: ASIC detection stub (BM1366/BM1368 SPI) Config: - config.h/c: mining_payout_mode_t enum (auto/pool/upstream/proxy_only), stratum pool settings, mining port, hashprice override, sandbox mint access - Defaults fill nostr_seed_relays (8/8) and nostr_relays (4/4) with fast relays Integration into existing modules: - session.h/c: payment_method_t enum (CASHU/MINING/BYTES) - firewall.h/c: firewall_set_mining_port(), firewall_set_sandbox_mint_access() - tollgate_api.c: GET /mining/job, POST /mining/share, GET /mining/stats - tollgate_client.h/c: TG_CLIENT_MINING state, mining discovery tag parsing - tollgate_main.c: mining init in start_services(), stratum_client_tick() in loop - captive_portal.c: tabbed Cashu/Mine UI with live hashrate polling Unit tests (69 new assertions across 4 suites): - test_mining_payment (23 tests): nbits->difficulty, hashprice, client stats, allotment - test_stratum_proxy (21 tests): job set/get, stats, type validation - test_session_payment_method (12 tests): PAYMENT_METHOD enum, bytes/cashu methods - test_tollgate_client_mining (20 tests): mining tag parsing, discovery struct - test_firewall_sandbox (16 tests): client grant/revoke, max clients, setters Enhanced test stubs: - BaseType_t/pdPASS in freertos/task.h - lwip: sockets.h, etharp.h, prot/ip.h, prot/ip4.h, prot/tcp.h, netif.h - dns_server.h, esp_wifi_ap_get_sta_list.h Build fixes: - cvm_server.c: replace esp_timer_get_time() with xTaskGetTickCount(), fix process_relay_message() 3-arg call to 2-arg, add WS keepalive ping - stratum_proxy.c: widen task_name buffer 16->20 - sw_miner.c: add missing #include esp_random.h - nucula_src: save_proofs() moved to public in wallet.hpp Nostr relay updates: - nostr_seed_relays: +relay.anzenkodo.workers.dev, +nostr.koning-degraaf.nl, +knostr.neutrine.com, +nostr.einundzwanzig.space (8/8 slots) - nostr_relays: +relay.anzenkodo.workers.dev, +nostr.koning-degraaf.nl (4/4 slots) Squash-merge of feature/mining-payment (5 commits: c75230e..9d98ba1)
Diffstat (limited to 'tests/unit/test_tollgate_client_mining.c')
-rw-r--r--tests/unit/test_tollgate_client_mining.c103
1 files changed, 103 insertions, 0 deletions
diff --git a/tests/unit/test_tollgate_client_mining.c b/tests/unit/test_tollgate_client_mining.c
new file mode 100644
index 0000000..e270864
--- /dev/null
+++ b/tests/unit/test_tollgate_client_mining.c
@@ -0,0 +1,103 @@
1#include "test_framework.h"
2#include "../../main/config.h"
3#include <string.h>
4#include <stdio.h>
5#include <stdlib.h>
6#include <cjson/cJSON.h>
7
8static tollgate_config_t g_test_config;
9
10const tollgate_config_t *tollgate_config_get(void) {
11 return &g_test_config;
12}
13
14uint64_t nucula_wallet_balance(void) { return 100; }
15esp_err_t nucula_wallet_send(uint64_t a, char *b, size_t c) { (void)a; (void)b; (void)c; return ESP_OK; }
16
17#include "freertos/FreeRTOS.h"
18
19#include "../../main/tollgate_client.c"
20
21int main(void)
22{
23 printf("=== test_tollgate_client_mining ===\n");
24
25 memset(&g_test_config, 0, sizeof(g_test_config));
26 g_test_config.client_enabled = true;
27
28 printf("\n--- mining tag: mining_available=true, port=3333 ---\n");
29 {
30 const char *json = "{\"kind\":10021,\"tags\":["
31 "[\"metric\",\"milliseconds\"],"
32 "[\"step_size\",\"60000\"],"
33 "[\"price_per_step\",\"0\",\"mining\",\"3333\",\"sat\"],"
34 "[\"tips\",\"1\",\"2\",\"5\"]"
35 "]}";
36
37 tollgate_discovery_t disc;
38 bool ok = parse_discovery_response(json, &disc);
39 ASSERT(ok, "mining discovery parsed");
40 ASSERT(disc.is_tollgate, "is_tollgate=true");
41 ASSERT(disc.mining_available, "mining_available=true");
42 ASSERT_EQ_INT(3333, (int)disc.mining_port, "mining_port=3333");
43 }
44
45 printf("\n--- mining tag: no mining tag ---\n");
46 {
47 const char *json = "{\"kind\":10021,\"tags\":["
48 "[\"metric\",\"milliseconds\"],"
49 "[\"step_size\",\"60000\"],"
50 "[\"price_per_step\",\"cashu\",\"21\",\"sat\",\"https://testnut.cashu.space\",\"1\"]"
51 "]}";
52
53 tollgate_discovery_t disc;
54 bool ok = parse_discovery_response(json, &disc);
55 ASSERT(ok, "cashu discovery parsed");
56 ASSERT(disc.is_tollgate, "is_tollgate=true");
57 ASSERT(!disc.mining_available, "mining_available=false");
58 ASSERT_EQ_INT(0, (int)disc.mining_port, "mining_port=0 when no mining");
59 ASSERT_EQ_INT(21, disc.price_per_step, "price_per_step=21 for cashu");
60 }
61
62 printf("\n--- mining tag: custom port 4033 ---\n");
63 {
64 const char *json = "{\"kind\":10021,\"tags\":["
65 "[\"metric\",\"milliseconds\"],"
66 "[\"step_size\",\"60000\"],"
67 "[\"price_per_step\",\"0\",\"mining\",\"4033\",\"sat\"]"
68 "]}";
69
70 tollgate_discovery_t disc;
71 bool ok = parse_discovery_response(json, &disc);
72 ASSERT(ok, "mining custom port parsed");
73 ASSERT(disc.mining_available, "mining_available=true");
74 ASSERT_EQ_INT(4033, (int)disc.mining_port, "mining_port=4033");
75 }
76
77 printf("\n--- tollgate_discovery_t zero-init ---\n");
78 {
79 tollgate_discovery_t disc = {0};
80 ASSERT(!disc.is_tollgate, "zero-init: is_tollgate=false");
81 ASSERT(!disc.mining_available, "zero-init: mining_available=false");
82 ASSERT_EQ_INT(0, (int)disc.mining_port, "zero-init: mining_port=0");
83 ASSERT_EQ_INT(0, disc.price_per_step, "zero-init: price=0");
84 }
85
86 printf("\n--- TG_CLIENT_MINING state enum ---\n");
87 {
88 ASSERT(TG_CLIENT_MINING > TG_CLIENT_PAID, "MINING > PAID in enum");
89 ASSERT(TG_CLIENT_MINING < TG_CLIENT_ERROR, "MINING < ERROR in enum");
90 }
91
92 printf("\n--- discovery struct fields ---\n");
93 {
94 tollgate_discovery_t disc;
95 memset(&disc, 0, sizeof(disc));
96 disc.mining_available = true;
97 disc.mining_port = 9999;
98 ASSERT(disc.mining_available, "mining_available set");
99 ASSERT_EQ_INT(9999, (int)disc.mining_port, "mining_port set");
100 }
101
102 TEST_SUMMARY();
103}