blob: f1205a7abd9fc7a14543a96540278fa92da341b2 [file] [log] [blame]
package identity
import (
"net/url"
"reflect"
"sort"
"strings"
"testing"
"time"
"veyron2"
"veyron2/rt"
"veyron2/security"
)
func createChain(r veyron2.Runtime, name string) security.PrivateID {
id := r.Identity()
for _, component := range strings.Split(name, "/") {
newID, err := r.NewIdentity(component)
if err != nil {
panic(err)
}
if id == nil {
id = newID
continue
}
blessedID, err := id.Bless(newID.PublicID(), component, time.Hour, nil)
if err != nil {
panic(err)
}
id, err = newID.Derive(blessedID)
if err != nil {
panic(err)
}
}
return id
}
func TestSavingAndFetchingIdentity(t *testing.T) {
r := rt.Init()
manager, err := NewIDManager(r, &InMemorySerializer{})
if err != nil {
t.Fatalf("creating identity manager failed with: %v", err)
}
origin := "http://sampleapp.com:80"
account := "google/user1"
manager.AddAccount(account, createChain(r, account))
if err := manager.AddOrigin(origin, account, nil); err != nil {
t.Fatalf("failed to generate id: %v", err)
}
id, err := manager.Identity(origin)
if err != nil {
t.Errorf("failed to get an identity for %v: %v", origin, err)
}
want := []string{createChain(r, account).PublicID().Names()[0] + "/" + url.QueryEscape(origin)}
if got := id.PublicID().Names(); !reflect.DeepEqual(got, want) {
t.Errorf("unexpected identity name. got: %v, wanted: %v", got, want)
}
unknownOrigin := "http://unknown.com:80"
if _, err := manager.Identity(unknownOrigin); err != OriginDoesNotExist {
t.Error("should not have found an identity for %v", unknownOrigin)
}
}
func TestAccountsMatching(t *testing.T) {
r := rt.Init()
topLevelName := r.Identity().PublicID().Names()[0]
manager, err := NewIDManager(r, &InMemorySerializer{})
if err != nil {
t.Fatalf("creating identity manager failed with: %v", err)
}
googleAccount1 := "google/user1"
googleAccount2 := "google/user2"
facebookAccount := "facebook/user1"
manager.AddAccount(googleAccount1, createChain(r, googleAccount1))
manager.AddAccount(googleAccount2, createChain(r, googleAccount2))
manager.AddAccount(facebookAccount, createChain(r, facebookAccount))
result := manager.AccountsMatching(security.BlessingPattern(topLevelName + "/google/..."))
sort.StringSlice(result).Sort()
expected := []string{googleAccount1, googleAccount2}
if !reflect.DeepEqual(result, expected) {
t.Errorf("unexpected result from AccountsMatching, expected :%v, got: %v", expected, result)
}
}
func TestGenerateIDWithUnknownBlesser(t *testing.T) {
r := rt.Init()
manager, err := NewIDManager(r, &InMemorySerializer{})
if err != nil {
t.Fatalf("creating identity manager failed with: %v", err)
}
err = manager.AddOrigin("http://sampleapp.com:80", "google/user1", nil)
if err == nil {
t.Errorf("should have failed to generated an id blessed by google/user1")
}
}
func TestSerializingAndDeserializing(t *testing.T) {
r := rt.Init()
var serializer InMemorySerializer
manager, err := NewIDManager(r, &serializer)
if err != nil {
t.Fatalf("creating identity manager failed with: %v", err)
}
manager.AddAccount("google/user1", createChain(r, "google/user1"))
origin1 := "https://sampleapp-1.com:443"
account := "google/user1"
if err = manager.AddOrigin(origin1, account, nil); err != nil {
t.Fatalf("failed to generate id: %v", err)
}
newManager, err := NewIDManager(r, &serializer)
if err != nil {
t.Fatalf("failed to deserialize data: %v", err)
}
id, err := newManager.Identity(origin1)
if err != nil {
t.Errorf("can't find the %v identity: %v", origin1, err)
}
want := []string{createChain(r, account).PublicID().Names()[0] + "/" + url.QueryEscape(origin1)}
if got := id.PublicID().Names(); !reflect.DeepEqual(got, want) {
t.Errorf("unexpected identity name. got: %v, wanted: %v", got, want)
}
origin2 := "https://sampleapp-2.com:443"
if err := newManager.AddOrigin(origin2, account, nil); err != nil {
t.Errorf("can't find the %v identity: %v", origin2, err)
}
}