github.com/grafana/synthetic-monitoring-agent@v0.64.2/internal/k6runner/local_test.go (about) 1 package k6runner 2 3 import ( 4 "encoding/json" 5 "os" 6 "slices" 7 "testing" 8 ) 9 10 func TestCreateSecretConfigFile(t *testing.T) { 11 tests := map[string]struct { 12 url string 13 token string 14 }{ 15 "valid data": { 16 url: "http://secrets.example.com", 17 token: "secret-token-123", 18 }, 19 "empty values": { 20 url: "", 21 token: "", 22 }, 23 } 24 25 for name, tt := range tests { 26 t.Run(name, func(t *testing.T) { 27 filename, cleanup, err := createSecretConfigFile(tt.url, tt.token) 28 defer cleanup() 29 30 if err != nil { 31 t.Errorf("unexpected error: %v", err) 32 return 33 } 34 35 // Check if file exists 36 if _, err := os.Stat(filename); os.IsNotExist(err) { 37 t.Error("config file was not created") 38 return 39 } 40 41 // Check file permissions 42 info, err := os.Stat(filename) 43 if err != nil { 44 t.Errorf("failed to get file info: %v", err) 45 return 46 } 47 48 if info.Mode().Perm() != 0600 { 49 t.Errorf("expected file permissions 0600, got %v", info.Mode().Perm()) 50 } 51 52 // Check file contents 53 content, err := os.ReadFile(filename) 54 if err != nil { 55 t.Errorf("failed to read config file: %v", err) 56 return 57 } 58 59 // Verify JSON format and content 60 var config secretSourceConfig 61 if err := json.Unmarshal(content, &config); err != nil { 62 t.Errorf("failed to unmarshal JSON: %v", err) 63 return 64 } 65 66 if config.URL != tt.url { 67 t.Errorf("expected URL %q, got %q", tt.url, config.URL) 68 } 69 70 if config.Token != tt.token { 71 t.Errorf("expected token %q, got %q", tt.token, config.Token) 72 } 73 74 // Test cleanup function 75 cleanup() 76 77 if _, err := os.Stat(filename); !os.IsNotExist(err) { 78 t.Error("cleanup function did not remove the file") 79 } 80 }) 81 } 82 } 83 84 func TestBuildK6Args(t *testing.T) { 85 secretUrl := "http://secrets.example.com" 86 87 configFilename, cleanup, err := createSecretConfigFile(secretUrl, "secret-token") 88 if err != nil { 89 t.Fatalf("failed to create config file: %v", err) 90 } 91 defer cleanup() 92 93 tests := map[string]struct { 94 script Script 95 metricsFn string 96 logsFn string 97 scriptFn string 98 blacklistedIP string 99 configFile string 100 executionID string 101 wantArgs []string 102 wantAbsent []string 103 }{ 104 "script without secrets": { 105 metricsFn: "/tmp/metrics.json", 106 logsFn: "/tmp/logs.log", 107 scriptFn: "/tmp/script.js", 108 blacklistedIP: "127.0.0.1", 109 configFile: "", 110 executionID: "test-exec-id", 111 wantArgs: []string{ 112 "--out", "sm=/tmp/metrics.json", 113 "--log-output", "file=/tmp/logs.log", 114 "--blacklist-ip", "127.0.0.1", 115 "--vus", "--iterations", 116 }, 117 wantAbsent: []string{k6CloudPushRefIDEnvVar}, 118 }, 119 "script with secrets": { 120 script: Script{}, 121 metricsFn: "/tmp/metrics.json", 122 logsFn: "/tmp/logs.log", 123 scriptFn: "/tmp/script.js", 124 blacklistedIP: "127.0.0.1", 125 configFile: configFilename, 126 executionID: "test-exec-id", 127 wantArgs: []string{ 128 "--out", "sm=/tmp/metrics.json", 129 "--log-output", "file=/tmp/logs.log", 130 "--blacklist-ip", "127.0.0.1", 131 "--secret-source", "grafanasecrets=config=" + configFilename, 132 "--vus", "--iterations", 133 }, 134 wantAbsent: []string{k6CloudPushRefIDEnvVar}, 135 }, 136 "browser check sets K6_CLOUD_PUSH_REF_ID": { 137 script: Script{ 138 CheckInfo: CheckInfo{Type: "browser"}, 139 }, 140 metricsFn: "/tmp/metrics.json", 141 logsFn: "/tmp/logs.log", 142 scriptFn: "/tmp/script.js", 143 blacklistedIP: "127.0.0.1", 144 executionID: "abc-123", 145 wantArgs: []string{ 146 "-e", k6CloudPushRefIDEnvVar + "=sm:abc-123", 147 }, 148 wantAbsent: []string{"--vus", "--iterations"}, 149 }, 150 "browser check with empty executionID omits K6_CLOUD_PUSH_REF_ID": { 151 script: Script{ 152 CheckInfo: CheckInfo{Type: "browser"}, 153 }, 154 metricsFn: "/tmp/metrics.json", 155 logsFn: "/tmp/logs.log", 156 scriptFn: "/tmp/script.js", 157 blacklistedIP: "127.0.0.1", 158 executionID: "", 159 wantAbsent: []string{k6CloudPushRefIDEnvVar, "--vus", "--iterations"}, 160 }, 161 } 162 163 for name, tt := range tests { 164 t.Run(name, func(t *testing.T) { 165 r := Local{blacklistedIP: tt.blacklistedIP} 166 167 args, err := r.buildK6Args(tt.script, tt.metricsFn, tt.logsFn, tt.scriptFn, tt.configFile, tt.executionID) 168 if err != nil { 169 t.Errorf("unexpected error: %v", err) 170 return 171 } 172 173 for _, want := range tt.wantArgs { 174 if !slices.Contains(args, want) { 175 t.Errorf("buildK6Args() missing expected argument got \n%v\nwant \n%v", args, want) 176 } 177 } 178 179 for _, absent := range tt.wantAbsent { 180 if slices.Contains(args, absent) { 181 t.Errorf("buildK6Args() should not contain %q, got \n%v", absent, args) 182 } 183 } 184 }) 185 } 186 } 187 188 func TestBuildK6RefID(t *testing.T) { 189 t.Parallel() 190 191 t.Run("valid executionID", func(t *testing.T) { 192 got, err := buildK6RefID("abc-123-def") 193 if err != nil { 194 t.Fatalf("unexpected error: %v", err) 195 } 196 197 if got != "sm:abc-123-def" { 198 t.Errorf("buildK6RefID() = %q, want %q", got, "sm:abc-123-def") 199 } 200 }) 201 202 t.Run("empty executionID returns error", func(t *testing.T) { 203 _, err := buildK6RefID("") 204 if err == nil { 205 t.Fatal("expected error for empty executionID, got nil") 206 } 207 }) 208 }