Jiri Simsa | d7616c9 | 2015-03-24 23:44:30 -0700 | [diff] [blame] | 1 | // Copyright 2015 The Vanadium Authors. All rights reserved. |
| 2 | // Use of this source code is governed by a BSD-style |
| 3 | // license that can be found in the LICENSE file. |
| 4 | |
Suharsh Sivakumar | cbfe474 | 2015-03-11 14:54:22 -0700 | [diff] [blame] | 5 | package test |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 6 | |
| 7 | import ( |
| 8 | "fmt" |
| 9 | "reflect" |
| 10 | "testing" |
| 11 | |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 12 | "v.io/v23" |
| 13 | "v.io/v23/context" |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 14 | "v.io/v23/naming" |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 15 | "v.io/v23/rpc" |
| 16 | "v.io/v23/rpc/reserved" |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 17 | "v.io/v23/vdl" |
Todd Wang | 751c039 | 2015-02-25 01:54:42 -0800 | [diff] [blame] | 18 | "v.io/v23/vdlroot/signature" |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 19 | |
Jiri Simsa | ffceefa | 2015-02-28 11:03:34 -0800 | [diff] [blame] | 20 | _ "v.io/x/ref/profiles" |
Cosmos Nicolaou | 1381f8a | 2015-03-13 09:40:34 -0700 | [diff] [blame] | 21 | "v.io/x/ref/test" |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 22 | ) |
| 23 | |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 24 | func startSigServer(ctx *context.T, sig sigImpl) (string, func(), error) { |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 25 | server, err := v23.NewServer(ctx) |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 26 | if err != nil { |
| 27 | return "", nil, fmt.Errorf("failed to start sig server: %v", err) |
| 28 | } |
Jiri Simsa | 6ac9522 | 2015-02-23 16:11:49 -0800 | [diff] [blame] | 29 | eps, err := server.Listen(v23.GetListenSpec(ctx)) |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 30 | if err != nil { |
| 31 | return "", nil, fmt.Errorf("failed to listen: %v", err) |
| 32 | } |
| 33 | if err := server.Serve("", sig, nil); err != nil { |
| 34 | return "", nil, err |
| 35 | } |
Cosmos Nicolaou | 28dabfc | 2014-12-15 22:51:07 -0800 | [diff] [blame] | 36 | return eps[0].String(), func() { server.Stop() }, nil |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 37 | } |
| 38 | |
| 39 | type sigImpl struct{} |
| 40 | |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 41 | func (sigImpl) NonStreaming0(rpc.ServerCall) error { panic("X") } |
| 42 | func (sigImpl) NonStreaming1(_ rpc.ServerCall, _ string) (int64, error) { panic("X") } |
Matt Rosencrantz | 5c7ed21 | 2015-02-27 22:42:35 -0800 | [diff] [blame] | 43 | func (sigImpl) Streaming0(_ *streamStringBool) error { panic("X") } |
| 44 | func (sigImpl) Streaming1(_ *streamStringBool, _ int64) (float64, error) { panic("X") } |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 45 | |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 46 | type streamStringBool struct{ rpc.StreamServerCall } |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 47 | |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 48 | func (*streamStringBool) Init(rpc.StreamServerCall) { panic("X") } |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 49 | func (*streamStringBool) RecvStream() interface { |
| 50 | Advance() bool |
| 51 | Value() string |
| 52 | Err() error |
| 53 | } { |
| 54 | panic("X") |
| 55 | } |
| 56 | func (*streamStringBool) SendStream() interface { |
| 57 | Send(_ bool) error |
| 58 | } { |
| 59 | panic("X") |
| 60 | } |
| 61 | |
Todd Wang | b747720 | 2015-01-08 11:41:39 -0800 | [diff] [blame] | 62 | func TestMethodSignature(t *testing.T) { |
Cosmos Nicolaou | 1381f8a | 2015-03-13 09:40:34 -0700 | [diff] [blame] | 63 | ctx, shutdown := test.InitForTest() |
Suharsh Sivakumar | 19fbf99 | 2015-01-23 11:02:27 -0800 | [diff] [blame] | 64 | defer shutdown() |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 65 | ep, stop, err := startSigServer(ctx, sigImpl{}) |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 66 | if err != nil { |
| 67 | t.Fatalf("startSigServer: %v", err) |
| 68 | } |
| 69 | defer stop() |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 70 | name := naming.JoinAddressName(ep, "") |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 71 | |
| 72 | tests := []struct { |
| 73 | Method string |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 74 | Want signature.Method |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 75 | }{ |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 76 | {"NonStreaming0", signature.Method{ |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 77 | Name: "NonStreaming0", |
| 78 | }}, |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 79 | {"NonStreaming1", signature.Method{ |
| 80 | Name: "NonStreaming1", |
| 81 | InArgs: []signature.Arg{{Type: vdl.StringType}}, |
Todd Wang | e77f995 | 2015-02-18 13:20:50 -0800 | [diff] [blame] | 82 | OutArgs: []signature.Arg{{Type: vdl.Int64Type}}, |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 83 | }}, |
| 84 | {"Streaming0", signature.Method{ |
| 85 | Name: "Streaming0", |
| 86 | InStream: &signature.Arg{Type: vdl.StringType}, |
| 87 | OutStream: &signature.Arg{Type: vdl.BoolType}, |
| 88 | }}, |
| 89 | {"Streaming1", signature.Method{ |
| 90 | Name: "Streaming1", |
| 91 | InArgs: []signature.Arg{{Type: vdl.Int64Type}}, |
Todd Wang | e77f995 | 2015-02-18 13:20:50 -0800 | [diff] [blame] | 92 | OutArgs: []signature.Arg{{Type: vdl.Float64Type}}, |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 93 | InStream: &signature.Arg{Type: vdl.StringType}, |
| 94 | OutStream: &signature.Arg{Type: vdl.BoolType}, |
| 95 | }}, |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 96 | } |
| 97 | for _, test := range tests { |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 98 | sig, err := reserved.MethodSignature(ctx, name, test.Method) |
Todd Wang | 5739dda | 2014-11-16 22:44:02 -0800 | [diff] [blame] | 99 | if err != nil { |
| 100 | t.Errorf("call failed: %v", err) |
| 101 | } |
| 102 | if got, want := sig, test.Want; !reflect.DeepEqual(got, want) { |
| 103 | t.Errorf("%s got %#v, want %#v", test.Method, got, want) |
| 104 | } |
| 105 | } |
| 106 | } |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 107 | |
Todd Wang | b747720 | 2015-01-08 11:41:39 -0800 | [diff] [blame] | 108 | func TestSignature(t *testing.T) { |
Cosmos Nicolaou | 1381f8a | 2015-03-13 09:40:34 -0700 | [diff] [blame] | 109 | ctx, shutdown := test.InitForTest() |
Suharsh Sivakumar | 19fbf99 | 2015-01-23 11:02:27 -0800 | [diff] [blame] | 110 | defer shutdown() |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 111 | ep, stop, err := startSigServer(ctx, sigImpl{}) |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 112 | if err != nil { |
| 113 | t.Fatalf("startSigServer: %v", err) |
| 114 | } |
| 115 | defer stop() |
| 116 | name := naming.JoinAddressName(ep, "") |
Matt Rosencrantz | f541b77 | 2015-01-13 07:58:59 -0800 | [diff] [blame] | 117 | sig, err := reserved.Signature(ctx, name) |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 118 | if err != nil { |
| 119 | t.Errorf("call failed: %v", err) |
| 120 | } |
Todd Wang | b747720 | 2015-01-08 11:41:39 -0800 | [diff] [blame] | 121 | if got, want := len(sig), 2; got != want { |
| 122 | t.Fatalf("got sig %#v len %d, want %d", sig, got, want) |
| 123 | } |
| 124 | // Check expected methods. |
| 125 | methods := signature.Interface{ |
| 126 | Doc: "The empty interface contains methods not attached to any interface.", |
| 127 | Methods: []signature.Method{ |
| 128 | { |
| 129 | Name: "NonStreaming0", |
| 130 | }, |
| 131 | { |
| 132 | Name: "NonStreaming1", |
| 133 | InArgs: []signature.Arg{{Type: vdl.StringType}}, |
Todd Wang | e77f995 | 2015-02-18 13:20:50 -0800 | [diff] [blame] | 134 | OutArgs: []signature.Arg{{Type: vdl.Int64Type}}, |
Todd Wang | b747720 | 2015-01-08 11:41:39 -0800 | [diff] [blame] | 135 | }, |
| 136 | { |
| 137 | Name: "Streaming0", |
| 138 | InStream: &signature.Arg{Type: vdl.StringType}, |
| 139 | OutStream: &signature.Arg{Type: vdl.BoolType}, |
| 140 | }, |
| 141 | { |
| 142 | Name: "Streaming1", |
| 143 | InArgs: []signature.Arg{{Type: vdl.Int64Type}}, |
Todd Wang | e77f995 | 2015-02-18 13:20:50 -0800 | [diff] [blame] | 144 | OutArgs: []signature.Arg{{Type: vdl.Float64Type}}, |
Todd Wang | b747720 | 2015-01-08 11:41:39 -0800 | [diff] [blame] | 145 | InStream: &signature.Arg{Type: vdl.StringType}, |
| 146 | OutStream: &signature.Arg{Type: vdl.BoolType}, |
| 147 | }, |
| 148 | }, |
| 149 | } |
| 150 | if got, want := sig[0], methods; !reflect.DeepEqual(got, want) { |
| 151 | t.Errorf("got sig[0] %#v, want %#v", got, want) |
| 152 | } |
| 153 | // Check reserved methods. |
| 154 | if got, want := sig[1].Name, "__Reserved"; got != want { |
| 155 | t.Errorf("got sig[1].Name %q, want %q", got, want) |
| 156 | } |
| 157 | if got, want := signature.MethodNames(sig[1:2]), []string{"__Glob", "__MethodSignature", "__Signature"}; !reflect.DeepEqual(got, want) { |
| 158 | t.Fatalf("got sig[1] methods %v, want %v", got, want) |
Todd Wang | 67fc8d7 | 2014-12-03 14:36:33 -0800 | [diff] [blame] | 159 | } |
| 160 | } |