Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 4f91a19

Browse files
authored
Merge pull request #117 from docker/add-utm-tests
Added unit tests on snyk env var
2 parents e69d4a0 + a7023a4 commit 4f91a19

3 files changed

Lines changed: 116 additions & 4 deletions

File tree

internal/provider/snyk.go

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import (
2121
"context"
2222
"encoding/json"
2323
"fmt"
24+
"io"
2425
"io/ioutil"
2526
"os"
2627
"os/exec"
@@ -45,12 +46,16 @@ type snykProvider struct {
4546
flags []string
4647
auth types.AuthConfig
4748
context context.Context
49+
out io.Writer
50+
err io.Writer
4851
}
4952

5053
// NewSnykProvider returns a Snyk implementation of scan provider
5154
func NewSnykProvider(ops ...SnykProviderOps) (Provider, error) {
5255
provider := snykProvider{
5356
flags: []string{"container", "test"},
57+
out: os.Stdout,
58+
err: os.Stderr,
5459
}
5560
for _, op := range ops {
5661
if err := op(&provider); err != nil {
@@ -71,6 +76,15 @@ func WithContext(ctx context.Context) SnykProviderOps {
7176
}
7277
}
7378

79+
//WithStreams sets the out and err streams to be used by commands
80+
func WithStreams(out, err io.Writer) SnykProviderOps {
81+
return func(provider *snykProvider) error {
82+
provider.out = out
83+
provider.err = err
84+
return nil
85+
}
86+
}
87+
7488
// WithPath update the Snyk provider with the path from the configuration
7589
func WithPath(path string) SnykProviderOps {
7690
return func(provider *snykProvider) error {
@@ -133,8 +147,8 @@ func (s *snykProvider) Authenticate(token string) error {
133147
"SNYK_UTM_MEDIUM=Partner",
134148
"SNYK_UTM_SOURCE=Docker",
135149
"SNYK_UTM_CAMPAIGN=Docker-Desktop-2020")
136-
cmd.Stdout = os.Stdout
137-
cmd.Stderr = os.Stderr
150+
cmd.Stdout = s.out
151+
cmd.Stderr = s.err
138152
return checkCommandErr(cmd.Run())
139153
}
140154

@@ -150,8 +164,8 @@ func (s *snykProvider) Scan(image string) error {
150164
cmd.Env = append(cmd.Env, fmt.Sprintf("SNYK_DOCKER_TOKEN=%s", token))
151165
}
152166

153-
cmd.Stdout = os.Stdout
154-
cmd.Stderr = os.Stderr
167+
cmd.Stdout = s.out
168+
cmd.Stderr = s.err
155169
return checkCommandErr(cmd.Run())
156170
}
157171

internal/provider/snyk_test.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,87 @@
1616

1717
package provider
1818

19+
import (
20+
"bytes"
21+
"context"
22+
"os"
23+
"path/filepath"
24+
"runtime"
25+
"strings"
26+
"testing"
27+
28+
"gotest.tools/v3/assert"
29+
"gotest.tools/v3/env"
30+
"gotest.tools/v3/fs"
31+
)
32+
1933
var (
2034
_ Provider = &snykProvider{}
2135
)
36+
37+
const (
38+
snykToken = "aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
39+
)
40+
41+
func TestSnykLoginEnvVars(t *testing.T) {
42+
if runtime.GOOS == "windows" {
43+
t.Skip("Can't run this test on windows")
44+
}
45+
46+
provider, outStream := setupMockSnykBinary(t)
47+
48+
err := provider.Authenticate(snykToken)
49+
assert.NilError(t, err)
50+
51+
// SNYK_INTEGRATION is always set
52+
assert.Assert(t, strings.Contains(outStream.String(), "SNYK_INTEGRATION_NAME=DOCKER_DESKTOP"))
53+
// NO_UPDATE_NOTIFIER disables node.js automatic update notification in console
54+
assert.Assert(t, strings.Contains(outStream.String(), "NO_UPDATE_NOTIFIER=true"))
55+
// SNYK_CFG_DISABLESUGGESTIONS removes user hints from snyk
56+
assert.Assert(t, strings.Contains(outStream.String(), "SNYK_CFG_DISABLESUGGESTIONS=true"))
57+
// Check UTMs variables
58+
assert.Assert(t, strings.Contains(outStream.String(), "SNYK_UTM_MEDIUM=Partner"))
59+
assert.Assert(t, strings.Contains(outStream.String(), "SNYK_UTM_SOURCE=Docker"))
60+
assert.Assert(t, strings.Contains(outStream.String(), "SNYK_UTM_CAMPAIGN=Docker-Desktop-2020"))
61+
}
62+
63+
func TestSnykScanEnvVars(t *testing.T) {
64+
if runtime.GOOS == "windows" {
65+
t.Skip("Can't run this test on windows")
66+
}
67+
68+
// Create Snyk config file with token
69+
tempDir := fs.NewDir(t, t.Name(),
70+
fs.WithDir(".config",
71+
fs.WithDir("configstore",
72+
fs.WithFile("snyk.json", `{"api":"`+snykToken+`"}`))))
73+
defer tempDir.Remove()
74+
defer env.Patch(t, "HOME", tempDir.Path())()
75+
76+
provider, outStream := setupMockSnykBinary(t)
77+
78+
err := provider.Scan("image")
79+
assert.NilError(t, err)
80+
81+
// SNYK_INTEGRATION is always set
82+
assert.Assert(t, strings.Contains(outStream.String(), "SNYK_INTEGRATION_NAME=DOCKER_DESKTOP"))
83+
// NO_UPDATE_NOTIFIER disables node.js automatic update notification in console
84+
assert.Assert(t, strings.Contains(outStream.String(), "NO_UPDATE_NOTIFIER=true"))
85+
// SNYK_CFG_DISABLESUGGESTIONS removes user hints from snyk
86+
assert.Assert(t, strings.Contains(outStream.String(), "SNYK_CFG_DISABLESUGGESTIONS=true"))
87+
}
88+
89+
func setupMockSnykBinary(t *testing.T) (Provider, *bytes.Buffer) {
90+
pwd, err := os.Getwd()
91+
assert.NilError(t, err)
92+
snykPath := filepath.Join(pwd, "testdata", "snyk")
93+
outStream := bytes.NewBuffer(nil)
94+
errStream := bytes.NewBuffer(nil)
95+
96+
provider, err := NewSnykProvider(
97+
WithPath(snykPath),
98+
WithContext(context.Background()),
99+
WithStreams(outStream, errStream))
100+
assert.NilError(t, err)
101+
return provider, outStream
102+
}

internal/provider/testdata/snyk

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
#!/usr/bin/env bash
2+
3+
# Copyright The Compose Specification Authors.
4+
5+
# Licensed under the Apache License, Version 2.0 (the "License");
6+
# you may not use this file except in compliance with the License.
7+
# You may obtain a copy of the License at
8+
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS,
13+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
# See the License for the specific language governing permissions and
15+
# limitations under the License.
16+
17+
env

0 commit comments

Comments
 (0)