blob: 4b2b6107432dedd7cb19124d48dcdf5763f2af36 [file] [log] [blame]
Jiri Simsa5293dcb2014-05-10 09:56:38 -07001package mounttable
2
3import (
4 "fmt"
David Why Use Two When One Will Do Presotto55ed4302014-07-30 14:50:45 -07005 "os"
Jiri Simsa5293dcb2014-05-10 09:56:38 -07006 "reflect"
7 "testing"
8 "time"
9
Jiri Simsa519c5072014-09-17 21:37:57 -070010 _ "veyron.io/veyron/veyron/lib/testutil"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070011
Jiri Simsa519c5072014-09-17 21:37:57 -070012 "veyron.io/veyron/veyron2"
13 "veyron.io/veyron/veyron2/naming"
14 "veyron.io/veyron/veyron2/rt"
15 "veyron.io/veyron/veyron2/services/mounttable"
16 "veyron.io/veyron/veyron2/vlog"
Jiri Simsa5293dcb2014-05-10 09:56:38 -070017)
18
19func protocolAndAddress(e naming.Endpoint) (string, string, error) {
20 addr := e.Addr()
21 if addr == nil {
22 return "", "", fmt.Errorf("failed to get address")
23 }
24 return addr.Network(), addr.String(), nil
25}
26
27func TestNeighborhood(t *testing.T) {
28 r := rt.Init()
Ankura3c97652014-07-17 20:01:21 -070029 id := veyron2.LocalID(rt.R().Identity().PublicID())
Jiri Simsa5293dcb2014-05-10 09:56:38 -070030 vlog.Infof("TestNeighborhood")
31 server, err := r.NewServer()
32 if err != nil {
33 boom(t, "r.NewServer: %s", err)
34 }
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070035 defer server.Stop()
Jiri Simsa5293dcb2014-05-10 09:56:38 -070036
37 // Start serving on a loopback address.
38 e, err := server.Listen("tcp", "127.0.0.1:0")
39 if err != nil {
40 boom(t, "Failed to Listen mount table: %s", err)
41 }
42 estr := e.String()
Robin Thellend06a99de2014-06-25 14:31:21 -070043 addresses := []string{
44 naming.JoinAddressName(estr, ""),
45 naming.JoinAddressName(estr, "suffix1"),
46 naming.JoinAddressName(estr, "suffix2"),
47 }
David Why Use Two When One Will Do Presotto55ed4302014-07-30 14:50:45 -070048
49 // Create a name for the server.
50 serverName := fmt.Sprintf("nhtest%d", os.Getpid())
51
Jiri Simsa5293dcb2014-05-10 09:56:38 -070052 // Add neighborhood server.
David Why Use Two When One Will Do Presotto55ed4302014-07-30 14:50:45 -070053 nhd, err := NewLoopbackNeighborhoodServer(serverName, addresses...)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070054 if err != nil {
Robin Thellend06a99de2014-06-25 14:31:21 -070055 boom(t, "Failed to create neighborhood server: %s\n", err)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070056 }
57 defer nhd.Stop()
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070058 if err := server.Serve("", nhd); err != nil {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070059 boom(t, "Failed to register neighborhood server: %s", err)
60 }
61
62 // Wait for the mounttable to appear in mdns
63L:
64 for tries := 1; tries < 2; tries++ {
Cosmos Nicolaoufdc838b2014-06-30 21:44:27 -070065 names := doGlob(t, naming.JoinAddressName(estr, "//"), "*", id)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070066 t.Logf("names %v", names)
67 for _, n := range names {
David Why Use Two When One Will Do Presotto55ed4302014-07-30 14:50:45 -070068 if n == serverName {
Jiri Simsa5293dcb2014-05-10 09:56:38 -070069 break L
70 }
71 }
72 time.Sleep(1 * time.Second)
73 }
74
David Why Use Two When One Will Do Presotto55ed4302014-07-30 14:50:45 -070075 // Make sure we get back a root for the server.
76 want, got := []string{""}, doGlob(t, naming.JoinAddressName(estr, "//"+serverName), "", id)
Jiri Simsa5293dcb2014-05-10 09:56:38 -070077 if !reflect.DeepEqual(want, got) {
78 t.Errorf("Unexpected Glob result want: %q, got: %q", want, got)
79 }
80
81 // Make sure we can resolve through the neighborhood.
82 expectedSuffix := "a/b"
David Why Use Two When One Will Do Presotto55ed4302014-07-30 14:50:45 -070083 objectPtr, err := mounttable.BindMountTable(naming.JoinAddressName(estr, "//"+serverName+"/"+expectedSuffix), quuxClient(id))
Jiri Simsa5293dcb2014-05-10 09:56:38 -070084 if err != nil {
85 boom(t, "BindMountTable: %s", err)
86 }
Matt Rosencrantzf5afcaf2014-06-02 11:31:22 -070087 servers, suffix, err := objectPtr.ResolveStep(r.NewContext())
Jiri Simsa5293dcb2014-05-10 09:56:38 -070088 if err != nil {
89 boom(t, "resolveStep: %s", err)
90 }
91
92 // Resolution returned something. Make sure its correct.
93 if suffix != expectedSuffix {
94 boom(t, "resolveStep suffix: expected %s, got %s", expectedSuffix, suffix)
95 }
96 if len(servers) == 0 {
97 boom(t, "resolveStep returns no severs")
98 }
Robin Thellend06a99de2014-06-25 14:31:21 -070099L2:
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700100 for _, s := range servers {
Robin Thellend06a99de2014-06-25 14:31:21 -0700101 for _, a := range addresses {
102 if a == s.Server {
103 continue L2
104 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700105 }
Robin Thellend06a99de2014-06-25 14:31:21 -0700106 boom(t, "Unexpected address from resolveStep result: %v", s.Server)
107 }
108L3:
109 for _, a := range addresses {
110 for _, s := range servers {
111 if a == s.Server {
112 continue L3
113 }
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700114 }
Robin Thellend06a99de2014-06-25 14:31:21 -0700115 boom(t, "Missing address from resolveStep result: %v", a)
Jiri Simsa5293dcb2014-05-10 09:56:38 -0700116 }
117}