github.com/tiagovtristao/plz@v13.4.0+incompatible/src/core/config_test.go (about) 1 package core 2 3 import ( 4 "bytes" 5 "os" 6 "runtime" 7 "testing" 8 "time" 9 10 "github.com/jessevdk/go-flags" 11 "github.com/stretchr/testify/assert" 12 13 "github.com/thought-machine/please/src/cli" 14 "reflect" 15 "strings" 16 ) 17 18 func TestPlzConfigWorking(t *testing.T) { 19 config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "") 20 assert.NoError(t, err) 21 assert.Equal(t, "pexmabob", config.Python.PexTool) 22 assert.Equal(t, "javac", config.Java.JavacTool) 23 assert.Equal(t, "jlink", config.Java.JlinkTool) 24 assert.Equal(t, "/path/to/java/home", config.Java.JavaHome) 25 assert.Equal(t, "8", config.Java.SourceLevel) 26 assert.Equal(t, "7", config.Java.TargetLevel) 27 assert.Equal(t, "10", config.Java.ReleaseLevel) 28 } 29 30 func TestPlzConfigFailing(t *testing.T) { 31 _, err := ReadConfigFiles([]string{"src/core/test_data/failing.plzconfig"}, "") 32 assert.Error(t, err) 33 } 34 35 func TestPlzConfigProfile(t *testing.T) { 36 config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "dev") 37 assert.NoError(t, err) 38 assert.Equal(t, "pexmabob", config.Python.PexTool) 39 assert.Equal(t, "/opt/java/bin/javac", config.Java.JavacTool) 40 assert.Equal(t, "8", config.Java.SourceLevel) 41 assert.Equal(t, "8", config.Java.TargetLevel) 42 assert.Equal(t, "10", config.Java.ReleaseLevel) 43 } 44 45 func TestMultiplePlzConfigFiles(t *testing.T) { 46 config, err := ReadConfigFiles([]string{ 47 "src/core/test_data/working.plzconfig", 48 "src/core/test_data/failing.plzconfig", 49 }, "") 50 assert.Error(t, err) 51 // Quick check of this - we should have still read the first config file correctly. 52 assert.Equal(t, "javac", config.Java.JavacTool) 53 } 54 55 func TestConfigSlicesOverwrite(t *testing.T) { 56 config, err := ReadConfigFiles([]string{"src/core/test_data/slices.plzconfig"}, "") 57 assert.NoError(t, err) 58 // This should be completely overwritten by the config file 59 assert.Equal(t, []string{"/sbin"}, config.Build.Path) 60 // This should still get the defaults. 61 assert.Equal(t, []string{"BUILD", "BUILD.plz"}, config.Parse.BuildFileName) 62 } 63 64 func TestConfigOverrideString(t *testing.T) { 65 config := DefaultConfiguration() 66 err := config.ApplyOverrides(map[string]string{"python.pextool": "pexinator"}) 67 assert.NoError(t, err) 68 assert.Equal(t, "pexinator", config.Python.PexTool) 69 } 70 71 func TestConfigOverrideUppercase(t *testing.T) { 72 config := DefaultConfiguration() 73 err := config.ApplyOverrides(map[string]string{"Python.PexTool": "pexinator"}) 74 assert.NoError(t, err) 75 assert.Equal(t, "pexinator", config.Python.PexTool) 76 } 77 78 func TestConfigOverrideDuration(t *testing.T) { 79 config := DefaultConfiguration() 80 err := config.ApplyOverrides(map[string]string{"build.timeout": "15"}) 81 assert.NoError(t, err) 82 assert.EqualValues(t, 15*time.Second, config.Build.Timeout) 83 } 84 85 func TestConfigOverrideNonIntDuration(t *testing.T) { 86 config := DefaultConfiguration() 87 err := config.ApplyOverrides(map[string]string{"build.timeout": "10m"}) 88 assert.NoError(t, err) 89 assert.EqualValues(t, 10*time.Minute, config.Build.Timeout) 90 } 91 92 func TestConfigOverrideBool(t *testing.T) { 93 config := DefaultConfiguration() 94 err := config.ApplyOverrides(map[string]string{"cache.rpcwriteable": "yes"}) 95 assert.NoError(t, err) 96 assert.True(t, config.Cache.RPCWriteable) 97 } 98 99 func TestConfigOverrideSlice(t *testing.T) { 100 config := DefaultConfiguration() 101 err := config.ApplyOverrides(map[string]string{"build.path": "/mnt/bin,/mnt/sbin"}) 102 assert.NoError(t, err) 103 assert.Equal(t, []string{"/mnt/bin", "/mnt/sbin"}, config.Build.Path) 104 } 105 106 func TestConfigOverrideLabelSlice(t *testing.T) { 107 config := DefaultConfiguration() 108 err := config.ApplyOverrides(map[string]string{"gc.keep": "//src/core:core"}) 109 assert.NoError(t, err) 110 assert.Equal(t, []BuildLabel{ParseBuildLabel("//src/core:core", "")}, config.Gc.Keep) 111 } 112 113 func TestConfigOverrideURLSlice(t *testing.T) { 114 config := DefaultConfiguration() 115 err := config.ApplyOverrides(map[string]string{"java.defaultmavenrepo": "https://repo1.maven.org,https://maven.google.com"}) 116 assert.NoError(t, err) 117 assert.Equal(t, []cli.URL{"https://repo1.maven.org", "https://maven.google.com"}, config.Java.DefaultMavenRepo) 118 } 119 120 func TestConfigOverrideMap(t *testing.T) { 121 config := DefaultConfiguration() 122 err := config.ApplyOverrides(map[string]string{ 123 "buildconfig.android-keystore": "/tmp/debug.key", 124 "buildconfig.android-keystore-password": "android", 125 }) 126 assert.NoError(t, err) 127 assert.Equal(t, map[string]string{ 128 "android-keystore": "/tmp/debug.key", 129 "android-keystore-password": "android", 130 }, config.BuildConfig) 131 } 132 133 func TestConfigOverrideUnknownName(t *testing.T) { 134 config := DefaultConfiguration() 135 err := config.ApplyOverrides(map[string]string{"build.blah": "whatevs"}) 136 assert.Error(t, err) 137 } 138 139 func TestConfigOverrideURL(t *testing.T) { 140 config := DefaultConfiguration() 141 err := config.ApplyOverrides(map[string]string{"metrics.pushgatewayurl": "http://gateway:9091"}) 142 assert.NoError(t, err) 143 assert.EqualValues(t, "http://gateway:9091", config.Metrics.PushGatewayURL) 144 } 145 146 func TestConfigOverrideOptions(t *testing.T) { 147 config := DefaultConfiguration() 148 err := config.ApplyOverrides(map[string]string{"python.testrunner": "pytest"}) 149 assert.NoError(t, err) 150 assert.Equal(t, "pytest", config.Python.TestRunner) 151 err = config.ApplyOverrides(map[string]string{"python.testrunner": "junit"}) 152 assert.Error(t, err) 153 } 154 155 func TestDynamicSection(t *testing.T) { 156 config, err := ReadConfigFiles([]string{"src/core/test_data/aliases.plzconfig"}, "") 157 assert.NoError(t, err) 158 expected := map[string]string{ 159 "deploy": "run //deployment:deployer --", 160 "deploy dev": "run //deployment:deployer -- --env=dev", 161 "deploy prod": "run //deployment:deployer -- --env=prod", 162 } 163 assert.Equal(t, expected, config.Aliases) 164 } 165 166 func TestDynamicSubsection(t *testing.T) { 167 config, err := ReadConfigFiles([]string{"src/core/test_data/metrics.plzconfig"}, "") 168 assert.NoError(t, err) 169 assert.EqualValues(t, "http://localhost:9091", config.Metrics.PushGatewayURL) 170 expected := map[string]string{ 171 "branch": "git rev-parse --abbrev-ref HEAD", 172 } 173 assert.Equal(t, expected, config.CustomMetricLabels) 174 } 175 176 func TestReadSemver(t *testing.T) { 177 config, err := ReadConfigFiles([]string{"src/core/test_data/version_good.plzconfig"}, "") 178 assert.NoError(t, err) 179 assert.EqualValues(t, 2, config.Please.Version.Major) 180 assert.EqualValues(t, 3, config.Please.Version.Minor) 181 assert.EqualValues(t, 4, config.Please.Version.Patch) 182 config, err = ReadConfigFiles([]string{"src/core/test_data/version_bad.plzconfig"}, "") 183 assert.Error(t, err) 184 } 185 186 func TestReadDurations(t *testing.T) { 187 config, err := ReadConfigFiles([]string{"src/core/test_data/duration_good.plzconfig"}, "") 188 assert.NoError(t, err) 189 assert.EqualValues(t, 500*time.Millisecond, config.Metrics.PushTimeout) 190 assert.EqualValues(t, 5*time.Second, config.Metrics.PushFrequency) 191 config, err = ReadConfigFiles([]string{"src/core/test_data/duration_bad.plzconfig"}, "") 192 assert.Error(t, err) 193 } 194 195 func TestReadByteSizes(t *testing.T) { 196 config, err := ReadConfigFiles([]string{"src/core/test_data/bytesize_good.plzconfig"}, "") 197 assert.NoError(t, err) 198 assert.EqualValues(t, 500*1000*1000, config.Cache.RPCMaxMsgSize) 199 config, err = ReadConfigFiles([]string{"src/core/test_data/bytesize_bad.plzconfig"}, "") 200 assert.Error(t, err) 201 } 202 203 func TestReadContainers(t *testing.T) { 204 config, err := ReadConfigFiles([]string{"src/core/test_data/container_good.plzconfig"}, "") 205 assert.NoError(t, err) 206 assert.EqualValues(t, ContainerImplementationDocker, config.Test.DefaultContainer) 207 config, err = ReadConfigFiles([]string{"src/core/test_data/container_bad.plzconfig"}, "") 208 assert.Error(t, err) 209 } 210 211 func TestCompletions(t *testing.T) { 212 config := DefaultConfiguration() 213 completions := config.Completions("python.pip") 214 assert.Equal(t, 2, len(completions)) 215 assert.Equal(t, "python.piptool:", completions[0].Item) 216 assert.Equal(t, "python.pipflags:", completions[1].Item) 217 } 218 219 func TestConfigVerifiesOptions(t *testing.T) { 220 config, err := ReadConfigFiles([]string{"src/core/test_data/testrunner_good.plzconfig"}, "") 221 assert.NoError(t, err) 222 assert.Equal(t, "pytest", config.Python.TestRunner) 223 _, err = ReadConfigFiles([]string{"src/core/test_data/testrunner_bad.plzconfig"}, "") 224 assert.Error(t, err) 225 } 226 227 func TestBuildEnvSection(t *testing.T) { 228 config, err := ReadConfigFiles([]string{"src/core/test_data/buildenv.plzconfig"}, "") 229 assert.NoError(t, err) 230 expected := []string{ 231 "ARCH=" + runtime.GOARCH, 232 "BAR_BAR=first", 233 "FOO_BAR=second", 234 "GOARCH=" + runtime.GOARCH, 235 "GOOS=" + runtime.GOOS, 236 "OS=" + runtime.GOOS, 237 "PATH=" + os.Getenv("TMP_DIR") + "/.please:/usr/local/bin:/usr/bin:/bin", 238 "XARCH=x86_64", 239 "XOS=" + xos(), 240 } 241 assert.Equal(t, expected, config.GetBuildEnv()) 242 } 243 244 func TestPassEnv(t *testing.T) { 245 err := os.Setenv("FOO", "first") 246 assert.NoError(t, err) 247 err = os.Setenv("BAR", "second") 248 assert.NoError(t, err) 249 config, err := ReadConfigFiles([]string{"src/core/test_data/passenv.plzconfig"}, "") 250 assert.NoError(t, err) 251 expected := []string{ 252 "ARCH=" + runtime.GOARCH, 253 "BAR=second", 254 "FOO=first", 255 "GOARCH=" + runtime.GOARCH, 256 "GOOS=" + runtime.GOOS, 257 "OS=" + runtime.GOOS, 258 "PATH=" + os.Getenv("TMP_DIR") + "/.please:" + os.Getenv("PATH"), 259 "XARCH=x86_64", 260 "XOS=" + xos(), 261 } 262 assert.Equal(t, expected, config.GetBuildEnv()) 263 } 264 265 func TestBuildPathWithPathEnv(t *testing.T) { 266 config, err := ReadConfigFiles([]string{"src/core/test_data/passenv.plzconfig"}, "") 267 assert.NoError(t, err) 268 assert.Equal(t, config.Build.Path, strings.Split(os.Getenv("PATH"), ":")) 269 } 270 271 func xos() string { 272 if runtime.GOOS == "darwin" { 273 return "osx" 274 } 275 return runtime.GOOS 276 } 277 278 func TestUpdateArgsWithAliases(t *testing.T) { 279 c := DefaultConfiguration() 280 c.Aliases["deploy"] = "run //deploy:deployer --" 281 c.Aliases["mytool"] = "run //mytool:tool --" 282 283 args := c.UpdateArgsWithAliases([]string{"plz", "run", "//src/tools:tool"}) 284 assert.EqualValues(t, []string{"plz", "run", "//src/tools:tool"}, args) 285 286 args = c.UpdateArgsWithAliases([]string{"plz", "deploy", "something"}) 287 assert.EqualValues(t, []string{"plz", "run", "//deploy:deployer", "--", "something"}, args) 288 289 args = c.UpdateArgsWithAliases([]string{"plz", "mytool"}) 290 assert.EqualValues(t, []string{"plz", "run", "//mytool:tool", "--"}, args) 291 292 args = c.UpdateArgsWithAliases([]string{"plz", "mytool", "deploy", "something"}) 293 assert.EqualValues(t, []string{"plz", "run", "//mytool:tool", "--", "deploy", "something"}, args) 294 } 295 296 func TestUpdateArgsWithQuotedAliases(t *testing.T) { 297 c := DefaultConfiguration() 298 c.Aliases["release"] = "build -o 'buildconfig.gpg_userid:Please Releases <releases@please.build>' //package:tarballs" 299 args := c.UpdateArgsWithAliases([]string{"plz", "release"}) 300 assert.EqualValues(t, []string{"plz", "build", "-o", "buildconfig.gpg_userid:Please Releases <releases@please.build>", "//package:tarballs"}, args) 301 } 302 303 func TestParseNewFormatAliases(t *testing.T) { 304 c, err := ReadConfigFiles([]string{"src/core/test_data/alias.plzconfig"}, "") 305 assert.NoError(t, err) 306 assert.Equal(t, 2, len(c.Alias)) 307 a := c.Alias["auth"] 308 assert.Equal(t, "run //infra:auth --", a.Cmd) 309 assert.EqualValues(t, []string{"gcp", "aws k8s", "aws ecr"}, a.Subcommand) 310 assert.EqualValues(t, []string{"--host", "--repo"}, a.Flag) 311 } 312 313 func TestAttachAliasFlags(t *testing.T) { 314 c, err := ReadConfigFiles([]string{"src/core/test_data/alias.plzconfig"}, "") 315 assert.NoError(t, err) 316 os.Setenv("GO_FLAGS_COMPLETION", "1") 317 p := flags.NewParser(&struct{}{}, 0) 318 b := c.AttachAliasFlags(p) 319 assert.True(t, b) 320 completions := []string{} 321 p.CompletionHandler = func(items []flags.Completion) { 322 completions = make([]string, len(items)) 323 for i, item := range items { 324 completions[i] = item.Item 325 } 326 } 327 328 _, err = p.ParseArgs([]string{"plz", "au"}) 329 assert.NoError(t, err) 330 assert.EqualValues(t, []string{"auth"}, completions) 331 332 _, err = p.ParseArgs([]string{"plz", "auth", "gc"}) 333 assert.NoError(t, err) 334 assert.EqualValues(t, []string{"gcp"}, completions) 335 336 _, err = p.ParseArgs([]string{"plz", "auth", "aws", "e"}) 337 assert.NoError(t, err) 338 assert.EqualValues(t, []string{"ecr"}, completions) 339 340 _, err = p.ParseArgs([]string{"plz", "auth", "aws", "--h"}) 341 assert.NoError(t, err) 342 assert.EqualValues(t, []string{"--host"}, completions) 343 344 _, err = p.ParseArgs([]string{"plz", "query", "ow"}) 345 assert.NoError(t, err) 346 assert.EqualValues(t, []string{"owners"}, completions) 347 } 348 349 func TestPrintAliases(t *testing.T) { 350 c, err := ReadConfigFiles([]string{"src/core/test_data/alias.plzconfig"}, "") 351 assert.NoError(t, err) 352 var buf bytes.Buffer 353 c.PrintAliases(&buf) 354 assert.Equal(t, ` 355 Available commands for this repository: 356 auth Authenticates you. 357 query owners Queries owners of a thing. 358 `, buf.String()) 359 } 360 361 func TestGetTags(t *testing.T) { 362 config := DefaultConfiguration() 363 tags := config.TagsToFields() 364 365 assert.Equal(t, "Version", tags["PLZ_VERSION"].Name) 366 assert.True(t, tags["PLZ_VERSION"].Type == reflect.TypeOf(cli.Version{})) 367 }