Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 4719d24

Browse files
authored
chore(testutil): extract testutil.CreateZip and testutil.CreateTar helpers (#15540)
Extracts `testutil.CreateTar` and `testutil.CreateZip` test helpers.
1 parent f9d6698 commit 4719d24

File tree

6 files changed

+89
-116
lines changed

6 files changed

+89
-116
lines changed

provisioner/terraform/parse_test.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import (
99
"github.com/stretchr/testify/require"
1010

1111
"github.com/coder/coder/v2/provisionersdk/proto"
12+
"github.com/coder/coder/v2/testutil"
1213
)
1314

1415
func TestParse(t *testing.T) {
@@ -380,7 +381,7 @@ func TestParse(t *testing.T) {
380381
t.Parallel()
381382

382383
session := configure(ctx, t, api, &proto.Config{
383-
TemplateSourceArchive: makeTar(t, testCase.Files),
384+
TemplateSourceArchive: testutil.CreateTar(t, testCase.Files),
384385
})
385386

386387
err := session.Send(&proto.Request{Type: &proto.Request_Parse{Parse: &proto.ParseRequest{}}})

provisioner/terraform/provision_test.go

+8-42
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
package terraform_test
44

55
import (
6-
"archive/tar"
7-
"bytes"
86
"context"
97
"encoding/json"
108
"errors"
@@ -28,6 +26,7 @@ import (
2826
"github.com/coder/coder/v2/provisioner/terraform"
2927
"github.com/coder/coder/v2/provisionersdk"
3028
"github.com/coder/coder/v2/provisionersdk/proto"
29+
"github.com/coder/coder/v2/testutil"
3130
)
3231

3332
type provisionerServeOptions struct {
@@ -78,39 +77,6 @@ func setupProvisioner(t *testing.T, opts *provisionerServeOptions) (context.Cont
7877
return ctx, api
7978
}
8079

81-
func makeTar(t *testing.T, files map[string]string) []byte {
82-
t.Helper()
83-
var buffer bytes.Buffer
84-
writer := tar.NewWriter(&buffer)
85-
86-
addedDirs := make(map[string]bool)
87-
for name, content := range files {
88-
// Add parent directories if they don't exist
89-
dir := filepath.Dir(name)
90-
if dir != "." && !addedDirs[dir] {
91-
err := writer.WriteHeader(&tar.Header{
92-
Name: dir + "/", // Directory names must end with /
93-
Mode: 0o755,
94-
Typeflag: tar.TypeDir,
95-
})
96-
require.NoError(t, err)
97-
addedDirs[dir] = true
98-
}
99-
100-
err := writer.WriteHeader(&tar.Header{
101-
Name: name,
102-
Size: int64(len(content)),
103-
Mode: 0o644,
104-
})
105-
require.NoError(t, err)
106-
_, err = writer.Write([]byte(content))
107-
require.NoError(t, err)
108-
}
109-
err := writer.Flush()
110-
require.NoError(t, err)
111-
return buffer.Bytes()
112-
}
113-
11480
func configure(ctx context.Context, t *testing.T, client proto.DRPCProvisionerClient, config *proto.Config) proto.DRPCProvisioner_SessionClient {
11581
t.Helper()
11682
sess, err := client.Session(ctx)
@@ -200,7 +166,7 @@ func TestProvision_Cancel(t *testing.T) {
200166
binaryPath: binPath,
201167
})
202168
sess := configure(ctx, t, api, &proto.Config{
203-
TemplateSourceArchive: makeTar(t, nil),
169+
TemplateSourceArchive: testutil.CreateTar(t, nil),
204170
})
205171

206172
err = sendPlan(sess, proto.WorkspaceTransition_START)
@@ -271,7 +237,7 @@ func TestProvision_CancelTimeout(t *testing.T) {
271237
})
272238

273239
sess := configure(ctx, t, api, &proto.Config{
274-
TemplateSourceArchive: makeTar(t, nil),
240+
TemplateSourceArchive: testutil.CreateTar(t, nil),
275241
})
276242

277243
// provisioner requires plan before apply, so test cancel with plan.
@@ -360,7 +326,7 @@ func TestProvision_TextFileBusy(t *testing.T) {
360326
})
361327

362328
sess := configure(ctx, t, api, &proto.Config{
363-
TemplateSourceArchive: makeTar(t, nil),
329+
TemplateSourceArchive: testutil.CreateTar(t, nil),
364330
})
365331

366332
err = sendPlan(sess, proto.WorkspaceTransition_START)
@@ -811,7 +777,7 @@ func TestProvision(t *testing.T) {
811777

812778
ctx, api := setupProvisioner(t, nil)
813779
sess := configure(ctx, t, api, &proto.Config{
814-
TemplateSourceArchive: makeTar(t, testCase.Files),
780+
TemplateSourceArchive: testutil.CreateTar(t, testCase.Files),
815781
})
816782

817783
planRequest := &proto.Request{Type: &proto.Request_Plan{Plan: &proto.PlanRequest{
@@ -925,7 +891,7 @@ func TestProvision_ExtraEnv(t *testing.T) {
925891

926892
ctx, api := setupProvisioner(t, nil)
927893
sess := configure(ctx, t, api, &proto.Config{
928-
TemplateSourceArchive: makeTar(t, map[string]string{"main.tf": `resource "null_resource" "A" {}`}),
894+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{"main.tf": `resource "null_resource" "A" {}`}),
929895
})
930896

931897
err := sendPlan(sess, proto.WorkspaceTransition_START)
@@ -975,7 +941,7 @@ func TestProvision_SafeEnv(t *testing.T) {
975941

976942
ctx, api := setupProvisioner(t, nil)
977943
sess := configure(ctx, t, api, &proto.Config{
978-
TemplateSourceArchive: makeTar(t, map[string]string{"main.tf": echoResource}),
944+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{"main.tf": echoResource}),
979945
})
980946

981947
err := sendPlan(sess, proto.WorkspaceTransition_START)
@@ -997,7 +963,7 @@ func TestProvision_MalformedModules(t *testing.T) {
997963

998964
ctx, api := setupProvisioner(t, nil)
999965
sess := configure(ctx, t, api, &proto.Config{
1000-
TemplateSourceArchive: makeTar(t, map[string]string{
966+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
1001967
"main.tf": `module "hello" { source = "./module" }`,
1002968
"module/module.tf": `resource "null_`,
1003969
}),

provisioner/terraform/tfparse/tfparse_test.go

+4-37
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package tfparse_test
22

33
import (
4-
"archive/tar"
5-
"bytes"
64
"context"
75
"io"
86
"log"
@@ -11,7 +9,6 @@ import (
119
"cdr.dev/slog"
1210
"cdr.dev/slog/sloggers/sloghuman"
1311
"cdr.dev/slog/sloggers/slogtest"
14-
"github.com/coder/coder/v2/archive"
1512
"github.com/coder/coder/v2/provisioner/terraform/tfparse"
1613
"github.com/coder/coder/v2/testutil"
1714

@@ -363,7 +360,7 @@ func Test_WorkspaceTagDefaultsFromFile(t *testing.T) {
363360
t.Run(tc.name+"/tar", func(t *testing.T) {
364361
t.Parallel()
365362
ctx := testutil.Context(t, testutil.WaitShort)
366-
tar := createTar(t, tc.files)
363+
tar := testutil.CreateTar(t, tc.files)
367364
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
368365
tmpDir := t.TempDir()
369366
tfparse.WriteArchive(tar, "application/x-tar", tmpDir)
@@ -381,7 +378,7 @@ func Test_WorkspaceTagDefaultsFromFile(t *testing.T) {
381378
t.Run(tc.name+"/zip", func(t *testing.T) {
382379
t.Parallel()
383380
ctx := testutil.Context(t, testutil.WaitShort)
384-
zip := createZip(t, tc.files)
381+
zip := testutil.CreateZip(t, tc.files)
385382
logger := slogtest.Make(t, nil).Leveled(slog.LevelDebug)
386383
tmpDir := t.TempDir()
387384
tfparse.WriteArchive(zip, "application/zip", tmpDir)
@@ -399,36 +396,6 @@ func Test_WorkspaceTagDefaultsFromFile(t *testing.T) {
399396
}
400397
}
401398

402-
func createTar(t testing.TB, files map[string]string) []byte {
403-
var buffer bytes.Buffer
404-
writer := tar.NewWriter(&buffer)
405-
for path, content := range files {
406-
err := writer.WriteHeader(&tar.Header{
407-
Name: path,
408-
Size: int64(len(content)),
409-
Uid: 65534, // nobody
410-
Gid: 65534, // nogroup
411-
Mode: 0o666, // -rw-rw-rw-
412-
})
413-
require.NoError(t, err)
414-
415-
_, err = writer.Write([]byte(content))
416-
require.NoError(t, err)
417-
}
418-
419-
err := writer.Flush()
420-
require.NoError(t, err)
421-
return buffer.Bytes()
422-
}
423-
424-
func createZip(t testing.TB, files map[string]string) []byte {
425-
ta := createTar(t, files)
426-
tr := tar.NewReader(bytes.NewReader(ta))
427-
za, err := archive.CreateZipFromTar(tr, int64(len(ta)))
428-
require.NoError(t, err)
429-
return za
430-
}
431-
432399
// Last run results:
433400
// goos: linux
434401
// goarch: amd64
@@ -460,8 +427,8 @@ func BenchmarkWorkspaceTagDefaultsFromFile(b *testing.B) {
460427
}
461428
}`,
462429
}
463-
tarFile := createTar(b, files)
464-
zipFile := createZip(b, files)
430+
tarFile := testutil.CreateTar(b, files)
431+
zipFile := testutil.CreateZip(b, files)
465432
logger := discardLogger(b)
466433
b.ResetTimer()
467434
b.Run("Tar", func(b *testing.B) {

provisioner/terraform/timings_test.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ func TestTimingsFromProvision(t *testing.T) {
3434
binaryPath: fakeBin,
3535
})
3636
sess := configure(ctx, t, api, &proto.Config{
37-
TemplateSourceArchive: makeTar(t, nil),
37+
TemplateSourceArchive: testutil.CreateTar(t, nil),
3838
})
3939

4040
ctx, cancel := context.WithTimeout(ctx, testutil.WaitLong)

provisionerd/provisionerd_test.go

+13-35
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package provisionerd_test
22

33
import (
4-
"archive/tar"
5-
"bytes"
64
"context"
75
"fmt"
86
"io"
@@ -97,7 +95,7 @@ func TestProvisionerd(t *testing.T) {
9795
err := stream.Send(&proto.AcquiredJob{
9896
JobId: "test",
9997
Provisioner: "someprovisioner",
100-
TemplateSourceArchive: createTar(t, map[string]string{
98+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
10199
"test.txt": "content",
102100
}),
103101
Type: &proto.AcquiredJob_TemplateImport_{
@@ -150,7 +148,7 @@ func TestProvisionerd(t *testing.T) {
150148
acq = newAcquireOne(t, &proto.AcquiredJob{
151149
JobId: "test",
152150
Provisioner: "someprovisioner",
153-
TemplateSourceArchive: createTar(t, map[string]string{
151+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
154152
"../../../etc/passwd": "content",
155153
}),
156154
Type: &proto.AcquiredJob_TemplateImport_{
@@ -194,7 +192,7 @@ func TestProvisionerd(t *testing.T) {
194192
err := stream.Send(&proto.AcquiredJob{
195193
JobId: "test",
196194
Provisioner: "someprovisioner",
197-
TemplateSourceArchive: createTar(t, map[string]string{
195+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
198196
"test.txt": "content",
199197
}),
200198
Type: &proto.AcquiredJob_TemplateImport_{
@@ -243,7 +241,7 @@ func TestProvisionerd(t *testing.T) {
243241
acq = newAcquireOne(t, &proto.AcquiredJob{
244242
JobId: "test",
245243
Provisioner: "someprovisioner",
246-
TemplateSourceArchive: createTar(t, map[string]string{
244+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
247245
"test.txt": "content",
248246
provisionersdk.ReadmeFile: "# A cool template 😎\n",
249247
}),
@@ -325,7 +323,7 @@ func TestProvisionerd(t *testing.T) {
325323
acq = newAcquireOne(t, &proto.AcquiredJob{
326324
JobId: "test",
327325
Provisioner: "someprovisioner",
328-
TemplateSourceArchive: createTar(t, map[string]string{
326+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
329327
"test.txt": "content",
330328
}),
331329
Type: &proto.AcquiredJob_TemplateDryRun_{
@@ -396,7 +394,7 @@ func TestProvisionerd(t *testing.T) {
396394
acq = newAcquireOne(t, &proto.AcquiredJob{
397395
JobId: "test",
398396
Provisioner: "someprovisioner",
399-
TemplateSourceArchive: createTar(t, map[string]string{
397+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
400398
"test.txt": "content",
401399
}),
402400
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -459,7 +457,7 @@ func TestProvisionerd(t *testing.T) {
459457
acq = newAcquireOne(t, &proto.AcquiredJob{
460458
JobId: "test",
461459
Provisioner: "someprovisioner",
462-
TemplateSourceArchive: createTar(t, map[string]string{
460+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
463461
"test.txt": "content",
464462
}),
465463
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -549,7 +547,7 @@ func TestProvisionerd(t *testing.T) {
549547
acq = newAcquireOne(t, &proto.AcquiredJob{
550548
JobId: "test",
551549
Provisioner: "someprovisioner",
552-
TemplateSourceArchive: createTar(t, map[string]string{
550+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
553551
"test.txt": "content",
554552
}),
555553
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -645,7 +643,7 @@ func TestProvisionerd(t *testing.T) {
645643
err := stream.Send(&proto.AcquiredJob{
646644
JobId: "test",
647645
Provisioner: "someprovisioner",
648-
TemplateSourceArchive: createTar(t, map[string]string{
646+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
649647
"test.txt": "content",
650648
}),
651649
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -725,7 +723,7 @@ func TestProvisionerd(t *testing.T) {
725723
err := stream.Send(&proto.AcquiredJob{
726724
JobId: "test",
727725
Provisioner: "someprovisioner",
728-
TemplateSourceArchive: createTar(t, map[string]string{
726+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
729727
"test.txt": "content",
730728
}),
731729
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -819,7 +817,7 @@ func TestProvisionerd(t *testing.T) {
819817
job := &proto.AcquiredJob{
820818
JobId: "test",
821819
Provisioner: "someprovisioner",
822-
TemplateSourceArchive: createTar(t, map[string]string{
820+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
823821
"test.txt": "content",
824822
}),
825823
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -916,7 +914,7 @@ func TestProvisionerd(t *testing.T) {
916914
job := &proto.AcquiredJob{
917915
JobId: "test",
918916
Provisioner: "someprovisioner",
919-
TemplateSourceArchive: createTar(t, map[string]string{
917+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
920918
"test.txt": "content",
921919
}),
922920
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -1010,7 +1008,7 @@ func TestProvisionerd(t *testing.T) {
10101008
err := stream.Send(&proto.AcquiredJob{
10111009
JobId: "test",
10121010
Provisioner: "someprovisioner",
1013-
TemplateSourceArchive: createTar(t, map[string]string{
1011+
TemplateSourceArchive: testutil.CreateTar(t, map[string]string{
10141012
"test.txt": "content",
10151013
}),
10161014
Type: &proto.AcquiredJob_WorkspaceBuild_{
@@ -1078,26 +1076,6 @@ func TestProvisionerd(t *testing.T) {
10781076
})
10791077
}
10801078

1081-
// Creates an in-memory tar of the files provided.
1082-
func createTar(t *testing.T, files map[string]string) []byte {
1083-
var buffer bytes.Buffer
1084-
writer := tar.NewWriter(&buffer)
1085-
for path, content := range files {
1086-
err := writer.WriteHeader(&tar.Header{
1087-
Name: path,
1088-
Size: int64(len(content)),
1089-
})
1090-
require.NoError(t, err)
1091-
1092-
_, err = writer.Write([]byte(content))
1093-
require.NoError(t, err)
1094-
}
1095-
1096-
err := writer.Flush()
1097-
require.NoError(t, err)
1098-
return buffer.Bytes()
1099-
}
1100-
11011079
// Creates a provisionerd implementation with the provided dialer and provisioners.
11021080
func createProvisionerd(t *testing.T, dialer provisionerd.Dialer, connector provisionerd.LocalProvisioners) *provisionerd.Server {
11031081
server := provisionerd.New(dialer, &provisionerd.Options{

0 commit comments

Comments
 (0)