var tape = require("tape"); var protobuf = require(".."); tape.test("runtime services", function(test) { // FIXME protobuf.load("tests/data/rpc.proto", function(err, root) { if (err) return test.fail(err.message); var MyService = root.lookup("MyService"), MyMethod = MyService.get("MyMethod").resolve(), MyRequest = MyMethod.resolvedRequestType, MyResponse = MyMethod.resolvedResponseType; var statusCodes = [200, 400]; var timesCalled = 0; MyService = root.lookup("MyService"); test.plan(2); test.test(test.name + " - closed server-side", function(test) { function rpc(method, requestData, callback) { if (++timesCalled < 3) { test.test(test.name + " - should call the rpc impl with", function(test) { test.equal(method, MyMethod, "the reflected method"); test.ok(requestData.length, "a buffer"); test.ok(typeof callback === "function", "a callback function"); test.end(); }); test.test(test.name + " - should call with a buffer that contains", function(test) { test.equal(requestData[0], 3, "ldelim 3"); test.equal(requestData[1], 10, "id 1, wireType 2"); test.equal(requestData[2], 1, "length 1"); test.equal(requestData[3], 0x2f, "the original string"); test.end(); }); setTimeout(function() { var status = statusCodes.shift(); callback(null, MyResponse.encode({ status: status }).finish()); if (status === 200) callback(null, null); // ended server-side }); } else { test.equal(requestData, null, "should signal ended client-side"); } } var service = MyService.create(rpc, true, false); service.myMethod(MyRequest.create({ path: "/" }), function(err, response) { if (err) return test.fail(err.message); test.ok(response instanceof MyResponse.ctor, "should return an instance of MyResponse"); test.deepEqual(response, { status: 200 }, "should return status 200"); test.end(); }); }); test.test(test.name + " - closed client-side", function(test) { function rpc(method, requestData, callback) { if (++timesCalled < 3) { test.test(test.name + " - should call the rpc impl with", function(test) { test.equal(method, MyMethod, "the reflected method"); test.ok(requestData.length, "a buffer"); test.ok(typeof callback === "function", "a callback function"); test.end(); }); test.test(test.name + " - should call with a buffer that contains", function(test) { test.equal(requestData[0], 3, "ldelim 3"); test.equal(requestData[1], 10, "id 1, wireType 2"); test.equal(requestData[2], 1, "length 1"); test.equal(requestData[3], 0x2f, "the original string"); test.end(); }); setTimeout(function() { var status = statusCodes.shift(); callback(null, MyResponse.encode({ status: status }).finish()); if (status === 200) callback(null, null); // ended server-side }); } else { test.equal(requestData, null, "should signal ended client-side"); } } var service = MyService.create(rpc, true, false); service.myMethod(MyRequest.create({ path: "/" }), function(err, response) { if (err) return test.fail(err.message); test.ok(response instanceof MyResponse.ctor, "should return an instance of MyResponse"); test.deepEqual(response, { status: 400 }, "should return status 400"); service.end(); // ended client-side var count = 0, total = 1; if (typeof Promise !== "undefined") { ++total; var promise = service.myMethod(MyRequest.create({ path: "/" })); promise.catch(function(err) { test.ok(err, "should return an error if already ended (Promise)"); if (++count === total) test.end(); }); test.ok(promise instanceof Promise, "should return a promise if callback has been omitted (even if already ended)"); } service.myMethod(MyRequest.create({ path: "/" }), function(err) { test.ok(err, "should return an error if already ended"); if (++count === total) test.end(); }); }); }); }); }); function fakeRPC(test) { function rpc(method, requestData, callback) { if (++timesCalled < 3) { test.test(test.name + " - should call the rpc impl with", function(test) { test.equal(method, MyMethod, "the reflected method"); test.ok(requestData.length, "a buffer"); test.ok(typeof callback === "function", "a callback function"); test.end(); }); test.test(test.name + " - should call with a buffer that contains", function(test) { test.equal(requestData[0], 3, "ldelim 3"); test.equal(requestData[1], 10, "id 1, wireType 2"); test.equal(requestData[2], 1, "length 1"); test.equal(requestData[3], 0x2f, "the original string"); test.end(); }); setTimeout(function() { var status = statusCodes.shift(); callback(null, MyResponse.encode({ status: status }).finish()); if (status === 200) callback(null, null); // ended server-side }); } else { test.equal(requestData, null, "should signal ended client-side"); } } return rpc; }