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  }