blob: 3f8d6adabb870d8a4982f63cb140a6545200c804 [file] [log] [blame]
package handlers
import (
"fmt"
"io/ioutil"
"net/http"
"net/http/httptest"
"net/url"
"reflect"
"testing"
"time"
"veyron.io/veyron/veyron/services/identity/util"
"veyron.io/veyron/veyron2/rt"
"veyron.io/veyron/veyron2/security"
)
func TestObject(t *testing.T) {
want := struct {
Int int
String string
}{1, "foo"}
ts := httptest.NewServer(Object{want})
defer ts.Close()
got, err := parseResponse(http.Get(ts.URL))
if err != nil {
t.Fatal(err)
}
if !reflect.DeepEqual(got, want) {
t.Errorf("Got %T=%#v want %T=%#v", got, got, want, want)
}
}
func TestRandom(t *testing.T) {
r, err := rt.New()
if err != nil {
t.Fatal(err)
}
defer r.Cleanup()
ts := httptest.NewServer(Random{r})
defer ts.Close()
got, err := parseResponse(http.Get(ts.URL))
if err != nil {
t.Fatal(err)
}
if id, ok := got.(security.PrivateID); !ok {
t.Fatalf("Got %T want security.PrivateID", got, id)
}
}
func TestBless(t *testing.T) {
r, err := rt.New()
if err != nil {
t.Fatal(err)
}
defer r.Cleanup()
ts := httptest.NewServer(http.HandlerFunc(Bless))
defer ts.Close()
// GET requests should succeed (render the form)
if resp, err := http.Get(ts.URL); err != nil || resp.StatusCode != http.StatusOK {
t.Errorf("Got (%+v, %v) want (200, nil)", resp, err)
}
blessor, err := r.NewIdentity("god")
if err != nil {
t.Fatal(err)
}
blessee, err := r.NewIdentity("person")
if err != nil {
t.Fatal(err)
}
bless := func(blesser security.PrivateID, blessee security.PublicID, name string) security.PublicID {
blessedID, err := blesser.Bless(blessee, name, 24*time.Hour, nil)
if err != nil {
t.Fatalf("%q.Bless(%q, %q, ...) failed: %v", blesser, blessee, name, err)
}
return blessedID
}
tests := []struct {
Blessor, Blessee interface{}
BlessingName string
ExpectedBlessedID security.PublicID
}{
{ // No field specified, bad request
Blessor: nil,
Blessee: nil,
},
{ // No blessee specified, bad request
Blessor: blessor,
Blessee: nil,
},
{ // No blessor specified, bad request
Blessor: nil,
Blessee: blessee,
},
{ // No name specified, bad request
Blessor: blessor,
Blessee: blessee,
},
{ // Blessor is a security.PublicID, bad request
Blessor: blessor.PublicID(),
Blessee: blessee,
BlessingName: "batman",
},
{ // Everything specified, blessee is a security.PrivateID. Should succeed
Blessor: blessor,
Blessee: blessee,
BlessingName: "batman",
ExpectedBlessedID: bless(blessor, blessee.PublicID(), "batman"),
},
{ // Everything specified, blessee is a security.PublicID. Should succeed
Blessor: blessor,
Blessee: blessee.PublicID(),
BlessingName: "batman",
ExpectedBlessedID: bless(blessor, blessee.PublicID(), "batman"),
},
}
for _, test := range tests {
debug := fmt.Sprintf("%q.Bless(%q, %q, ...)", test.Blessor, test.Blessee, test.BlessingName)
v := url.Values{}
if test.Blessor != nil {
v.Set("blessor", b64vomencode(test.Blessor))
} else {
v.Set("blessor", "")
}
if test.Blessee != nil {
v.Set("blessee", b64vomencode(test.Blessee))
} else {
v.Set("blessee", "")
}
v.Set("name", test.BlessingName)
res, err := http.PostForm(ts.URL, v)
if test.ExpectedBlessedID == nil {
if res.StatusCode != http.StatusBadRequest {
t.Errorf("%v: Got (%v=%v) want 400", debug, res.StatusCode, res.Status)
}
continue
}
id, err := parseResponse(res, nil)
if err != nil {
t.Errorf("%v error: %v", debug, err)
continue
}
pub, ok := id.(security.PublicID)
if !ok {
t.Errorf("%v returned %T, want security.PublicID", debug, id)
continue
}
if got, want := fmt.Sprintf("%s", pub), fmt.Sprintf("%s", test.ExpectedBlessedID); got != want {
t.Errorf("%v returned an identity %q want %q", debug, got, want)
continue
}
}
}
func parseResponse(r *http.Response, err error) (interface{}, error) {
if err != nil {
return nil, err
}
b64, err := ioutil.ReadAll(r.Body)
if err != nil {
return nil, err
}
var parsed interface{}
if err := util.Base64VomDecode(string(b64), &parsed); err != nil {
return nil, err
}
return parsed, nil
}
func b64vomencode(obj interface{}) string {
str, err := util.Base64VomEncode(obj)
if err != nil {
panic(err)
}
return str
}