blob: 47830582d1b5f8e423002d76f95e5682d0166459 [file] [log] [blame]
package impl
import (
"reflect"
"testing"
iapplication "veyron/services/mgmt/application"
istore "veyron/services/store/testutil"
"veyron2/naming"
"veyron2/rt"
"veyron2/services/mgmt/application"
)
// TestInterface tests that the implementation correctly implements
// the Application interface.
func TestInterface(t *testing.T) {
runtime := rt.Init()
ctx := runtime.NewContext()
defer runtime.Shutdown()
// Setup and start the application manager server.
server, err := runtime.NewServer()
if err != nil {
t.Fatalf("NewServer() failed: %v", err)
}
// Setup and start a store server.
name, cleanup := istore.NewStore(t, server, runtime.Identity().PublicID())
defer cleanup()
dispatcher, err := NewDispatcher(name, nil)
if err != nil {
t.Fatalf("NewDispatcher() failed: %v", err)
}
suffix := ""
if err := server.Register(suffix, dispatcher); err != nil {
t.Fatalf("Register(%v, %v) failed: %v", suffix, dispatcher, err)
}
protocol, hostname := "tcp", "localhost:0"
endpoint, err := server.Listen(protocol, hostname)
if err != nil {
t.Fatalf("Listen(%v, %v) failed: %v", protocol, hostname, err)
}
// Create client stubs for talking to the server.
stub, err := iapplication.BindRepository(naming.JoinAddressName(endpoint.String(), "search"))
if err != nil {
t.Fatalf("BindRepository() failed: %v", err)
}
stubV1, err := iapplication.BindRepository(naming.JoinAddressName(endpoint.String(), "search/v1"))
if err != nil {
t.Fatalf("BindRepository() failed: %v", err)
}
stubV2, err := iapplication.BindRepository(naming.JoinAddressName(endpoint.String(), "search/v2"))
if err != nil {
t.Fatalf("BindRepository() failed: %v", err)
}
// Create example envelopes.
envelopeV1 := application.Envelope{
Args: []string{"--help"},
Env: []string{"DEBUG=1"},
Binary: "/veyron/name/of/binary",
}
envelopeV2 := application.Envelope{
Args: []string{"--verbose"},
Env: []string{"DEBUG=0"},
Binary: "/veyron/name/of/binary",
}
// Test Put(), adding a number of application envelopes.
if err := stubV1.Put(ctx, []string{"base", "media"}, envelopeV1); err != nil {
t.Fatalf("Put() failed: %v", err)
}
if err := stubV2.Put(ctx, []string{"base"}, envelopeV2); err != nil {
t.Fatalf("Put() failed: %v", err)
}
if err := stub.Put(ctx, []string{"base", "media"}, envelopeV1); err == nil || err.Error() != errInvalidSuffix.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errInvalidSuffix, err)
}
// Test Match(), trying to retrieve both existing and non-existing
// application envelopes.
var output application.Envelope
if output, err = stubV2.Match(ctx, []string{"base", "media"}); err != nil {
t.Fatalf("Match() failed: %v", err)
}
if !reflect.DeepEqual(envelopeV2, output) {
t.Fatalf("Incorrect output: expected %v, got %v", envelopeV2, output)
}
if output, err = stubV1.Match(ctx, []string{"media"}); err != nil {
t.Fatalf("Match() failed: %v", err)
}
if !reflect.DeepEqual(envelopeV1, output) {
t.Fatalf("Unexpected output: expected %v, got %v", envelopeV1, output)
}
if _, err := stubV2.Match(ctx, []string{"media"}); err == nil || err.Error() != errNotFound.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
}
if _, err := stubV2.Match(ctx, []string{}); err == nil || err.Error() != errNotFound.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
}
if _, err := stub.Match(ctx, []string{"media"}); err == nil || err.Error() != errInvalidSuffix.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errInvalidSuffix, err)
}
// Test Remove(), trying to remove both existing and non-existing
// application envelopes.
if err := stubV1.Remove(ctx, "base"); err != nil {
t.Fatalf("Remove() failed: %v", err)
}
if output, err = stubV1.Match(ctx, []string{"media"}); err != nil {
t.Fatalf("Match() failed: %v", err)
}
if err := stubV1.Remove(ctx, "base"); err == nil || err.Error() != errNotFound.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
}
if err := stub.Remove(ctx, "base"); err != nil {
t.Fatalf("Remove() failed: %v", err)
}
if err := stubV2.Remove(ctx, "media"); err == nil || err.Error() != errNotFound.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
}
if err := stubV1.Remove(ctx, "media"); err != nil {
t.Fatalf("Remove() failed: %v", err)
}
// Finally, use Match() to test that Remove really removed the
// application envelopes.
if _, err := stubV1.Match(ctx, []string{"base"}); err == nil || err.Error() != errNotFound.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
}
if _, err := stubV1.Match(ctx, []string{"media"}); err == nil || err.Error() != errNotFound.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
}
if _, err := stubV2.Match(ctx, []string{"base"}); err == nil || err.Error() != errNotFound.Error() {
t.Fatalf("Unexpected error: expected %v, got %v", errNotFound, err)
}
// Shutdown the application manager server.
if err := server.Stop(); err != nil {
t.Fatalf("Stop() failed: %v", err)
}
}