mirror of
				https://github.com/moby/moby.git
				synced 2022-11-09 12:21:53 -05:00 
			
		
		
		
	- Refactor opts.ValidatePath and add an opts.ValidateDevice ValidePath will now accept : containerPath:mode, hostPath:containerPath:mode and hostPath:containerPath. ValidateDevice will have the same behavior as current. - Refactor opts.ValidateEnv, opts.ParseEnvFile Environment variables will now be validated with the following definition : > Environment variables set by the user must have a name consisting > solely of alphabetics, numerics, and underscores - the first of > which must not be numeric. Signed-off-by: Vincent Demeester <vincent@sbr.pm>
		
			
				
	
	
		
			133 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			133 lines
		
	
	
	
		
			3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package opts
 | 
						|
 | 
						|
import (
 | 
						|
	"bufio"
 | 
						|
	"fmt"
 | 
						|
	"io/ioutil"
 | 
						|
	"os"
 | 
						|
	"reflect"
 | 
						|
	"strings"
 | 
						|
	"testing"
 | 
						|
)
 | 
						|
 | 
						|
func tmpFileWithContent(content string, t *testing.T) string {
 | 
						|
	tmpFile, err := ioutil.TempFile("", "envfile-test")
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
	defer tmpFile.Close()
 | 
						|
 | 
						|
	tmpFile.WriteString(content)
 | 
						|
	return tmpFile.Name()
 | 
						|
}
 | 
						|
 | 
						|
// Test ParseEnvFile for a file with a few well formatted lines
 | 
						|
func TestParseEnvFileGoodFile(t *testing.T) {
 | 
						|
	content := `foo=bar
 | 
						|
    baz=quux
 | 
						|
# comment
 | 
						|
 | 
						|
_foobar=foobaz
 | 
						|
`
 | 
						|
 | 
						|
	tmpFile := tmpFileWithContent(content, t)
 | 
						|
	defer os.Remove(tmpFile)
 | 
						|
 | 
						|
	lines, err := ParseEnvFile(tmpFile)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	expectedLines := []string{
 | 
						|
		"foo=bar",
 | 
						|
		"baz=quux",
 | 
						|
		"_foobar=foobaz",
 | 
						|
	}
 | 
						|
 | 
						|
	if !reflect.DeepEqual(lines, expectedLines) {
 | 
						|
		t.Fatal("lines not equal to expected_lines")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Test ParseEnvFile for an empty file
 | 
						|
func TestParseEnvFileEmptyFile(t *testing.T) {
 | 
						|
	tmpFile := tmpFileWithContent("", t)
 | 
						|
	defer os.Remove(tmpFile)
 | 
						|
 | 
						|
	lines, err := ParseEnvFile(tmpFile)
 | 
						|
	if err != nil {
 | 
						|
		t.Fatal(err)
 | 
						|
	}
 | 
						|
 | 
						|
	if len(lines) != 0 {
 | 
						|
		t.Fatal("lines not empty; expected empty")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Test ParseEnvFile for a non existent file
 | 
						|
func TestParseEnvFileNonExistentFile(t *testing.T) {
 | 
						|
	_, err := ParseEnvFile("foo_bar_baz")
 | 
						|
	if err == nil {
 | 
						|
		t.Fatal("ParseEnvFile succeeded; expected failure")
 | 
						|
	}
 | 
						|
	if _, ok := err.(*os.PathError); !ok {
 | 
						|
		t.Fatalf("Expected a PathError, got [%v]", err)
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Test ParseEnvFile for a badly formatted file
 | 
						|
func TestParseEnvFileBadlyFormattedFile(t *testing.T) {
 | 
						|
	content := `foo=bar
 | 
						|
    f   =quux
 | 
						|
`
 | 
						|
 | 
						|
	tmpFile := tmpFileWithContent(content, t)
 | 
						|
	defer os.Remove(tmpFile)
 | 
						|
 | 
						|
	_, err := ParseEnvFile(tmpFile)
 | 
						|
	if err == nil {
 | 
						|
		t.Fatalf("Expected a ErrBadEnvVariable, got nothing")
 | 
						|
	}
 | 
						|
	if _, ok := err.(ErrBadEnvVariable); !ok {
 | 
						|
		t.Fatalf("Expected a ErrBadEnvVariable, got [%v]", err)
 | 
						|
	}
 | 
						|
	expectedMessage := "poorly formatted environment: variable 'f   ' is not a valid environment variable"
 | 
						|
	if err.Error() != expectedMessage {
 | 
						|
		t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error())
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// Test ParseEnvFile for a file with a line exeeding bufio.MaxScanTokenSize
 | 
						|
func TestParseEnvFileLineTooLongFile(t *testing.T) {
 | 
						|
	content := strings.Repeat("a", bufio.MaxScanTokenSize+42)
 | 
						|
	content = fmt.Sprint("foo=", content)
 | 
						|
 | 
						|
	tmpFile := tmpFileWithContent(content, t)
 | 
						|
	defer os.Remove(tmpFile)
 | 
						|
 | 
						|
	_, err := ParseEnvFile(tmpFile)
 | 
						|
	if err == nil {
 | 
						|
		t.Fatal("ParseEnvFile succeeded; expected failure")
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
// ParseEnvFile with a random file, pass through
 | 
						|
func TestParseEnvFileRandomFile(t *testing.T) {
 | 
						|
	content := `first line
 | 
						|
another invalid line`
 | 
						|
	tmpFile := tmpFileWithContent(content, t)
 | 
						|
	defer os.Remove(tmpFile)
 | 
						|
 | 
						|
	_, err := ParseEnvFile(tmpFile)
 | 
						|
 | 
						|
	if err == nil {
 | 
						|
		t.Fatalf("Expected a ErrBadEnvVariable, got nothing")
 | 
						|
	}
 | 
						|
	if _, ok := err.(ErrBadEnvVariable); !ok {
 | 
						|
		t.Fatalf("Expected a ErrBadEnvvariable, got [%v]", err)
 | 
						|
	}
 | 
						|
	expectedMessage := "poorly formatted environment: variable 'first line' is not a valid environment variable"
 | 
						|
	if err.Error() != expectedMessage {
 | 
						|
		t.Fatalf("Expected [%v], got [%v]", expectedMessage, err.Error())
 | 
						|
	}
 | 
						|
}
 |