github.com/antevens/oras@v0.8.1/pkg/auth/docker/client_test.go (about) 1 package docker 2 3 import ( 4 "context" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "testing" 10 "time" 11 12 "github.com/docker/distribution/configuration" 13 "github.com/docker/distribution/registry" 14 _ "github.com/docker/distribution/registry/auth/htpasswd" 15 _ "github.com/docker/distribution/registry/storage/driver/inmemory" 16 "github.com/phayes/freeport" 17 "github.com/stretchr/testify/suite" 18 "golang.org/x/crypto/bcrypt" 19 ) 20 21 var ( 22 testConfig = "test.config" 23 testHtpasswd = "test.htpasswd" 24 testUsername = "alice" 25 testPassword = "wonderland" 26 ) 27 28 type DockerClientTestSuite struct { 29 suite.Suite 30 DockerRegistryHost string 31 Client *Client 32 TempTestDir string 33 } 34 35 func newContext() context.Context { 36 return context.Background() 37 } 38 39 func (suite *DockerClientTestSuite) SetupSuite() { 40 tempDir, err := ioutil.TempDir("", "oras_auth_docker_test") 41 suite.Nil(err, "no error creating temp directory for test") 42 suite.TempTestDir = tempDir 43 44 // Create client 45 client, err := NewClient(filepath.Join(suite.TempTestDir, testConfig)) 46 suite.Nil(err, "no error creating client") 47 var ok bool 48 suite.Client, ok = client.(*Client) 49 suite.True(ok, "NewClient returns a *docker.Client inside") 50 51 // Create htpasswd file with bcrypt 52 secret, err := bcrypt.GenerateFromPassword([]byte(testPassword), bcrypt.DefaultCost) 53 suite.Nil(err, "no error generating bcrypt password for test htpasswd file") 54 authRecord := fmt.Sprintf("%s:%s\n", testUsername, string(secret)) 55 htpasswdPath := filepath.Join(suite.TempTestDir, testHtpasswd) 56 err = ioutil.WriteFile(htpasswdPath, []byte(authRecord), 0644) 57 suite.Nil(err, "no error creating test htpasswd file") 58 59 // Registry config 60 config := &configuration.Configuration{} 61 port, err := freeport.GetFreePort() 62 suite.Nil(err, "no error finding free port for test registry") 63 suite.DockerRegistryHost = fmt.Sprintf("localhost:%d", port) 64 config.HTTP.Addr = fmt.Sprintf(":%d", port) 65 config.HTTP.DrainTimeout = time.Duration(10) * time.Second 66 config.Storage = map[string]configuration.Parameters{"inmemory": map[string]interface{}{}} 67 config.Auth = configuration.Auth{ 68 "htpasswd": configuration.Parameters{ 69 "realm": "localhost", 70 "path": htpasswdPath, 71 }, 72 } 73 dockerRegistry, err := registry.NewRegistry(context.Background(), config) 74 suite.Nil(err, "no error finding free port for test registry") 75 76 // Start Docker registry 77 go dockerRegistry.ListenAndServe() 78 } 79 80 func (suite *DockerClientTestSuite) TearDownSuite() { 81 os.RemoveAll(suite.TempTestDir) 82 } 83 84 func (suite *DockerClientTestSuite) Test_0_Login() { 85 var err error 86 87 err = suite.Client.Login(newContext(), suite.DockerRegistryHost, "oscar", "opponent", "RenegotiateNever", false) 88 suite.NotNil(err, "error logging into registry with invalid credentials") 89 90 err = suite.Client.Login(newContext(), suite.DockerRegistryHost, testUsername, testPassword, "RenegotiateNever" false) 91 suite.Nil(err, "no error logging into registry with valid credentials") 92 } 93 func (suite *DockerClientTestSuite) Test_2_Logout() { 94 var err error 95 96 err = suite.Client.Logout(newContext(), "non-existing-host:42") 97 suite.NotNil(err, "error logging out of registry that has no entry") 98 99 err = suite.Client.Logout(newContext(), suite.DockerRegistryHost) 100 suite.Nil(err, "no error logging out of registry") 101 } 102 103 func TestDockerClientTestSuite(t *testing.T) { 104 suite.Run(t, new(DockerClientTestSuite)) 105 }