github.com/vanadium-archive/go.jiri@v0.0.0-20160715023856-abfb8b131290/profiles/profilesreader/reader_test.go (about) 1 // Copyright 2015 The Vanadium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package profilesreader_test 6 7 import ( 8 "flag" 9 "fmt" 10 "path/filepath" 11 "sort" 12 "testing" 13 14 "v.io/jiri/jiritest" 15 "v.io/jiri/profiles" 16 "v.io/jiri/profiles/profilesreader" 17 "v.io/x/lib/envvar" 18 ) 19 20 func TestReader(t *testing.T) { 21 fake, cleanup := jiritest.NewFakeJiriRoot(t) 22 defer cleanup() 23 rd, err := profilesreader.NewReader(fake.X, profilesreader.UseProfiles, filepath.Join("testdata", "m2.xml")) 24 if err != nil { 25 t.Fatal(err) 26 } 27 rd.Vars = envvar.VarsFromOS() 28 rd.Delete("CGO_CFLAGS") 29 native, err := profiles.NewTarget("amd64-darwin", "") 30 if err != nil { 31 t.Fatal(err) 32 } 33 rd.MergeEnvFromProfiles(profilesreader.JiriMergePolicies(), native, "test::go", "test::syncbase") 34 if got, want := rd.Get("CGO_CFLAGS"), "-IX -IY -IA -IB"; got != want { 35 t.Errorf("got %v, want %v", got, want) 36 } 37 if got, want := rd.DebugString(), "Root: "+fake.X.Root+` 38 Path: testdata/m2.xml 39 test:go: amd64-darwin@1.5 dir: --env= envvars:[CGO_ENABLED=1 GOARCH=amd64 GOOS=darwin GOROOT=/goroot CGO_CFLAGS=-IX -IY] 40 test:syncbase: amd64-darwin@1 dir: --env= envvars:[CGO_CFLAGS=-IA -IB CGO_LDFLAGS=-LA -LB] 41 `; got != want { 42 t.Errorf("got %v, want %v", got, want) 43 } 44 } 45 46 func TestEnvFromTarget(t *testing.T) { 47 fake, cleanup := jiritest.NewFakeJiriRoot(t) 48 defer cleanup() 49 pdb := profiles.NewDB() 50 pdb.InstallProfile("test", "a", "root") 51 pdb.InstallProfile("test", "b", "root") 52 t1, t2 := &profiles.Target{}, &profiles.Target{} 53 54 t1.Set("cpu1-os1@1") 55 t1.Env.Set("A=B C=D,B=C Z=Z") 56 t2.Set("cpu1-os1@1") 57 t2.Env.Set("A=Z,B=Z,Z=Z1") 58 pdb.AddProfileTarget("test", "a", *t1) 59 pdb.AddProfileTarget("test", "b", *t2) 60 pdb.Write(fake.X, "test", "profile-manifest") 61 filename := filepath.Join(fake.X.Root, "profile-manifest") 62 if err := pdb.Write(fake.X, "test", filename); err != nil { 63 t.Fatal(err) 64 } 65 rd, err := profilesreader.NewReader(fake.X, profilesreader.UseProfiles, filename) 66 if err != nil { 67 t.Fatal(err) 68 } 69 rd.Vars = envvar.VarsFromSlice([]string{}) 70 t1Target, err := profiles.NewTarget("cpu1-os1@1", "") 71 if err != nil { 72 t.Fatal(err) 73 } 74 rd.MergeEnvFromProfiles(map[string]profilesreader.MergePolicy{ 75 "A": profilesreader.AppendFlag, 76 "B": profilesreader.UseLast, 77 "Z": profilesreader.IgnoreBaseUseLast}, 78 t1Target, "test::a", "test::b") 79 vars := rd.ToMap() 80 if got, want := len(vars), 3; got != want { 81 t.Errorf("got %v, want %v", got, want) 82 } 83 if got, want := rd.Get("A"), "B C=D Z"; got != want { 84 t.Errorf("got %v, want %v", got, want) 85 } 86 if got, want := rd.Get("B"), "Z"; got != want { 87 t.Errorf("got %v, want %v", got, want) 88 } 89 } 90 91 func TestMergeEnv(t *testing.T) { 92 base := []string{"FS1=A", "IF=A", "A=B", "B=A", "C=D", "P=A", "V=A", "P1=A", "V1=A", "IA=A", "IB=A", "IC=A", "ID=A", "IE=A", "IG1=A"} 93 b := []string{"FS1=B", "FS2=B", "IF=B", "A=B1", "B=B", "C=D1", "P=B", "V=B", "P1=B", "V1=B", "W=X", "Y=Z", "GP=X", "IA=B", "IB=B", "IC=B", "ID=B", "IE=B", "IG2=A"} 94 c := []string{"FS1=C", "FS2=C", "FS3=C", "A=BL", "B=C", "C=DL", "P=C", "V=C", "P1=C", "V1=C", "Y=ZL", "GP=XL", "IA=C", "IB=C", "IC=C", "ID=C", "IE=C", "IG3=B"} 95 env := envvar.VarsFromSlice(base) 96 97 policies := map[string]profilesreader.MergePolicy{ 98 "GP": profilesreader.UseLast, 99 "P": profilesreader.PrependPath, 100 "V": profilesreader.PrependFlag, 101 "P1": profilesreader.AppendPath, 102 "V1": profilesreader.AppendFlag, 103 "A": profilesreader.IgnoreBaseUseLast, 104 "B": profilesreader.UseBaseIgnoreProfiles, 105 "IA": profilesreader.IgnoreBaseAppendPath, 106 "IB": profilesreader.IgnoreBaseAppendFlag, 107 "IC": profilesreader.IgnoreBasePrependPath, 108 "ID": profilesreader.IgnoreBasePrependFlag, 109 "IE": profilesreader.IgnoreBaseUseLast, 110 "IF": profilesreader.IgnoreBaseUseFirst, 111 "IG1": profilesreader.IgnoreVariable, 112 "IG2": profilesreader.IgnoreVariable, 113 "IG3": profilesreader.IgnoreVariable, 114 "C": profilesreader.UseLast, 115 "Y": profilesreader.UseLast, 116 } 117 profilesreader.MergeEnv(policies, env, b, c) 118 119 expected := []string{"B=A", "A=BL", "C=DL", "GP=XL", "P1=A:B:C", "P=C:B:A", 120 "V1=A B C", "V=C B A", "W=X", "Y=ZL", 121 "IA=B:C", "IB=B C", "IC=C:B", "ID=C B", "IE=C", 122 "FS1=A", "FS2=B", "FS3=C", "IF=B", 123 } 124 sort.Strings(expected) 125 if got, want := env.ToSlice(), expected; len(got) != len(want) { 126 sort.Strings(got) 127 t.Errorf("got: %v", got) 128 t.Errorf("want: %v", want) 129 t.Errorf("got %v, want %v", len(got), len(want)) 130 } 131 for _, g := range env.ToSlice() { 132 found := false 133 for _, w := range expected { 134 if g == w { 135 found = true 136 } 137 } 138 if !found { 139 t.Errorf("failed to find %v in %v", g, expected) 140 } 141 } 142 } 143 144 func TestMergePolicyFlags(t *testing.T) { 145 mp := profilesreader.MergePolicies{} 146 fs := flag.NewFlagSet("test", flag.ContinueOnError) 147 fs.Var(mp, "p", mp.Usage()) 148 all := []string{"-p=:a", "-p=+b", "-p=^c", "-p=^:d", "-p=^e:", "-p=^+f", "-p=^g+", "-p=last*", "-p=xx:", "-p=yy+", "-p=zz^"} 149 if err := fs.Parse(all); err != nil { 150 t.Fatal(err) 151 } 152 for _, c := range []struct { 153 k string 154 p profilesreader.MergePolicy 155 }{ 156 {"a", profilesreader.AppendPath}, 157 {"b", profilesreader.AppendFlag}, 158 {"c", profilesreader.IgnoreBaseUseFirst}, 159 {"d", profilesreader.IgnoreBaseAppendPath}, 160 {"e", profilesreader.IgnoreBasePrependPath}, 161 {"f", profilesreader.IgnoreBaseAppendFlag}, 162 {"g", profilesreader.IgnoreBasePrependFlag}, 163 {"last", profilesreader.UseLast}, 164 {"xx", profilesreader.PrependPath}, 165 {"yy", profilesreader.PrependFlag}, 166 {"zz", profilesreader.UseBaseIgnoreProfiles}, 167 } { 168 if got, want := mp[c.k], c.p; got != want { 169 t.Errorf("(%s) got %v, want %v", c.k, got, want) 170 } 171 } 172 173 mp = profilesreader.MergePolicies{} 174 fs1 := flag.NewFlagSet("test1", flag.ContinueOnError) 175 fs1.Var(mp, "p", mp.Usage()) 176 if err := fs1.Parse([]string{"-p=yy+,zz^"}); err != nil { 177 t.Fatal(err) 178 } 179 if got, want := len(mp), 2; got != want { 180 t.Errorf("got %v, want %v", got, want) 181 } 182 183 for i, cl := range append(all, "-p=+b,^c,zz^") { 184 mp := profilesreader.MergePolicies{} 185 fs := flag.NewFlagSet(fmt.Sprintf("t%d", i), flag.ContinueOnError) 186 fs.Var(mp, "p", mp.Usage()) 187 err := fs.Parse([]string{cl}) 188 if err != nil { 189 t.Fatal(err) 190 } 191 if got, want := "-p="+mp.String(), cl; got != want { 192 t.Errorf("%d: got %v, want %v", i, got, want) 193 } 194 } 195 }