reality_finalmask_migration_test.go 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. package database
  2. import (
  3. "encoding/json"
  4. "testing"
  5. )
  6. func TestStripRealityFinalmaskTcpFromStream(t *testing.T) {
  7. tests := []struct {
  8. name string
  9. raw string
  10. wantChanged bool
  11. wantAbsent []string
  12. wantPresent []string
  13. }{
  14. {
  15. name: "reality with tcp masks is stripped",
  16. raw: `{"network":"tcp","security":"reality","realitySettings":{"privateKey":"k"},"finalmask":{"tcp":[{"type":"sudoku"}]}}`,
  17. wantChanged: true,
  18. wantAbsent: []string{"finalmask"},
  19. wantPresent: []string{"realitySettings"},
  20. },
  21. {
  22. name: "reality with tcp and udp masks keeps udp",
  23. raw: `{"security":"reality","finalmask":{"tcp":[{"type":"sudoku"}],"udp":[{"type":"salt"}]}}`,
  24. wantChanged: true,
  25. wantAbsent: []string{"tcp"},
  26. wantPresent: []string{"udp"},
  27. },
  28. {
  29. name: "tls with tcp masks is untouched",
  30. raw: `{"security":"tls","finalmask":{"tcp":[{"type":"sudoku"}]}}`,
  31. wantChanged: false,
  32. },
  33. {
  34. name: "reality without finalmask is untouched",
  35. raw: `{"security":"reality","realitySettings":{}}`,
  36. wantChanged: false,
  37. },
  38. {
  39. name: "empty stream is untouched",
  40. raw: "",
  41. wantChanged: false,
  42. },
  43. {
  44. name: "invalid json is untouched",
  45. raw: "{not json",
  46. wantChanged: false,
  47. },
  48. }
  49. for _, tc := range tests {
  50. t.Run(tc.name, func(t *testing.T) {
  51. updated, changed := stripRealityFinalmaskTcpFromStream(tc.raw)
  52. if changed != tc.wantChanged {
  53. t.Fatalf("changed = %v, want %v (updated: %s)", changed, tc.wantChanged, updated)
  54. }
  55. if !tc.wantChanged {
  56. if updated != tc.raw {
  57. t.Fatalf("stream mutated without change flag: %s", updated)
  58. }
  59. return
  60. }
  61. var stream map[string]any
  62. if err := json.Unmarshal([]byte(updated), &stream); err != nil {
  63. t.Fatalf("updated stream is not valid json: %v", err)
  64. }
  65. flat, _ := json.Marshal(stream)
  66. for _, key := range tc.wantAbsent {
  67. if containsJSONKey(stream, key) {
  68. t.Fatalf("key %q should be gone: %s", key, flat)
  69. }
  70. }
  71. for _, key := range tc.wantPresent {
  72. if !containsJSONKey(stream, key) {
  73. t.Fatalf("key %q should survive: %s", key, flat)
  74. }
  75. }
  76. })
  77. }
  78. }
  79. func containsJSONKey(m map[string]any, key string) bool {
  80. if _, ok := m[key]; ok {
  81. return true
  82. }
  83. for _, v := range m {
  84. if nested, ok := v.(map[string]any); ok && containsJSONKey(nested, key) {
  85. return true
  86. }
  87. }
  88. return false
  89. }