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 | |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 5 | package main_test |
| 6 | |
Suharsh Sivakumar | 8646ba6 | 2015-03-18 15:22:28 -0700 | [diff] [blame] | 7 | // This test assumes the vdl packages under v.io/x/ref/lib/vdl/testdata have been |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 8 | // compiled using the vdl binary, and runs end-to-end rpc tests against the |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 9 | // generated output. It's meant as a final sanity check of the vdl compiler; by |
| 10 | // using the compiled results we're behaving as an end-user would behave. |
| 11 | |
| 12 | import ( |
| 13 | "errors" |
| 14 | "math" |
| 15 | "reflect" |
| 16 | "testing" |
| 17 | |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 18 | "v.io/v23/context" |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 19 | "v.io/v23/rpc" |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 20 | "v.io/v23/vdl" |
| 21 | "v.io/x/ref/lib/vdl/testdata/arith" |
| 22 | "v.io/x/ref/lib/vdl/testdata/base" |
Matt Rosencrantz | bb6295d | 2015-06-19 15:13:58 -0700 | [diff] [blame] | 23 | "v.io/x/ref/lib/xrpc" |
Cosmos Nicolaou | 1381f8a | 2015-03-13 09:40:34 -0700 | [diff] [blame] | 24 | "v.io/x/ref/test" |
Todd Wang | 99b459d | 2015-04-02 12:32:09 -0700 | [diff] [blame] | 25 | |
Suharsh Sivakumar | dcc11d7 | 2015-05-11 12:19:20 -0700 | [diff] [blame] | 26 | _ "v.io/x/ref/runtime/factories/generic" |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 27 | ) |
| 28 | |
| 29 | var generatedError = errors.New("generated error") |
| 30 | |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 31 | // serverArith implements the arith.Arith interface. |
| 32 | type serverArith struct{} |
| 33 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 34 | func (*serverArith) Add(_ *context.T, _ rpc.ServerCall, A, B int32) (int32, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 35 | return A + B, nil |
| 36 | } |
| 37 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 38 | func (*serverArith) DivMod(_ *context.T, _ rpc.ServerCall, A, B int32) (int32, int32, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 39 | return A / B, A % B, nil |
| 40 | } |
| 41 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 42 | func (*serverArith) Sub(_ *context.T, _ rpc.ServerCall, args base.Args) (int32, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 43 | return args.A - args.B, nil |
| 44 | } |
| 45 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 46 | func (*serverArith) Mul(_ *context.T, _ rpc.ServerCall, nestedArgs base.NestedArgs) (int32, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 47 | return nestedArgs.Args.A * nestedArgs.Args.B, nil |
| 48 | } |
| 49 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 50 | func (*serverArith) Count(_ *context.T, call arith.ArithCountServerCall, start int32) error { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 51 | const kNum = 1000 |
| 52 | for i := int32(0); i < kNum; i++ { |
Suharsh Sivakumar | 31f4985 | 2015-03-03 16:13:20 -0800 | [diff] [blame] | 53 | if err := call.SendStream().Send(start + i); err != nil { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 54 | return err |
| 55 | } |
| 56 | } |
| 57 | return nil |
| 58 | } |
| 59 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 60 | func (*serverArith) StreamingAdd(_ *context.T, call arith.ArithStreamingAddServerCall) (int32, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 61 | var total int32 |
Suharsh Sivakumar | 31f4985 | 2015-03-03 16:13:20 -0800 | [diff] [blame] | 62 | for call.RecvStream().Advance() { |
| 63 | value := call.RecvStream().Value() |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 64 | total += value |
Suharsh Sivakumar | 31f4985 | 2015-03-03 16:13:20 -0800 | [diff] [blame] | 65 | call.SendStream().Send(total) |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 66 | } |
Suharsh Sivakumar | 31f4985 | 2015-03-03 16:13:20 -0800 | [diff] [blame] | 67 | return total, call.RecvStream().Err() |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 68 | } |
| 69 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 70 | func (*serverArith) GenError(_ *context.T, _ rpc.ServerCall) error { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 71 | return generatedError |
| 72 | } |
| 73 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 74 | func (*serverArith) QuoteAny(_ *context.T, _ rpc.ServerCall, any *vdl.Value) (*vdl.Value, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 75 | return vdl.StringValue(any.String()), nil |
| 76 | } |
| 77 | |
| 78 | type serverCalculator struct { |
| 79 | serverArith |
| 80 | } |
| 81 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 82 | func (*serverCalculator) Sine(_ *context.T, _ rpc.ServerCall, angle float64) (float64, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 83 | return math.Sin(angle), nil |
| 84 | } |
| 85 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 86 | func (*serverCalculator) Cosine(_ *context.T, _ rpc.ServerCall, angle float64) (float64, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 87 | return math.Cos(angle), nil |
| 88 | } |
| 89 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 90 | func (*serverCalculator) Exp(_ *context.T, _ rpc.ServerCall, x float64) (float64, error) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 91 | return math.Exp(x), nil |
| 92 | } |
| 93 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 94 | func (*serverCalculator) On(_ *context.T, _ rpc.ServerCall) error { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 95 | return nil |
| 96 | } |
| 97 | |
Todd Wang | 54feabe | 2015-04-15 23:38:26 -0700 | [diff] [blame] | 98 | func (*serverCalculator) Off(_ *context.T, _ rpc.ServerCall) error { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 99 | return nil |
| 100 | } |
| 101 | |
| 102 | func TestCalculator(t *testing.T) { |
Todd Wang | 60052d8 | 2015-05-22 15:00:10 -0700 | [diff] [blame] | 103 | ctx, shutdown := test.V23Init() |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 104 | defer shutdown() |
| 105 | |
Matt Rosencrantz | bb6295d | 2015-06-19 15:13:58 -0700 | [diff] [blame] | 106 | server, err := xrpc.NewServer(ctx, "", arith.CalculatorServer(&serverCalculator{}), nil) |
| 107 | if err != nil { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 108 | t.Fatal(err) |
| 109 | } |
Matt Rosencrantz | bb6295d | 2015-06-19 15:13:58 -0700 | [diff] [blame] | 110 | root := server.Status().Endpoints[0].Name() |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 111 | // Synchronous calls |
| 112 | calculator := arith.CalculatorClient(root) |
| 113 | sine, err := calculator.Sine(ctx, 0) |
| 114 | if err != nil { |
| 115 | t.Errorf("Sine: got %q but expected no error", err) |
| 116 | } |
| 117 | if sine != 0 { |
| 118 | t.Errorf("Sine: expected 0 got %f", sine) |
| 119 | } |
| 120 | cosine, err := calculator.Cosine(ctx, 0) |
| 121 | if err != nil { |
| 122 | t.Errorf("Cosine: got %q but expected no error", err) |
| 123 | } |
| 124 | if cosine != 1 { |
| 125 | t.Errorf("Cosine: expected 1 got %f", cosine) |
| 126 | } |
| 127 | |
| 128 | ar := arith.ArithClient(root) |
| 129 | sum, err := ar.Add(ctx, 7, 8) |
| 130 | if err != nil { |
| 131 | t.Errorf("Add: got %q but expected no error", err) |
| 132 | } |
| 133 | if sum != 15 { |
| 134 | t.Errorf("Add: expected 15 got %d", sum) |
| 135 | } |
| 136 | ar = calculator |
| 137 | sum, err = ar.Add(ctx, 7, 8) |
| 138 | if err != nil { |
| 139 | t.Errorf("Add: got %q but expected no error", err) |
| 140 | } |
| 141 | if sum != 15 { |
| 142 | t.Errorf("Add: expected 15 got %d", sum) |
| 143 | } |
| 144 | |
| 145 | trig := arith.TrigonometryClient(root) |
| 146 | cosine, err = trig.Cosine(ctx, 0) |
| 147 | if err != nil { |
| 148 | t.Errorf("Cosine: got %q but expected no error", err) |
| 149 | } |
| 150 | if cosine != 1 { |
| 151 | t.Errorf("Cosine: expected 1 got %f", cosine) |
| 152 | } |
| 153 | |
| 154 | // Test auto-generated methods. |
| 155 | serverStub := arith.CalculatorServer(&serverCalculator{}) |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 156 | expectDesc(t, serverStub.Describe__(), []rpc.InterfaceDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 157 | { |
| 158 | Name: "Calculator", |
| 159 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 160 | Embeds: []rpc.EmbedDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 161 | { |
| 162 | Name: "Arith", |
| 163 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
| 164 | }, |
| 165 | { |
| 166 | Name: "AdvancedMath", |
| 167 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
| 168 | }, |
| 169 | }, |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 170 | Methods: []rpc.MethodDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 171 | {Name: "On"}, |
| 172 | {Name: "Off", Tags: []*vdl.Value{vdl.StringValue("offtag")}}, |
| 173 | }, |
| 174 | }, |
| 175 | { |
| 176 | Name: "Arith", |
| 177 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 178 | Methods: []rpc.MethodDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 179 | { |
| 180 | Name: "Add", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 181 | InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}}, |
| 182 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 183 | }, |
| 184 | { |
| 185 | Name: "DivMod", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 186 | InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}}, |
| 187 | OutArgs: []rpc.ArgDesc{{Name: "quot"}, {Name: "rem"}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 188 | }, |
| 189 | { |
| 190 | Name: "Sub", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 191 | InArgs: []rpc.ArgDesc{{Name: "args"}}, |
| 192 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 193 | }, |
| 194 | { |
| 195 | Name: "Mul", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 196 | InArgs: []rpc.ArgDesc{{Name: "nested"}}, |
| 197 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 198 | }, |
| 199 | { |
| 200 | Name: "GenError", |
| 201 | Tags: []*vdl.Value{vdl.StringValue("foo"), vdl.StringValue("barz"), vdl.StringValue("hello"), vdl.Int32Value(129), vdl.Uint64Value(0x24)}, |
| 202 | }, |
| 203 | { |
| 204 | Name: "Count", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 205 | InArgs: []rpc.ArgDesc{{Name: "start"}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 206 | }, |
| 207 | { |
| 208 | Name: "StreamingAdd", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 209 | OutArgs: []rpc.ArgDesc{{Name: "total"}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 210 | }, |
| 211 | { |
| 212 | Name: "QuoteAny", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 213 | InArgs: []rpc.ArgDesc{{Name: "a"}}, |
| 214 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 215 | }, |
| 216 | }, |
| 217 | }, |
| 218 | { |
| 219 | Name: "AdvancedMath", |
| 220 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 221 | Embeds: []rpc.EmbedDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 222 | { |
| 223 | Name: "Trigonometry", |
| 224 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
| 225 | }, |
| 226 | { |
| 227 | Name: "Exp", |
| 228 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith/exp", |
| 229 | }}, |
| 230 | }, |
| 231 | { |
| 232 | Name: "Trigonometry", |
| 233 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
| 234 | Doc: "// Trigonometry is an interface that specifies a couple trigonometric functions.", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 235 | Methods: []rpc.MethodDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 236 | { |
| 237 | Name: "Sine", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 238 | InArgs: []rpc.ArgDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 239 | {"angle", ``}, // float64 |
| 240 | }, |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 241 | OutArgs: []rpc.ArgDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 242 | {"", ``}, // float64 |
| 243 | }, |
| 244 | }, |
| 245 | { |
| 246 | Name: "Cosine", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 247 | InArgs: []rpc.ArgDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 248 | {"angle", ``}, // float64 |
| 249 | }, |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 250 | OutArgs: []rpc.ArgDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 251 | {"", ``}, // float64 |
| 252 | }, |
| 253 | }, |
| 254 | }, |
| 255 | }, |
| 256 | { |
| 257 | Name: "Exp", |
| 258 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith/exp", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 259 | Methods: []rpc.MethodDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 260 | { |
| 261 | Name: "Exp", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 262 | InArgs: []rpc.ArgDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 263 | {"x", ``}, // float64 |
| 264 | }, |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 265 | OutArgs: []rpc.ArgDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 266 | {"", ``}, // float64 |
| 267 | }, |
| 268 | }, |
| 269 | }, |
| 270 | }, |
| 271 | }) |
| 272 | } |
| 273 | |
| 274 | func TestArith(t *testing.T) { |
Todd Wang | 60052d8 | 2015-05-22 15:00:10 -0700 | [diff] [blame] | 275 | ctx, shutdown := test.V23Init() |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 276 | defer shutdown() |
| 277 | |
| 278 | // TODO(bprosnitz) Split this test up -- it is quite long and hard to debug. |
| 279 | |
| 280 | // We try a few types of dispatchers on the server side, to verify that |
| 281 | // anything dispatching to Arith or an interface embedding Arith (like |
| 282 | // Calculator) works for a client looking to talk to an Arith service. |
| 283 | objects := []interface{}{ |
| 284 | arith.ArithServer(&serverArith{}), |
| 285 | arith.ArithServer(&serverCalculator{}), |
| 286 | arith.CalculatorServer(&serverCalculator{}), |
| 287 | } |
| 288 | |
| 289 | for i, obj := range objects { |
Matt Rosencrantz | bb6295d | 2015-06-19 15:13:58 -0700 | [diff] [blame] | 290 | server, err := xrpc.NewServer(ctx, "", obj, nil) |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 291 | if err != nil { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 292 | t.Fatalf("%d: %v", i, err) |
| 293 | } |
Matt Rosencrantz | bb6295d | 2015-06-19 15:13:58 -0700 | [diff] [blame] | 294 | root := server.Status().Endpoints[0].Name() |
| 295 | |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 296 | // Synchronous calls |
| 297 | ar := arith.ArithClient(root) |
| 298 | sum, err := ar.Add(ctx, 7, 8) |
| 299 | if err != nil { |
| 300 | t.Errorf("Add: got %q but expected no error", err) |
| 301 | } |
| 302 | if sum != 15 { |
| 303 | t.Errorf("Add: expected 15 got %d", sum) |
| 304 | } |
| 305 | q, r, err := ar.DivMod(ctx, 7, 3) |
| 306 | if err != nil { |
| 307 | t.Errorf("DivMod: got %q but expected no error", err) |
| 308 | } |
| 309 | if q != 2 || r != 1 { |
| 310 | t.Errorf("DivMod: expected (2,1) got (%d,%d)", q, r) |
| 311 | } |
| 312 | diff, err := ar.Sub(ctx, base.Args{7, 8}) |
| 313 | if err != nil { |
| 314 | t.Errorf("Sub: got %q but expected no error", err) |
| 315 | } |
| 316 | if diff != -1 { |
| 317 | t.Errorf("Sub: got %d, expected -1", diff) |
| 318 | } |
| 319 | prod, err := ar.Mul(ctx, base.NestedArgs{base.Args{7, 8}}) |
| 320 | if err != nil { |
| 321 | t.Errorf("Mul: got %q, but expected no error", err) |
| 322 | } |
| 323 | if prod != 56 { |
| 324 | t.Errorf("Sub: got %d, expected 56", prod) |
| 325 | } |
| 326 | stream, err := ar.Count(ctx, 35) |
| 327 | if err != nil { |
| 328 | t.Fatalf("error while executing Count %v", err) |
| 329 | } |
| 330 | |
| 331 | countIterator := stream.RecvStream() |
| 332 | for i := int32(0); i < 1000; i++ { |
| 333 | if !countIterator.Advance() { |
| 334 | t.Errorf("Error getting value %v", countIterator.Err()) |
| 335 | } |
| 336 | val := countIterator.Value() |
| 337 | if val != 35+i { |
| 338 | t.Errorf("Expected value %d, got %d", 35+i, val) |
| 339 | } |
| 340 | } |
| 341 | if countIterator.Advance() || countIterator.Err() != nil { |
| 342 | t.Errorf("Reply stream should have been closed %v", countIterator.Err()) |
| 343 | } |
| 344 | |
| 345 | if err := stream.Finish(); err != nil { |
| 346 | t.Errorf("Count failed with %v", err) |
| 347 | } |
| 348 | |
| 349 | addStream, err := ar.StreamingAdd(ctx) |
| 350 | |
| 351 | go func() { |
| 352 | sender := addStream.SendStream() |
| 353 | for i := int32(0); i < 100; i++ { |
| 354 | if err := sender.Send(i); err != nil { |
| 355 | t.Errorf("Send error %v", err) |
| 356 | } |
| 357 | } |
| 358 | if err := sender.Close(); err != nil { |
| 359 | t.Errorf("Close error %v", err) |
| 360 | } |
| 361 | }() |
| 362 | |
| 363 | var expectedSum int32 |
| 364 | rStream := addStream.RecvStream() |
| 365 | for i := int32(0); i < 100; i++ { |
| 366 | expectedSum += i |
| 367 | if !rStream.Advance() { |
| 368 | t.Errorf("Error getting value %v", rStream.Err()) |
| 369 | } |
| 370 | value := rStream.Value() |
| 371 | if value != expectedSum { |
| 372 | t.Errorf("Got %d but expected %d", value, expectedSum) |
| 373 | } |
| 374 | } |
| 375 | |
| 376 | if rStream.Advance() || rStream.Err() != nil { |
| 377 | t.Errorf("Reply stream should have been closed %v", rStream.Err()) |
| 378 | } |
| 379 | |
| 380 | total, err := addStream.Finish() |
| 381 | |
| 382 | if err != nil { |
| 383 | t.Errorf("Count failed with %v", err) |
| 384 | } |
| 385 | |
| 386 | if total != expectedSum { |
| 387 | t.Errorf("Got %d but expexted %d", total, expectedSum) |
| 388 | } |
| 389 | |
| 390 | if err := ar.GenError(ctx); err == nil { |
| 391 | t.Errorf("GenError: got %v but expected %v", err, generatedError) |
| 392 | } |
| 393 | |
| 394 | // Server-side stubs |
| 395 | |
| 396 | serverStub := arith.ArithServer(&serverArith{}) |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 397 | expectDesc(t, serverStub.Describe__(), []rpc.InterfaceDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 398 | { |
| 399 | Name: "Arith", |
| 400 | PkgPath: "v.io/x/ref/lib/vdl/testdata/arith", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 401 | Methods: []rpc.MethodDesc{ |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 402 | { |
| 403 | Name: "Add", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 404 | InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}}, |
| 405 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 406 | }, |
| 407 | { |
| 408 | Name: "DivMod", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 409 | InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}}, |
| 410 | OutArgs: []rpc.ArgDesc{{Name: "quot"}, {Name: "rem"}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 411 | }, |
| 412 | { |
| 413 | Name: "Sub", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 414 | InArgs: []rpc.ArgDesc{{Name: "args"}}, |
| 415 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 416 | }, |
| 417 | { |
| 418 | Name: "Mul", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 419 | InArgs: []rpc.ArgDesc{{Name: "nested"}}, |
| 420 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 421 | }, |
| 422 | { |
| 423 | Name: "GenError", |
| 424 | Tags: []*vdl.Value{vdl.StringValue("foo"), vdl.StringValue("barz"), vdl.StringValue("hello"), vdl.Int32Value(129), vdl.Uint64Value(0x24)}, |
| 425 | }, |
| 426 | { |
| 427 | Name: "Count", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 428 | InArgs: []rpc.ArgDesc{{Name: "start"}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 429 | }, |
| 430 | { |
| 431 | Name: "StreamingAdd", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 432 | OutArgs: []rpc.ArgDesc{{Name: "total"}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 433 | }, |
| 434 | { |
| 435 | Name: "QuoteAny", |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 436 | InArgs: []rpc.ArgDesc{{Name: "a"}}, |
| 437 | OutArgs: []rpc.ArgDesc{{}}, |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 438 | }, |
| 439 | }, |
| 440 | }, |
| 441 | }) |
| 442 | } |
| 443 | } |
| 444 | |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 445 | func expectDesc(t *testing.T, got, want []rpc.InterfaceDesc) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 446 | stripDesc(got) |
| 447 | stripDesc(want) |
| 448 | if !reflect.DeepEqual(got, want) { |
| 449 | t.Errorf("Describe__ got %#v, want %#v", got, want) |
| 450 | } |
| 451 | } |
| 452 | |
Matt Rosencrantz | 94502cf | 2015-03-18 09:43:44 -0700 | [diff] [blame] | 453 | func stripDesc(desc []rpc.InterfaceDesc) { |
Matt Rosencrantz | bca4981 | 2015-03-01 21:32:54 -0800 | [diff] [blame] | 454 | // Don't bother testing the documentation, to avoid spurious changes. |
| 455 | for i := range desc { |
| 456 | desc[i].Doc = "" |
| 457 | for j := range desc[i].Embeds { |
| 458 | desc[i].Embeds[j].Doc = "" |
| 459 | } |
| 460 | for j := range desc[i].Methods { |
| 461 | desc[i].Methods[j].Doc = "" |
| 462 | for k := range desc[i].Methods[j].InArgs { |
| 463 | desc[i].Methods[j].InArgs[k].Doc = "" |
| 464 | } |
| 465 | for k := range desc[i].Methods[j].OutArgs { |
| 466 | desc[i].Methods[j].OutArgs[k].Doc = "" |
| 467 | } |
| 468 | desc[i].Methods[j].InStream.Doc = "" |
| 469 | desc[i].Methods[j].OutStream.Doc = "" |
| 470 | } |
| 471 | } |
| 472 | } |