| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- package database
- import (
- "encoding/json"
- "testing"
- )
- func TestStripRealityFinalmaskTcpFromStream(t *testing.T) {
- tests := []struct {
- name string
- raw string
- wantChanged bool
- wantAbsent []string
- wantPresent []string
- }{
- {
- name: "reality with tcp masks is stripped",
- raw: `{"network":"tcp","security":"reality","realitySettings":{"privateKey":"k"},"finalmask":{"tcp":[{"type":"sudoku"}]}}`,
- wantChanged: true,
- wantAbsent: []string{"finalmask"},
- wantPresent: []string{"realitySettings"},
- },
- {
- name: "reality with tcp and udp masks keeps udp",
- raw: `{"security":"reality","finalmask":{"tcp":[{"type":"sudoku"}],"udp":[{"type":"salt"}]}}`,
- wantChanged: true,
- wantAbsent: []string{"tcp"},
- wantPresent: []string{"udp"},
- },
- {
- name: "tls with tcp masks is untouched",
- raw: `{"security":"tls","finalmask":{"tcp":[{"type":"sudoku"}]}}`,
- wantChanged: false,
- },
- {
- name: "reality without finalmask is untouched",
- raw: `{"security":"reality","realitySettings":{}}`,
- wantChanged: false,
- },
- {
- name: "empty stream is untouched",
- raw: "",
- wantChanged: false,
- },
- {
- name: "invalid json is untouched",
- raw: "{not json",
- wantChanged: false,
- },
- }
- for _, tc := range tests {
- t.Run(tc.name, func(t *testing.T) {
- updated, changed := stripRealityFinalmaskTcpFromStream(tc.raw)
- if changed != tc.wantChanged {
- t.Fatalf("changed = %v, want %v (updated: %s)", changed, tc.wantChanged, updated)
- }
- if !tc.wantChanged {
- if updated != tc.raw {
- t.Fatalf("stream mutated without change flag: %s", updated)
- }
- return
- }
- var stream map[string]any
- if err := json.Unmarshal([]byte(updated), &stream); err != nil {
- t.Fatalf("updated stream is not valid json: %v", err)
- }
- flat, _ := json.Marshal(stream)
- for _, key := range tc.wantAbsent {
- if containsJSONKey(stream, key) {
- t.Fatalf("key %q should be gone: %s", key, flat)
- }
- }
- for _, key := range tc.wantPresent {
- if !containsJSONKey(stream, key) {
- t.Fatalf("key %q should survive: %s", key, flat)
- }
- }
- })
- }
- }
- func containsJSONKey(m map[string]any, key string) bool {
- if _, ok := m[key]; ok {
- return true
- }
- for _, v := range m {
- if nested, ok := v.(map[string]any); ok && containsJSONKey(nested, key) {
- return true
- }
- }
- return false
- }
|