| // Copyright 2015 The Vanadium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package rt_test |
| |
| import ( |
| "fmt" |
| "testing" |
| "time" |
| |
| "v.io/v23" |
| "v.io/v23/context" |
| "v.io/v23/naming" |
| "v.io/v23/rpc" |
| "v.io/x/ref/lib/stats" |
| _ "v.io/x/ref/runtime/factories/generic" |
| "v.io/x/ref/services/debug/debuglib" |
| "v.io/x/ref/test" |
| "v.io/x/ref/test/testutil" |
| ) |
| |
| type fakeServer struct{} |
| |
| func (*fakeServer) Foo(ctx *context.T, call rpc.ServerCall) error { return nil } |
| |
| func TestWithNewServer(t *testing.T) { |
| ctx, shutdown := test.V23Init() |
| defer shutdown() |
| |
| if _, s, err := v23.WithNewServer(ctx, "", &fakeServer{}, nil); err != nil || s == nil { |
| t.Fatalf("Could not create server: %v", err) |
| } |
| } |
| |
| func TestPrincipal(t *testing.T) { |
| ctx, shutdown := test.V23Init() |
| defer shutdown() |
| |
| p2 := testutil.NewPrincipal() |
| c2, err := v23.WithPrincipal(ctx, p2) |
| if err != nil { |
| t.Fatalf("Could not attach principal: %v", err) |
| } |
| if !c2.Initialized() { |
| t.Fatal("Got uninitialized context.") |
| } |
| if p2 != v23.GetPrincipal(c2) { |
| t.Fatal("The new principal should be attached to the context, but it isn't") |
| } |
| |
| // Stats should die with the context. |
| c3, cancel := context.WithCancel(ctx) |
| c3, err = v23.WithPrincipal(c3, testutil.NewPrincipal()) |
| if err != nil { |
| t.Fatal(err) |
| } |
| hasStats := func() error { |
| prefix := fmt.Sprintf("security/principal/%v", v23.GetPrincipal(c3).PublicKey()) |
| // A counter is used to generate the variable name, so try a few times. |
| for i := 0; i < 100; i++ { |
| store := fmt.Sprintf("%v/blessingstore/%d", prefix, i) |
| roots := fmt.Sprintf("%v/blessingroots/%d", prefix, i) |
| _, e1 := stats.Value(store) |
| _, e2 := stats.Value(roots) |
| if (e1 == nil) && (e2 == nil) { |
| return nil |
| } |
| } |
| return fmt.Errorf("did not find stats for blessing store and roots") |
| } |
| if err := hasStats(); err != nil { |
| t.Error(err) |
| } |
| cancel() |
| // Eventually, the stats should go away. |
| for i := 0; i < 10; i++ { |
| if err := hasStats(); err != nil { |
| break |
| } |
| time.Sleep(time.Millisecond) |
| } |
| if err := hasStats(); err == nil { |
| t.Errorf("Found blessing store and blessing roots stats even after context was killed, stats are likely holding on to a dead principal") |
| } |
| } |
| |
| func TestClient(t *testing.T) { |
| ctx, shutdown := test.V23Init() |
| defer shutdown() |
| |
| orig := v23.GetClient(ctx) |
| |
| c2, client, err := v23.WithNewClient(ctx) |
| if err != nil || client == nil { |
| t.Fatalf("Could not create client: %v", err) |
| } |
| if !c2.Initialized() { |
| t.Fatal("Got uninitialized context.") |
| } |
| if client == orig { |
| t.Fatal("Should have replaced the client but didn't") |
| } |
| if client != v23.GetClient(c2) { |
| t.Fatal("The new client should be attached to the context, but it isn't") |
| } |
| } |
| |
| func TestNamespace(t *testing.T) { |
| ctx, shutdown := test.V23Init() |
| defer shutdown() |
| |
| orig := v23.GetNamespace(ctx) |
| orig.CacheCtl(naming.DisableCache(true)) |
| |
| newroots := []string{"/newroot1", "/newroot2"} |
| c2, ns, err := v23.WithNewNamespace(ctx, newroots...) |
| if err != nil || ns == nil { |
| t.Fatalf("Could not create namespace: %v", err) |
| } |
| if !c2.Initialized() { |
| t.Fatal("Got uninitialized context.") |
| } |
| if ns == orig { |
| t.Fatal("Should have replaced the namespace but didn't") |
| } |
| if ns != v23.GetNamespace(c2) { |
| t.Fatal("The new namespace should be attached to the context, but it isn't") |
| } |
| newrootmap := map[string]bool{"/newroot1": true, "/newroot2": true} |
| for _, root := range ns.Roots() { |
| if !newrootmap[root] { |
| t.Errorf("root %s found in ns, but we expected: %v", root, newroots) |
| } |
| } |
| opts := ns.CacheCtl() |
| if len(opts) != 1 { |
| t.Fatalf("Expected one option for cache control, got %v", opts) |
| } |
| if disable, ok := opts[0].(naming.DisableCache); !ok || !bool(disable) { |
| t.Errorf("expected a disable(true) message got %#v", opts[0]) |
| } |
| } |
| |
| func TestBackgroundContext(t *testing.T) { |
| ctx, shutdown := test.V23Init() |
| defer shutdown() |
| |
| bgctx := v23.GetBackgroundContext(ctx) |
| |
| if bgctx == ctx { |
| t.Error("The background context should not be the same as the context") |
| } |
| |
| bgctx2 := v23.GetBackgroundContext(bgctx) |
| if bgctx != bgctx2 { |
| t.Error("Calling GetBackgroundContext a second time should return the same context.") |
| } |
| } |
| |
| func TestReservedNameDispatcher(t *testing.T) { |
| ctx, shutdown := test.V23Init() |
| defer shutdown() |
| |
| oldDebugDisp := v23.GetReservedNameDispatcher(ctx) |
| newDebugDisp := debuglib.NewDispatcher(nil) |
| |
| nctx := v23.WithReservedNameDispatcher(ctx, newDebugDisp) |
| debugDisp := v23.GetReservedNameDispatcher(nctx) |
| |
| if debugDisp != newDebugDisp || debugDisp == oldDebugDisp { |
| t.Error("WithNewDebugDispatcher didn't update the context properly") |
| } |
| |
| } |
| |
| func TestFlowManager(t *testing.T) { |
| ctx, shutdown := test.V23Init() |
| defer shutdown() |
| |
| oldman, err := v23.NewFlowManager(ctx, 0) |
| if err != nil || oldman == nil { |
| t.Error("NewFlowManager failed: %v, %v", oldman, err) |
| } |
| newman, err := v23.NewFlowManager(ctx, 0) |
| if err != nil || newman == nil || newman == oldman { |
| t.Fatalf("NewFlowManager failed: %v, %v", newman, err) |
| } |
| } |