github.com/bshelton229/agent@v3.5.4+incompatible/bootstrap/hook_test.go (about) 1 package bootstrap 2 3 import ( 4 "fmt" 5 "io/ioutil" 6 "os" 7 "path/filepath" 8 "reflect" 9 "runtime" 10 "testing" 11 12 "github.com/buildkite/agent/bootstrap/shell" 13 "github.com/buildkite/agent/env" 14 ) 15 16 func TestRunningHookDetectsChangedEnvironment(t *testing.T) { 17 t.Parallel() 18 19 var script []string 20 21 if runtime.GOOS != "windows" { 22 script = []string{ 23 "#!/bin/bash", 24 "export LLAMAS=rock", 25 "export Alpacas=\"are ok\"", 26 "echo hello world", 27 } 28 } else { 29 script = []string{ 30 "@echo off", 31 "set LLAMAS=rock", 32 "set Alpacas=are ok", 33 "echo hello world", 34 } 35 } 36 37 wrapper := newTestHookWrapper(t, script) 38 defer os.Remove(wrapper.Path()) 39 40 sh := newTestShell(t) 41 42 if err := sh.RunScript(wrapper.Path(), nil); err != nil { 43 t.Fatal(err) 44 } 45 46 changes, err := wrapper.Changes() 47 if err != nil { 48 t.Fatal(err) 49 } 50 51 if !reflect.DeepEqual(changes.Env, env.FromSlice([]string{"LLAMAS=rock", "Alpacas=are ok"})) { 52 t.Fatalf("Unexpected env in %#v", changes.Env) 53 } 54 } 55 56 func TestRunningHookDetectsChangedWorkingDirectory(t *testing.T) { 57 t.Parallel() 58 59 tempDir, err := ioutil.TempDir("", "hookwrapperdir") 60 if err != nil { 61 t.Fatal(err) 62 } 63 defer os.RemoveAll(tempDir) 64 65 var script []string 66 67 if runtime.GOOS != "windows" { 68 script = []string{ 69 "#!/bin/bash", 70 "mkdir mysubdir", 71 "cd mysubdir", 72 "echo hello world", 73 } 74 } else { 75 script = []string{ 76 "@echo off", 77 "mkdir mysubdir", 78 "cd mysubdir", 79 "echo hello world", 80 } 81 } 82 83 wrapper := newTestHookWrapper(t, script) 84 defer os.Remove(wrapper.Path()) 85 86 sh := newTestShell(t) 87 if err := sh.Chdir(tempDir); err != nil { 88 t.Fatal(err) 89 } 90 91 if err := sh.RunScript(wrapper.Path(), nil); err != nil { 92 t.Fatal(err) 93 } 94 95 changes, err := wrapper.Changes() 96 if err != nil { 97 t.Fatal(err) 98 } 99 100 expected, err := filepath.EvalSymlinks(filepath.Join(tempDir, "mysubdir")) 101 if err != nil { 102 t.Fatal(err) 103 } 104 105 if changes.Dir != expected { 106 t.Fatalf("Expected working dir of %q, got %q", expected, changes.Dir) 107 } 108 } 109 110 func newTestShell(t *testing.T) *shell.Shell { 111 sh, err := shell.New() 112 if err != nil { 113 t.Fatal(err) 114 } 115 116 sh.Logger = shell.DiscardLogger 117 sh.Writer = ioutil.Discard 118 119 if os.Getenv(`DEBUG_SHELL`) == "1" { 120 sh.Logger = shell.TestingLogger{T: t} 121 } 122 123 // Windows requires certain env variables to be present 124 if runtime.GOOS == "windows" { 125 sh.Env = env.FromSlice([]string{ 126 // "PATH=" + os.Getenv("PATH"), 127 "SystemRoot=" + os.Getenv("SystemRoot"), 128 "WINDIR=" + os.Getenv("WINDIR"), 129 "COMSPEC=" + os.Getenv("COMSPEC"), 130 "PATHEXT=" + os.Getenv("PATHEXT"), 131 "TMP=" + os.Getenv("TMP"), 132 "TEMP=" + os.Getenv("TEMP"), 133 }) 134 } else { 135 sh.Env = env.New() 136 } 137 138 return sh 139 } 140 141 func newTestHookWrapper(t *testing.T, script []string) *hookScriptWrapper { 142 hookName := "hookwrapper" 143 if runtime.GOOS == "windows" { 144 hookName += ".bat" 145 } 146 147 hookFile, err := shell.TempFileWithExtension(hookName) 148 if err != nil { 149 t.Fatal(err) 150 } 151 152 for _, line := range script { 153 if _, err = fmt.Fprintln(hookFile, line); err != nil { 154 t.Fatal(err) 155 } 156 } 157 158 hookFile.Close() 159 160 wrapper, err := newHookScriptWrapper(hookFile.Name()) 161 if err != nil { 162 t.Fatal(err) 163 } 164 165 return wrapper 166 }