pkg/cmd/server/api/stringsource_test.go
70fd4c72
 package api
 
 import (
 	"io/ioutil"
 	"os"
 	"strings"
 	"testing"
 )
 
 var (
 	// encrypted data generated by `oadm ca encrypt`
 	// if the output of `oadm ca encrypt` changes, add additional tests,
 	// but do not modify this, to ensure we continue to decrypt these values
 	encryptedData = []byte(`-----BEGIN ENCRYPTED STRING-----
 Proc-Type: 4,ENCRYPTED
 DEK-Info: AES-256-CBC,8db8d0db237a56c8ea8d3c5c21acc5b6
 
 9JUj8ezx/3MDgiiWbnx9QA==
 -----END ENCRYPTED STRING-----`)
 
 	// encrypting key generated by `oadm ca encrypt`
 	// if the output of `oadm ca encrypt` changes, add additional tests,
 	// but do not modify this, to ensure we continue to decrypt these values
 	encryptingKey = []byte(`-----BEGIN ENCRYPTING KEY-----
 f3zQfReuhwI1BvBNglhZdjgSocKKqABwyGafHJcdORw=
 -----END ENCRYPTING KEY-----`)
 )
 
 func TestStringSource(t *testing.T) {
 	os.Setenv("TestStringSource_present_env", "envvalue")
 	os.Setenv("TestStringSource_encrypted_env", string(encryptedData))
 
 	emptyFile, err := ioutil.TempFile("", "empty_file")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer os.Remove(emptyFile.Name()) // clean up
 
 	fooFile, err := ioutil.TempFile("", "foo_file")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer os.Remove(emptyFile.Name()) // clean up
 	if err := ioutil.WriteFile(fooFile.Name(), []byte(`filevalue`), os.FileMode(0755)); err != nil {
 		t.Fatal(err)
 	}
 
 	encryptedFile, err := ioutil.TempFile("", "encrypted_file")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer os.Remove(encryptedFile.Name()) // clean up
 	if err := ioutil.WriteFile(encryptedFile.Name(), encryptedData, os.FileMode(0755)); err != nil {
 		t.Fatal(err)
 	}
 
 	validKeyFile, err := ioutil.TempFile("", "valid_key_file")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer os.Remove(validKeyFile.Name()) // clean up
 	if err := ioutil.WriteFile(validKeyFile.Name(), encryptingKey, os.FileMode(0755)); err != nil {
 		t.Fatal(err)
 	}
 
 	invalidKeyFile, err := ioutil.TempFile("", "invalid_key_file")
 	if err != nil {
 		t.Fatal(err)
 	}
 	defer os.Remove(invalidKeyFile.Name()) // clean up
 	if err := ioutil.WriteFile(invalidKeyFile.Name(), []byte(`invalid key value`), os.FileMode(0600)); err != nil {
 		t.Fatal(err)
 	}
 
 	testcases := map[string]struct {
 		StringSource  StringSource
 		ExpectedValue string
 		ExpectedError string
 	}{
 		"empty": {
 			StringSource:  StringSource{},
 			ExpectedValue: "",
 			ExpectedError: "",
 		},
 		"value": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Value: "foo"}},
 			ExpectedValue: "foo",
 			ExpectedError: "",
 		},
 		"env empty": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Env: "empty_env"}},
 			ExpectedValue: "",
 			ExpectedError: "",
 		},
 		"env present": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Env: "TestStringSource_present_env"}},
 			ExpectedValue: "envvalue",
 			ExpectedError: "",
 		},
 		"file missing": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{File: "missing_file"}},
 			ExpectedValue: "",
 			ExpectedError: "missing_file: no such file",
 		},
 		"file empty": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{File: emptyFile.Name()}},
 			ExpectedValue: "",
 			ExpectedError: "",
 		},
 		"file present": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{File: fooFile.Name()}},
 			ExpectedValue: "filevalue",
 			ExpectedError: "",
 		},
 
 		"encrypted env with missing key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Env: "TestStringSource_encrypted_env", KeyFile: "missing_key"}},
 			ExpectedValue: "",
 			ExpectedError: "missing_key: no such file",
 		},
 		"encrypted env with invalid key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Env: "TestStringSource_encrypted_env", KeyFile: invalidKeyFile.Name()}},
 			ExpectedValue: "",
 			ExpectedError: "no valid PEM block",
 		},
 		"encrypted env with valid key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Env: "TestStringSource_encrypted_env", KeyFile: validKeyFile.Name()}},
 			ExpectedValue: "encryptedvalue",
 			ExpectedError: "",
 		},
 
 		"encrypted value with missing key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Value: string(encryptedData), KeyFile: "missing_key"}},
 			ExpectedValue: "",
 			ExpectedError: "missing_key: no such file",
 		},
 		"encrypted value with invalid key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Value: string(encryptedData), KeyFile: invalidKeyFile.Name()}},
 			ExpectedValue: "",
 			ExpectedError: "no valid PEM block",
 		},
 		"encrypted value with valid key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{Value: string(encryptedData), KeyFile: validKeyFile.Name()}},
 			ExpectedValue: "encryptedvalue",
 			ExpectedError: "",
 		},
 
 		"missing encrypted file with valid key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{File: "missing_file", KeyFile: validKeyFile.Name()}},
 			ExpectedValue: "",
 			ExpectedError: "missing_file: no such file",
 		},
 		"encrypted file with missing key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{File: encryptedFile.Name(), KeyFile: "missing_key"}},
 			ExpectedValue: "",
 			ExpectedError: "missing_key: no such file",
 		},
 		"encrypted file with invalid key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{File: encryptedFile.Name(), KeyFile: invalidKeyFile.Name()}},
 			ExpectedValue: "",
 			ExpectedError: "no valid PEM block",
 		},
 		"encrypted file with valid key": {
 			StringSource:  StringSource{StringSourceSpec: StringSourceSpec{File: encryptedFile.Name(), KeyFile: validKeyFile.Name()}},
 			ExpectedValue: "encryptedvalue",
 			ExpectedError: "",
 		},
 	}
 	for k, tc := range testcases {
 		value, err := ResolveStringValue(tc.StringSource)
 
 		if len(tc.ExpectedError) > 0 && (err == nil || !strings.Contains(err.Error(), tc.ExpectedError)) {
 			t.Errorf("%s: expected error containing %q, got %q", k, tc.ExpectedError, err.Error())
 		}
 		if len(tc.ExpectedError) == 0 && err != nil {
 			t.Errorf("%s: got unexpected error: %v", k, err)
 		}
 		if tc.ExpectedValue != value {
 			t.Errorf("%s: Expected value=%q, got %q", k, tc.ExpectedValue, value)
 		}
 	}
 }