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  }