package dockerfile import ( "bufio" "os" "runtime" "strings" "testing" ) func TestShellParser4EnvVars(t *testing.T) { fn := "envVarTest" lineCount := 0 file, err := os.Open(fn) if err != nil { t.Fatalf("Can't open '%s': %s", err, fn) } defer file.Close() scanner := bufio.NewScanner(file) envs := []string{"PWD=/home", "SHELL=bash", "KOREAN=한국어"} for scanner.Scan() { line := scanner.Text() lineCount++ // Trim comments and blank lines i := strings.Index(line, "#") if i >= 0 { line = line[:i] } line = strings.TrimSpace(line) if line == "" { continue } words := strings.Split(line, "|") if len(words) != 3 { t.Fatalf("Error in '%s' - should be exactly one | in:%q", fn, line) } words[0] = strings.TrimSpace(words[0]) words[1] = strings.TrimSpace(words[1]) words[2] = strings.TrimSpace(words[2]) // Key W=Windows; A=All; U=Unix if (words[0] != "W") && (words[0] != "A") && (words[0] != "U") { t.Fatalf("Invalid tag %s at line %d of %s. Must be W, A or U", words[0], lineCount, fn) } if ((words[0] == "W" || words[0] == "A") && runtime.GOOS == "windows") || ((words[0] == "U" || words[0] == "A") && runtime.GOOS != "windows") { newWord, err := ProcessWord(words[1], envs, '\\') if err != nil { newWord = "error" } if newWord != words[2] { t.Fatalf("Error. Src: %s Calc: %s Expected: %s at line %d", words[1], newWord, words[2], lineCount) } } } } func TestShellParser4Words(t *testing.T) { fn := "wordsTest" file, err := os.Open(fn) if err != nil { t.Fatalf("Can't open '%s': %s", err, fn) } defer file.Close() envs := []string{} scanner := bufio.NewScanner(file) for scanner.Scan() { line := scanner.Text() if strings.HasPrefix(line, "#") { continue } if strings.HasPrefix(line, "ENV ") { line = strings.TrimLeft(line[3:], " ") envs = append(envs, line) continue } words := strings.Split(line, "|") if len(words) != 2 { t.Fatalf("Error in '%s' - should be exactly one | in: %q", fn, line) } test := strings.TrimSpace(words[0]) expected := strings.Split(strings.TrimLeft(words[1], " "), ",") result, err := ProcessWords(test, envs, '\\') if err != nil { result = []string{"error"} } if len(result) != len(expected) { t.Fatalf("Error. %q was suppose to result in %q, but got %q instead", test, expected, result) } for i, w := range expected { if w != result[i] { t.Fatalf("Error. %q was suppose to result in %q, but got %q instead", test, expected, result) } } } } func TestGetEnv(t *testing.T) { sw := &shellWord{ word: "", envs: nil, pos: 0, } sw.envs = []string{} if sw.getEnv("foo") != "" { t.Fatalf("2 - 'foo' should map to ''") } sw.envs = []string{"foo"} if sw.getEnv("foo") != "" { t.Fatalf("3 - 'foo' should map to ''") } sw.envs = []string{"foo="} if sw.getEnv("foo") != "" { t.Fatalf("4 - 'foo' should map to ''") } sw.envs = []string{"foo=bar"} if sw.getEnv("foo") != "bar" { t.Fatalf("5 - 'foo' should map to 'bar'") } sw.envs = []string{"foo=bar", "car=hat"} if sw.getEnv("foo") != "bar" { t.Fatalf("6 - 'foo' should map to 'bar'") } if sw.getEnv("car") != "hat" { t.Fatalf("7 - 'car' should map to 'hat'") } // Make sure we grab the first 'car' in the list sw.envs = []string{"foo=bar", "car=hat", "car=bike"} if sw.getEnv("car") != "hat" { t.Fatalf("8 - 'car' should map to 'hat'") } }