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  }