blob: 781a30789465b26079050fbf7f225c2f2a45f31f [file] [log] [blame]
Suharsh Sivakumarcbfe4742015-03-11 14:54:22 -07001package test
Todd Wang5739dda2014-11-16 22:44:02 -08002
3import (
4 "fmt"
5 "reflect"
6 "testing"
7
Jiri Simsa6ac95222015-02-23 16:11:49 -08008 "v.io/v23"
9 "v.io/v23/context"
10 "v.io/v23/ipc"
11 "v.io/v23/ipc/reserved"
12 "v.io/v23/naming"
13 "v.io/v23/vdl"
Todd Wang751c0392015-02-25 01:54:42 -080014 "v.io/v23/vdlroot/signature"
Todd Wang5739dda2014-11-16 22:44:02 -080015
Jiri Simsaffceefa2015-02-28 11:03:34 -080016 _ "v.io/x/ref/profiles"
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070017 "v.io/x/ref/test"
Todd Wang5739dda2014-11-16 22:44:02 -080018)
19
Matt Rosencrantzf541b772015-01-13 07:58:59 -080020func startSigServer(ctx *context.T, sig sigImpl) (string, func(), error) {
Jiri Simsa6ac95222015-02-23 16:11:49 -080021 server, err := v23.NewServer(ctx)
Todd Wang5739dda2014-11-16 22:44:02 -080022 if err != nil {
23 return "", nil, fmt.Errorf("failed to start sig server: %v", err)
24 }
Jiri Simsa6ac95222015-02-23 16:11:49 -080025 eps, err := server.Listen(v23.GetListenSpec(ctx))
Todd Wang5739dda2014-11-16 22:44:02 -080026 if err != nil {
27 return "", nil, fmt.Errorf("failed to listen: %v", err)
28 }
29 if err := server.Serve("", sig, nil); err != nil {
30 return "", nil, err
31 }
Cosmos Nicolaou28dabfc2014-12-15 22:51:07 -080032 return eps[0].String(), func() { server.Stop() }, nil
Todd Wang5739dda2014-11-16 22:44:02 -080033}
34
35type sigImpl struct{}
36
Matt Rosencrantz5c7ed212015-02-27 22:42:35 -080037func (sigImpl) NonStreaming0(ipc.ServerCall) error { panic("X") }
38func (sigImpl) NonStreaming1(_ ipc.ServerCall, _ string) (int64, error) { panic("X") }
39func (sigImpl) Streaming0(_ *streamStringBool) error { panic("X") }
40func (sigImpl) Streaming1(_ *streamStringBool, _ int64) (float64, error) { panic("X") }
Todd Wang5739dda2014-11-16 22:44:02 -080041
Matt Rosencrantz1dcd0a92015-02-27 11:05:59 -080042type streamStringBool struct{ ipc.StreamServerCall }
Todd Wang67fc8d72014-12-03 14:36:33 -080043
Matt Rosencrantz1dcd0a92015-02-27 11:05:59 -080044func (*streamStringBool) Init(ipc.StreamServerCall) { panic("X") }
Todd Wang67fc8d72014-12-03 14:36:33 -080045func (*streamStringBool) RecvStream() interface {
46 Advance() bool
47 Value() string
48 Err() error
49} {
50 panic("X")
51}
52func (*streamStringBool) SendStream() interface {
53 Send(_ bool) error
54} {
55 panic("X")
56}
57
Todd Wangb7477202015-01-08 11:41:39 -080058func TestMethodSignature(t *testing.T) {
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070059 ctx, shutdown := test.InitForTest()
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -080060 defer shutdown()
Matt Rosencrantzf541b772015-01-13 07:58:59 -080061 ep, stop, err := startSigServer(ctx, sigImpl{})
Todd Wang5739dda2014-11-16 22:44:02 -080062 if err != nil {
63 t.Fatalf("startSigServer: %v", err)
64 }
65 defer stop()
Todd Wang67fc8d72014-12-03 14:36:33 -080066 name := naming.JoinAddressName(ep, "")
Todd Wang5739dda2014-11-16 22:44:02 -080067
68 tests := []struct {
69 Method string
Todd Wang67fc8d72014-12-03 14:36:33 -080070 Want signature.Method
Todd Wang5739dda2014-11-16 22:44:02 -080071 }{
Todd Wang67fc8d72014-12-03 14:36:33 -080072 {"NonStreaming0", signature.Method{
Todd Wang5739dda2014-11-16 22:44:02 -080073 Name: "NonStreaming0",
74 }},
Todd Wang67fc8d72014-12-03 14:36:33 -080075 {"NonStreaming1", signature.Method{
76 Name: "NonStreaming1",
77 InArgs: []signature.Arg{{Type: vdl.StringType}},
Todd Wange77f9952015-02-18 13:20:50 -080078 OutArgs: []signature.Arg{{Type: vdl.Int64Type}},
Todd Wang67fc8d72014-12-03 14:36:33 -080079 }},
80 {"Streaming0", signature.Method{
81 Name: "Streaming0",
82 InStream: &signature.Arg{Type: vdl.StringType},
83 OutStream: &signature.Arg{Type: vdl.BoolType},
84 }},
85 {"Streaming1", signature.Method{
86 Name: "Streaming1",
87 InArgs: []signature.Arg{{Type: vdl.Int64Type}},
Todd Wange77f9952015-02-18 13:20:50 -080088 OutArgs: []signature.Arg{{Type: vdl.Float64Type}},
Todd Wang67fc8d72014-12-03 14:36:33 -080089 InStream: &signature.Arg{Type: vdl.StringType},
90 OutStream: &signature.Arg{Type: vdl.BoolType},
91 }},
Todd Wang5739dda2014-11-16 22:44:02 -080092 }
93 for _, test := range tests {
Matt Rosencrantzf541b772015-01-13 07:58:59 -080094 sig, err := reserved.MethodSignature(ctx, name, test.Method)
Todd Wang5739dda2014-11-16 22:44:02 -080095 if err != nil {
96 t.Errorf("call failed: %v", err)
97 }
98 if got, want := sig, test.Want; !reflect.DeepEqual(got, want) {
99 t.Errorf("%s got %#v, want %#v", test.Method, got, want)
100 }
101 }
102}
Todd Wang67fc8d72014-12-03 14:36:33 -0800103
Todd Wangb7477202015-01-08 11:41:39 -0800104func TestSignature(t *testing.T) {
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -0700105 ctx, shutdown := test.InitForTest()
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -0800106 defer shutdown()
Matt Rosencrantzf541b772015-01-13 07:58:59 -0800107 ep, stop, err := startSigServer(ctx, sigImpl{})
Todd Wang67fc8d72014-12-03 14:36:33 -0800108 if err != nil {
109 t.Fatalf("startSigServer: %v", err)
110 }
111 defer stop()
112 name := naming.JoinAddressName(ep, "")
Matt Rosencrantzf541b772015-01-13 07:58:59 -0800113 sig, err := reserved.Signature(ctx, name)
Todd Wang67fc8d72014-12-03 14:36:33 -0800114 if err != nil {
115 t.Errorf("call failed: %v", err)
116 }
Todd Wangb7477202015-01-08 11:41:39 -0800117 if got, want := len(sig), 2; got != want {
118 t.Fatalf("got sig %#v len %d, want %d", sig, got, want)
119 }
120 // Check expected methods.
121 methods := signature.Interface{
122 Doc: "The empty interface contains methods not attached to any interface.",
123 Methods: []signature.Method{
124 {
125 Name: "NonStreaming0",
126 },
127 {
128 Name: "NonStreaming1",
129 InArgs: []signature.Arg{{Type: vdl.StringType}},
Todd Wange77f9952015-02-18 13:20:50 -0800130 OutArgs: []signature.Arg{{Type: vdl.Int64Type}},
Todd Wangb7477202015-01-08 11:41:39 -0800131 },
132 {
133 Name: "Streaming0",
134 InStream: &signature.Arg{Type: vdl.StringType},
135 OutStream: &signature.Arg{Type: vdl.BoolType},
136 },
137 {
138 Name: "Streaming1",
139 InArgs: []signature.Arg{{Type: vdl.Int64Type}},
Todd Wange77f9952015-02-18 13:20:50 -0800140 OutArgs: []signature.Arg{{Type: vdl.Float64Type}},
Todd Wangb7477202015-01-08 11:41:39 -0800141 InStream: &signature.Arg{Type: vdl.StringType},
142 OutStream: &signature.Arg{Type: vdl.BoolType},
143 },
144 },
145 }
146 if got, want := sig[0], methods; !reflect.DeepEqual(got, want) {
147 t.Errorf("got sig[0] %#v, want %#v", got, want)
148 }
149 // Check reserved methods.
150 if got, want := sig[1].Name, "__Reserved"; got != want {
151 t.Errorf("got sig[1].Name %q, want %q", got, want)
152 }
153 if got, want := signature.MethodNames(sig[1:2]), []string{"__Glob", "__MethodSignature", "__Signature"}; !reflect.DeepEqual(got, want) {
154 t.Fatalf("got sig[1] methods %v, want %v", got, want)
Todd Wang67fc8d72014-12-03 14:36:33 -0800155 }
156}