blob: c83ec259c88bf777deae802b7dabead17a4febf4 [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
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -08006
7import (
8 "io"
9 "testing"
10 "time"
11
Jiri Simsa6ac95222015-02-23 16:11:49 -080012 "v.io/v23"
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070013 "v.io/v23/rpc"
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080014)
15
16type simple struct {
17 done <-chan struct{}
18}
19
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070020func (s *simple) Sleep(call rpc.ServerCall) error {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080021 select {
22 case <-s.done:
23 case <-time.After(time.Hour):
24 }
25 return nil
26}
27
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070028func (s *simple) Ping(call rpc.ServerCall) (string, error) {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080029 return "pong", nil
30}
31
Cosmos Nicolaou185c0c62015-04-13 21:22:43 -070032func (s *simple) Echo(call rpc.ServerCall, arg string) (string, error) {
33 return arg, nil
34}
35
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070036func (s *simple) Source(call rpc.StreamServerCall, start int) error {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080037 i := start
38 backoff := 25 * time.Millisecond
39 for {
40 select {
41 case <-s.done:
42 return nil
43 case <-time.After(backoff):
44 call.Send(i)
45 i++
46 }
47 backoff *= 2
48 }
49}
50
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070051func (s *simple) Sink(call rpc.StreamServerCall) (int, error) {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080052 i := 0
53 for {
54 if err := call.Recv(&i); err != nil {
Todd Wange77f9952015-02-18 13:20:50 -080055 if err == io.EOF {
56 return i, nil
57 }
58 return 0, err
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080059 }
60 }
61}
62
Matt Rosencrantz94502cf2015-03-18 09:43:44 -070063func (s *simple) Inc(call rpc.StreamServerCall, inc int) (int, error) {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080064 i := 0
65 for {
66 if err := call.Recv(&i); err != nil {
67 if err == io.EOF {
Todd Wange77f9952015-02-18 13:20:50 -080068 return i, nil
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080069 }
Todd Wange77f9952015-02-18 13:20:50 -080070 return 0, err
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080071 }
72 call.Send(i + inc)
73 }
74}
75
76func TestSimpleRPC(t *testing.T) {
Ankurfb9255a2015-01-21 15:29:38 -080077 ctx, shutdown := newCtx()
78 defer shutdown()
79 name, fn := initServer(t, ctx)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080080 defer fn()
81
Jiri Simsa6ac95222015-02-23 16:11:49 -080082 client := v23.GetClient(ctx)
Ankurfb9255a2015-01-21 15:29:38 -080083 call, err := client.StartCall(ctx, name, "Ping", nil)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080084 if err != nil {
85 t.Fatalf("unexpected error: %s", err)
86 }
87 response := ""
Todd Wange77f9952015-02-18 13:20:50 -080088 if err := call.Finish(&response); err != nil {
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -080089 t.Fatalf("unexpected error: %s", err)
90 }
91 if got, want := response, "pong"; got != want {
92 t.Fatalf("got %q, want %q", got, want)
93 }
94}
95
96func TestSimpleStreaming(t *testing.T) {
Ankurfb9255a2015-01-21 15:29:38 -080097 ctx, shutdown := newCtx()
98 defer shutdown()
99 name, fn := initServer(t, ctx)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800100 defer fn()
101
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800102 inc := 1
Jiri Simsa6ac95222015-02-23 16:11:49 -0800103 call, err := v23.GetClient(ctx).StartCall(ctx, name, "Inc", []interface{}{inc})
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800104 if err != nil {
105 t.Fatalf("unexpected error: %s", err)
106 }
107
108 want := 10
109 for i := 0; i <= want; i++ {
110 if err := call.Send(i); err != nil {
111 t.Fatalf("unexpected error: %s", err)
112 }
113 got := -1
114 if err = call.Recv(&got); err != nil {
115 t.Fatalf("unexpected error: %s", err)
116 }
117 if want := i + inc; got != want {
118 t.Fatalf("got %d, want %d")
119 }
120 }
121 call.CloseSend()
122 final := -1
Todd Wange77f9952015-02-18 13:20:50 -0800123 err = call.Finish(&final)
124 if err != nil {
125 t.Errorf("unexpected error: %#v", err)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800126 }
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800127 if got := final; got != want {
Todd Wange77f9952015-02-18 13:20:50 -0800128 t.Fatalf("got %d, want %d", got, want)
Cosmos Nicolaouae8dd212014-12-13 23:43:08 -0800129 }
130}