Wideband autonomous SDR analysis engine forked from sdr-visual-suite
Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

120 rindas
3.7KB

  1. package pipeline
  2. import "testing"
  3. func TestRebalanceArchiveProtectsRecord(t *testing.T) {
  4. policy := Policy{
  5. Profile: "archive",
  6. Intent: "archive-and-triage",
  7. MaxRefinementJobs: 4,
  8. MaxRecordingStreams: 4,
  9. MaxDecodeJobs: 4,
  10. }
  11. budget := BudgetModelFromPolicy(policy)
  12. pressure := BudgetPressureSummary{
  13. Refinement: pressureFor(0.6),
  14. Record: pressureFor(0.6),
  15. Decode: pressureFor(1.3),
  16. }
  17. rebalanced := ApplyBudgetRebalance(policy, budget, pressure)
  18. if rebalanced.Record.RebalanceDelta < 0 {
  19. t.Fatalf("expected record to be protected from donating, got delta=%d", rebalanced.Record.RebalanceDelta)
  20. }
  21. if rebalanced.Decode.RebalanceDelta <= 0 {
  22. t.Fatalf("expected decode to receive a slot, got delta=%d", rebalanced.Decode.RebalanceDelta)
  23. }
  24. if rebalanced.Refinement.RebalanceDelta >= 0 {
  25. t.Fatalf("expected refinement to donate a slot, got delta=%d", rebalanced.Refinement.RebalanceDelta)
  26. }
  27. }
  28. func TestRebalanceDigitalProtectsDecode(t *testing.T) {
  29. policy := Policy{
  30. Profile: "digital-hunting",
  31. Intent: "decode-digital",
  32. MaxRefinementJobs: 4,
  33. MaxRecordingStreams: 4,
  34. MaxDecodeJobs: 4,
  35. }
  36. budget := BudgetModelFromPolicy(policy)
  37. pressure := BudgetPressureSummary{
  38. Refinement: pressureFor(0.6),
  39. Record: pressureFor(1.3),
  40. Decode: pressureFor(0.6),
  41. }
  42. rebalanced := ApplyBudgetRebalance(policy, budget, pressure)
  43. if rebalanced.Decode.RebalanceDelta < 0 {
  44. t.Fatalf("expected decode to be protected from donating, got delta=%d", rebalanced.Decode.RebalanceDelta)
  45. }
  46. if rebalanced.Record.RebalanceDelta <= 0 {
  47. t.Fatalf("expected record to receive a slot, got delta=%d", rebalanced.Record.RebalanceDelta)
  48. }
  49. if rebalanced.Refinement.RebalanceDelta >= 0 {
  50. t.Fatalf("expected refinement to donate a slot, got delta=%d", rebalanced.Refinement.RebalanceDelta)
  51. }
  52. }
  53. func TestRebalanceAggressiveFavorsRefinement(t *testing.T) {
  54. policy := Policy{
  55. Profile: "wideband-aggressive",
  56. Intent: "wideband-surveillance",
  57. MaxRefinementJobs: 6,
  58. MaxRecordingStreams: 4,
  59. MaxDecodeJobs: 4,
  60. }
  61. budget := BudgetModelFromPolicy(policy)
  62. pressure := BudgetPressureSummary{
  63. Refinement: pressureFor(1.3),
  64. Record: pressureFor(0.5),
  65. Decode: pressureFor(0.5),
  66. }
  67. rebalanced := ApplyBudgetRebalance(policy, budget, pressure)
  68. if rebalanced.Refinement.RebalanceDelta <= 0 {
  69. t.Fatalf("expected refinement to receive slots, got delta=%d", rebalanced.Refinement.RebalanceDelta)
  70. }
  71. }
  72. func TestRebalanceLegacyStaysConservative(t *testing.T) {
  73. policy := Policy{
  74. Profile: "legacy",
  75. Intent: "general-monitoring",
  76. MaxRefinementJobs: 4,
  77. MaxRecordingStreams: 4,
  78. MaxDecodeJobs: 4,
  79. }
  80. budget := BudgetModelFromPolicy(policy)
  81. pressure := BudgetPressureSummary{
  82. Refinement: pressureFor(0.5),
  83. Record: pressureFor(1.3),
  84. Decode: pressureFor(0.5),
  85. }
  86. rebalanced := ApplyBudgetRebalance(policy, budget, pressure)
  87. if rebalanced.Rebalance.Active {
  88. t.Fatalf("expected legacy rebalance to remain inactive")
  89. }
  90. if rebalanced.Refinement.RebalanceDelta != 0 || rebalanced.Record.RebalanceDelta != 0 || rebalanced.Decode.RebalanceDelta != 0 {
  91. t.Fatalf("expected no rebalance deltas, got ref=%d record=%d decode=%d", rebalanced.Refinement.RebalanceDelta, rebalanced.Record.RebalanceDelta, rebalanced.Decode.RebalanceDelta)
  92. }
  93. }
  94. func pressureFor(value float64) BudgetPressure {
  95. level := ""
  96. switch {
  97. case value >= 1.5:
  98. level = "critical"
  99. case value >= 1.15:
  100. level = "high"
  101. case value >= 0.85:
  102. level = "elevated"
  103. case value > 0:
  104. level = "steady"
  105. default:
  106. level = "idle"
  107. }
  108. demand := 1
  109. if value == 0 {
  110. demand = 0
  111. }
  112. return BudgetPressure{Pressure: value, Level: level, Demand: demand}
  113. }