aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/node/test/call_test.js
blob: 25860d040de16d1df9ea7d480a8fe67653357f5e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
var assert = require('assert');
var grpc = require('bindings')('grpc.node');

var channel = new grpc.Channel('localhost:7070');

/**
 * Helper function to return an absolute deadline given a relative timeout in
 * seconds.
 * @param {number} timeout_secs The number of seconds to wait before timing out
 * @return {Date} A date timeout_secs in the future
 */
function getDeadline(timeout_secs) {
  var deadline = new Date();
  deadline.setSeconds(deadline.getSeconds() + timeout_secs);
  return deadline;
}

describe('call', function() {
  describe('constructor', function() {
    it('should reject anything less than 3 arguments', function() {
      assert.throws(function() {
        new grpc.Call();
      }, TypeError);
      assert.throws(function() {
        new grpc.Call(channel);
      }, TypeError);
      assert.throws(function() {
        new grpc.Call(channel, 'method');
      }, TypeError);
    });
    it('should succeed with a Channel, a string, and a date or number',
       function() {
         assert.doesNotThrow(function() {
           new grpc.Call(channel, 'method', new Date());
         });
         assert.doesNotThrow(function() {
           new grpc.Call(channel, 'method', 0);
         });
       });
    it('should fail with a closed channel', function() {
      var local_channel = new grpc.Channel('hostname');
      local_channel.close();
      assert.throws(function() {
        new grpc.Call(channel, 'method');
      });
    });
    it('should fail with other types', function() {
      assert.throws(function() {
        new grpc.Call({}, 'method', 0);
      }, TypeError);
      assert.throws(function() {
        new grpc.Call(channel, null, 0);
      }, TypeError);
      assert.throws(function() {
        new grpc.Call(channel, 'method', 'now');
      }, TypeError);
    });
  });
  describe('addMetadata', function() {
    it('should succeed with objects containing keys and values', function() {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      assert.doesNotThrow(function() {
        call.addMetadata();
      });
      assert.doesNotThrow(function() {
        call.addMetadata({'key' : 'key',
                          'value' : new Buffer('value')});
      });
      assert.doesNotThrow(function() {
        call.addMetadata({'key' : 'key1',
                          'value' : new Buffer('value1')},
                         {'key' : 'key2',
                          'value' : new Buffer('value2')});
      });
    });
    it('should fail with other parameter types', function() {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      assert.throws(function() {
        call.addMetadata(null);
      }, TypeError);
      assert.throws(function() {
        call.addMetadata('value');
      }, TypeError);
      assert.throws(function() {
        call.addMetadata(5);
      }, TypeError);
    });
    it('should fail if startInvoke was already called', function(done) {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      call.startInvoke(function() {},
                       function() {},
                       function() {done();},
                       0);
      assert.throws(function() {
        call.addMetadata({'key' : 'key', 'value' : new Buffer('value') });
      }, function(err) {
        return err.code === grpc.callError.ALREADY_INVOKED;
      });
      // Cancel to speed up the test
      call.cancel();
    });
  });
  describe('startInvoke', function() {
    it('should fail with fewer than 4 arguments', function() {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      assert.throws(function() {
        call.startInvoke();
      }, TypeError);
      assert.throws(function() {
        call.startInvoke(function() {});
      }, TypeError);
      assert.throws(function() {
        call.startInvoke(function() {},
                         function() {});
      }, TypeError);
      assert.throws(function() {
        call.startInvoke(function() {},
                         function() {},
                         function() {});
      }, TypeError);
    });
    it('should work with 3 args and an int', function(done) {
      assert.doesNotThrow(function() {
        var call = new grpc.Call(channel, 'method', getDeadline(1));
        call.startInvoke(function() {},
                         function() {},
                         function() {done();},
                         0);
        // Cancel to speed up the test
        call.cancel();
      });
    });
    it('should reject incorrectly typed arguments', function() {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      assert.throws(function() {
        call.startInvoke(0, 0, 0, 0);
      }, TypeError);
      assert.throws(function() {
        call.startInvoke(function() {},
                         function() {},
                         function() {}, 'test');
      });
    });
  });
  describe('serverAccept', function() {
    it('should fail with fewer than 1 argument1', function() {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      assert.throws(function() {
        call.serverAccept();
      }, TypeError);
    });
    it('should return an error when called on a client Call', function() {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      assert.throws(function() {
        call.serverAccept(function() {});
      }, function(err) {
        return err.code === grpc.callError.NOT_ON_CLIENT;
      });
    });
  });
  describe('cancel', function() {
    it('should succeed', function() {
      var call = new grpc.Call(channel, 'method', getDeadline(1));
      assert.doesNotThrow(function() {
        call.cancel();
      });
    });
  });
});