Jiri Simsa | d7616c9 | 2015-03-24 23:44:30 -0700 | [diff] [blame] | 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 | |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 5 | package browspr |
| 6 | |
| 7 | import ( |
| 8 | "fmt" |
| 9 | "testing" |
| 10 | |
Jiri Simsa | 1f1302c | 2015-02-23 16:18:34 -0800 | [diff] [blame] | 11 | "v.io/v23" |
| 12 | "v.io/v23/context" |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 13 | "v.io/v23/rpc" |
Jiri Simsa | 1f1302c | 2015-02-23 16:18:34 -0800 | [diff] [blame] | 14 | "v.io/v23/security" |
| 15 | "v.io/v23/vdl" |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 16 | |
Jiri Simsa | ffceefa | 2015-02-28 11:03:34 -0800 | [diff] [blame] | 17 | _ "v.io/x/ref/profiles" |
Cosmos Nicolaou | 1381f8a | 2015-03-13 09:40:34 -0700 | [diff] [blame] | 18 | "v.io/x/ref/test" |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 19 | ) |
| 20 | |
| 21 | const topLevelName = "mock-blesser" |
| 22 | |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 23 | type mockBlesserService struct { |
| 24 | p security.Principal |
| 25 | count int |
| 26 | } |
| 27 | |
| 28 | func newMockBlesserService(p security.Principal) *mockBlesserService { |
| 29 | return &mockBlesserService{ |
| 30 | p: p, |
| 31 | count: 0, |
| 32 | } |
| 33 | } |
| 34 | |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 35 | func (m *mockBlesserService) BlessUsingAccessToken(c *context.T, accessToken string, co ...rpc.CallOpt) (security.Blessings, string, error) { |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 36 | 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 Shankar | b07ec69 | 2015-02-27 23:40:44 -0800 | [diff] [blame] | 40 | return blessing, "", err |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 41 | } |
Asim Shankar | b07ec69 | 2015-02-27 23:40:44 -0800 | [diff] [blame] | 42 | return blessing, name, nil |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 43 | } |
| 44 | |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 45 | func setup(t *testing.T) (*Browspr, func()) { |
Cosmos Nicolaou | 1381f8a | 2015-03-13 09:40:34 -0700 | [diff] [blame] | 46 | ctx, shutdown := test.InitForTest() |
Suharsh Sivakumar | 94d0066 | 2015-01-21 14:31:30 -0800 | [diff] [blame] | 47 | |
Jiri Simsa | 1f1302c | 2015-02-23 16:18:34 -0800 | [diff] [blame] | 48 | spec := v23.GetListenSpec(ctx) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 49 | spec.Proxy = "/mock/proxy" |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 50 | mockPostMessage := func(_ int32, _, _ string) {} |
Suharsh Sivakumar | 94d0066 | 2015-01-21 14:31:30 -0800 | [diff] [blame] | 51 | browspr := NewBrowspr(ctx, mockPostMessage, &spec, "/mock:1234/identd", nil) |
Jiri Simsa | 1f1302c | 2015-02-23 16:18:34 -0800 | [diff] [blame] | 52 | principal := v23.GetPrincipal(browspr.ctx) |
Matt Rosencrantz | c90eb7b | 2015-01-09 08:32:01 -0800 | [diff] [blame] | 53 | browspr.accountManager.SetMockBlesser(newMockBlesserService(principal)) |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 54 | |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 55 | return browspr, func() { |
| 56 | browspr.Shutdown() |
Suharsh Sivakumar | 94d0066 | 2015-01-21 14:31:30 -0800 | [diff] [blame] | 57 | shutdown() |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 58 | } |
| 59 | } |
| 60 | |
| 61 | func TestHandleCreateAccount(t *testing.T) { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 62 | browspr, teardown := setup(t) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 63 | defer teardown() |
| 64 | |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 65 | // Verify that HandleAuthGetAccountsRpc returns empty. |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 66 | nilValue := vdl.ValueOf(GetAccountsMessage{}) |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 67 | a, err := browspr.HandleAuthGetAccountsRpc(nilValue) |
| 68 | if err != nil { |
| 69 | t.Fatal("browspr.HandleAuthGetAccountsRpc(%v) failed: %v", nilValue, err) |
| 70 | } |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 71 | if a.Len() > 0 { |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 72 | t.Fatalf("Expected accounts to be empty array but got %v", a) |
| 73 | } |
| 74 | |
| 75 | // Add one account. |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 76 | message1 := vdl.ValueOf(CreateAccountMessage{ |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 77 | Token: "mock-access-token-1", |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 78 | }) |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 79 | account1, err := browspr.HandleAuthCreateAccountRpc(message1) |
| 80 | if err != nil { |
| 81 | t.Fatalf("browspr.HandleAuthCreateAccountRpc(%v) failed: %v", message1, err) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 82 | } |
| 83 | |
| 84 | // Verify that principalManager has the new account |
Asim Shankar | 2bf7b1e | 2015-02-27 00:45:12 -0800 | [diff] [blame] | 85 | if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b.IsZero() { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 86 | t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account1, b, err) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 87 | } |
| 88 | |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 89 | // 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 Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 94 | if want := vdl.ValueOf([]string{account1.RawString()}); !vdl.EqualValue(want, gotAccounts1) { |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 95 | t.Fatalf("Expected account to be %v but got empty but got %v", want, gotAccounts1) |
| 96 | } |
| 97 | |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 98 | // Add another account |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 99 | message2 := vdl.ValueOf(CreateAccountMessage{ |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 100 | Token: "mock-access-token-2", |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 101 | }) |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 102 | account2, err := browspr.HandleAuthCreateAccountRpc(message2) |
| 103 | if err != nil { |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 104 | 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 Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 112 | if want := vdl.ValueOf([]string{account1.RawString(), account2.RawString()}); !vdl.EqualValue(want, gotAccounts2) { |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 113 | t.Fatalf("Expected account to be %v but got empty but got %v", want, gotAccounts2) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 114 | } |
| 115 | |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 116 | // Verify that principalManager has both accounts |
Asim Shankar | 2bf7b1e | 2015-02-27 00:45:12 -0800 | [diff] [blame] | 117 | if b, err := browspr.principalManager.BlessingsForAccount(account1.RawString()); err != nil || b.IsZero() { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 118 | t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account1, b, err) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 119 | } |
Asim Shankar | 2bf7b1e | 2015-02-27 00:45:12 -0800 | [diff] [blame] | 120 | if b, err := browspr.principalManager.BlessingsForAccount(account2.RawString()); err != nil || b.IsZero() { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 121 | t.Fatalf("Failed to get Blessings for account %v: got %v, %v", account2, b, err) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 122 | } |
| 123 | } |
| 124 | |
| 125 | func TestHandleAssocAccount(t *testing.T) { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 126 | browspr, teardown := setup(t) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 127 | defer teardown() |
| 128 | |
| 129 | // First create an account. |
| 130 | account := "mock-account" |
Jiri Simsa | 1f1302c | 2015-02-23 16:18:34 -0800 | [diff] [blame] | 131 | principal := v23.GetPrincipal(browspr.ctx) |
Matt Rosencrantz | c90eb7b | 2015-01-09 08:32:01 -0800 | [diff] [blame] | 132 | blessing, err := principal.BlessSelf(account) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 133 | if err != nil { |
| 134 | t.Fatalf("browspr.rt.Principal.BlessSelf(%v) failed: %v", account, err) |
| 135 | } |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 136 | if err := browspr.principalManager.AddAccount(account, blessing); err != nil { |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 137 | t.Fatalf("browspr.principalManager.AddAccount(%v, %v) failed; %v", account, blessing, err) |
| 138 | } |
| 139 | |
| 140 | origin := "https://my.webapp.com:443" |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 141 | |
| 142 | // Verify that HandleAuthOriginHasAccountRpc returns false |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 143 | hasAccountMessage := vdl.ValueOf(OriginHasAccountMessage{ |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 144 | Origin: origin, |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 145 | }) |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 146 | hasAccount, err := browspr.HandleAuthOriginHasAccountRpc(hasAccountMessage) |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 147 | if err != nil { |
| 148 | t.Fatal(err) |
| 149 | } |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 150 | if hasAccount.Bool() { |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 151 | t.Fatal("Expected browspr.HandleAuthOriginHasAccountRpc(%v) to be false but was true", hasAccountMessage) |
| 152 | } |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 153 | |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 154 | assocAccountMessage := vdl.ValueOf(AssociateAccountMessage{ |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 155 | Account: account, |
| 156 | Origin: origin, |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 157 | }) |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 158 | |
| 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 Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 168 | if !hasAccount.Bool() { |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 169 | t.Fatal("Expected browspr.HandleAuthOriginHasAccountRpc(%v) to be true but was false", hasAccountMessage) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 170 | } |
| 171 | |
| 172 | // Verify that principalManager has the correct principal for the origin |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 173 | got, err := browspr.principalManager.Principal(origin) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 174 | 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 | |
| 183 | func TestHandleAssocAccountWithMissingAccount(t *testing.T) { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 184 | browspr, teardown := setup(t) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 185 | defer teardown() |
| 186 | |
| 187 | account := "mock-account" |
| 188 | origin := "https://my.webapp.com:443" |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 189 | message := vdl.ValueOf(AssociateAccountMessage{ |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 190 | Account: account, |
| 191 | Origin: origin, |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 192 | }) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 193 | |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 194 | if _, err := browspr.HandleAuthAssociateAccountRpc(message); err == nil { |
| 195 | t.Fatalf("browspr.HandleAuthAssociateAccountRpc(%v) should have failed but did not.") |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 196 | } |
| 197 | |
| 198 | // Verify that principalManager creates no principal for the origin |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 199 | got, err := browspr.principalManager.Principal(origin) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 200 | if err == nil { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 201 | t.Fatalf("Expected browspr.principalManager.Principal(%v) to fail, but got: %v", origin, got) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 202 | } |
| 203 | |
| 204 | if got != nil { |
Nicolas LaCasse | f74ec6a | 2014-12-22 10:22:52 -0800 | [diff] [blame] | 205 | t.Fatalf("Expected browspr.principalManager.Principal(%v) not to return a principal, but got %v", origin, got) |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 206 | } |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 207 | |
| 208 | // Verify that HandleAuthOriginHasAccountRpc returns false |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 209 | hasAccountMessage := vdl.ValueOf(OriginHasAccountMessage{ |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 210 | Origin: origin, |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 211 | }) |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 212 | hasAccount, err := browspr.HandleAuthOriginHasAccountRpc(hasAccountMessage) |
| 213 | if err != nil { |
| 214 | t.Fatal(err) |
| 215 | } |
Todd Wang | 5ab0366 | 2015-02-19 21:03:01 -0800 | [diff] [blame] | 216 | if hasAccount.Bool() { |
Nicolas LaCasse | 13a4eb7 | 2015-01-26 13:39:03 -0800 | [diff] [blame] | 217 | t.Fatal("Expected browspr.HandleAuthOriginHasAccountRpc(%v) to be false but was true", hasAccountMessage) |
| 218 | } |
Benjamin Prosnitz | 10fab58 | 2014-11-11 13:28:15 -0800 | [diff] [blame] | 219 | } |