blob: a5390f56431570a899b3e37194f002f3c8c35c1f [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// 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
Benjamin Prosnitz10fab582014-11-11 13:28:15 -08005package browspr
6
7import (
8 "fmt"
9 "testing"
10
Jiri Simsa1f1302c2015-02-23 16:18:34 -080011 "v.io/v23"
12 "v.io/v23/context"
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070013 "v.io/v23/rpc"
Jiri Simsa1f1302c2015-02-23 16:18:34 -080014 "v.io/v23/security"
15 "v.io/v23/vdl"
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080016
Jiri Simsaffceefa2015-02-28 11:03:34 -080017 _ "v.io/x/ref/profiles"
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070018 "v.io/x/ref/test"
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080019)
20
21const topLevelName = "mock-blesser"
22
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080023type mockBlesserService struct {
24 p security.Principal
25 count int
26}
27
28func newMockBlesserService(p security.Principal) *mockBlesserService {
29 return &mockBlesserService{
30 p: p,
31 count: 0,
32 }
33}
34
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070035func (m *mockBlesserService) BlessUsingAccessToken(c *context.T, accessToken string, co ...rpc.CallOpt) (security.Blessings, string, error) {
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080036 m.count++
37 name := fmt.Sprintf("%s%s%d", topLevelName, security.ChainSeparator, m.count)
38 blessing, err := m.p.BlessSelf(name)
39 if err != nil {
Asim Shankarb07ec692015-02-27 23:40:44 -080040 return blessing, "", err
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080041 }
Asim Shankarb07ec692015-02-27 23:40:44 -080042 return blessing, name, nil
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080043}
44
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080045func setup(t *testing.T) (*Browspr, func()) {
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070046 ctx, shutdown := test.InitForTest()
Suharsh Sivakumar94d00662015-01-21 14:31:30 -080047
Jiri Simsa1f1302c2015-02-23 16:18:34 -080048 spec := v23.GetListenSpec(ctx)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080049 spec.Proxy = "/mock/proxy"
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080050 mockPostMessage := func(_ int32, _, _ string) {}
Suharsh Sivakumar94d00662015-01-21 14:31:30 -080051 browspr := NewBrowspr(ctx, mockPostMessage, &spec, "/mock:1234/identd", nil)
Jiri Simsa1f1302c2015-02-23 16:18:34 -080052 principal := v23.GetPrincipal(browspr.ctx)
Matt Rosencrantzc90eb7b2015-01-09 08:32:01 -080053 browspr.accountManager.SetMockBlesser(newMockBlesserService(principal))
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080054
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080055 return browspr, func() {
56 browspr.Shutdown()
Suharsh Sivakumar94d00662015-01-21 14:31:30 -080057 shutdown()
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080058 }
59}
60
61func TestHandleCreateAccount(t *testing.T) {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080062 browspr, teardown := setup(t)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080063 defer teardown()
64
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -080065 // Verify that HandleAuthGetAccountsRpc returns empty.
Todd Wang5ab03662015-02-19 21:03:01 -080066 nilValue := vdl.ValueOf(GetAccountsMessage{})
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -080067 a, err := browspr.HandleAuthGetAccountsRpc(nilValue)
68 if err != nil {
69 t.Fatal("browspr.HandleAuthGetAccountsRpc(%v) failed: %v", nilValue, err)
70 }
Todd Wang5ab03662015-02-19 21:03:01 -080071 if a.Len() > 0 {
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -080072 t.Fatalf("Expected accounts to be empty array but got %v", a)
73 }
74
75 // Add one account.
Todd Wang5ab03662015-02-19 21:03:01 -080076 message1 := vdl.ValueOf(CreateAccountMessage{
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080077 Token: "mock-access-token-1",
Todd Wang5ab03662015-02-19 21:03:01 -080078 })
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080079 account1, err := browspr.HandleAuthCreateAccountRpc(message1)
80 if err != nil {
81 t.Fatalf("browspr.HandleAuthCreateAccountRpc(%v) failed: %v", message1, err)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080082 }
83
84 // Verify that principalManager has the new account
Asim Shankar2bf7b1e2015-02-27 00:45:12 -080085 if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b.IsZero() {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080086 t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account1, b, err)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -080087 }
88
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -080089 // Verify that HandleAuthGetAccountsRpc returns the new account.
90 gotAccounts1, err := browspr.HandleAuthGetAccountsRpc(nilValue)
91 if err != nil {
92 t.Fatal("browspr.HandleAuthGetAccountsRpc(%v) failed: %v", nilValue, err)
93 }
Todd Wang5ab03662015-02-19 21:03:01 -080094 if want := vdl.ValueOf([]string{account1.RawString()}); !vdl.EqualValue(want, gotAccounts1) {
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -080095 t.Fatalf("Expected account to be %v but got empty but got %v", want, gotAccounts1)
96 }
97
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -080098 // Add another account
Todd Wang5ab03662015-02-19 21:03:01 -080099 message2 := vdl.ValueOf(CreateAccountMessage{
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800100 Token: "mock-access-token-2",
Todd Wang5ab03662015-02-19 21:03:01 -0800101 })
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800102 account2, err := browspr.HandleAuthCreateAccountRpc(message2)
103 if err != nil {
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800104 t.Fatalf("browspr.HandleAuthCreateAccountsRpc(%v) failed: %v", message2, err)
105 }
106
107 // Verify that HandleAuthGetAccountsRpc returns the new account.
108 gotAccounts2, err := browspr.HandleAuthGetAccountsRpc(nilValue)
109 if err != nil {
110 t.Fatal("browspr.HandleAuthGetAccountsRpc(%v) failed: %v", nilValue, err)
111 }
Todd Wang5ab03662015-02-19 21:03:01 -0800112 if want := vdl.ValueOf([]string{account1.RawString(), account2.RawString()}); !vdl.EqualValue(want, gotAccounts2) {
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800113 t.Fatalf("Expected account to be %v but got empty but got %v", want, gotAccounts2)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800114 }
115
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800116 // Verify that principalManager has both accounts
Asim Shankar2bf7b1e2015-02-27 00:45:12 -0800117 if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b.IsZero() {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800118 t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account1, b, err)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800119 }
Asim Shankar2bf7b1e2015-02-27 00:45:12 -0800120 if b, err := browspr.principalManager.BlessingsForAccount(account2.RawString()); err != nil || b.IsZero() {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800121 t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account2, b, err)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800122 }
123}
124
125func TestHandleAssocAccount(t *testing.T) {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800126 browspr, teardown := setup(t)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800127 defer teardown()
128
129 // First create an account.
130 account := "mock-account"
Jiri Simsa1f1302c2015-02-23 16:18:34 -0800131 principal := v23.GetPrincipal(browspr.ctx)
Matt Rosencrantzc90eb7b2015-01-09 08:32:01 -0800132 blessing, err := principal.BlessSelf(account)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800133 if err != nil {
134 t.Fatalf("browspr.rt.Principal.BlessSelf(%v) failed: %v", account, err)
135 }
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800136 if err := browspr.principalManager.AddAccount(account, blessing); err != nil {
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800137 t.Fatalf("browspr.principalManager.AddAccount(%v, %v) failed; %v", account, blessing, err)
138 }
139
140 origin := "https://my.webapp.com:443"
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800141
142 // Verify that HandleAuthOriginHasAccountRpc returns false
Todd Wang5ab03662015-02-19 21:03:01 -0800143 hasAccountMessage := vdl.ValueOf(OriginHasAccountMessage{
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800144 Origin: origin,
Todd Wang5ab03662015-02-19 21:03:01 -0800145 })
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800146 hasAccount, err := browspr.HandleAuthOriginHasAccountRpc(hasAccountMessage)
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800147 if err != nil {
148 t.Fatal(err)
149 }
Todd Wang5ab03662015-02-19 21:03:01 -0800150 if hasAccount.Bool() {
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800151 t.Fatal("Expected browspr.HandleAuthOriginHasAccountRpc(%v) to be false but was true", hasAccountMessage)
152 }
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800153
Todd Wang5ab03662015-02-19 21:03:01 -0800154 assocAccountMessage := vdl.ValueOf(AssociateAccountMessage{
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800155 Account: account,
156 Origin: origin,
Todd Wang5ab03662015-02-19 21:03:01 -0800157 })
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800158
159 if _, err := browspr.HandleAuthAssociateAccountRpc(assocAccountMessage); err != nil {
160 t.Fatalf("browspr.HandleAuthAssociateAccountRpc(%v) failed: %v", assocAccountMessage, err)
161 }
162
163 // Verify that HandleAuthOriginHasAccountRpc returns true
164 hasAccount, err = browspr.HandleAuthOriginHasAccountRpc(hasAccountMessage)
165 if err != nil {
166 t.Fatal(err)
167 }
Todd Wang5ab03662015-02-19 21:03:01 -0800168 if !hasAccount.Bool() {
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800169 t.Fatal("Expected browspr.HandleAuthOriginHasAccountRpc(%v) to be true but was false", hasAccountMessage)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800170 }
171
172 // Verify that principalManager has the correct principal for the origin
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800173 got, err := browspr.principalManager.Principal(origin)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800174 if err != nil {
175 t.Fatalf("browspr.principalManager.Principal(%v) failed: %v", origin, err)
176 }
177
178 if got == nil {
179 t.Fatalf("Expected browspr.principalManager.Principal(%v) to return a valid principal, but got %v", origin, got)
180 }
181}
182
183func TestHandleAssocAccountWithMissingAccount(t *testing.T) {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800184 browspr, teardown := setup(t)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800185 defer teardown()
186
187 account := "mock-account"
188 origin := "https://my.webapp.com:443"
Todd Wang5ab03662015-02-19 21:03:01 -0800189 message := vdl.ValueOf(AssociateAccountMessage{
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800190 Account: account,
191 Origin: origin,
Todd Wang5ab03662015-02-19 21:03:01 -0800192 })
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800193
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800194 if _, err := browspr.HandleAuthAssociateAccountRpc(message); err == nil {
195 t.Fatalf("browspr.HandleAuthAssociateAccountRpc(%v) should have failed but did not.")
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800196 }
197
198 // Verify that principalManager creates no principal for the origin
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800199 got, err := browspr.principalManager.Principal(origin)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800200 if err == nil {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800201 t.Fatalf("Expected browspr.principalManager.Principal(%v) to fail, but got: %v", origin, got)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800202 }
203
204 if got != nil {
Nicolas LaCassef74ec6a2014-12-22 10:22:52 -0800205 t.Fatalf("Expected browspr.principalManager.Principal(%v) not to return a principal, but got %v", origin, got)
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800206 }
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800207
208 // Verify that HandleAuthOriginHasAccountRpc returns false
Todd Wang5ab03662015-02-19 21:03:01 -0800209 hasAccountMessage := vdl.ValueOf(OriginHasAccountMessage{
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800210 Origin: origin,
Todd Wang5ab03662015-02-19 21:03:01 -0800211 })
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800212 hasAccount, err := browspr.HandleAuthOriginHasAccountRpc(hasAccountMessage)
213 if err != nil {
214 t.Fatal(err)
215 }
Todd Wang5ab03662015-02-19 21:03:01 -0800216 if hasAccount.Bool() {
Nicolas LaCasse13a4eb72015-01-26 13:39:03 -0800217 t.Fatal("Expected browspr.HandleAuthOriginHasAccountRpc(%v) to be false but was true", hasAccountMessage)
218 }
Benjamin Prosnitz10fab582014-11-11 13:28:15 -0800219}