vaguerent/internal/pkg/epinject/epinject_test.go
2022-04-25 12:23:57 -05:00

102 lines
2.3 KiB
Go

package epinject
import (
"context"
"crypto/rand"
"encoding/json"
"os"
"os/exec"
"strings"
"testing"
"github.com/hashicorp/go-hclog"
"github.com/oklog/ulid"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestEPInject(t *testing.T) {
t.Run("can alter the entrypoint of a docker image", func(t *testing.T) {
_, err := exec.LookPath("docker")
if err != nil {
t.Skip("docker isn't available to test with")
}
// Use the nginx image for this
out, err := exec.Command("docker", "pull", "nginx").CombinedOutput()
require.NoError(t, err, string(out))
var inspectOut []struct {
Config struct {
Entrypoint []string `json:"entrypoint"`
} `json:"Config"`
}
out, err = exec.Command("docker", "inspect", "nginx").CombinedOutput()
require.NoError(t, err, string(out))
err = json.Unmarshal(out, &inspectOut)
require.NoError(t, err)
ctx := context.Background()
u, err := ulid.New(ulid.Now(), rand.Reader)
require.NoError(t, err)
origEp := inspectOut[0].Config.Entrypoint
testImage := strings.ToLower("epinject-test-" + u.String() + ":latest")
// Be sure we cleanup our test image
defer exec.Command("docker", "rmi", "-f", testImage).Run()
L := hclog.New(&hclog.LoggerOptions{Level: hclog.Trace})
ctx = hclog.WithContext(ctx, L)
injectF, err := os.Open("./testdata/cowsay")
require.NoError(t, err)
defer injectF.Close()
injectFI, err := injectF.Stat()
require.NoError(t, err)
_, err = AlterEntrypoint(ctx, "nginx:latest", func(cur []string) (*NewEntrypoint, error) {
assert.Equal(t, origEp, cur)
ep := &NewEntrypoint{
NewImage: testImage,
Entrypoint: append([]string{"/bin/cowsay"}, cur...),
InjectFiles: map[string]InjectFile{
"/bin/cowsay": {
Reader: injectF,
Info: injectFI,
},
},
}
return ep, nil
})
require.NoError(t, err)
out, err = exec.Command("docker", "inspect", testImage).Output()
require.NoError(t, err)
inspectOut = nil
err = json.Unmarshal(out, &inspectOut)
require.NoError(t, err)
assert.Equal(t, "/bin/cowsay", inspectOut[0].Config.Entrypoint[0])
assert.Equal(t, origEp, inspectOut[0].Config.Entrypoint[1:])
// Check for cowsay
out, err = exec.Command("docker", "run", "--rm", testImage, "/bin/cowsay").Output()
require.NoError(t, err)
assert.Equal(t, "moooooo\n", string(out))
})
}