mirror of
https://github.com/containers/skopeo.git
synced 2025-10-24 13:21:27 +00:00
- consumeAndLogOutputs - assertSkopeoSucceeds - assertSkopeoFails - runCommandWithInput All of these allow running commands as one-liners with no call-site error handling, making tests much more readable. Also modifies TestNoNeedAuthToPrivateRegistryV2ImageNotFound to use check.Matches instead of manual strings.Contains conditions, which is shorter and more consistent with the assertSkopeo... calls.
105 lines
3.3 KiB
Go
105 lines
3.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
"os/exec"
|
|
"testing"
|
|
|
|
"github.com/go-check/check"
|
|
)
|
|
|
|
const (
|
|
privateRegistryURL0 = "127.0.0.1:5000"
|
|
privateRegistryURL1 = "127.0.0.1:5001"
|
|
privateRegistryURL2 = "127.0.0.1:5002"
|
|
privateRegistryURL3 = "127.0.0.1:5003"
|
|
privateRegistryURL4 = "127.0.0.1:5004"
|
|
)
|
|
|
|
func Test(t *testing.T) {
|
|
check.TestingT(t)
|
|
}
|
|
|
|
func init() {
|
|
check.Suite(&SkopeoSuite{})
|
|
}
|
|
|
|
type SkopeoSuite struct {
|
|
regV1 *testRegistryV1
|
|
regV2 *testRegistryV2
|
|
regV2Shema1 *testRegistryV2
|
|
regV1WithAuth *testRegistryV1 // does v1 support auth?
|
|
regV2WithAuth *testRegistryV2
|
|
}
|
|
|
|
func (s *SkopeoSuite) SetUpSuite(c *check.C) {
|
|
|
|
}
|
|
|
|
func (s *SkopeoSuite) TearDownSuite(c *check.C) {
|
|
|
|
}
|
|
|
|
func (s *SkopeoSuite) SetUpTest(c *check.C) {
|
|
_, err := exec.LookPath(skopeoBinary)
|
|
c.Assert(err, check.IsNil)
|
|
|
|
s.regV1 = setupRegistryV1At(c, privateRegistryURL0, false) // TODO:(runcom)
|
|
s.regV2 = setupRegistryV2At(c, privateRegistryURL1, false, false)
|
|
s.regV2Shema1 = setupRegistryV2At(c, privateRegistryURL2, false, true)
|
|
s.regV1WithAuth = setupRegistryV1At(c, privateRegistryURL3, true) // not used
|
|
s.regV2WithAuth = setupRegistryV2At(c, privateRegistryURL4, true, false)
|
|
}
|
|
|
|
func (s *SkopeoSuite) TearDownTest(c *check.C) {
|
|
// not checking V1 registries now...
|
|
if s.regV2 != nil {
|
|
s.regV2.Close()
|
|
}
|
|
if s.regV2Shema1 != nil {
|
|
s.regV2Shema1.Close()
|
|
}
|
|
if s.regV2WithAuth != nil {
|
|
//cmd := exec.Command("docker", "logout", s.regV2WithAuth)
|
|
//c.Assert(cmd.Run(), check.IsNil)
|
|
s.regV2WithAuth.Close()
|
|
}
|
|
}
|
|
|
|
// TODO like dockerCmd but much easier, just out,err
|
|
//func skopeoCmd()
|
|
|
|
func (s *SkopeoSuite) TestVersion(c *check.C) {
|
|
wanted := fmt.Sprintf(".*%s version .*", skopeoBinary)
|
|
assertSkopeoSucceeds(c, wanted, "--version")
|
|
}
|
|
|
|
const (
|
|
errFetchManifestRegexp = ".*error fetching manifest: status code: %s.*"
|
|
)
|
|
|
|
func (s *SkopeoSuite) TestCanAuthToPrivateRegistryV2WithoutDockerCfg(c *check.C) {
|
|
// TODO(runcom)
|
|
c.Skip("we need to restore --username --password flags!")
|
|
wanted := fmt.Sprintf(errFetchManifestRegexp, "401")
|
|
assertSkopeoFails(c, wanted, "--docker-cfg=''", "--username="+s.regV2WithAuth.username, "--password="+s.regV2WithAuth.password, "inspect", fmt.Sprintf("docker://%s/busybox:latest", s.regV2WithAuth.url))
|
|
}
|
|
|
|
func (s *SkopeoSuite) TestNeedAuthToPrivateRegistryV2WithoutDockerCfg(c *check.C) {
|
|
// TODO(runcom): mock the empty docker-cfg by removing it in the test itself (?)
|
|
c.Skip("mock empty docker config")
|
|
wanted := fmt.Sprintf(errFetchManifestRegexp, "401")
|
|
assertSkopeoFails(c, wanted, "--docker-cfg=''", "inspect", fmt.Sprintf("docker://%s/busybox:latest", s.regV2WithAuth.url))
|
|
}
|
|
|
|
// TODO(runcom): as soon as we can push to registries ensure you can inspect here
|
|
// not just get image not found :)
|
|
func (s *SkopeoSuite) TestNoNeedAuthToPrivateRegistryV2ImageNotFound(c *check.C) {
|
|
out, err := exec.Command(skopeoBinary, "inspect", fmt.Sprintf("docker://%s/busybox:latest", s.regV2.url)).CombinedOutput()
|
|
c.Assert(err, check.NotNil, check.Commentf(string(out)))
|
|
wanted := fmt.Sprintf(errFetchManifestRegexp, "404")
|
|
c.Assert(string(out), check.Matches, "(?s)"+wanted) // (?s) : '.' will also match newlines
|
|
wanted = fmt.Sprintf(errFetchManifestRegexp, "401")
|
|
c.Assert(string(out), check.Not(check.Matches), "(?s)"+wanted) // (?s) : '.' will also match newlines
|
|
}
|