| Index: server/static/rpc/test/rpc-client.html
|
| diff --git a/server/static/rpc/test/rpc-client.html b/server/static/rpc/test/rpc-client.html
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..b0d3880c866c6a431ae8522aaaf25e3adc909a61
|
| --- /dev/null
|
| +++ b/server/static/rpc/test/rpc-client.html
|
| @@ -0,0 +1,256 @@
|
| +<!--
|
| + Copyright 2016 The Chromium Authors. All rights reserved.
|
| + Use of this source code is governed by a BSD-style license that can be
|
| + found in the LICENSE file.
|
| + -->
|
| +
|
| +<!doctype html>
|
| +<title>rpc-client</title>
|
| +
|
| +<link rel="import" href="../rpc-client.html">
|
| +<script src="../../bower_components/web-component-tester/browser.js"></script>
|
| +
|
| +<test-fixture id="client">
|
| + <template>
|
| + <rpc-client service="service" method="ok"></rpc-client>
|
| + </template>
|
| +</test-fixture>
|
| +<script>
|
| + 'use strict';
|
| +
|
| + suite('<rpc-client>', function() {
|
| + var client;
|
| + var server;
|
| +
|
| + setup(function() {
|
| + var prefix = ')]}\'\n';
|
| +
|
| + server = sinon.fakeServer.create();
|
| + var okResponseHeaders = {
|
| + 'Content-Type': 'application/json',
|
| + 'X-Prpc-Grpc-Code': '' + luci.rpc.Code.OK
|
| + }
|
| + server.respondWith('POST', '/prpc/service/ok', [
|
| + 200,
|
| + okResponseHeaders,
|
| + prefix + '{"secure": false}'
|
| + ]);
|
| + server.respondWith(
|
| + 'POST',
|
| + 'https://' + document.location.host + '/prpc/service/ok',
|
| + [
|
| + 200,
|
| + okResponseHeaders,
|
| + prefix + '{"secure": true}'
|
| + ])
|
| +
|
| + server.respondWith('POST', '/prpc/service/notFound', [
|
| + 404,
|
| + {
|
| + 'Content-Type': 'text/plain',
|
| + 'X-Prpc-Grpc-Code': '' + luci.rpc.Code.NOT_FOUND
|
| + },
|
| + 'Not found'
|
| + ]);
|
| +
|
| + server.respondWith('POST', '/prpc/service/noCode', [
|
| + 200,
|
| + {
|
| + 'Content-Type': 'text/json',
|
| + },
|
| + '{"blah": "bleh"}'
|
| + ]);
|
| +
|
| + server.respondWith('POST', '/prpc/service/invalidCode', [
|
| + 200,
|
| + {
|
| + 'Content-Type': 'text/json',
|
| + 'X-Prpc-Grpc-Code': 'abc'
|
| + },
|
| + '{"blah": "bleh"}'
|
| + ]);
|
| +
|
| + server.respondWith('POST', '/prpc/service/malformedResponse', [
|
| + 200,
|
| + {
|
| + 'Content-Type': 'text/json',
|
| + 'X-Prpc-Grpc-Code': '' + luci.rpc.Code.OK
|
| + },
|
| + '}}}'
|
| + ]);
|
| +
|
| + client = fixture('client');
|
| + });
|
| +
|
| + teardown(function() {
|
| + server.restore();
|
| + });
|
| +
|
| + function expectResponse(fn) {
|
| + var call = client.call();
|
| + server.respond();
|
| + return call.completes.then(function () {
|
| + expect(client.lastError).not.to.be.error;
|
| + expect(client.lastResponse).to.equal(call.response);
|
| + fn(call);
|
| + });
|
| + }
|
| +
|
| + function expectError(fn) {
|
| + var call = client.call();
|
| + server.respond();
|
| + return call.completes.then(function() {
|
| + assert.fail('no error', 'error');
|
| + }).catch(function (error) {
|
| + expect(error).not.to.be.null;
|
| + expect(client.lastResponse).to.be.null;
|
| + expect(client.lastError).to.be.equal(error);
|
| + fn(error);
|
| + });
|
| + }
|
| +
|
| + test('by default host is current', function() {
|
| + expect(client.host).to.be.equal(document.location.host);
|
| + });
|
| +
|
| + test('with a request', function() {
|
| + client.request = { msg: 'hi' };
|
| + var call = client.call();
|
| + expect(call.xhr.requestBody).to.equal('{"msg":"hi"}');
|
| + });
|
| +
|
| + test('loading property changes', function() {
|
| + expect(client.loading).to.be.false;
|
| +
|
| + var call = client.call();
|
| + expect(client.loading).to.be.true;
|
| +
|
| + server.respond();
|
| + return call.completes.then(function() {
|
| + expect(client.loading).to.be.false;
|
| + });
|
| + });
|
| +
|
| + test('reads response', function() {
|
| + return expectResponse(function(call) {
|
| + expect(call.response).to.be.deep.equal({ secure: false });
|
| + expect(call.code).to.equal(luci.rpc.Code.OK);
|
| + });
|
| + });
|
| +
|
| + test('sets code', function() {
|
| + return expectResponse(function(call) {
|
| + expect(call.code).to.equal(luci.rpc.Code.OK);
|
| + expect(client.lastCode).to.equal(call.code);
|
| + });
|
| + });
|
| +
|
| + test('secure', function() {
|
| + client.insecure = false;
|
| + return expectResponse(function(call) {
|
| + expect(call.response).to.be.deep.equal({ secure: true });
|
| + });
|
| + });
|
| +
|
| + test('with timeout', function() {
|
| + client.timeout = 1000;
|
| + var call = client.call();
|
| + var timeoutHeader = call.xhr.requestHeaders['x-prpc-timeout'];
|
| + expect(timeoutHeader).to.be.equal('1000m');
|
| + });
|
| +
|
| + test('error code', function() {
|
| + client.method = 'notFound';
|
| + return expectError(function(e) {
|
| + expect(e).to.be.an.instanceof(luci.rpc.GrpcError);
|
| + expect(e.code).to.equal(luci.rpc.Code.NOT_FOUND);
|
| + expect(e.description).to.equal('Not found');
|
| + expect(client.lastCall.code).to.equal(luci.rpc.Code.NOT_FOUND);
|
| + expect(client.lastCode).to.equal(luci.rpc.Code.NOT_FOUND);
|
| + });
|
| + });
|
| +
|
| + test('no code', function() {
|
| + client.method = 'noCode';
|
| + return expectError(function(e) {
|
| + expect(e.message).to.contain('no X-Prpc-Grpc-Code');
|
| + });
|
| + });
|
| +
|
| + test('malformed response', function() {
|
| + client.method = 'malformedResponse';
|
| + return expectError(function(e) {
|
| + expect(e.message).to.contain('could not parse response');
|
| + });
|
| + });
|
| +
|
| + test('invalid code', function() {
|
| + client.method = 'invalidCode';
|
| + return expectError(function(e) {
|
| + expect(e.message).to.contain('Invalid X-Prpc-Grpc-Code');
|
| + });
|
| + });
|
| +
|
| + test('request event', function() {
|
| + client.request = { msg: 'hi' };
|
| + var event = null;
|
| + client.addEventListener('request', function(e) {
|
| + event = e;
|
| + });
|
| + expect(event).to.be.null;
|
| + var call = client.call();
|
| + expect(event).to.be.ok
|
| + expect(event.detail.call).to.equal(call);
|
| + expect(client.lastCall).to.equal(call);
|
| + expect(call.host).to.equal(document.location.host);
|
| + expect(call.service).to.equal('service');
|
| + expect(call.method).to.equal('ok');
|
| + expect(call.request).to.equal(client.request);
|
| + });
|
| +
|
| + test('response event', function() {
|
| + var event = null;
|
| + client.addEventListener('response', function(e) {
|
| + event = e;
|
| + });
|
| + expect(event).to.be.null;
|
| + return expectResponse(function(call) {
|
| + expect(event).to.be.ok
|
| + expect(event.detail.call).to.equal(call);
|
| + expect(call.host).to.equal(document.location.host);
|
| + expect(call.service).to.equal('service');
|
| + expect(call.method).to.equal('ok');
|
| + expect(call.request).to.equal(client.request);
|
| +
|
| + expect(call.response).to.deep.equal({secure: false});
|
| + expect(call.error).to.be.null;
|
| + });
|
| + });
|
| +
|
| + test('error event', function() {
|
| + client.method = 'notFound';
|
| + var event = null;
|
| + client.addEventListener('error', function(e) {
|
| + event = e;
|
| + });
|
| + expect(event).to.be.null;
|
| + var call = client.call();
|
| + expect(event).to.be.null;
|
| +
|
| + server.respond();
|
| +
|
| + return expectError(function(call) {
|
| + var call = client.lastCall;
|
| + expect(event).to.be.ok
|
| + expect(event.detail.call).to.equal(call);
|
| + expect(call.host).to.equal(document.location.host);
|
| + expect(call.service).to.equal('service');
|
| + expect(call.method).to.equal('notFound');
|
| + expect(call.request).to.equal(client.request);
|
| +
|
| + expect(call.response).to.be.null;
|
| + expect(call.error).to.be.an.instanceof(luci.rpc.GrpcError);
|
| + });
|
| + });
|
| + });
|
| +</script>
|
|
|