github.com/sijibomii/docker@v0.0.0-20231230191044-5cf6ca554647/builder/dockerfile/shell_parser_test.go (about) 1 package dockerfile 2 3 import ( 4 "bufio" 5 "os" 6 "strings" 7 "testing" 8 ) 9 10 func TestShellParser4EnvVars(t *testing.T) { 11 fn := "envVarTest" 12 13 file, err := os.Open(fn) 14 if err != nil { 15 t.Fatalf("Can't open '%s': %s", err, fn) 16 } 17 defer file.Close() 18 19 scanner := bufio.NewScanner(file) 20 envs := []string{"PWD=/home", "SHELL=bash", "KOREAN=한국어"} 21 for scanner.Scan() { 22 line := scanner.Text() 23 24 // Trim comments and blank lines 25 i := strings.Index(line, "#") 26 if i >= 0 { 27 line = line[:i] 28 } 29 line = strings.TrimSpace(line) 30 31 if line == "" { 32 continue 33 } 34 35 words := strings.Split(line, "|") 36 if len(words) != 2 { 37 t.Fatalf("Error in '%s' - should be exactly one | in:%q", fn, line) 38 } 39 40 words[0] = strings.TrimSpace(words[0]) 41 words[1] = strings.TrimSpace(words[1]) 42 43 newWord, err := ProcessWord(words[0], envs) 44 45 if err != nil { 46 newWord = "error" 47 } 48 49 if newWord != words[1] { 50 t.Fatalf("Error. Src: %s Calc: %s Expected: %s", words[0], newWord, words[1]) 51 } 52 } 53 } 54 55 func TestShellParser4Words(t *testing.T) { 56 fn := "wordsTest" 57 58 file, err := os.Open(fn) 59 if err != nil { 60 t.Fatalf("Can't open '%s': %s", err, fn) 61 } 62 defer file.Close() 63 64 envs := []string{} 65 scanner := bufio.NewScanner(file) 66 for scanner.Scan() { 67 line := scanner.Text() 68 69 if strings.HasPrefix(line, "#") { 70 continue 71 } 72 73 if strings.HasPrefix(line, "ENV ") { 74 line = strings.TrimLeft(line[3:], " ") 75 envs = append(envs, line) 76 continue 77 } 78 79 words := strings.Split(line, "|") 80 if len(words) != 2 { 81 t.Fatalf("Error in '%s' - should be exactly one | in: %q", fn, line) 82 } 83 test := strings.TrimSpace(words[0]) 84 expected := strings.Split(strings.TrimLeft(words[1], " "), ",") 85 86 result, err := ProcessWords(test, envs) 87 88 if err != nil { 89 result = []string{"error"} 90 } 91 92 if len(result) != len(expected) { 93 t.Fatalf("Error. %q was suppose to result in %q, but got %q instead", test, expected, result) 94 } 95 for i, w := range expected { 96 if w != result[i] { 97 t.Fatalf("Error. %q was suppose to result in %q, but got %q instead", test, expected, result) 98 } 99 } 100 } 101 } 102 103 func TestGetEnv(t *testing.T) { 104 sw := &shellWord{ 105 word: "", 106 envs: nil, 107 pos: 0, 108 } 109 110 sw.envs = []string{} 111 if sw.getEnv("foo") != "" { 112 t.Fatalf("2 - 'foo' should map to ''") 113 } 114 115 sw.envs = []string{"foo"} 116 if sw.getEnv("foo") != "" { 117 t.Fatalf("3 - 'foo' should map to ''") 118 } 119 120 sw.envs = []string{"foo="} 121 if sw.getEnv("foo") != "" { 122 t.Fatalf("4 - 'foo' should map to ''") 123 } 124 125 sw.envs = []string{"foo=bar"} 126 if sw.getEnv("foo") != "bar" { 127 t.Fatalf("5 - 'foo' should map to 'bar'") 128 } 129 130 sw.envs = []string{"foo=bar", "car=hat"} 131 if sw.getEnv("foo") != "bar" { 132 t.Fatalf("6 - 'foo' should map to 'bar'") 133 } 134 if sw.getEnv("car") != "hat" { 135 t.Fatalf("7 - 'car' should map to 'hat'") 136 } 137 138 // Make sure we grab the first 'car' in the list 139 sw.envs = []string{"foo=bar", "car=hat", "car=bike"} 140 if sw.getEnv("car") != "hat" { 141 t.Fatalf("8 - 'car' should map to 'hat'") 142 } 143 }