Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 1 | package mounttable |
| 2 | |
| 3 | import ( |
| 4 | "fmt" |
David Why Use Two When One Will Do Presotto | 55ed430 | 2014-07-30 14:50:45 -0700 | [diff] [blame] | 5 | "os" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 6 | "reflect" |
| 7 | "testing" |
| 8 | "time" |
| 9 | |
Jiri Simsa | 519c507 | 2014-09-17 21:37:57 -0700 | [diff] [blame] | 10 | "veyron.io/veyron/veyron2/naming" |
David Why Use Two When One Will Do Presotto | 9c374c2 | 2014-10-21 16:16:30 -0700 | [diff] [blame] | 11 | "veyron.io/veyron/veyron2/options" |
Jiri Simsa | 519c507 | 2014-09-17 21:37:57 -0700 | [diff] [blame] | 12 | "veyron.io/veyron/veyron2/vlog" |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 13 | |
Asim Shankar | c920db3 | 2014-10-16 19:18:21 -0700 | [diff] [blame] | 14 | "veyron.io/veyron/veyron/lib/testutil" |
Cosmos Nicolaou | d6c3c9c | 2014-09-30 15:42:53 -0700 | [diff] [blame] | 15 | "veyron.io/veyron/veyron/profiles" |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 16 | ) |
| 17 | |
Asim Shankar | c920db3 | 2014-10-16 19:18:21 -0700 | [diff] [blame] | 18 | func init() { testutil.Init() } |
| 19 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 20 | func protocolAndAddress(e naming.Endpoint) (string, string, error) { |
| 21 | addr := e.Addr() |
| 22 | if addr == nil { |
| 23 | return "", "", fmt.Errorf("failed to get address") |
| 24 | } |
| 25 | return addr.Network(), addr.String(), nil |
| 26 | } |
| 27 | |
| 28 | func TestNeighborhood(t *testing.T) { |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 29 | vlog.Infof("TestNeighborhood") |
Asim Shankar | 8829291 | 2014-10-09 19:41:07 -0700 | [diff] [blame] | 30 | server, err := rootRT.NewServer() |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 31 | if err != nil { |
| 32 | boom(t, "r.NewServer: %s", err) |
| 33 | } |
Cosmos Nicolaou | fdc838b | 2014-06-30 21:44:27 -0700 | [diff] [blame] | 34 | defer server.Stop() |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 35 | |
| 36 | // Start serving on a loopback address. |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 37 | eps, err := server.Listen(profiles.LocalListenSpec) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 38 | if err != nil { |
| 39 | boom(t, "Failed to Listen mount table: %s", err) |
| 40 | } |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 41 | estr := eps[0].String() |
Robin Thellend | 06a99de | 2014-06-25 14:31:21 -0700 | [diff] [blame] | 42 | addresses := []string{ |
| 43 | naming.JoinAddressName(estr, ""), |
| 44 | naming.JoinAddressName(estr, "suffix1"), |
| 45 | naming.JoinAddressName(estr, "suffix2"), |
| 46 | } |
David Why Use Two When One Will Do Presotto | 55ed430 | 2014-07-30 14:50:45 -0700 | [diff] [blame] | 47 | |
| 48 | // Create a name for the server. |
| 49 | serverName := fmt.Sprintf("nhtest%d", os.Getpid()) |
| 50 | |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 51 | // Add neighborhood server. |
Matt Rosencrantz | ac32b6c | 2014-12-01 15:49:18 -0800 | [diff] [blame] | 52 | nhd, err := NewLoopbackNeighborhoodServer(rootRT, serverName, addresses...) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 53 | if err != nil { |
Robin Thellend | 06a99de | 2014-06-25 14:31:21 -0700 | [diff] [blame] | 54 | boom(t, "Failed to create neighborhood server: %s\n", err) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 55 | } |
| 56 | defer nhd.Stop() |
Cosmos Nicolaou | 92dba58 | 2014-11-05 17:24:10 -0800 | [diff] [blame] | 57 | if err := server.ServeDispatcher("", nhd); err != nil { |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 58 | boom(t, "Failed to register neighborhood server: %s", err) |
| 59 | } |
| 60 | |
| 61 | // Wait for the mounttable to appear in mdns |
| 62 | L: |
| 63 | for tries := 1; tries < 2; tries++ { |
David Why Use Two When One Will Do Presotto | 9c374c2 | 2014-10-21 16:16:30 -0700 | [diff] [blame] | 64 | names := doGlob(t, estr, "", "*", rootRT) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 65 | t.Logf("names %v", names) |
| 66 | for _, n := range names { |
David Why Use Two When One Will Do Presotto | 55ed430 | 2014-07-30 14:50:45 -0700 | [diff] [blame] | 67 | if n == serverName { |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 68 | break L |
| 69 | } |
| 70 | } |
| 71 | time.Sleep(1 * time.Second) |
| 72 | } |
| 73 | |
David Why Use Two When One Will Do Presotto | 55ed430 | 2014-07-30 14:50:45 -0700 | [diff] [blame] | 74 | // Make sure we get back a root for the server. |
David Why Use Two When One Will Do Presotto | 9c374c2 | 2014-10-21 16:16:30 -0700 | [diff] [blame] | 75 | want, got := []string{""}, doGlob(t, estr, serverName, "", rootRT) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 76 | if !reflect.DeepEqual(want, got) { |
| 77 | t.Errorf("Unexpected Glob result want: %q, got: %q", want, got) |
| 78 | } |
| 79 | |
| 80 | // Make sure we can resolve through the neighborhood. |
| 81 | expectedSuffix := "a/b" |
David Why Use Two When One Will Do Presotto | 9c374c2 | 2014-10-21 16:16:30 -0700 | [diff] [blame] | 82 | ctx := rootRT.NewContext() |
| 83 | client := rootRT.Client() |
| 84 | name := naming.JoinAddressName(estr, serverName+"/"+expectedSuffix) |
| 85 | call, cerr := client.StartCall(ctx, name, "ResolveStepX", nil, options.NoResolve(true)) |
| 86 | if cerr != nil { |
| 87 | boom(t, "ResolveStepX.StartCall: %s", cerr) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 88 | } |
Todd Wang | 1aa5769 | 2014-11-11 13:53:29 -0800 | [diff] [blame] | 89 | var entry naming.VDLMountEntry |
David Why Use Two When One Will Do Presotto | 9c374c2 | 2014-10-21 16:16:30 -0700 | [diff] [blame] | 90 | if cerr = call.Finish(&entry, &err); cerr != nil { |
| 91 | boom(t, "ResolveStepX: %s", cerr) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 92 | } |
| 93 | |
| 94 | // Resolution returned something. Make sure its correct. |
David Why Use Two When One Will Do Presotto | 6f9f574 | 2014-10-20 16:27:05 -0700 | [diff] [blame] | 95 | if entry.Name != expectedSuffix { |
| 96 | boom(t, "resolveStep suffix: expected %s, got %s", expectedSuffix, entry.Name) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 97 | } |
David Why Use Two When One Will Do Presotto | 6f9f574 | 2014-10-20 16:27:05 -0700 | [diff] [blame] | 98 | if len(entry.Servers) == 0 { |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 99 | boom(t, "resolveStep returns no severs") |
| 100 | } |
Robin Thellend | 06a99de | 2014-06-25 14:31:21 -0700 | [diff] [blame] | 101 | L2: |
David Why Use Two When One Will Do Presotto | 6f9f574 | 2014-10-20 16:27:05 -0700 | [diff] [blame] | 102 | for _, s := range entry.Servers { |
Robin Thellend | 06a99de | 2014-06-25 14:31:21 -0700 | [diff] [blame] | 103 | for _, a := range addresses { |
| 104 | if a == s.Server { |
| 105 | continue L2 |
| 106 | } |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 107 | } |
Robin Thellend | 06a99de | 2014-06-25 14:31:21 -0700 | [diff] [blame] | 108 | boom(t, "Unexpected address from resolveStep result: %v", s.Server) |
| 109 | } |
| 110 | L3: |
| 111 | for _, a := range addresses { |
David Why Use Two When One Will Do Presotto | 6f9f574 | 2014-10-20 16:27:05 -0700 | [diff] [blame] | 112 | for _, s := range entry.Servers { |
Robin Thellend | 06a99de | 2014-06-25 14:31:21 -0700 | [diff] [blame] | 113 | if a == s.Server { |
| 114 | continue L3 |
| 115 | } |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 116 | } |
Robin Thellend | 06a99de | 2014-06-25 14:31:21 -0700 | [diff] [blame] | 117 | boom(t, "Missing address from resolveStep result: %v", a) |
Jiri Simsa | 5293dcb | 2014-05-10 09:56:38 -0700 | [diff] [blame] | 118 | } |
| 119 | } |