mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			170 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			170 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"io/ioutil"
 | |
| 	"os"
 | |
| 	"path/filepath"
 | |
| 	"strings"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/docker/notary/passphrase"
 | |
| 	"github.com/stretchr/testify/assert"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| // the default location for the config file is in ~/.notary/config.json - even if it doesn't exist.
 | |
| func TestNotaryConfigFileDefault(t *testing.T) {
 | |
| 	commander := ¬aryCommander{
 | |
| 		getRetriever: func() passphrase.Retriever { return passphrase.ConstantRetriever("pass") },
 | |
| 	}
 | |
| 
 | |
| 	config, err := commander.parseConfig()
 | |
| 	assert.NoError(t, err)
 | |
| 	configFileUsed := config.ConfigFileUsed()
 | |
| 	assert.True(t, strings.HasSuffix(configFileUsed,
 | |
| 		filepath.Join(".notary", "config.json")), "Unknown config file: %s", configFileUsed)
 | |
| }
 | |
| 
 | |
| // the default server address is notary-server
 | |
| func TestRemoteServerDefault(t *testing.T) {
 | |
| 	tempDir := tempDirWithConfig(t, "{}")
 | |
| 	defer os.RemoveAll(tempDir)
 | |
| 	configFile := filepath.Join(tempDir, "config.json")
 | |
| 
 | |
| 	commander := ¬aryCommander{
 | |
| 		getRetriever: func() passphrase.Retriever { return passphrase.ConstantRetriever("pass") },
 | |
| 	}
 | |
| 
 | |
| 	// set a blank config file, so it doesn't check ~/.notary/config.json by default
 | |
| 	// and execute a random command so that the flags are parsed
 | |
| 	cmd := commander.GetCommand()
 | |
| 	cmd.SetArgs([]string{"-c", configFile, "list"})
 | |
| 	cmd.SetOutput(new(bytes.Buffer)) // eat the output
 | |
| 	cmd.Execute()
 | |
| 
 | |
| 	config, err := commander.parseConfig()
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Equal(t, "https://notary-server:4443", getRemoteTrustServer(config))
 | |
| }
 | |
| 
 | |
| // providing a config file uses the config file's server url instead
 | |
| func TestRemoteServerUsesConfigFile(t *testing.T) {
 | |
| 	tempDir := tempDirWithConfig(t, `{"remote_server": {"url": "https://myserver"}}`)
 | |
| 	defer os.RemoveAll(tempDir)
 | |
| 	configFile := filepath.Join(tempDir, "config.json")
 | |
| 
 | |
| 	commander := ¬aryCommander{
 | |
| 		getRetriever: func() passphrase.Retriever { return passphrase.ConstantRetriever("pass") },
 | |
| 	}
 | |
| 
 | |
| 	// set a config file, so it doesn't check ~/.notary/config.json by default,
 | |
| 	// and execute a random command so that the flags are parsed
 | |
| 	cmd := commander.GetCommand()
 | |
| 	cmd.SetArgs([]string{"-c", configFile, "list"})
 | |
| 	cmd.SetOutput(new(bytes.Buffer)) // eat the output
 | |
| 	cmd.Execute()
 | |
| 
 | |
| 	config, err := commander.parseConfig()
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Equal(t, "https://myserver", getRemoteTrustServer(config))
 | |
| }
 | |
| 
 | |
| // a command line flag overrides the config file's server url
 | |
| func TestRemoteServerCommandLineFlagOverridesConfig(t *testing.T) {
 | |
| 	tempDir := tempDirWithConfig(t, `{"remote_server": {"url": "https://myserver"}}`)
 | |
| 	defer os.RemoveAll(tempDir)
 | |
| 	configFile := filepath.Join(tempDir, "config.json")
 | |
| 
 | |
| 	commander := ¬aryCommander{
 | |
| 		getRetriever: func() passphrase.Retriever { return passphrase.ConstantRetriever("pass") },
 | |
| 	}
 | |
| 
 | |
| 	// set a config file, so it doesn't check ~/.notary/config.json by default,
 | |
| 	// and execute a random command so that the flags are parsed
 | |
| 	cmd := commander.GetCommand()
 | |
| 	cmd.SetArgs([]string{"-c", configFile, "-s", "http://overridden", "list"})
 | |
| 	cmd.SetOutput(new(bytes.Buffer)) // eat the output
 | |
| 	cmd.Execute()
 | |
| 
 | |
| 	config, err := commander.parseConfig()
 | |
| 	assert.NoError(t, err)
 | |
| 	assert.Equal(t, "http://overridden", getRemoteTrustServer(config))
 | |
| }
 | |
| 
 | |
| var exampleValidCommands = []string{
 | |
| 	"init repo",
 | |
| 	"list repo",
 | |
| 	"status repo",
 | |
| 	"publish repo",
 | |
| 	"add repo v1 somefile",
 | |
| 	"verify repo v1",
 | |
| 	"key list",
 | |
| 	"key rotate repo",
 | |
| 	"key generate rsa",
 | |
| 	"key backup tempfile.zip",
 | |
| 	"key export e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 backup.pem",
 | |
| 	"key restore tempfile.zip",
 | |
| 	"key import backup.pem",
 | |
| 	"key remove e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
 | |
| 	"key passwd e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
 | |
| 	"cert list",
 | |
| 	"cert remove e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
 | |
| 	"delegation list repo",
 | |
| 	"delegation add repo targets/releases path/to/pem/file.pem",
 | |
| 	"delegation remove repo targets/releases",
 | |
| }
 | |
| 
 | |
| // config parsing bugs are propagated in all commands
 | |
| func TestConfigParsingErrorsPropagatedByCommands(t *testing.T) {
 | |
| 	tempdir, err := ioutil.TempDir("", "empty-dir")
 | |
| 	require.NoError(t, err)
 | |
| 	defer os.RemoveAll(tempdir)
 | |
| 
 | |
| 	for _, args := range exampleValidCommands {
 | |
| 		b := new(bytes.Buffer)
 | |
| 		cmd := NewNotaryCommand()
 | |
| 		cmd.SetOutput(b)
 | |
| 
 | |
| 		cmd.SetArgs(append(
 | |
| 			[]string{"-c", filepath.Join(tempdir, "idonotexist.json"), "-d", tempdir},
 | |
| 			strings.Fields(args)...))
 | |
| 		err = cmd.Execute()
 | |
| 
 | |
| 		require.Error(t, err, "expected error when running %s", args)
 | |
| 		require.Contains(t, err.Error(), "error opening config file", "running %s", args)
 | |
| 		require.NotContains(t, b.String(), "Usage:")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| // insufficient arguments produce an error before any parsing of configs happens
 | |
| func TestInsufficientArgumentsReturnsErrorAndPrintsUsage(t *testing.T) {
 | |
| 	tempdir, err := ioutil.TempDir("", "empty-dir")
 | |
| 	require.NoError(t, err)
 | |
| 	defer os.RemoveAll(tempdir)
 | |
| 
 | |
| 	for _, args := range exampleValidCommands {
 | |
| 		b := new(bytes.Buffer)
 | |
| 		cmd := NewNotaryCommand()
 | |
| 		cmd.SetOutput(b)
 | |
| 
 | |
| 		arglist := strings.Fields(args)
 | |
| 		if args == "key list" || args == "cert list" || args == "key generate rsa" {
 | |
| 			// in these case, "key" or "cert" or "key generate" are valid commands, so add an arg to them instead
 | |
| 			arglist = append(arglist, "extraArg")
 | |
| 		} else {
 | |
| 			arglist = arglist[:len(arglist)-1]
 | |
| 		}
 | |
| 
 | |
| 		invalid := strings.Join(arglist, " ")
 | |
| 
 | |
| 		cmd.SetArgs(append(
 | |
| 			[]string{"-c", filepath.Join(tempdir, "idonotexist.json"), "-d", tempdir}, arglist...))
 | |
| 		err = cmd.Execute()
 | |
| 
 | |
| 		require.NotContains(t, err.Error(), "error opening config file", "running %s", invalid)
 | |
| 		// it's a usage error, so the usage is printed
 | |
| 		require.Contains(t, b.String(), "Usage:", "expected usage when running %s", invalid)
 | |
| 	}
 | |
| }
 |