github.com/clusterize-io/tusk@v0.6.3-0.20211001020217-cfe8a8cd0d4a/runner/utils_test.go (about)

     1  package runner
     2  
     3  import (
     4  	"fmt"
     5  	"math/rand"
     6  	"os"
     7  	"runtime"
     8  
     9  	"github.com/clusterize-io/tusk/marshal"
    10  )
    11  
    12  // createOption creates a custom option for testing purposes.
    13  func createOption(operators ...func(o *Option)) Option {
    14  	o := Option{}
    15  
    16  	for _, f := range operators {
    17  		f(&o)
    18  	}
    19  
    20  	return o
    21  }
    22  
    23  // withOptionName returns an operator that adds a name to an option.
    24  func withOptionName(name string) func(o *Option) {
    25  	return func(o *Option) {
    26  		o.Name = name
    27  	}
    28  }
    29  
    30  // withOptionDependency returns an operator that adds a dependency to an option.
    31  func withOptionDependency(name string) func(o *Option) {
    32  	return func(o *Option) {
    33  		o.DefaultValues = append(
    34  			o.DefaultValues,
    35  			Value{
    36  				Value: fmt.Sprintf("${%s}", name),
    37  			},
    38  		)
    39  	}
    40  }
    41  
    42  // withOptionWhenDependency returns an operator that adds a when dependency to an option.
    43  func withOptionWhenDependency(name string) func(o *Option) {
    44  	return func(o *Option) {
    45  		o.DefaultValues = append(
    46  			o.DefaultValues,
    47  			Value{When: WhenList{createWhen(withWhenEqual(name, "true"))}},
    48  		)
    49  	}
    50  }
    51  
    52  // whenTrue is a When that always evaluates to true.
    53  var whenTrue = When{}
    54  
    55  // whenFalse is a When that always evaluates to false.
    56  var whenFalse = When{OS: marshal.StringList{"fake"}}
    57  
    58  // createWhen creates a custom when for testing purposes.
    59  func createWhen(operators ...func(w *When)) When {
    60  	w := When{}
    61  
    62  	for _, f := range operators {
    63  		f(&w)
    64  	}
    65  
    66  	return w
    67  }
    68  
    69  // withWhenCommand returns an operator that runs a given command
    70  func withWhenCommand(command string) func(w *When) {
    71  	return func(w *When) {
    72  		w.Command = append(w.Command, command)
    73  	}
    74  }
    75  
    76  // withWhenCommandSuccess is an operator that includes a successful command.
    77  var withWhenCommandSuccess = func(w *When) {
    78  	w.Command = append(w.Command, "test 1 = 1")
    79  }
    80  
    81  // withWhenCommandFailure is an operator that includes a failed command.
    82  var withWhenCommandFailure = func(w *When) {
    83  	w.Command = append(w.Command, "test 0 = 1")
    84  }
    85  
    86  // withWhenExists returns an operator that requires a file to exist.
    87  func withWhenExists(filename string) func(w *When) {
    88  	return func(w *When) {
    89  		w.Exists = append(w.Exists, filename)
    90  	}
    91  }
    92  
    93  // withWhenNotExists returns an operator that requires a file to not exist.
    94  func withWhenNotExists(filename string) func(w *When) {
    95  	return func(w *When) {
    96  		w.NotExists = append(w.NotExists, filename)
    97  	}
    98  }
    99  
   100  // withWhenOS returns an operator that requires an arbitrary OS.
   101  func withWhenOS(name string) func(w *When) {
   102  	return func(w *When) {
   103  		w.OS = append(w.OS, name)
   104  	}
   105  }
   106  
   107  // withWhenOSSuccess is an operator that requires the current OS.
   108  var withWhenOSSuccess = func(w *When) {
   109  	w.OS = append(w.OS, runtime.GOOS)
   110  }
   111  
   112  // withWhenOSFailure is an operator that requires the wrong OS.
   113  var withWhenOSFailure = func(w *When) {
   114  	w.OS = append(w.OS, "fake")
   115  }
   116  
   117  // withWhenEnv returns an operator that requires an env var to be set.
   118  func withWhenEnv(key, value string) func(w *When) {
   119  	return func(w *When) {
   120  		ensureEnv(w)
   121  		w.Environment[key] = append(w.Environment[key], &value)
   122  	}
   123  }
   124  
   125  // withoutWhenEnv returns an operator that requires an env var to be unset.
   126  func withoutWhenEnv(key string) func(w *When) {
   127  	return func(w *When) {
   128  		ensureEnv(w)
   129  		w.Environment[key] = append(w.Environment[key], nil)
   130  	}
   131  }
   132  
   133  // withWhenEnvSuccess is an operator that requires a set environment variable.
   134  var withWhenEnvSuccess = func(w *When) {
   135  	ensureEnv(w)
   136  	key := randomString()
   137  	value := randomString()
   138  	os.Setenv(key, value) // nolint: errcheck
   139  	w.Environment[key] = append(w.Environment[key], &value)
   140  }
   141  
   142  // withWhenEnvFailure is an operator that requires a set environment variable.
   143  var withWhenEnvFailure = func(w *When) {
   144  	ensureEnv(w)
   145  	key := randomString()
   146  	value := randomString()
   147  	w.Environment[key] = append(w.Environment[key], &value)
   148  }
   149  
   150  // withoutWhenEnvSuccess is an operator that requires an unset environment variable.
   151  var withoutWhenEnvSuccess = func(w *When) {
   152  	ensureEnv(w)
   153  	key := randomString()
   154  	w.Environment[key] = append(w.Environment[key], nil)
   155  }
   156  
   157  // withoutWhenEnvFailure is an operator that requires an unset environment variable.
   158  var withoutWhenEnvFailure = func(w *When) {
   159  	ensureEnv(w)
   160  	key := randomString()
   161  	value := randomString()
   162  	os.Setenv(key, value) // nolint: errcheck
   163  	w.Environment[key] = append(w.Environment[key], nil)
   164  }
   165  
   166  func randomString() string {
   167  	letters := []rune("ABCDEFGHIJKLMNOPQRSTUVWXYZ_")
   168  	a := make([]rune, 20)
   169  	for i := range a {
   170  		a[i] = letters[rand.Intn(len(letters))]
   171  	}
   172  	return string(a)
   173  }
   174  
   175  func ensureEnv(w *When) {
   176  	if w.Environment == nil {
   177  		w.Environment = make(map[string]marshal.NullableStringList)
   178  	}
   179  }
   180  
   181  // withWhenEqual returns an operator that requires the key to equal the value.
   182  func withWhenEqual(key, value string) func(w *When) {
   183  	return func(w *When) {
   184  		if w.Equal == nil {
   185  			w.Equal = make(map[string]marshal.StringList)
   186  		}
   187  
   188  		w.Equal[key] = append(w.Equal[key], value)
   189  	}
   190  }
   191  
   192  // withWhenNotEqual returns an operator that requires the key to not equal the value.
   193  func withWhenNotEqual(key, value string) func(w *When) {
   194  	return func(w *When) {
   195  		if w.NotEqual == nil {
   196  			w.NotEqual = make(map[string]marshal.StringList)
   197  		}
   198  		w.NotEqual[key] = append(w.NotEqual[key], value)
   199  	}
   200  }