|
| 1 | +//go:build unix |
| 2 | + |
1 | 3 | package resolvers_test
|
2 | 4 |
|
3 | 5 | import (
|
4 | 6 | "context"
|
| 7 | + "crypto/tls" |
5 | 8 | "io/fs"
|
| 9 | + "net/http" |
| 10 | + "net/http/httptest" |
| 11 | + "path" |
| 12 | + "strings" |
6 | 13 | "testing"
|
7 | 14 |
|
8 | 15 | "github.com/stretchr/testify/assert"
|
9 | 16 | "github.com/stretchr/testify/require"
|
10 | 17 |
|
| 18 | + "github.com/aquasecurity/trivy/internal/gittest" |
11 | 19 | "github.com/aquasecurity/trivy/pkg/iac/scanners/terraform/parser/resolvers"
|
| 20 | + "github.com/aquasecurity/trivy/pkg/log" |
12 | 21 | )
|
13 | 22 |
|
14 | 23 | type moduleResolver interface {
|
15 | 24 | Resolve(context.Context, fs.FS, resolvers.Options) (fs.FS, string, string, bool, error)
|
16 | 25 | }
|
17 | 26 |
|
18 |
| -func TestResolveModuleFromCache(t *testing.T) { |
19 |
| - if testing.Short() { |
20 |
| - t.Skip("skipping integration test in short mode") |
| 27 | +func testOptions(t *testing.T, source string) resolvers.Options { |
| 28 | + return resolvers.Options{ |
| 29 | + Source: source, |
| 30 | + OriginalSource: source, |
| 31 | + Version: "", |
| 32 | + OriginalVersion: "", |
| 33 | + AllowDownloads: true, |
| 34 | + CacheDir: t.TempDir(), |
| 35 | + Logger: log.WithPrefix("test"), |
21 | 36 | }
|
| 37 | +} |
| 38 | + |
| 39 | +func newRegistry(repoURL string) *httptest.Server { |
| 40 | + mux := http.NewServeMux() |
| 41 | + mux.HandleFunc("/v1/modules/terraform-aws-modules/s3-bucket/aws/download", func(w http.ResponseWriter, r *http.Request) { |
| 42 | + w.Header().Set("X-Terraform-Get", repoURL) |
| 43 | + w.WriteHeader(http.StatusNoContent) |
| 44 | + }) |
| 45 | + |
| 46 | + return httptest.NewTLSServer(mux) |
| 47 | +} |
| 48 | + |
| 49 | +func buildGitSource(repoURL string) string { return "git::" + repoURL } |
| 50 | + |
| 51 | +func TestResolveModuleFromCache(t *testing.T) { |
| 52 | + |
| 53 | + repo := "terraform-aws-s3-bucket" |
| 54 | + gs := gittest.NewServer(t, repo, "testdata/terraform-aws-s3-bucket") |
| 55 | + defer gs.Close() |
| 56 | + |
| 57 | + repoURL := gs.URL + "/" + repo + ".git" |
| 58 | + |
| 59 | + registry := newRegistry(buildGitSource(repoURL)) |
| 60 | + defer registry.Close() |
| 61 | + |
| 62 | + registryAddress := strings.TrimPrefix(registry.URL, "https://") |
22 | 63 |
|
23 | 64 | tests := []struct {
|
24 | 65 | name string
|
25 | 66 | opts resolvers.Options
|
26 | 67 | firstResolver moduleResolver
|
27 | 68 | expectedSubdir string
|
| 69 | + expectedString string |
28 | 70 | }{
|
29 | 71 | {
|
30 | 72 | name: "registry",
|
31 | 73 | opts: resolvers.Options{
|
32 |
| - Name: "bucket", |
33 |
| - Source: "terraform-aws-modules/s3-bucket/aws", |
34 |
| - Version: "4.1.2", |
| 74 | + Source: registryAddress + "/terraform-aws-modules/s3-bucket/aws", |
| 75 | + Client: &http.Client{ |
| 76 | + Transport: &http.Transport{ |
| 77 | + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, |
| 78 | + }, |
| 79 | + }, |
35 | 80 | },
|
36 | 81 | firstResolver: resolvers.Registry,
|
37 | 82 | expectedSubdir: ".",
|
| 83 | + expectedString: "# AWS S3 bucket Terraform module", |
38 | 84 | },
|
39 | 85 | {
|
40 | 86 | name: "registry with subdir",
|
41 | 87 | opts: resolvers.Options{
|
42 |
| - Name: "object", |
43 |
| - Source: "terraform-aws-modules/s3-bucket/aws//modules/object", |
44 |
| - Version: "4.1.2", |
| 88 | + Source: registryAddress + "/terraform-aws-modules/s3-bucket/aws//modules/object", |
| 89 | + Client: &http.Client{ |
| 90 | + Transport: &http.Transport{ |
| 91 | + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, |
| 92 | + }, |
| 93 | + }, |
45 | 94 | },
|
46 | 95 | firstResolver: resolvers.Registry,
|
47 | 96 | expectedSubdir: "modules/object",
|
| 97 | + expectedString: "# S3 bucket object", |
48 | 98 | },
|
49 | 99 | {
|
50 | 100 | name: "remote",
|
51 | 101 | opts: resolvers.Options{
|
52 |
| - Name: "bucket", |
53 |
| - Source: "git::https://github.com/terraform-aws-modules/terraform-aws-s3-bucket.git?ref=v4.1.2", |
| 102 | + Source: buildGitSource(repoURL), |
54 | 103 | },
|
55 | 104 | firstResolver: resolvers.Remote,
|
56 | 105 | expectedSubdir: ".",
|
| 106 | + expectedString: "# AWS S3 bucket Terraform module", |
57 | 107 | },
|
58 | 108 | {
|
59 | 109 | name: "remote with subdir",
|
60 | 110 | opts: resolvers.Options{
|
61 |
| - Name: "object", |
62 |
| - Source: "git::https://github.com/terraform-aws-modules/terraform-aws-s3-bucket.git//modules/object?ref=v4.1.2", |
| 111 | + Source: buildGitSource(repoURL) + "//modules/object", |
63 | 112 | },
|
64 | 113 | firstResolver: resolvers.Remote,
|
65 | 114 | expectedSubdir: "modules/object",
|
| 115 | + expectedString: "# S3 bucket object", |
66 | 116 | },
|
67 | 117 | }
|
68 | 118 |
|
69 | 119 | for _, tt := range tests {
|
70 | 120 | t.Run(tt.name, func(t *testing.T) {
|
71 | 121 |
|
72 |
| - tt.opts.AllowDownloads = true |
73 | 122 | tt.opts.OriginalSource = tt.opts.Source
|
74 |
| - tt.opts.OriginalVersion = tt.opts.Version |
| 123 | + tt.opts.AllowDownloads = true |
75 | 124 | tt.opts.CacheDir = t.TempDir()
|
| 125 | + tt.opts.Logger = log.WithPrefix("test") |
| 126 | + |
| 127 | + fsys, _, dir, _, err := tt.firstResolver.Resolve(context.Background(), nil, tt.opts) |
| 128 | + require.NoError(t, err) |
| 129 | + assert.Equal(t, tt.expectedSubdir, dir) |
76 | 130 |
|
77 |
| - fsys, _, _, applies, err := tt.firstResolver.Resolve(context.Background(), nil, tt.opts) |
| 131 | + b, err := fs.ReadFile(fsys, path.Join(dir, "README.md")) |
78 | 132 | require.NoError(t, err)
|
79 |
| - assert.True(t, applies) |
| 133 | + assert.Equal(t, tt.expectedString, string(b)) |
80 | 134 |
|
81 |
| - _, err = fs.Stat(fsys, "main.tf") |
| 135 | + _, _, dir, _, err = resolvers.Cache.Resolve(context.Background(), fsys, tt.opts) |
82 | 136 | require.NoError(t, err)
|
| 137 | + assert.Equal(t, tt.expectedSubdir, dir) |
83 | 138 |
|
84 |
| - _, _, _, applies, err = resolvers.Cache.Resolve(context.Background(), fsys, tt.opts) |
| 139 | + b, err = fs.ReadFile(fsys, path.Join(dir, "README.md")) |
85 | 140 | require.NoError(t, err)
|
86 |
| - assert.True(t, applies) |
| 141 | + assert.Equal(t, tt.expectedString, string(b)) |
87 | 142 | })
|
88 | 143 | }
|
89 | 144 | }
|
90 | 145 |
|
91 | 146 | func TestResolveModuleFromCacheWithDifferentSubdir(t *testing.T) {
|
92 |
| - if testing.Short() { |
93 |
| - t.Skip("skipping integration test in short mode") |
94 |
| - } |
| 147 | + repo := "terraform-aws-s3-bucket" |
| 148 | + gs := gittest.NewServer(t, repo, "testdata/terraform-aws-s3-bucket") |
| 149 | + defer gs.Close() |
95 | 150 |
|
96 |
| - cacheDir := t.TempDir() |
| 151 | + repoURL := gs.URL + "/" + repo + ".git" |
97 | 152 |
|
98 |
| - fsys, _, _, applies, err := resolvers.Remote.Resolve(context.Background(), nil, resolvers.Options{ |
99 |
| - Name: "object", |
100 |
| - Source: "git::https://github.com/terraform-aws-modules/terraform-aws-s3-bucket.git//modules/object?ref=v4.1.2", |
101 |
| - OriginalSource: "git::https://github.com/terraform-aws-modules/terraform-aws-s3-bucket.git//modules/object?ref=v4.1.2", |
102 |
| - AllowDownloads: true, |
103 |
| - CacheDir: cacheDir, |
104 |
| - }) |
| 153 | + fsys, _, dir, _, err := resolvers.Remote.Resolve( |
| 154 | + context.Background(), nil, |
| 155 | + testOptions(t, "git::"+repoURL+"//modules/object"), |
| 156 | + ) |
105 | 157 | require.NoError(t, err)
|
106 |
| - assert.True(t, applies) |
107 | 158 |
|
108 |
| - _, err = fs.Stat(fsys, "main.tf") |
| 159 | + b, err := fs.ReadFile(fsys, path.Join(dir, "README.md")) |
109 | 160 | require.NoError(t, err)
|
| 161 | + assert.Equal(t, "# S3 bucket object", string(b)) |
110 | 162 |
|
111 |
| - _, _, _, applies, err = resolvers.Cache.Resolve(context.Background(), nil, resolvers.Options{ |
112 |
| - Name: "notification", |
113 |
| - Source: "git::https://github.com/terraform-aws-modules/terraform-aws-s3-bucket.git//modules/notification?ref=v4.1.2", |
114 |
| - OriginalSource: "git::https://github.com/terraform-aws-modules/terraform-aws-s3-bucket.git//modules/notification?ref=v4.1.2", |
115 |
| - CacheDir: cacheDir, |
116 |
| - }) |
| 163 | + fsys, _, dir, _, err = resolvers.Remote.Resolve( |
| 164 | + context.Background(), nil, |
| 165 | + testOptions(t, "git::"+repoURL+"//modules/notification"), |
| 166 | + ) |
| 167 | + require.NoError(t, err) |
| 168 | + |
| 169 | + b, err = fs.ReadFile(fsys, path.Join(dir, "README.md")) |
117 | 170 | require.NoError(t, err)
|
118 |
| - assert.True(t, applies) |
| 171 | + assert.Equal(t, "# S3 bucket notification", string(b)) |
119 | 172 | }
|
0 commit comments