forked from coder/envbuilder
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdevcontainer_test.go
127 lines (114 loc) · 3.38 KB
/
devcontainer_test.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package devcontainer_test
import (
"fmt"
"io"
"net/url"
"os"
"path/filepath"
"strings"
"testing"
"github.com/coder/envbuilder"
"github.com/coder/envbuilder/devcontainer"
"github.com/coder/envbuilder/registrytest"
"github.com/go-git/go-billy/v5/memfs"
"github.com/google/go-containerregistry/pkg/name"
v1 "github.com/google/go-containerregistry/pkg/v1"
"github.com/google/go-containerregistry/pkg/v1/partial"
"github.com/google/go-containerregistry/pkg/v1/remote"
"github.com/google/go-containerregistry/pkg/v1/types"
"github.com/stretchr/testify/require"
)
func TestParse(t *testing.T) {
t.Parallel()
raw := `{
"build": {
"dockerfile": "Dockerfile",
"context": "."
},
// Comments here!
"image": "codercom/code-server:latest"
}`
parsed, err := devcontainer.Parse([]byte(raw))
require.NoError(t, err)
require.Equal(t, "Dockerfile", parsed.Build.Dockerfile)
}
func TestCompileDevContainer(t *testing.T) {
t.Parallel()
t.Run("WithImage", func(t *testing.T) {
t.Parallel()
fs := memfs.New()
dc := &devcontainer.Spec{
Image: "codercom/code-server:latest",
}
params, err := dc.Compile(fs, "", envbuilder.MagicDir, "")
require.NoError(t, err)
require.Equal(t, filepath.Join(envbuilder.MagicDir, "Dockerfile"), params.DockerfilePath)
require.Equal(t, envbuilder.MagicDir, params.BuildContext)
})
t.Run("WithBuild", func(t *testing.T) {
t.Parallel()
fs := memfs.New()
dc := &devcontainer.Spec{
Build: devcontainer.BuildSpec{
Dockerfile: "Dockerfile",
Context: ".",
Args: map[string]string{
"ARG1": "value1",
},
},
}
dcDir := "/workspaces/coder/.devcontainer"
err := fs.MkdirAll(dcDir, 0755)
require.NoError(t, err)
file, err := fs.OpenFile(filepath.Join(dcDir, "Dockerfile"), os.O_CREATE|os.O_WRONLY, 0644)
require.NoError(t, err)
_, err = io.WriteString(file, "FROM ubuntu")
require.NoError(t, err)
_ = file.Close()
params, err := dc.Compile(fs, dcDir, envbuilder.MagicDir, "")
require.NoError(t, err)
require.Equal(t, "ARG1=value1", params.BuildArgs[0])
require.Equal(t, filepath.Join(dcDir, "Dockerfile"), params.DockerfilePath)
require.Equal(t, dcDir, params.BuildContext)
})
}
func TestUserFromDockerfile(t *testing.T) {
t.Parallel()
user := devcontainer.UserFromDockerfile("FROM ubuntu\nUSER kyle")
require.Equal(t, "kyle", user)
}
func TestUserFromImage(t *testing.T) {
t.Parallel()
registry := registrytest.New(t)
image, err := partial.UncompressedToImage(emptyImage{configFile: &v1.ConfigFile{
Config: v1.Config{
User: "example",
},
}})
require.NoError(t, err)
parsed, err := url.Parse(registry)
require.NoError(t, err)
parsed.Path = "coder/test:latest"
ref, err := name.ParseReference(strings.TrimPrefix(parsed.String(), "http://"))
require.NoError(t, err)
err = remote.Write(ref, image)
require.NoError(t, err)
user, err := devcontainer.UserFromImage(ref)
require.NoError(t, err)
require.Equal(t, "example", user)
}
type emptyImage struct {
configFile *v1.ConfigFile
}
func (i emptyImage) MediaType() (types.MediaType, error) {
return types.DockerManifestSchema2, nil
}
func (i emptyImage) RawConfigFile() ([]byte, error) {
return partial.RawConfigFile(i)
}
func (i emptyImage) ConfigFile() (*v1.ConfigFile, error) {
return i.configFile, nil
}
func (i emptyImage) LayerByDiffID(h v1.Hash) (partial.UncompressedLayer, error) {
return nil, fmt.Errorf("LayerByDiffID(%s): empty image", h)
}