github.phpd.cn/thought-machine/please@v12.2.0+incompatible/src/core/config_test.go (about) 1 package core 2 3 import ( 4 "os" 5 "runtime" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/assert" 10 11 "cli" 12 ) 13 14 func TestPlzConfigWorking(t *testing.T) { 15 config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "") 16 assert.NoError(t, err) 17 assert.Equal(t, "pexmabob", config.Python.PexTool) 18 assert.Equal(t, "javac", config.Java.JavacTool) 19 assert.Equal(t, "jlink", config.Java.JlinkTool) 20 assert.Equal(t, "/path/to/java/home", config.Java.JavaHome) 21 assert.Equal(t, "8", config.Java.SourceLevel) 22 assert.Equal(t, "7", config.Java.TargetLevel) 23 assert.Equal(t, "10", config.Java.ReleaseLevel) 24 } 25 26 func TestPlzConfigFailing(t *testing.T) { 27 _, err := ReadConfigFiles([]string{"src/core/test_data/failing.plzconfig"}, "") 28 assert.Error(t, err) 29 } 30 31 func TestPlzConfigProfile(t *testing.T) { 32 config, err := ReadConfigFiles([]string{"src/core/test_data/working.plzconfig"}, "dev") 33 assert.NoError(t, err) 34 assert.Equal(t, "pexmabob", config.Python.PexTool) 35 assert.Equal(t, "/opt/java/bin/javac", config.Java.JavacTool) 36 assert.Equal(t, "8", config.Java.SourceLevel) 37 assert.Equal(t, "8", config.Java.TargetLevel) 38 assert.Equal(t, "10", config.Java.ReleaseLevel) 39 } 40 41 func TestMultiplePlzConfigFiles(t *testing.T) { 42 config, err := ReadConfigFiles([]string{ 43 "src/core/test_data/working.plzconfig", 44 "src/core/test_data/failing.plzconfig", 45 }, "") 46 assert.Error(t, err) 47 // Quick check of this - we should have still read the first config file correctly. 48 assert.Equal(t, "javac", config.Java.JavacTool) 49 } 50 51 func TestConfigSlicesOverwrite(t *testing.T) { 52 config, err := ReadConfigFiles([]string{"src/core/test_data/slices.plzconfig"}, "") 53 assert.NoError(t, err) 54 // This should be completely overwritten by the config file 55 assert.Equal(t, []string{"/sbin"}, config.Build.Path) 56 // This should still get the defaults. 57 assert.Equal(t, []string{"BUILD"}, config.Parse.BuildFileName) 58 } 59 60 func TestConfigOverrideString(t *testing.T) { 61 config := DefaultConfiguration() 62 err := config.ApplyOverrides(map[string]string{"python.pextool": "pexinator"}) 63 assert.NoError(t, err) 64 assert.Equal(t, "pexinator", config.Python.PexTool) 65 } 66 67 func TestConfigOverrideUppercase(t *testing.T) { 68 config := DefaultConfiguration() 69 err := config.ApplyOverrides(map[string]string{"Python.PexTool": "pexinator"}) 70 assert.NoError(t, err) 71 assert.Equal(t, "pexinator", config.Python.PexTool) 72 } 73 74 func TestConfigOverrideDuration(t *testing.T) { 75 config := DefaultConfiguration() 76 err := config.ApplyOverrides(map[string]string{"build.timeout": "15"}) 77 assert.NoError(t, err) 78 assert.EqualValues(t, 15*time.Second, config.Build.Timeout) 79 } 80 81 func TestConfigOverrideNonIntDuration(t *testing.T) { 82 config := DefaultConfiguration() 83 err := config.ApplyOverrides(map[string]string{"build.timeout": "10m"}) 84 assert.NoError(t, err) 85 assert.EqualValues(t, 10*time.Minute, config.Build.Timeout) 86 } 87 88 func TestConfigOverrideBool(t *testing.T) { 89 config := DefaultConfiguration() 90 err := config.ApplyOverrides(map[string]string{"cache.rpcwriteable": "yes"}) 91 assert.NoError(t, err) 92 assert.True(t, config.Cache.RPCWriteable) 93 } 94 95 func TestConfigOverrideSlice(t *testing.T) { 96 config := DefaultConfiguration() 97 err := config.ApplyOverrides(map[string]string{"build.path": "/mnt/bin,/mnt/sbin"}) 98 assert.NoError(t, err) 99 assert.Equal(t, []string{"/mnt/bin", "/mnt/sbin"}, config.Build.Path) 100 } 101 102 func TestConfigOverrideLabelSlice(t *testing.T) { 103 config := DefaultConfiguration() 104 err := config.ApplyOverrides(map[string]string{"gc.keep": "//src/core:core"}) 105 assert.NoError(t, err) 106 assert.Equal(t, []BuildLabel{ParseBuildLabel("//src/core:core", "")}, config.Gc.Keep) 107 } 108 109 func TestConfigOverrideURLSlice(t *testing.T) { 110 config := DefaultConfiguration() 111 err := config.ApplyOverrides(map[string]string{"java.defaultmavenrepo": "https://repo1.maven.org,https://maven.google.com"}) 112 assert.NoError(t, err) 113 assert.Equal(t, []cli.URL{"https://repo1.maven.org", "https://maven.google.com"}, config.Java.DefaultMavenRepo) 114 } 115 116 func TestConfigOverrideMap(t *testing.T) { 117 config := DefaultConfiguration() 118 err := config.ApplyOverrides(map[string]string{ 119 "buildconfig.android-keystore": "/tmp/debug.key", 120 "buildconfig.android-keystore-password": "android", 121 }) 122 assert.NoError(t, err) 123 assert.Equal(t, map[string]string{ 124 "android-keystore": "/tmp/debug.key", 125 "android-keystore-password": "android", 126 }, config.BuildConfig) 127 } 128 129 func TestConfigOverrideUnknownName(t *testing.T) { 130 config := DefaultConfiguration() 131 err := config.ApplyOverrides(map[string]string{"build.blah": "whatevs"}) 132 assert.Error(t, err) 133 } 134 135 func TestConfigOverrideURL(t *testing.T) { 136 config := DefaultConfiguration() 137 err := config.ApplyOverrides(map[string]string{"metrics.pushgatewayurl": "http://gateway:9091"}) 138 assert.NoError(t, err) 139 assert.EqualValues(t, "http://gateway:9091", config.Metrics.PushGatewayURL) 140 } 141 142 func TestConfigOverrideOptions(t *testing.T) { 143 config := DefaultConfiguration() 144 err := config.ApplyOverrides(map[string]string{"python.testrunner": "pytest"}) 145 assert.NoError(t, err) 146 assert.Equal(t, "pytest", config.Python.TestRunner) 147 err = config.ApplyOverrides(map[string]string{"python.testrunner": "junit"}) 148 assert.Error(t, err) 149 } 150 151 func TestDynamicSection(t *testing.T) { 152 config, err := ReadConfigFiles([]string{"src/core/test_data/aliases.plzconfig"}, "") 153 assert.NoError(t, err) 154 expected := map[string]string{ 155 "deploy": "run //deployment:deployer --", 156 "deploy dev": "run //deployment:deployer -- --env=dev", 157 "deploy prod": "run //deployment:deployer -- --env=prod", 158 } 159 assert.Equal(t, expected, config.Aliases) 160 } 161 162 func TestDynamicSubsection(t *testing.T) { 163 config, err := ReadConfigFiles([]string{"src/core/test_data/metrics.plzconfig"}, "") 164 assert.NoError(t, err) 165 assert.EqualValues(t, "http://localhost:9091", config.Metrics.PushGatewayURL) 166 expected := map[string]string{ 167 "branch": "git rev-parse --abbrev-ref HEAD", 168 } 169 assert.Equal(t, expected, config.CustomMetricLabels) 170 } 171 172 func TestReadSemver(t *testing.T) { 173 config, err := ReadConfigFiles([]string{"src/core/test_data/version_good.plzconfig"}, "") 174 assert.NoError(t, err) 175 assert.EqualValues(t, 2, config.Please.Version.Major) 176 assert.EqualValues(t, 3, config.Please.Version.Minor) 177 assert.EqualValues(t, 4, config.Please.Version.Patch) 178 config, err = ReadConfigFiles([]string{"src/core/test_data/version_bad.plzconfig"}, "") 179 assert.Error(t, err) 180 } 181 182 func TestReadDurations(t *testing.T) { 183 config, err := ReadConfigFiles([]string{"src/core/test_data/duration_good.plzconfig"}, "") 184 assert.NoError(t, err) 185 assert.EqualValues(t, 500*time.Millisecond, config.Metrics.PushTimeout) 186 assert.EqualValues(t, 5*time.Second, config.Metrics.PushFrequency) 187 config, err = ReadConfigFiles([]string{"src/core/test_data/duration_bad.plzconfig"}, "") 188 assert.Error(t, err) 189 } 190 191 func TestReadByteSizes(t *testing.T) { 192 config, err := ReadConfigFiles([]string{"src/core/test_data/bytesize_good.plzconfig"}, "") 193 assert.NoError(t, err) 194 assert.EqualValues(t, 500*1000*1000, config.Cache.RPCMaxMsgSize) 195 config, err = ReadConfigFiles([]string{"src/core/test_data/bytesize_bad.plzconfig"}, "") 196 assert.Error(t, err) 197 } 198 199 func TestReadContainers(t *testing.T) { 200 config, err := ReadConfigFiles([]string{"src/core/test_data/container_good.plzconfig"}, "") 201 assert.NoError(t, err) 202 assert.EqualValues(t, ContainerImplementationDocker, config.Test.DefaultContainer) 203 config, err = ReadConfigFiles([]string{"src/core/test_data/container_bad.plzconfig"}, "") 204 assert.Error(t, err) 205 } 206 207 func TestCompletions(t *testing.T) { 208 config := DefaultConfiguration() 209 completions := config.Completions("python.pip") 210 assert.Equal(t, 2, len(completions)) 211 assert.Equal(t, "python.piptool:", completions[0].Item) 212 assert.Equal(t, "python.pipflags:", completions[1].Item) 213 } 214 215 func TestConfigVerifiesOptions(t *testing.T) { 216 config, err := ReadConfigFiles([]string{"src/core/test_data/testrunner_good.plzconfig"}, "") 217 assert.NoError(t, err) 218 assert.Equal(t, "pytest", config.Python.TestRunner) 219 _, err = ReadConfigFiles([]string{"src/core/test_data/testrunner_bad.plzconfig"}, "") 220 assert.Error(t, err) 221 } 222 223 func TestBuildEnvSection(t *testing.T) { 224 config, err := ReadConfigFiles([]string{"src/core/test_data/buildenv.plzconfig"}, "") 225 assert.NoError(t, err) 226 expected := []string{ 227 "ARCH=" + runtime.GOARCH, 228 "BAR_BAR=first", 229 "FOO_BAR=second", 230 "GOARCH=" + runtime.GOARCH, 231 "GOOS=" + runtime.GOOS, 232 "OS=" + runtime.GOOS, 233 "XARCH=x86_64", 234 "XOS=" + xos(), 235 } 236 assert.Equal(t, expected, config.GetBuildEnv()) 237 } 238 239 func TestPassEnv(t *testing.T) { 240 err := os.Setenv("FOO", "first") 241 assert.NoError(t, err) 242 err = os.Setenv("BAR", "second") 243 assert.NoError(t, err) 244 config, err := ReadConfigFiles([]string{"src/core/test_data/passenv.plzconfig"}, "") 245 assert.NoError(t, err) 246 expected := []string{ 247 "ARCH=" + runtime.GOARCH, 248 "BAR=second", 249 "FOO=first", 250 "GOARCH=" + runtime.GOARCH, 251 "GOOS=" + runtime.GOOS, 252 "OS=" + runtime.GOOS, 253 "XARCH=x86_64", 254 "XOS=" + xos(), 255 } 256 assert.Equal(t, expected, config.GetBuildEnv()) 257 } 258 259 func xos() string { 260 if runtime.GOOS == "darwin" { 261 return "osx" 262 } 263 return runtime.GOOS 264 }