node_netmetrics_test.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. package service
  2. import (
  3. "context"
  4. "net/http"
  5. "net/http/httptest"
  6. "net/url"
  7. "slices"
  8. "strconv"
  9. "testing"
  10. "time"
  11. "github.com/mhsanaei/3x-ui/v3/internal/database"
  12. "github.com/mhsanaei/3x-ui/v3/internal/database/model"
  13. )
  14. func TestProbeParsesNetIO(t *testing.T) {
  15. srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
  16. w.Header().Set("Content-Type", "application/json")
  17. _, _ = w.Write([]byte(`{"success":true,"obj":{"cpu":5,"mem":{"current":1,"total":2},"netIO":{"up":1000,"down":2000},"panelGuid":"g","uptime":42}}`))
  18. }))
  19. defer srv.Close()
  20. u, err := url.Parse(srv.URL)
  21. if err != nil {
  22. t.Fatalf("parse url: %v", err)
  23. }
  24. port, _ := strconv.Atoi(u.Port())
  25. n := &model.Node{Scheme: "http", Address: u.Hostname(), Port: port, BasePath: "/", ApiToken: "t", AllowPrivateAddress: true}
  26. patch, err := (&NodeService{}).probe(context.Background(), n, "")
  27. if err != nil {
  28. t.Fatalf("probe: %v", err)
  29. }
  30. if patch.NetUp != 1000 || patch.NetDown != 2000 {
  31. t.Fatalf("net throughput not parsed from status: up=%d down=%d", patch.NetUp, patch.NetDown)
  32. }
  33. }
  34. func TestUpdateHeartbeatStoresNetMetrics(t *testing.T) {
  35. _ = setupSettingMtlsDB(t)
  36. s := &NodeService{}
  37. n := &model.Node{Name: "netn", Address: "1.2.3.4", Port: 2053, Scheme: "https", ApiToken: "t"}
  38. if err := database.GetDB().Create(n).Error; err != nil {
  39. t.Fatalf("create node: %v", err)
  40. }
  41. patch := HeartbeatPatch{Status: "online", LastHeartbeat: time.Now().Unix(), NetUp: 111, NetDown: 222}
  42. if err := s.UpdateHeartbeat(n.Id, patch); err != nil {
  43. t.Fatalf("UpdateHeartbeat: %v", err)
  44. }
  45. var got model.Node
  46. if err := database.GetDB().First(&got, n.Id).Error; err != nil {
  47. t.Fatalf("reload node: %v", err)
  48. }
  49. if got.NetUp != 111 || got.NetDown != 222 {
  50. t.Fatalf("net columns not persisted: up=%d down=%d", got.NetUp, got.NetDown)
  51. }
  52. if len(s.AggregateNodeMetric(n.Id, "netUp", 2, 60)) == 0 {
  53. t.Fatal("expected netUp history points after an online heartbeat")
  54. }
  55. }
  56. func TestNodeMetricKeysIncludesNet(t *testing.T) {
  57. for _, k := range []string{"netUp", "netDown"} {
  58. if !slices.Contains(NodeMetricKeys, k) {
  59. t.Fatalf("NodeMetricKeys must include %q so the history endpoint accepts it", k)
  60. }
  61. }
  62. }