123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286 |
- package expansion
- import (
- "testing"
- api "k8s.io/kubernetes/pkg/apis/core"
- )
- func TestMapReference(t *testing.T) {
- envs := []api.EnvVar{
- {
- Name: "FOO",
- Value: "bar",
- },
- {
- Name: "ZOO",
- Value: "$(FOO)-1",
- },
- {
- Name: "BLU",
- Value: "$(ZOO)-2",
- },
- }
- declaredEnv := map[string]string{
- "FOO": "bar",
- "ZOO": "$(FOO)-1",
- "BLU": "$(ZOO)-2",
- }
- serviceEnv := map[string]string{}
- mapping := MappingFuncFor(declaredEnv, serviceEnv)
- for _, env := range envs {
- declaredEnv[env.Name] = Expand(env.Value, mapping)
- }
- expectedEnv := map[string]string{
- "FOO": "bar",
- "ZOO": "bar-1",
- "BLU": "bar-1-2",
- }
- for k, v := range expectedEnv {
- if e, a := v, declaredEnv[k]; e != a {
- t.Errorf("Expected %v, got %v", e, a)
- } else {
- delete(declaredEnv, k)
- }
- }
- if len(declaredEnv) != 0 {
- t.Errorf("Unexpected keys in declared env: %v", declaredEnv)
- }
- }
- func TestMapping(t *testing.T) {
- context := map[string]string{
- "VAR_A": "A",
- "VAR_B": "B",
- "VAR_C": "C",
- "VAR_REF": "$(VAR_A)",
- "VAR_EMPTY": "",
- }
- mapping := MappingFuncFor(context)
- doExpansionTest(t, mapping)
- }
- func TestMappingDual(t *testing.T) {
- context := map[string]string{
- "VAR_A": "A",
- "VAR_EMPTY": "",
- }
- context2 := map[string]string{
- "VAR_B": "B",
- "VAR_C": "C",
- "VAR_REF": "$(VAR_A)",
- }
- mapping := MappingFuncFor(context, context2)
- doExpansionTest(t, mapping)
- }
- func doExpansionTest(t *testing.T, mapping func(string) string) {
- cases := []struct {
- name string
- input string
- expected string
- }{
- {
- name: "whole string",
- input: "$(VAR_A)",
- expected: "A",
- },
- {
- name: "repeat",
- input: "$(VAR_A)-$(VAR_A)",
- expected: "A-A",
- },
- {
- name: "beginning",
- input: "$(VAR_A)-1",
- expected: "A-1",
- },
- {
- name: "middle",
- input: "___$(VAR_B)___",
- expected: "___B___",
- },
- {
- name: "end",
- input: "___$(VAR_C)",
- expected: "___C",
- },
- {
- name: "compound",
- input: "$(VAR_A)_$(VAR_B)_$(VAR_C)",
- expected: "A_B_C",
- },
- {
- name: "escape & expand",
- input: "$$(VAR_B)_$(VAR_A)",
- expected: "$(VAR_B)_A",
- },
- {
- name: "compound escape",
- input: "$$(VAR_A)_$$(VAR_B)",
- expected: "$(VAR_A)_$(VAR_B)",
- },
- {
- name: "mixed in escapes",
- input: "f000-$$VAR_A",
- expected: "f000-$VAR_A",
- },
- {
- name: "backslash escape ignored",
- input: "foo\\$(VAR_C)bar",
- expected: "foo\\Cbar",
- },
- {
- name: "backslash escape ignored",
- input: "foo\\\\$(VAR_C)bar",
- expected: "foo\\\\Cbar",
- },
- {
- name: "lots of backslashes",
- input: "foo\\\\\\\\$(VAR_A)bar",
- expected: "foo\\\\\\\\Abar",
- },
- {
- name: "nested var references",
- input: "$(VAR_A$(VAR_B))",
- expected: "$(VAR_A$(VAR_B))",
- },
- {
- name: "nested var references second type",
- input: "$(VAR_A$(VAR_B)",
- expected: "$(VAR_A$(VAR_B)",
- },
- {
- name: "value is a reference",
- input: "$(VAR_REF)",
- expected: "$(VAR_A)",
- },
- {
- name: "value is a reference x 2",
- input: "%%$(VAR_REF)--$(VAR_REF)%%",
- expected: "%%$(VAR_A)--$(VAR_A)%%",
- },
- {
- name: "empty var",
- input: "foo$(VAR_EMPTY)bar",
- expected: "foobar",
- },
- {
- name: "unterminated expression",
- input: "foo$(VAR_Awhoops!",
- expected: "foo$(VAR_Awhoops!",
- },
- {
- name: "expression without operator",
- input: "f00__(VAR_A)__",
- expected: "f00__(VAR_A)__",
- },
- {
- name: "shell special vars pass through",
- input: "$?_boo_$!",
- expected: "$?_boo_$!",
- },
- {
- name: "bare operators are ignored",
- input: "$VAR_A",
- expected: "$VAR_A",
- },
- {
- name: "undefined vars are passed through",
- input: "$(VAR_DNE)",
- expected: "$(VAR_DNE)",
- },
- {
- name: "multiple (even) operators, var undefined",
- input: "$$$$$$(BIG_MONEY)",
- expected: "$$$(BIG_MONEY)",
- },
- {
- name: "multiple (even) operators, var defined",
- input: "$$$$$$(VAR_A)",
- expected: "$$$(VAR_A)",
- },
- {
- name: "multiple (odd) operators, var undefined",
- input: "$$$$$$$(GOOD_ODDS)",
- expected: "$$$$(GOOD_ODDS)",
- },
- {
- name: "multiple (odd) operators, var defined",
- input: "$$$$$$$(VAR_A)",
- expected: "$$$A",
- },
- {
- name: "missing open expression",
- input: "$VAR_A)",
- expected: "$VAR_A)",
- },
- {
- name: "shell syntax ignored",
- input: "${VAR_A}",
- expected: "${VAR_A}",
- },
- {
- name: "trailing incomplete expression not consumed",
- input: "$(VAR_B)_______$(A",
- expected: "B_______$(A",
- },
- {
- name: "trailing incomplete expression, no content, is not consumed",
- input: "$(VAR_C)_______$(",
- expected: "C_______$(",
- },
- {
- name: "operator at end of input string is preserved",
- input: "$(VAR_A)foobarzab$",
- expected: "Afoobarzab$",
- },
- {
- name: "shell escaped incomplete expr",
- input: "foo-\\$(VAR_A",
- expected: "foo-\\$(VAR_A",
- },
- {
- name: "lots of $( in middle",
- input: "--$($($($($--",
- expected: "--$($($($($--",
- },
- {
- name: "lots of $( in beginning",
- input: "$($($($($--foo$(",
- expected: "$($($($($--foo$(",
- },
- {
- name: "lots of $( at end",
- input: "foo0--$($($($(",
- expected: "foo0--$($($($(",
- },
- {
- name: "escaped operators in variable names are not escaped",
- input: "$(foo$$var)",
- expected: "$(foo$$var)",
- },
- {
- name: "newline not expanded",
- input: "\n",
- expected: "\n",
- },
- }
- for _, tc := range cases {
- expanded := Expand(tc.input, mapping)
- if e, a := tc.expected, expanded; e != a {
- t.Errorf("%v: expected %q, got %q", tc.name, e, a)
- }
- }
- }
|