blob: cb1832e5ab0e453b0d127f2655d95e07d4d0af57 [file] [log] [blame]
Jiri Simsa5293dcb2014-05-10 09:56:38 -07001package rt_test
2
3import (
4 "fmt"
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -07005 "io"
Ankur7c890592014-10-02 11:36:28 -07006 "io/ioutil"
Jiri Simsa5293dcb2014-05-10 09:56:38 -07007 "os"
Ankur7c890592014-10-02 11:36:28 -07008 "reflect"
Jiri Simsa5293dcb2014-05-10 09:56:38 -07009 "regexp"
10 "testing"
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070011 "time"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070012
Ankur7c890592014-10-02 11:36:28 -070013 "veyron.io/veyron/veyron2"
14 "veyron.io/veyron/veyron2/naming"
Asim Shankarcc044212014-10-15 23:25:26 -070015 "veyron.io/veyron/veyron2/options"
Jiri Simsa519c5072014-09-17 21:37:57 -070016 "veyron.io/veyron/veyron2/rt"
Ankur7c890592014-10-02 11:36:28 -070017 "veyron.io/veyron/veyron2/security"
Jiri Simsa519c5072014-09-17 21:37:57 -070018 "veyron.io/veyron/veyron2/vlog"
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070019
20 "veyron.io/veyron/veyron/lib/expect"
21 "veyron.io/veyron/veyron/lib/modules"
Asim Shankarc920db32014-10-16 19:18:21 -070022 "veyron.io/veyron/veyron/lib/testutil"
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070023 irt "veyron.io/veyron/veyron/runtimes/google/rt"
Ankur0e4aead2014-10-14 18:50:37 -070024 vsecurity "veyron.io/veyron/veyron/security"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070025)
26
Ankur7c890592014-10-02 11:36:28 -070027type context struct {
28 local security.Principal
29}
30
31func (*context) Method() string { return "" }
32func (*context) Name() string { return "" }
33func (*context) Suffix() string { return "" }
34func (*context) Label() (l security.Label) { return }
35func (*context) Discharges() map[string]security.Discharge { return nil }
36func (*context) LocalID() security.PublicID { return nil }
37func (*context) RemoteID() security.PublicID { return nil }
38func (c *context) LocalPrincipal() security.Principal { return c.local }
39func (*context) LocalBlessings() security.Blessings { return nil }
40func (*context) RemoteBlessings() security.Blessings { return nil }
41func (*context) LocalEndpoint() naming.Endpoint { return nil }
42func (*context) RemoteEndpoint() naming.Endpoint { return nil }
43
Jiri Simsa5293dcb2014-05-10 09:56:38 -070044func init() {
Asim Shankarc920db32014-10-16 19:18:21 -070045 testutil.Init()
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070046 modules.RegisterChild("child", "", child)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070047}
48
49func TestHelperProcess(t *testing.T) {
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070050 modules.DispatchInTest()
Jiri Simsa5293dcb2014-05-10 09:56:38 -070051}
52
53func TestInit(t *testing.T) {
Cosmos Nicolaouf889c732014-10-16 20:46:54 -070054 r, err := rt.New(profileOpt)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070055 if err != nil {
56 t.Fatalf("error: %s", err)
57 }
58 l := r.Logger()
59 args := fmt.Sprintf("%s", l)
60 expected := regexp.MustCompile("name=veyron logdirs=\\[/tmp\\] logtostderr=true|false alsologtostderr=false|true max_stack_buf_size=4292608 v=[0-9] stderrthreshold=2 vmodule= log_backtrace_at=:0")
61 if !expected.MatchString(args) {
62 t.Errorf("unexpected default args: %q", args)
63 }
64 if id := r.Identity().PublicID(); id == nil || len(id.Names()) == 0 || len(id.Names()[0]) == 0 {
65 t.Errorf("New should have created an identity. Created %v", id)
66 }
67}
68
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070069func child(stdin io.Reader, stdout, stderr io.Writer, env map[string]string, args ...string) error {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070070 r := rt.Init()
71 vlog.Infof("%s\n", r.Logger())
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070072 fmt.Fprintf(stdout, "%s\n", r.Logger())
73 modules.WaitForEOF(stdin)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070074 fmt.Printf("done\n")
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070075 return nil
Jiri Simsa5293dcb2014-05-10 09:56:38 -070076}
77
78func TestInitArgs(t *testing.T) {
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070079 sh := modules.NewShell("child")
80 defer sh.Cleanup(os.Stderr, os.Stderr)
Cosmos Nicolaou612ad382014-10-29 19:41:35 -070081 h, err := sh.Start("child", nil, "--logtostderr=true", "--vv=3", "--", "foobar")
Jiri Simsa5293dcb2014-05-10 09:56:38 -070082 if err != nil {
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070083 t.Fatalf("unexpected error: %s", err)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070084 }
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070085 s := expect.NewSession(t, h.Stdout(), time.Minute)
86 s.Expect(fmt.Sprintf("name=veyron "+
Jiri Simsa5293dcb2014-05-10 09:56:38 -070087 "logdirs=[%s] "+
88 "logtostderr=true "+
89 "alsologtostderr=true "+
90 "max_stack_buf_size=4292608 "+
91 "v=3 "+
92 "stderrthreshold=2 "+
93 "vmodule= "+
94 "log_backtrace_at=:0",
Cosmos Nicolaou59496fe2014-10-14 11:21:05 -070095 os.TempDir()))
96 h.CloseStdin()
97 s.Expect("done")
98 s.ExpectEOF()
99 h.Shutdown(os.Stderr, os.Stderr)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700100}
Ankur7c890592014-10-02 11:36:28 -0700101
102func TestInitPrincipal(t *testing.T) {
103 newRT := func() veyron2.Runtime {
Cosmos Nicolaouf889c732014-10-16 20:46:54 -0700104 r, err := rt.New(profileOpt)
Ankur7c890592014-10-02 11:36:28 -0700105 if err != nil {
106 t.Fatalf("rt.New failed: %v", err)
107 }
108 return r
109 }
110 testPrincipal := func(r veyron2.Runtime) security.Principal {
111 p := r.Principal()
112 if p == nil {
113 t.Fatalf("rt.Principal() returned nil")
114 }
115 blessings := p.BlessingStore().Default()
116 if blessings == nil {
117 t.Fatalf("rt.Principal().BlessingStore().Default() returned nil")
118
119 }
120 if n := len(blessings.ForContext(&context{local: p})); n != 1 {
121 t.Fatalf("rt.Principal().BlessingStore().Default() returned Blessing %v with %d recognized blessings, want exactly one recognized blessing", blessings, n)
122 }
123 return p
124 }
125 origCredentialsDir := os.Getenv(irt.VeyronCredentialsEnvVar)
126 defer os.Setenv(irt.VeyronCredentialsEnvVar, origCredentialsDir)
127
128 // Test that even with VEYRON_CREDENTIALS unset the runtime's Principal
129 // is correctly initialized.
130 if err := os.Setenv(irt.VeyronCredentialsEnvVar, ""); err != nil {
131 t.Fatal(err)
132 }
133 testPrincipal(newRT())
134
135 // Test that with VEYRON_CREDENTIALS set the runtime's Principal is correctly
136 // initialized.
137 credentials, err := ioutil.TempDir("", "credentials")
138 if err != nil {
139 t.Fatal(err)
140 }
141 defer os.RemoveAll(credentials)
142 if err := os.Setenv(irt.VeyronCredentialsEnvVar, credentials); err != nil {
143 t.Fatal(err)
144 }
145 p := testPrincipal(newRT())
146
147 // Mutate the roots and store of this principal.
148 blessing, err := p.BlessSelf("irrelevant")
149 if err != nil {
150 t.Fatal(err)
151 }
Asim Shankar48bf0e62014-10-03 16:27:05 -0700152 if _, err := p.BlessingStore().Set(blessing, security.AllPrincipals); err != nil {
Ankur7c890592014-10-02 11:36:28 -0700153 t.Fatal(err)
154 }
155 if err := p.AddToRoots(blessing); err != nil {
156 t.Fatal(err)
157 }
158
159 // Test that the same principal gets initialized on creating a new runtime
160 // from the same credentials directory.
161 if got := newRT().Principal(); !reflect.DeepEqual(got, p) {
Asim Shankarae8d4c52014-10-08 13:03:31 -0700162 t.Fatalf("Initialized Principal: %v, expected: %v", got.PublicKey(), p.PublicKey())
Ankur7c890592014-10-02 11:36:28 -0700163 }
164}
Ankur0e4aead2014-10-14 18:50:37 -0700165
166func TestInitPrincipalFromOption(t *testing.T) {
167 p, err := vsecurity.NewPrincipal()
168 if err != nil {
169 t.Fatalf("NewPrincipal() failed: %v", err)
170 }
Cosmos Nicolaouf889c732014-10-16 20:46:54 -0700171 r, err := rt.New(profileOpt, options.RuntimePrincipal{p})
Ankur0e4aead2014-10-14 18:50:37 -0700172 if err != nil {
173 t.Fatalf("rt.New failed: %v", err)
174 }
175
176 if got := r.Principal(); !reflect.DeepEqual(got, p) {
177 t.Fatalf("r.Principal(): got %v, want %v", got, p)
178 }
179}