blob: d0294ae9c4a2a63dc5342050e501769987c1a06a [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
Matt Rosencrantzbca49812015-03-01 21:32:54 -08005package main_test
6
Suharsh Sivakumar8646ba62015-03-18 15:22:28 -07007// This test assumes the vdl packages under v.io/x/ref/lib/vdl/testdata have been
Matt Rosencrantz94502cf2015-03-18 09:43:44 -07008// compiled using the vdl binary, and runs end-to-end rpc tests against the
Matt Rosencrantzbca49812015-03-01 21:32:54 -08009// 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
12import (
13 "errors"
14 "math"
15 "reflect"
16 "testing"
17
Matt Rosencrantzbca49812015-03-01 21:32:54 -080018 "v.io/v23/context"
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070019 "v.io/v23/rpc"
Matt Rosencrantzbca49812015-03-01 21:32:54 -080020 "v.io/v23/vdl"
21 "v.io/x/ref/lib/vdl/testdata/arith"
22 "v.io/x/ref/lib/vdl/testdata/base"
Matt Rosencrantzbb6295d2015-06-19 15:13:58 -070023 "v.io/x/ref/lib/xrpc"
Cosmos Nicolaou1381f8a2015-03-13 09:40:34 -070024 "v.io/x/ref/test"
Todd Wang99b459d2015-04-02 12:32:09 -070025
Suharsh Sivakumardcc11d72015-05-11 12:19:20 -070026 _ "v.io/x/ref/runtime/factories/generic"
Matt Rosencrantzbca49812015-03-01 21:32:54 -080027)
28
29var generatedError = errors.New("generated error")
30
Matt Rosencrantzbca49812015-03-01 21:32:54 -080031// serverArith implements the arith.Arith interface.
32type serverArith struct{}
33
Todd Wang54feabe2015-04-15 23:38:26 -070034func (*serverArith) Add(_ *context.T, _ rpc.ServerCall, A, B int32) (int32, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080035 return A + B, nil
36}
37
Todd Wang54feabe2015-04-15 23:38:26 -070038func (*serverArith) DivMod(_ *context.T, _ rpc.ServerCall, A, B int32) (int32, int32, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080039 return A / B, A % B, nil
40}
41
Todd Wang54feabe2015-04-15 23:38:26 -070042func (*serverArith) Sub(_ *context.T, _ rpc.ServerCall, args base.Args) (int32, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080043 return args.A - args.B, nil
44}
45
Todd Wang54feabe2015-04-15 23:38:26 -070046func (*serverArith) Mul(_ *context.T, _ rpc.ServerCall, nestedArgs base.NestedArgs) (int32, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080047 return nestedArgs.Args.A * nestedArgs.Args.B, nil
48}
49
Todd Wang54feabe2015-04-15 23:38:26 -070050func (*serverArith) Count(_ *context.T, call arith.ArithCountServerCall, start int32) error {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080051 const kNum = 1000
52 for i := int32(0); i < kNum; i++ {
Suharsh Sivakumar31f49852015-03-03 16:13:20 -080053 if err := call.SendStream().Send(start + i); err != nil {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080054 return err
55 }
56 }
57 return nil
58}
59
Todd Wang54feabe2015-04-15 23:38:26 -070060func (*serverArith) StreamingAdd(_ *context.T, call arith.ArithStreamingAddServerCall) (int32, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080061 var total int32
Suharsh Sivakumar31f49852015-03-03 16:13:20 -080062 for call.RecvStream().Advance() {
63 value := call.RecvStream().Value()
Matt Rosencrantzbca49812015-03-01 21:32:54 -080064 total += value
Suharsh Sivakumar31f49852015-03-03 16:13:20 -080065 call.SendStream().Send(total)
Matt Rosencrantzbca49812015-03-01 21:32:54 -080066 }
Suharsh Sivakumar31f49852015-03-03 16:13:20 -080067 return total, call.RecvStream().Err()
Matt Rosencrantzbca49812015-03-01 21:32:54 -080068}
69
Todd Wang54feabe2015-04-15 23:38:26 -070070func (*serverArith) GenError(_ *context.T, _ rpc.ServerCall) error {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080071 return generatedError
72}
73
Todd Wang54feabe2015-04-15 23:38:26 -070074func (*serverArith) QuoteAny(_ *context.T, _ rpc.ServerCall, any *vdl.Value) (*vdl.Value, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080075 return vdl.StringValue(any.String()), nil
76}
77
78type serverCalculator struct {
79 serverArith
80}
81
Todd Wang54feabe2015-04-15 23:38:26 -070082func (*serverCalculator) Sine(_ *context.T, _ rpc.ServerCall, angle float64) (float64, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080083 return math.Sin(angle), nil
84}
85
Todd Wang54feabe2015-04-15 23:38:26 -070086func (*serverCalculator) Cosine(_ *context.T, _ rpc.ServerCall, angle float64) (float64, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080087 return math.Cos(angle), nil
88}
89
Todd Wang54feabe2015-04-15 23:38:26 -070090func (*serverCalculator) Exp(_ *context.T, _ rpc.ServerCall, x float64) (float64, error) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080091 return math.Exp(x), nil
92}
93
Todd Wang54feabe2015-04-15 23:38:26 -070094func (*serverCalculator) On(_ *context.T, _ rpc.ServerCall) error {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080095 return nil
96}
97
Todd Wang54feabe2015-04-15 23:38:26 -070098func (*serverCalculator) Off(_ *context.T, _ rpc.ServerCall) error {
Matt Rosencrantzbca49812015-03-01 21:32:54 -080099 return nil
100}
101
102func TestCalculator(t *testing.T) {
Todd Wang60052d82015-05-22 15:00:10 -0700103 ctx, shutdown := test.V23Init()
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800104 defer shutdown()
105
Matt Rosencrantzbb6295d2015-06-19 15:13:58 -0700106 server, err := xrpc.NewServer(ctx, "", arith.CalculatorServer(&serverCalculator{}), nil)
107 if err != nil {
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800108 t.Fatal(err)
109 }
Matt Rosencrantzbb6295d2015-06-19 15:13:58 -0700110 root := server.Status().Endpoints[0].Name()
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800111 // 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 Rosencrantz94502cf2015-03-18 09:43:44 -0700156 expectDesc(t, serverStub.Describe__(), []rpc.InterfaceDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800157 {
158 Name: "Calculator",
159 PkgPath: "v.io/x/ref/lib/vdl/testdata/arith",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700160 Embeds: []rpc.EmbedDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800161 {
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 Rosencrantz94502cf2015-03-18 09:43:44 -0700170 Methods: []rpc.MethodDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800171 {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 Rosencrantz94502cf2015-03-18 09:43:44 -0700178 Methods: []rpc.MethodDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800179 {
180 Name: "Add",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700181 InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}},
182 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800183 },
184 {
185 Name: "DivMod",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700186 InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}},
187 OutArgs: []rpc.ArgDesc{{Name: "quot"}, {Name: "rem"}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800188 },
189 {
190 Name: "Sub",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700191 InArgs: []rpc.ArgDesc{{Name: "args"}},
192 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800193 },
194 {
195 Name: "Mul",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700196 InArgs: []rpc.ArgDesc{{Name: "nested"}},
197 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800198 },
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 Rosencrantz94502cf2015-03-18 09:43:44 -0700205 InArgs: []rpc.ArgDesc{{Name: "start"}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800206 },
207 {
208 Name: "StreamingAdd",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700209 OutArgs: []rpc.ArgDesc{{Name: "total"}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800210 },
211 {
212 Name: "QuoteAny",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700213 InArgs: []rpc.ArgDesc{{Name: "a"}},
214 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800215 },
216 },
217 },
218 {
219 Name: "AdvancedMath",
220 PkgPath: "v.io/x/ref/lib/vdl/testdata/arith",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700221 Embeds: []rpc.EmbedDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800222 {
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 Rosencrantz94502cf2015-03-18 09:43:44 -0700235 Methods: []rpc.MethodDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800236 {
237 Name: "Sine",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700238 InArgs: []rpc.ArgDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800239 {"angle", ``}, // float64
240 },
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700241 OutArgs: []rpc.ArgDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800242 {"", ``}, // float64
243 },
244 },
245 {
246 Name: "Cosine",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700247 InArgs: []rpc.ArgDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800248 {"angle", ``}, // float64
249 },
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700250 OutArgs: []rpc.ArgDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800251 {"", ``}, // float64
252 },
253 },
254 },
255 },
256 {
257 Name: "Exp",
258 PkgPath: "v.io/x/ref/lib/vdl/testdata/arith/exp",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700259 Methods: []rpc.MethodDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800260 {
261 Name: "Exp",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700262 InArgs: []rpc.ArgDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800263 {"x", ``}, // float64
264 },
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700265 OutArgs: []rpc.ArgDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800266 {"", ``}, // float64
267 },
268 },
269 },
270 },
271 })
272}
273
274func TestArith(t *testing.T) {
Todd Wang60052d82015-05-22 15:00:10 -0700275 ctx, shutdown := test.V23Init()
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800276 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 Rosencrantzbb6295d2015-06-19 15:13:58 -0700290 server, err := xrpc.NewServer(ctx, "", obj, nil)
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800291 if err != nil {
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800292 t.Fatalf("%d: %v", i, err)
293 }
Matt Rosencrantzbb6295d2015-06-19 15:13:58 -0700294 root := server.Status().Endpoints[0].Name()
295
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800296 // 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 Rosencrantz94502cf2015-03-18 09:43:44 -0700397 expectDesc(t, serverStub.Describe__(), []rpc.InterfaceDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800398 {
399 Name: "Arith",
400 PkgPath: "v.io/x/ref/lib/vdl/testdata/arith",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700401 Methods: []rpc.MethodDesc{
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800402 {
403 Name: "Add",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700404 InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}},
405 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800406 },
407 {
408 Name: "DivMod",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700409 InArgs: []rpc.ArgDesc{{Name: "a"}, {Name: "b"}},
410 OutArgs: []rpc.ArgDesc{{Name: "quot"}, {Name: "rem"}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800411 },
412 {
413 Name: "Sub",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700414 InArgs: []rpc.ArgDesc{{Name: "args"}},
415 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800416 },
417 {
418 Name: "Mul",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700419 InArgs: []rpc.ArgDesc{{Name: "nested"}},
420 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800421 },
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 Rosencrantz94502cf2015-03-18 09:43:44 -0700428 InArgs: []rpc.ArgDesc{{Name: "start"}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800429 },
430 {
431 Name: "StreamingAdd",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700432 OutArgs: []rpc.ArgDesc{{Name: "total"}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800433 },
434 {
435 Name: "QuoteAny",
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700436 InArgs: []rpc.ArgDesc{{Name: "a"}},
437 OutArgs: []rpc.ArgDesc{{}},
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800438 },
439 },
440 },
441 })
442 }
443}
444
Matt Rosencrantz94502cf2015-03-18 09:43:44 -0700445func expectDesc(t *testing.T, got, want []rpc.InterfaceDesc) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800446 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 Rosencrantz94502cf2015-03-18 09:43:44 -0700453func stripDesc(desc []rpc.InterfaceDesc) {
Matt Rosencrantzbca49812015-03-01 21:32:54 -0800454 // 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}