Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 41 additions & 1 deletion packages/cdenv/cdenv.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
// Package cdenv contains Cloud Deploy environment variable keys.
// Package cdenv contains Cloud Deploy environment variable keys and utility functions for environment
// variables.
package cdenv

import (
"fmt"
"strings"
)

// Cloud Deploy environment variable keys.
const (
RequestTypeEnvKey = "CLOUD_DEPLOY_REQUEST_TYPE"
Expand Down Expand Up @@ -30,3 +36,37 @@ const (
CloudBuildServiceAccount = "CLOUD_DEPLOY_WP_CB_ServiceAccount"
CloudBuildWorkerPool = "CLOUD_DEPLOY_WP_CB_WorkerPool"
)

// CheckDuplicates expects environment variables in the k=v format. It
// converts the environment string slice to a map and checks for duplicates
// and malformed entries.
func CheckDuplicates(environ []string) (map[string]string, error) {
envMap := make(map[string]string)

if len(environ) == 0 {
return nil, fmt.Errorf("no environment variables found")
}

for _, envVar := range environ {
pair := strings.SplitN(envVar, "=", 2)
if len(pair) != 2 {
return nil, fmt.Errorf("incorrect env variable format - expected k=v")
}

key := pair[0]
value := pair[1]
if key == "" {
return nil, fmt.Errorf("empty environment variable key")
}

if value == "" {
return nil, fmt.Errorf("empty environment variable value")
}

if _, exists := envMap[strings.ToLower(key)]; exists {
return nil, fmt.Errorf("duplicate environment variable key: %s", key)
}
envMap[strings.ToLower(key)] = value
}
return envMap, nil
}
97 changes: 97 additions & 0 deletions packages/cdenv/cdenv_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package cdenv

import (
"testing"

"github.com/google/go-cmp/cmp"
)

func TestCheckDuplicatesValid(t *testing.T) {
tests := []struct {
name string
envVars []string
wantVars map[string]string
}{
{
name: "Valid environment variables",
envVars: []string{
"KEY1=VALUE1",
"KEY2=VALUE2",
},
wantVars: map[string]string{
"key1": "VALUE1",
"key2": "VALUE2",
},
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
vars, err := CheckDuplicates(test.envVars)
if err != nil {
t.Errorf("checkDuplicates() error = %v", err)
}
if diff := cmp.Diff(vars, test.wantVars); diff != "" {
t.Errorf("checkDuplicates() mismatch (-want +got):\n%s", diff)
}
})
}
}

func TestCheckDuplicatesInvalid(t *testing.T) {
tests := []struct {
name string
envVars []string
}{
{
name: "Empty environment variables",
envVars: []string{
"",
"",
},
},
{
name: "Duplicate environment variable with same case",
envVars: []string{
"KEY1=VALUE1",
"KEY1=VALUE2",
},
},
{
name: "Duplicate environment variable with different cases",
envVars: []string{
"KEY1=VALUE1",
"key1=VALUE2",
},
},
{
name: "Empty environment variable value",
envVars: []string{
"KEY1VALUE1=",
"KEY2=VALUE2",
},
},
{
name: "Empty environment variable key",
envVars: []string{
"=KEY1VALUE1",
"KEY2=VALUE2",
},
},
{
name: "Incorrect env variable format - expected k=v",
envVars: []string{
"KEY1VALUE1",
"KEY2=VALUE2",
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
_, err := CheckDuplicates(test.envVars)
if err == nil {
t.Errorf("checkDuplicates() error = nil, want error")
}
})
}
}