客户端心跳时打印显卡温度功耗和算力日志,并带回今日预估积分。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
dekun
2026-10-11 00:55:08 +08:00
parent fe530a619d
commit 80d46dcd5d
4 changed files with 350 additions and 50 deletions
+61
View File
@@ -2,6 +2,8 @@
from __future__ import annotations
import contextlib
import io
import os
import tempfile
import unittest
@@ -346,12 +348,71 @@ class CoreFlowTest(unittest.TestCase):
beat = self.client.post("/api/v1/node/heartbeat", json={"sn": sn, "token": node["node_token"]})
self.assertEqual(beat.status_code, 200, beat.text)
self.assertEqual(beat.json()["status"], "online")
self.assertEqual(beat.json()["estimated_daily_points"], "50.00000000")
client = self.client.get(f"/api/v1/me/nodes/{sn}/client", headers=headers)
self.assertEqual(client.status_code, 200, client.text)
self.assertIn(node["node_token"], client.text)
self.assertIn("nvidia-smi", client.text)
self.assertIn("pynvml", client.text)
self.assertIn("nvmlDeviceGetTemperature", client.text)
self.assertIn("fan.speed", client.text)
self.assertIn("48.5", client.text)
self.assertIn("pow_mining", client.text)
namespace = {"__name__": "hypernode_client"}
exec(compile(client.text, "hypernode-client.py", "exec"), namespace)
card = {
"name": "NVIDIA GeForce RTX 3060 Ti",
"vram_gb": 8.0,
"vram_used_mb": 6200,
"vram_total_mb": 8192,
"gpu_temp": 67,
"fan_speed": 54,
"power_usage": 168.4,
"utilization": 99,
}
reply = {
"status": "online",
"display_node_id": 1001,
"hardware_weight": 1.0,
"recovery_days": 30,
"purchase_amount": "1500.00000000",
"recoverable_stake_amount": "1450.00000000",
"estimated_daily_points": "50.00000000",
}
buffer = io.StringIO()
with contextlib.redirect_stdout(buffer):
namespace["_report"](card, reply, 7)
rendered = buffer.getvalue()
self.assertIn("[INFO]", rendered)
self.assertIn("RTX 3060 Ti", rendered)
self.assertIn("8.00 GB", rendered)
self.assertIn("[HARDWARE]", rendered)
self.assertIn("67°C", rendered)
self.assertIn("Fan 54%", rendered)
self.assertIn("168.4 W", rendered)
self.assertIn("6200 / 8192 MB", rendered)
self.assertIn("[HASHRATE]", rendered)
self.assertIn("48.5 MH/s", rendered)
self.assertIn("Accepted 7", rendered)
self.assertIn("[HEARTBEAT]", rendered)
self.assertIn("Node #1001", rendered)
self.assertIn("Weight 1.0", rendered)
self.assertIn("[RECOVERY]", rendered)
self.assertIn("30-day fast recovery", rendered)
self.assertIn("3.3% returned", rendered)
self.assertIn("Est. Points 50.00000000", rendered)
os.environ["HYPERNODE_MODE"] = "gpu_rental"
try:
rental = io.StringIO()
with contextlib.redirect_stdout(rental):
namespace["_report"](card, reply, 7)
finally:
os.environ.pop("HYPERNODE_MODE", None)
rental_text = rental.getvalue()
self.assertIn("[AI Task Executing]", rental_text)
self.assertIn("99% Load", rental_text)
self.assertNotIn("[HASHRATE]", rental_text)
duplicated = self.client.post("/api/v1/me/orders", headers=headers, json={"tx_id": "paytx1500usdt01"})
self.assertEqual(duplicated.status_code, 409, duplicated.text)