From e8484940170e81eef1866f55f79030731e3d3d69 Mon Sep 17 00:00:00 2001 From: Matthieu Hauglustaine Date: Wed, 1 Jul 2015 16:54:20 +0200 Subject: [PATCH 1/2] Return bufio error if set in ParseEnvFile Return an error value if bufio failed to properly read a token. Avoids running a container with partial environment. Fixes: #14266 Signed-off-by: Matthieu Hauglustaine --- opts/envfile.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/opts/envfile.go b/opts/envfile.go index 19ee8955f9..74d7f96f34 100644 --- a/opts/envfile.go +++ b/opts/envfile.go @@ -40,7 +40,7 @@ func ParseEnvFile(filename string) ([]string, error) { } } } - return lines, nil + return lines, scanner.Err() } var whiteSpaces = " \t" From 0dadf11bec88b14b9f9e2c6267f9bfb15d020923 Mon Sep 17 00:00:00 2001 From: Matthieu Hauglustaine Date: Wed, 1 Jul 2015 17:02:40 +0200 Subject: [PATCH 2/2] Add unit tests for ParseEnvFile. Add unit tests of the ParseEnvFile function. Test for: * good file * empty file * non existent file * badly formatted file Signed-off-by: Matthieu Hauglustaine --- opts/envfile_test.go | 114 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 opts/envfile_test.go diff --git a/opts/envfile_test.go b/opts/envfile_test.go new file mode 100644 index 0000000000..3748481d1b --- /dev/null +++ b/opts/envfile_test.go @@ -0,0 +1,114 @@ +package opts + +import ( + "bufio" + "fmt" + "io/ioutil" + "os" + "reflect" + "strings" + "testing" +) + +func tmpFileWithContent(content string) (string, error) { + tmpFile, err := ioutil.TempFile("", "envfile-test") + if err != nil { + return "", err + } + defer tmpFile.Close() + + tmpFile.WriteString(content) + return tmpFile.Name(), nil +} + +// 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, err := tmpFileWithContent(content) + if err != nil { + t.Fatal("failed to create test data file") + } + defer os.Remove(tmpFile) + + lines, err := ParseEnvFile(tmpFile) + if err != nil { + t.Fatal("ParseEnvFile failed; expected success") + } + + expected_lines := []string{ + "foo=bar", + "baz=quux", + "foobar=foobaz", + } + + if !reflect.DeepEqual(lines, expected_lines) { + t.Fatal("lines not equal to expected_lines") + } +} + +// Test ParseEnvFile for an empty file +func TestParseEnvFileEmptyFile(t *testing.T) { + tmpFile, err := tmpFileWithContent("") + if err != nil { + t.Fatal("failed to create test data file") + } + defer os.Remove(tmpFile) + + lines, err := ParseEnvFile(tmpFile) + if err != nil { + t.Fatal("ParseEnvFile failed; expected success") + } + + 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") + } +} + +// Test ParseEnvFile for a badly formatted file +func TestParseEnvFileBadlyFormattedFile(t *testing.T) { + content := `foo=bar + f =quux +` + + tmpFile, err := tmpFileWithContent(content) + if err != nil { + t.Fatal("failed to create test data file") + } + defer os.Remove(tmpFile) + + _, err = ParseEnvFile(tmpFile) + if err == nil { + t.Fatal("ParseEnvFile succeeded; expected failure") + } +} + +// 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, err := tmpFileWithContent(content) + if err != nil { + t.Fatal("failed to create test data file") + } + defer os.Remove(tmpFile) + + _, err = ParseEnvFile(tmpFile) + if err == nil { + t.Fatal("ParseEnvFile succeeded; expected failure") + } +}