blob: d653e01165b26e8809549718a08c07ef0a34a89c [file] [log] [blame]
Jiri Simsad7616c92015-03-24 23:44:30 -07001// 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 Sivakumarcbfe4742015-03-11 14:54:22 -07005package test
Todd Wang5739dda2014-11-16 22:44:02 -08006
7import (
8 "fmt"
9 "reflect"
10 "testing"
11
Jiri Simsa6ac95222015-02-23 16:11:49 -080012 "v.io/v23"
13 "v.io/v23/context"
Jiri Simsa6ac95222015-02-23 16:11:49 -080014 "v.io/v23/naming"
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070015 "v.io/v23/rpc"
16 "v.io/v23/rpc/reserved"
Jiri Simsa6ac95222015-02-23 16:11:49 -080017 "v.io/v23/vdl"
Todd Wang751c0392015-02-25 01:54:42 -080018 "v.io/v23/vdlroot/signature"
Todd Wang5739dda2014-11-16 22:44:02 -080019
Jiri Simsaffceefa2015-02-28 11:03:34 -080020 _ "v.io/x/ref/profiles"
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070021 "v.io/x/ref/test"
Todd Wang5739dda2014-11-16 22:44:02 -080022)
23
Matt Rosencrantzf541b772015-01-13 07:58:59 -080024func startSigServer(ctx *context.T, sig sigImpl) (string, func(), error) {
Jiri Simsa6ac95222015-02-23 16:11:49 -080025 server, err := v23.NewServer(ctx)
Todd Wang5739dda2014-11-16 22:44:02 -080026 if err != nil {
27 return "", nil, fmt.Errorf("failed to start sig server: %v", err)
28 }
Jiri Simsa6ac95222015-02-23 16:11:49 -080029 eps, err := server.Listen(v23.GetListenSpec(ctx))
Todd Wang5739dda2014-11-16 22:44:02 -080030 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 Nicolaou28dabfc2014-12-15 22:51:07 -080036 return eps[0].String(), func() { server.Stop() }, nil
Todd Wang5739dda2014-11-16 22:44:02 -080037}
38
39type sigImpl struct{}
40
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070041func (sigImpl) NonStreaming0(rpc.ServerCall) error { panic("X") }
42func (sigImpl) NonStreaming1(_ rpc.ServerCall, _ string) (int64, error) { panic("X") }
Matt Rosencrantz5c7ed212015-02-27 22:42:35 -080043func (sigImpl) Streaming0(_ *streamStringBool) error { panic("X") }
44func (sigImpl) Streaming1(_ *streamStringBool, _ int64) (float64, error) { panic("X") }
Todd Wang5739dda2014-11-16 22:44:02 -080045
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070046type streamStringBool struct{ rpc.StreamServerCall }
Todd Wang67fc8d72014-12-03 14:36:33 -080047
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070048func (*streamStringBool) Init(rpc.StreamServerCall) { panic("X") }
Todd Wang67fc8d72014-12-03 14:36:33 -080049func (*streamStringBool) RecvStream() interface {
50 Advance() bool
51 Value() string
52 Err() error
53} {
54 panic("X")
55}
56func (*streamStringBool) SendStream() interface {
57 Send(_ bool) error
58} {
59 panic("X")
60}
61
Todd Wangb7477202015-01-08 11:41:39 -080062func TestMethodSignature(t *testing.T) {
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070063 ctx, shutdown := test.InitForTest()
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -080064 defer shutdown()
Matt Rosencrantzf541b772015-01-13 07:58:59 -080065 ep, stop, err := startSigServer(ctx, sigImpl{})
Todd Wang5739dda2014-11-16 22:44:02 -080066 if err != nil {
67 t.Fatalf("startSigServer: %v", err)
68 }
69 defer stop()
Todd Wang67fc8d72014-12-03 14:36:33 -080070 name := naming.JoinAddressName(ep, "")
Todd Wang5739dda2014-11-16 22:44:02 -080071
72 tests := []struct {
73 Method string
Todd Wang67fc8d72014-12-03 14:36:33 -080074 Want signature.Method
Todd Wang5739dda2014-11-16 22:44:02 -080075 }{
Todd Wang67fc8d72014-12-03 14:36:33 -080076 {"NonStreaming0", signature.Method{
Todd Wang5739dda2014-11-16 22:44:02 -080077 Name: "NonStreaming0",
78 }},
Todd Wang67fc8d72014-12-03 14:36:33 -080079 {"NonStreaming1", signature.Method{
80 Name: "NonStreaming1",
81 InArgs: []signature.Arg{{Type: vdl.StringType}},
Todd Wange77f9952015-02-18 13:20:50 -080082 OutArgs: []signature.Arg{{Type: vdl.Int64Type}},
Todd Wang67fc8d72014-12-03 14:36:33 -080083 }},
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 Wange77f9952015-02-18 13:20:50 -080092 OutArgs: []signature.Arg{{Type: vdl.Float64Type}},
Todd Wang67fc8d72014-12-03 14:36:33 -080093 InStream: &signature.Arg{Type: vdl.StringType},
94 OutStream: &signature.Arg{Type: vdl.BoolType},
95 }},
Todd Wang5739dda2014-11-16 22:44:02 -080096 }
97 for _, test := range tests {
Matt Rosencrantzf541b772015-01-13 07:58:59 -080098 sig, err := reserved.MethodSignature(ctx, name, test.Method)
Todd Wang5739dda2014-11-16 22:44:02 -080099 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 Wang67fc8d72014-12-03 14:36:33 -0800107
Todd Wangb7477202015-01-08 11:41:39 -0800108func TestSignature(t *testing.T) {
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -0700109 ctx, shutdown := test.InitForTest()
Suharsh Sivakumar19fbf992015-01-23 11:02:27 -0800110 defer shutdown()
Matt Rosencrantzf541b772015-01-13 07:58:59 -0800111 ep, stop, err := startSigServer(ctx, sigImpl{})
Todd Wang67fc8d72014-12-03 14:36:33 -0800112 if err != nil {
113 t.Fatalf("startSigServer: %v", err)
114 }
115 defer stop()
116 name := naming.JoinAddressName(ep, "")
Matt Rosencrantzf541b772015-01-13 07:58:59 -0800117 sig, err := reserved.Signature(ctx, name)
Todd Wang67fc8d72014-12-03 14:36:33 -0800118 if err != nil {
119 t.Errorf("call failed: %v", err)
120 }
Todd Wangb7477202015-01-08 11:41:39 -0800121 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 Wange77f9952015-02-18 13:20:50 -0800134 OutArgs: []signature.Arg{{Type: vdl.Int64Type}},
Todd Wangb7477202015-01-08 11:41:39 -0800135 },
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 Wange77f9952015-02-18 13:20:50 -0800144 OutArgs: []signature.Arg{{Type: vdl.Float64Type}},
Todd Wangb7477202015-01-08 11:41:39 -0800145 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 Wang67fc8d72014-12-03 14:36:33 -0800159 }
160}