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  }