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> |