blob: ca0f2b38200ab49b06d938f644fd2d0b939d77c0 [file] [log] [blame]
package fakestorage
import (
"context"
"io"
"os"
"os/exec"
"path/filepath"
"sync"
"testing"
"github.com/moby/go-archive"
"github.com/moby/moby/api/types/build"
"gotest.tools/v3/assert"
)
var ensureHTTPServerOnce sync.Once
func ensureHTTPServerImage(t testing.TB) {
t.Helper()
var doIt bool
ensureHTTPServerOnce.Do(func() {
doIt = true
})
if !doIt {
return
}
goos := testEnv.DaemonInfo.OSType
if goos == "" {
goos = "linux"
}
goarch := testEnv.DaemonVersion.Arch
if goarch == "" {
goarch = "amd64"
}
goCmd, err := exec.LookPath("go")
assert.NilError(t, err, "could not find go executable to build http server")
tmp := t.TempDir()
const httpServer = `package main
import (
"log"
"net/http"
)
func main() {
fs := http.FileServer(http.Dir("/static"))
http.Handle("/", fs)
log.Panic(http.ListenAndServe(":80", nil)) // #nosec G114 -- Ignoring for test-code: G114: Use of net/http serve function that has no support for setting timeouts (gosec)
}
`
src := filepath.Join(tmp, "main.go")
err = os.WriteFile(filepath.Join(tmp, "main.go"), []byte(httpServer), 0o0644)
assert.NilError(t, err)
cmd := exec.Command(goCmd, "build", "-o", filepath.Join(tmp, "httpserver"), src)
cmd.Env = append(os.Environ(), []string{
"CGO_ENABLED=0",
"GOOS=" + goos,
"GOARCH=" + goarch,
}...)
out, err := cmd.CombinedOutput()
assert.NilError(t, err, "could not build http server: %s", string(out))
const dockerfile = `FROM scratch
EXPOSE 80/tcp
COPY httpserver .
CMD ["./httpserver"]
`
err = os.WriteFile(filepath.Join(tmp, "Dockerfile"), []byte(dockerfile), 0o644)
assert.NilError(t, err, "could not write Dockerfile")
reader, err := archive.TarWithOptions(tmp, &archive.TarOptions{})
assert.NilError(t, err)
apiClient := testEnv.APIClient()
resp, err := apiClient.ImageBuild(context.Background(), reader, build.ImageBuildOptions{
Remove: true,
ForceRemove: true,
Tags: []string{"httpserver"},
})
assert.NilError(t, err)
_, err = io.Copy(io.Discard, resp.Body)
assert.NilError(t, err)
testEnv.ProtectImage(t, "httpserver:latest")
}