forked from
ptr.pet/hydrant
kind of like tap but different and in rust
1#!/usr/bin/env nu
2use common.nu *
3
4def main [] {
5 # 1. ensure http-nu is installed
6 if (which http-nu | is-empty) {
7 print "http-nu not found, installing..."
8 cargo install http-nu
9 }
10
11 # 2. setup ports and paths
12 let port = 3006
13 let mock_port = 3008
14 let url = $"http://localhost:($port)"
15 let debug_url = $"http://localhost:($port + 1)"
16 let mock_url = $"http://localhost:($mock_port)"
17 let db_path = (mktemp -d -t hydrant_full_net.XXXXXX)
18
19 print $"testing full network crawler..."
20 print $"database path: ($db_path)"
21
22 # 3. start mock relay
23 print $"starting mock relay on ($mock_port)..."
24 let mock_pid = (
25 bash -c $"http-nu :($mock_port) tests/mock_relay.nu > ($db_path)/mock.log 2>&1 & echo $!"
26 | str trim
27 | into int
28 )
29 print $"mock relay pid: ($mock_pid)"
30
31 # give mock relay a moment
32 sleep 1sec
33
34 # 4. start hydrant in full network mode, firehose disabled
35 let binary = build-hydrant
36
37 let log_file = $"($db_path)/hydrant.log"
38 print $"starting hydrant - logs at ($log_file)..."
39
40 let hydrant_pid = (
41 with-env {
42 HYDRANT_DATABASE_PATH: ($db_path),
43 HYDRANT_FULL_NETWORK: "true",
44 HYDRANT_RELAY_HOST: ($mock_url),
45 HYDRANT_DISABLE_FIREHOSE: "true",
46 HYDRANT_DISABLE_BACKFILL: "true",
47 HYDRANT_API_PORT: ($port | into string),
48 HYDRANT_ENABLE_DEBUG: "true", # for stats checking
49 HYDRANT_DEBUG_PORT: ($port + 1 | into string),
50 HYDRANT_LOG_LEVEL: "debug",
51 HYDRANT_CURSOR_SAVE_INTERVAL: "1" # faster save
52 } {
53 sh -c $"($binary) >($log_file) 2>&1 & echo $!" | str trim | into int
54 }
55 )
56 print $"hydrant started with pid: ($hydrant_pid)"
57
58 mut success = false
59
60 try {
61 if (wait-for-api $url) {
62 print "hydrant api is up."
63
64 # wait for crawler to run (it runs on startup)
65 print "waiting for crawler to fetch repos..."
66
67 # retry check for 30s
68 for i in 1..30 {
69 let stats = (http get $"($url)/stats?accurate=true").counts
70 let pending = ($stats.pending | into int)
71 let repos = ($stats.repos | default 0 | into int)
72
73 # we expect 5 repos from the mock
74 print $"[($i)/30] pending: ($pending), known_repos: ($repos)"
75
76 if $repos >= 5 {
77 print "crawler successfully discovered repos!"
78 $success = true
79 break
80 }
81
82 sleep 1sec
83 }
84
85 if not $success {
86 print "timeout waiting for crawler."
87 }
88
89 # check cursor persistence
90 print "verifying crawler cursor persistence..."
91 let cursor_check = try {
92 let cursor_res = (http get $"($debug_url)/debug/get?partition=cursors&key=crawler_cursor").value
93 print $"cursor value from debug: ($cursor_res)"
94
95 if $cursor_res == "50" {
96 print "cursor verified."
97 true
98 } else {
99 print "cursor mismatch or missing."
100 false
101 }
102 } catch {
103 print "failed to get cursor from debug endpoint"
104 false
105 }
106 if not $cursor_check { $success = false }
107
108 } else {
109 print "hydrant failed to start."
110 }
111 } catch { |e|
112 print $"test failed with error: ($e)"
113 }
114
115 # cleanup
116 print "stopping processes..."
117 try { kill $hydrant_pid }
118 try { kill $mock_pid }
119
120 if $success {
121 print "test passed!"
122 exit 0
123 } else {
124 print "test failed!"
125 print "hydrant logs:"
126 open $log_file | tail -n 20
127 print "mock logs:"
128 open $"($db_path)/mock.log"
129 exit 1
130 }
131}