Skip to content

Commit

Permalink
feat: tests for the --exclude-env-vars flag
Browse files Browse the repository at this point in the history
  • Loading branch information
olegbespalov committed Sep 8, 2022
1 parent ea61131 commit 7206f89
Showing 1 changed file with 119 additions and 0 deletions.
119 changes: 119 additions & 0 deletions cmd/archive_test.go
@@ -1,7 +1,13 @@
package cmd

import (
"archive/tar"
"bytes"
"encoding/json"
"errors"
"io"
"io/ioutil"
"os"
"path/filepath"
"testing"

Expand Down Expand Up @@ -86,3 +92,116 @@ func TestArchiveThresholds(t *testing.T) {
})
}
}

func TestArchiveContainsEnv(t *testing.T) {
t.Parallel()

// given some script that will be archived
fileName := "script.js"
testScript := []byte(`export default function () {}`)
testState := newGlobalTestState(t)
require.NoError(t, afero.WriteFile(testState.fs, filepath.Join(testState.cwd, fileName), testScript, 0o644))

// when we do archiving and passing the `--env` flags
testState.args = []string{"k6", "--env", "ENV1=lorem", "--env", "ENV2=ipsum", "archive", fileName}

newRootCommand(testState.globalState).execute()
require.NoError(t, untar(t, testState.fs, "archive.tar", "tmp/"))

data, err := afero.ReadFile(testState.fs, "tmp/metadata.json")
require.NoError(t, err)

metadata := struct {
Env map[string]string
}{}

// then unpacked metadata should contain the environment variables with the proper values
require.NoError(t, json.Unmarshal(data, &metadata))
require.Len(t, metadata.Env, 2)

require.Contains(t, metadata.Env, "ENV1")
require.Contains(t, metadata.Env, "ENV2")

require.Equal(t, "lorem", metadata.Env["ENV1"])
require.Equal(t, "ipsum", metadata.Env["ENV2"])
}

func TestArchiveNotContainsEnv(t *testing.T) {
t.Parallel()

// given some script that will be archived
fileName := "script.js"
testScript := []byte(`export default function () {}`)
testState := newGlobalTestState(t)
require.NoError(t, afero.WriteFile(testState.fs, filepath.Join(testState.cwd, fileName), testScript, 0o644))

// when we do archiving and passing the `--env` flags altogether with `--exclude-env-vars` flag
testState.args = []string{"k6", "--env", "ENV1=lorem", "--env", "ENV2=ipsum", "archive", "--exclude-env-vars", fileName}

newRootCommand(testState.globalState).execute()
require.NoError(t, untar(t, testState.fs, "archive.tar", "tmp/"))

data, err := afero.ReadFile(testState.fs, "tmp/metadata.json")
require.NoError(t, err)

metadata := struct {
Env map[string]string
}{}

// then unpacked metadata should not contain any environment variables passed at the moment of archive creation
require.NoError(t, json.Unmarshal(data, &metadata))
require.Len(t, metadata.Env, 0)
}

// untar untars a `fileName` file to a `destination` path
func untar(t *testing.T, fs afero.Fs, fileName string, destination string) error {
t.Helper()

archiveFile, err := afero.ReadFile(fs, fileName)
if err != nil {
return err
}

reader := bytes.NewBuffer(archiveFile)

tr := tar.NewReader(reader)

for {
header, err := tr.Next()
switch {
case errors.Is(err, io.EOF):
return nil
case err != nil:
return err
case header == nil:
continue
}

// as long as this code in a test helper, we can safely
// omit G305: File traversal when extracting zip/tar archive
target := filepath.Join(destination, header.Name) //nolint:gosec

switch header.Typeflag {
case tar.TypeDir:
if _, err := fs.Stat(target); err != nil && !os.IsNotExist(err) {
return err
}

if err := fs.MkdirAll(target, 0o755); err != nil {
return err
}
case tar.TypeReg:
f, err := fs.OpenFile(target, os.O_CREATE|os.O_RDWR, os.FileMode(header.Mode))
if err != nil {
return err
}
defer func() { _ = f.Close() }()

// as long as this code in a test helper, we can safely
// omit G110: Potential DoS vulnerability via decompression bomb
if _, err := io.Copy(f, tr); err != nil { //nolint:gosec
return err
}
}
}
}

0 comments on commit 7206f89

Please sign in to comment.