| // 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 test |
| |
| import ( |
| "flag" |
| |
| "os" |
| "os/signal" |
| "time" |
| |
| "v.io/v23" |
| "v.io/v23/context" |
| "v.io/v23/rpc" |
| "v.io/v23/security" |
| "v.io/x/ref/services/debug/debug/browseserver" |
| ) |
| |
| var debugOnShutdown = flag.String("v23.debug-address", "", |
| "If this is set then when a test runs, we start a debug browser (serving at the given address)"+ |
| " and hang so you can look at it. This only works when running a single test,"+ |
| " because you have to ctrl-c to finish the test.") |
| |
| // TODO(caprita): Instead of V23Init, should we have a test runtime factory? The |
| // problem with V23Init is that it creates a context using v23.Init, and then we |
| // edit the context to configure things like the listen spec, namespace, and |
| // principal. Would be better to set these things correctly for the test to |
| // begin with. |
| |
| // V23Init initializes the runtime and sets up the principal with a self-signed |
| // TestBlessing. The blessing setup step is skipped if this function is invoked |
| // from a v23test.Shell child process, since v23test.Shell passes credentials to |
| // its children. |
| // NOTE: For tests involving Vanadium RPCs, developers are encouraged to use |
| // V23InitWithMounttable, and have their services access each other via the |
| // mount table (rather than using endpoint strings). |
| func V23Init() (*context.T, v23.Shutdown) { |
| return internalInit(false) |
| } |
| |
| // V23InitWithMounttable initializes the runtime and: |
| // - Sets up the principal with a self-signed TestBlessing |
| // - Starts a mounttable and sets the namespace roots appropriately |
| // Both these steps are skipped if this function is invoked from a v23test.Shell |
| // child process. |
| func V23InitWithMounttable() (*context.T, v23.Shutdown) { |
| return internalInit(true) |
| } |
| |
| func debug(ctx *context.T, shutdown func()) { |
| ctx, cancel := context.WithCancel(ctx) |
| ctx, s, err := v23.WithNewServer(ctx, "", &dummyService{}, security.AllowEveryone()) |
| if err != nil { |
| panic(err) |
| } |
| eps := s.Status().Endpoints |
| |
| go func() { |
| ch := make(chan os.Signal) |
| signal.Notify(ch, os.Interrupt) |
| <-ch |
| signal.Stop(ch) |
| cancel() |
| }() |
| |
| if err := browseserver.Serve(ctx, *debugOnShutdown, eps[0].Name(), 10*time.Second, false, ""); err != nil { |
| ctx.Infof("Stopped debug server: %v", err) |
| } |
| shutdown() |
| } |
| |
| type dummyService struct{} |
| |
| func (*dummyService) Do(ctx *context.T, call rpc.ServerCall) error { |
| return nil |
| } |