config/config_test.go
Rama main · réplica de lectura del repositorio original.
package config
import (
"os"
"os/exec"
testing2 "testing"
"github.com/stretchr/testify/assert"
)
func setup(t *testing2.T) func() {
return func() {
}
}
func TestNotValidStorage(t *testing2.T) {
teardown := setup(t)
defer teardown()
isValid := validateStorageMode("bag")
assert.False(t, isValid)
}
func TestValidLocalStorage(t *testing2.T) {
teardown := setup(t)
defer teardown()
isValid := validateStorageMode("local")
assert.True(t, isValid)
}
func TestNotValidEmptyBaseUrl(t *testing2.T) {
teardown := setup(t)
defer teardown()
isValid := validateBaseUrl("")
assert.False(t, isValid)
}
func TestNotValidBaseUrl(t *testing2.T) {
teardown := setup(t)
defer teardown()
isValid := validateBaseUrl("test.com")
assert.False(t, isValid)
}
func TestMissingBucketParamsForS3(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("S3_BUCKET_NAME", "")
bucketParams := validateBucketParams("s3")
assert.False(t, bucketParams)
}
func TestValidAzureStorageMode(t *testing2.T) {
teardown := setup(t)
defer teardown()
assert.True(t, validateStorageMode("azure"))
}
func TestMissingBucketParamsForAzure(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("AZURE_BLOB_CONTAINER_NAME", "")
os.Setenv("AZURE_STORAGE_ACCOUNT_NAME", "")
os.Setenv("AZURE_STORAGE_ACCOUNT_KEY", "")
assert.False(t, validateBucketParams("azure"))
os.Setenv("AZURE_BLOB_CONTAINER_NAME", "container")
os.Setenv("AZURE_STORAGE_ACCOUNT_NAME", "account")
assert.False(t, validateBucketParams("azure"), "account key must be required")
os.Setenv("AZURE_STORAGE_ACCOUNT_KEY", "key")
defer func() {
os.Unsetenv("AZURE_BLOB_CONTAINER_NAME")
os.Unsetenv("AZURE_STORAGE_ACCOUNT_NAME")
os.Unsetenv("AZURE_STORAGE_ACCOUNT_KEY")
}()
assert.True(t, validateBucketParams("azure"))
}
func TestMissingBucketParamsForLocal(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("LOCAL_BUCKET_BASE_PATH", "")
bucketParams := validateBucketParams("local")
// Should be set as ./updates by default config values
assert.True(t, bucketParams)
}
func TestValidBaseUrl(t *testing2.T) {
teardown := setup(t)
defer teardown()
isValid := validateBaseUrl("http://test.com")
assert.True(t, isValid)
}
func TestValidBaseUrlWithPath(t *testing2.T) {
assert.True(t, validateBaseUrl("https://api.example.com/ota"))
assert.True(t, validateBaseUrl("https://api.example.com/path1/path2"))
}
func TestNotValidBaseUrlWithQueryOrFragment(t *testing2.T) {
assert.False(t, validateBaseUrl("https://api.example.com/ota?foo=bar"))
assert.False(t, validateBaseUrl("https://api.example.com/ota#section"))
assert.False(t, validateBaseUrl("https://api.example.com?"))
}
func TestPublicPath(t *testing2.T) {
t.Setenv("BASE_URL", "https://ota.example.com")
assert.Equal(t, "", PublicPath())
assert.Equal(t, "/dashboard/", PublicHref("/dashboard/"))
t.Setenv("BASE_URL", "https://ota.example.com/")
assert.Equal(t, "", PublicPath())
t.Setenv("BASE_URL", "https://api.example.com/ota")
assert.Equal(t, "/ota", PublicPath())
assert.Equal(t, "/ota/dashboard/", PublicHref("/dashboard/"))
assert.Equal(t, "/ota/manifest", PublicHref("/manifest"))
t.Setenv("BASE_URL", "https://api.example.com/path1/path2/")
assert.Equal(t, "/path1/path2", PublicPath())
assert.Equal(t, "/path1/path2/dashboard", PublicHref("/dashboard"))
}
func TestNotValidConfigStorage(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("STORAGE_MODE", "bag")
os.Setenv("BASE_URL", "http://test.com")
os.Setenv("JWT_SECRET", "test")
if os.Getenv("TEST_SUBPROCESS") == "1" {
LoadConfig()
return
}
cmd := exec.Command(os.Args[0], "-test.run=TestNotValidConfig")
cmd.Env = append(os.Environ(), "TEST_SUBPROCESS=1")
err := cmd.Run()
assert.Error(t, err)
exitError, ok := err.(*exec.ExitError)
assert.True(t, ok)
assert.Equal(t, 1, exitError.ExitCode())
}
func TestValidConfig(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("STORAGE_MODE", "local")
os.Setenv("BASE_URL", "http://test.com")
os.Setenv("JWT_SECRET", "test")
os.Setenv("LOCAL_BUCKET_BASE_PATH", "./updates")
LoadConfig()
}
func TestFallbackDefaultEnv(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("STORAGE_MODE", "local")
os.Setenv("BASE_URL", "http://test.com")
os.Setenv("JWT_SECRET", "test")
os.Setenv("LOCAL_BUCKET_BASE_PATH", "")
LoadConfig()
localBucketBasePath := GetEnv("LOCAL_BUCKET_BASE_PATH")
assert.Equal(t, DefaultEnvValues["LOCAL_BUCKET_BASE_PATH"], localBucketBasePath)
}
func TestNotSetEnv(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("STORAGE_MODE", "local")
os.Setenv("BASE_URL", "http://test.com")
os.Setenv("JWT_SECRET", "test")
os.Setenv("LOCAL_BUCKET_BASE_PATH", "")
LoadConfig()
assert.Empty(t, GetEnv("NOT_FOUND"))
}
func TestAwsBaseEndpointSet(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("STORAGE_MODE", "local")
os.Setenv("BASE_URL", "http://test.com")
os.Setenv("JWT_SECRET", "test")
os.Setenv("LOCAL_BUCKET_BASE_PATH", "./updates")
expectedEndpoint := "https://test-account.r2.cloudflarestorage.com"
os.Setenv("AWS_BASE_ENDPOINT", expectedEndpoint)
LoadConfig()
actualEndpoint := GetEnv("AWS_BASE_ENDPOINT")
assert.Equal(t, expectedEndpoint, actualEndpoint)
}
func TestAwsBaseEndpointNotSet(t *testing2.T) {
teardown := setup(t)
defer teardown()
os.Setenv("STORAGE_MODE", "local")
os.Setenv("BASE_URL", "http://test.com")
os.Setenv("JWT_SECRET", "test")
os.Setenv("LOCAL_BUCKET_BASE_PATH", "./updates")
os.Unsetenv("AWS_BASE_ENDPOINT")
LoadConfig()
endpoint := GetEnv("AWS_BASE_ENDPOINT")
assert.Equal(t, DefaultEnvValues["AWS_BASE_ENDPOINT"], endpoint)
assert.Empty(t, endpoint)
}
func TestTestMode(t *testing2.T) {
teardown := setup(t)
defer teardown()
testMode := IsTestMode()
assert.True(t, testMode)
}
// The switch is off unless the operator says otherwise, and a value that is
// not a boolean is not a way to turn collection off by accident.
func TestDeviceTelemetryDisabled(t *testing2.T) {
teardown := setup(t)
defer teardown()
for value, expected := range map[string]bool{
"": false,
"false": false,
"0": false,
"maybe": false,
"true": true,
"1": true,
"TRUE": true,
} {
t.Setenv("DISABLE_DEVICE_TELEMETRY", value)
assert.Equal(t, expected, IsDeviceTelemetryDisabled(), "DISABLE_DEVICE_TELEMETRY=%q", value)
}
}
func TestPreventCDNRedirectionHeaderEnabled(t *testing2.T) {
teardown := setup(t)
defer teardown()
for value, expected := range map[string]bool{
"": false,
"false": false,
"maybe": false,
"true": true,
"1": true,
"TRUE": true,
} {
t.Setenv("ENABLE_PREVENT_CDN_REDIRECTION_HEADER", value)
assert.Equal(t, expected, IsPreventCDNRedirectionHeaderEnabled(), "ENABLE_PREVENT_CDN_REDIRECTION_HEADER=%q", value)
}
}
func TestGetBindAddress(t *testing2.T) {
teardown := setup(t)
defer teardown()
for value, expected := range map[string]string{
"": "0.0.0.0",
"127.0.0.1": "127.0.0.1",
"::1": "::1",
} {
t.Setenv("BIND_TO_ADDRESS", value)
assert.Equal(t, expected, GetBindAddress(), "BIND_TO_ADDRESS=%q", value)
}
}
func TestGetBindAddressInvalid(t *testing2.T) {
teardown := setup(t)
defer teardown()
if os.Getenv("TEST_SUBPROCESS") == "1" {
GetBindAddress()
return
}
cmd := exec.Command(os.Args[0], "-test.run=^TestGetBindAddressInvalid$")
cmd.Env = append(os.Environ(), "TEST_SUBPROCESS=1", "BIND_TO_ADDRESS=invalid")
err := cmd.Run()
assert.Error(t, err, "an invalid BIND_TO_ADDRESS must abort the process")
exitError, ok := err.(*exec.ExitError)
assert.True(t, ok)
assert.Equal(t, 1, exitError.ExitCode())
}