Skip to content

Commit

Permalink
Merge pull request #6 from grafana/5-increasing-test-coverage
Browse files Browse the repository at this point in the history
Increasing test coverage
  • Loading branch information
szkiba authored Jul 9, 2024
2 parents 4935027 + cf2977a commit 20bd066
Show file tree
Hide file tree
Showing 20 changed files with 986 additions and 2 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
/k6exec
/k6exec.exe
/dist
test*.db
3 changes: 2 additions & 1 deletion build.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,6 +115,7 @@ func download(ctx context.Context, from *url.URL, dest string, client *http.Clie
}

if err != nil {
_ = tmp.Close()
_ = os.Remove(tmp.Name())

return err
Expand All @@ -124,7 +125,7 @@ func download(ctx context.Context, from *url.URL, dest string, client *http.Clie
return err
}

err = os.Chmod(tmp.Name(), syscall.S_IRUSR|syscall.S_IXUSR)
err = os.Chmod(tmp.Name(), syscall.S_IRUSR|syscall.S_IXUSR|syscall.S_IWUSR)
if err != nil {
return err
}
Expand Down
268 changes: 268 additions & 0 deletions build_internal_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,268 @@
package k6exec

import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"net/url"
"os"
"os/exec"
"path/filepath"
"runtime"
"strings"
"testing"

"github.com/grafana/k6build"
"github.com/grafana/k6deps"
"github.com/stretchr/testify/require"
)

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

src := make(k6deps.Dependencies)

err := src.UnmarshalText([]byte("k6>0.50;k6/x/faker>0.2.0"))

require.NoError(t, err)

k6Constraints, deps := depsConvert(src)

require.Equal(t, ">0.50", k6Constraints)

require.Equal(t, "k6/x/faker", deps[0].Name)
require.Equal(t, src["k6/x/faker"].Constraints.String(), deps[0].Constraints)

err = src.UnmarshalText([]byte("k6/x/faker*"))

require.NoError(t, err)

k6Constraints, deps = depsConvert(src)

require.Equal(t, "*", k6Constraints)

require.Equal(t, "k6/x/faker", deps[0].Name)
require.Equal(t, "*", deps[0].Constraints)
}

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

opts := &Options{
StateDir: t.TempDir(),
CacheDir: t.TempDir(),
}

opts.BuildServiceURL, _ = url.Parse("http://localhost:8000")

svc, err := newBuildService(context.Background(), opts)

require.NoError(t, err)
require.IsType(t, new(k6build.BuildClient), svc)
require.Equal(t, "*k6build.BuildClient", fmt.Sprintf("%T", svc))

srv := testWebServer(t)
defer srv.Close()

opts.ExtensionCatalogURL, err = url.Parse(srv.URL + "/empty-catalog.json")
require.NoError(t, err)
opts.BuildServiceURL = nil

svc, err = newBuildService(context.Background(), opts)

require.NoError(t, err)

require.NotEqual(t, "*k6build.BuildClient", fmt.Sprintf("%T", svc))
}

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

ctx := context.Background()

abs, err := filepath.Abs(filepath.Join("testdata", "minimal-catalog.json"))
require.NoError(t, err)

u, err := url.Parse("file://" + filepath.ToSlash(abs))
require.NoError(t, err)

opts := &Options{ExtensionCatalogURL: u}

_, err = newLocalBuildService(ctx, opts)
require.NoError(t, err)

opts.StateDir = ""
opts.AppName = invalidAppName(t)
_, err = newLocalBuildService(ctx, opts)
require.Error(t, err)
}

//nolint:forbidigo
func Test_httpDownload(t *testing.T) {
t.Parallel()

srv := testWebServer(t)
defer srv.Close()

tmp := t.TempDir()
ctx := context.Background()
from, err := url.Parse(srv.URL + "/empty-catalog.json")

require.NoError(t, err)

dest, err := os.Create(filepath.Clean(filepath.Join(tmp, "catalog.json")))

require.NoError(t, err)

err = httpDownload(ctx, from, dest, http.DefaultClient)
require.NoError(t, err)

require.NoError(t, dest.Close())

contents, err := os.ReadFile(dest.Name())

require.NoError(t, err)
require.Equal(t, "{}", strings.TrimSpace(string(contents)))
}

//nolint:forbidigo
func Test_fileDownload(t *testing.T) {
t.Parallel()

srv := testWebServer(t)
defer srv.Close()

tmp := t.TempDir()
abs, err := filepath.Abs(filepath.Join("testdata", "empty-catalog.json"))

require.NoError(t, err)

from, err := url.Parse("file://" + filepath.ToSlash(abs))

require.NoError(t, err)

dest, err := os.Create(filepath.Clean(filepath.Join(tmp, "catalog.json")))

require.NoError(t, err)

err = fileDownload(from, dest)
require.NoError(t, err)

require.NoError(t, dest.Close())

contents, err := os.ReadFile(dest.Name())

require.NoError(t, err)
require.Equal(t, "{}", strings.TrimSpace(string(contents)))

from, err = url.Parse("file:///" + tmp + "/no_such_file")

require.NoError(t, err)

err = fileDownload(from, dest)

require.Error(t, err)
}

//nolint:forbidigo
func Test_download(t *testing.T) {
t.Parallel()

srv := testWebServer(t)
defer srv.Close()

tmp := t.TempDir()
ctx := context.Background()
from, err := url.Parse(srv.URL + "/empty-catalog.json")

require.NoError(t, err)

dest := filepath.Clean(filepath.Join(tmp, "catalog.json"))

require.NoError(t, err)

err = download(ctx, from, dest, http.DefaultClient)
require.NoError(t, err)

contents, err := os.ReadFile(dest)

require.NoError(t, err)
require.Equal(t, "{}", strings.TrimSpace(string(contents)))

abs, err := filepath.Abs(filepath.Join("testdata", "empty-catalog.json"))

require.NoError(t, err)

from, err = url.Parse("file://" + filepath.ToSlash(abs))

require.NoError(t, err)

err = download(ctx, from, dest, http.DefaultClient)
require.NoError(t, err)

contents, err = os.ReadFile(dest)

require.NoError(t, err)
require.Equal(t, "{}", strings.TrimSpace(string(contents)))
}

func testWebServer(t *testing.T) *httptest.Server {
t.Helper()

return httptest.NewServer(http.FileServer(http.Dir("testdata")))
}

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

if runtime.GOOS == "windows" { // TODO - Re-enable as soon as k6build supports Windows!
t.Skip("Skip because k6build doesn't work on Windows yet!")
}

srv := testWebServer(t)
defer srv.Close()

u, err := url.Parse(srv.URL + "/minimal-catalog.json")

require.NoError(t, err)

ctx := context.Background()

opts := &Options{CacheDir: t.TempDir(), StateDir: t.TempDir(), ExtensionCatalogURL: u}

loc, err := build(ctx, make(k6deps.Dependencies), opts)

require.NoError(t, err)

tmp := t.TempDir()

dest := filepath.Join(tmp, k6binary)

err = download(ctx, loc, dest, nil)

require.NoError(t, err)

cmd := exec.Command(filepath.Clean(dest), "version") //nolint:gosec

out, err := cmd.Output()

require.NoError(t, err)
require.True(t, strings.HasPrefix(string(out), "k6 "))

opts.ExtensionCatalogURL, err = url.Parse(srv.URL + "/empty-catalog.json")

require.NoError(t, err)

_, err = build(ctx, make(k6deps.Dependencies), opts)

require.Error(t, err)

opts.ExtensionCatalogURL, err = url.Parse(srv.URL + "/missing-catalog.json")

require.NoError(t, err)

_, err = build(ctx, make(k6deps.Dependencies), opts)

require.Error(t, err)
}
51 changes: 51 additions & 0 deletions cleanup_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package k6exec_test

import (
"os"
"path/filepath"
"strconv"
"strings"
"testing"

"github.com/grafana/k6exec"
"github.com/stretchr/testify/require"
)

func exists(t *testing.T, filename string) bool {
t.Helper()

_, err := os.Stat(filename) //nolint:forbidigo

return err == nil
}

//nolint:forbidigo
func TestCleanupState(t *testing.T) {
t.Parallel()

tmp := t.TempDir()

opts := &k6exec.Options{StateDir: tmp}

subdir := filepath.Join(tmp, strconv.Itoa(os.Getpid()))

require.NoError(t, os.MkdirAll(subdir, 0o700))

name := filepath.Join(subdir, "hello.txt")

err := os.WriteFile(name, []byte("Hello, World!\n"), 0o600)

require.NoError(t, err)

require.True(t, exists(t, name))

err = k6exec.CleanupState(opts)
require.NoError(t, err)

require.False(t, exists(t, subdir))
require.True(t, exists(t, tmp))

opts = &k6exec.Options{AppName: strings.Repeat("too long", 2048)}
err = k6exec.CleanupState(opts)
require.Error(t, err)
}
2 changes: 1 addition & 1 deletion cmd/cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ func scriptArg(cmd *cobra.Command, args []string) (string, bool) {
}

last := args[len(args)-1]
if len(last) == 0 || last[0] == '-' {
if last[0] == '-' {
return "", false
}

Expand Down
43 changes: 43 additions & 0 deletions cmd/cmd_internal_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package cmd

import (
"testing"

"github.com/spf13/cobra"
"github.com/stretchr/testify/require"
)

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

cmd := new(cobra.Command)

sarg, has := scriptArg(cmd, nil)

require.False(t, has)
require.Empty(t, sarg)

cmd.Annotations = map[string]string{"foo": "bar"}

sarg, has = scriptArg(cmd, nil)

require.False(t, has)
require.Empty(t, sarg)

cmd.Annotations = map[string]string{useExtensions: "true"}

sarg, has = scriptArg(cmd, nil)

require.False(t, has)
require.Empty(t, sarg)

sarg, has = scriptArg(cmd, []string{"-"})

require.False(t, has)
require.Empty(t, sarg)

sarg, has = scriptArg(cmd, []string{"script.js"})

require.True(t, has)
require.Equal(t, "script.js", sarg)
}
Loading

0 comments on commit 20bd066

Please sign in to comment.