| # -*- coding: utf-8 -*- |
| # Copyright 2017 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Unit tests for prpc.""" |
| |
| from __future__ import print_function |
| |
| import json |
| import mock |
| |
| from chromite.lib import auth |
| from chromite.lib import cros_test_lib |
| from chromite.lib import prpc |
| |
| |
| class TestClient(prpc.PRPCClient): |
| """Test PRPCClient object.""" |
| def _GetHost(self): |
| return 'foo.com' |
| |
| |
| class PRPCCodeTest(cros_test_lib.MockTestCase): |
| """Tests for PRPCCode.""" |
| def testGetCodeString(self): |
| """Test GetCodeString.""" |
| self.assertEqual(prpc.PRPCCode.OK, 0) |
| self.assertEqual(prpc.PRPCCode.Unauthenticated, 16) |
| self.assertEqual(prpc.GetCodeString(prpc.PRPCCode.OK), 'OK') |
| self.assertEqual(prpc.GetCodeString(prpc.PRPCCode.Unauthenticated), |
| 'Unauthenticated') |
| self.assertEqual(prpc.GetCodeString(-1), 'pRPC code (-1) out of range') |
| self.assertEqual(prpc.GetCodeString(prpc.PRPCCode.Unauthenticated + 1), |
| 'pRPC code (17) out of range') |
| |
| |
| class PRPCClientTest(cros_test_lib.MockTestCase): |
| """Tests for PRPCClient.""" |
| def setUp(self): |
| self.mock_http = mock.MagicMock() |
| self.PatchObject(auth, 'AuthorizedHttp', return_value=self.mock_http) |
| self.xssi_prefix = ")]}'\n" |
| self.success_response = { |
| 'status': 200, |
| 'x-prpc-grpc-code': 0, |
| } |
| self.success_content = self.xssi_prefix + json.dumps({ |
| 'key': 'value', |
| }) |
| self.client = TestClient() |
| |
| def testConstructURL(self): |
| """Test ConstructURL.""" |
| client = prpc.PRPCClient(insecure=True, host='bar.com') |
| self.assertEqual(client.ConstructURL('svc', 'm'), 'http://bar.com/svc/m') |
| self.assertEqual(self.client.ConstructURL('svc2', 'm2'), |
| 'https://foo.com/svc2/m2') |
| |
| def testConstructURLSpaces(self): |
| """Test ConstructURL when host has spaces.""" |
| client = prpc.PRPCClient(insecure=True, host=' baz.com ') |
| self.assertEqual(client.ConstructURL('svc', 'm'), 'http://baz.com/svc/m') |
| |
| def testSendRequest(self): |
| """Test SendRequest.""" |
| self.mock_http.request.return_value = (self.success_response, |
| self.success_content) |
| resp = self.client.SendRequest('svc', 'm') |
| self.assertEqual(resp['key'], 'value') |
| self.assertEqual(self.mock_http.request.call_count, 1) |
| |
| def testMissingHTTPStatus(self): |
| """Test SendRequest with missing HTTP status code.""" |
| response = { |
| 'x-prpc-grpc-code': 0, |
| } |
| self.mock_http.request.return_value = (response, self.success_content) |
| self.assertRaises(prpc.PRPCResponseException, |
| self.client.SendRequest, 'svc', 'm') |
| self.assertEqual(self.mock_http.request.call_count, 1) |
| |
| def testBadHTTPStatus(self): |
| """Test SendRequest with bad HTTP status code.""" |
| response = { |
| 'status': 203, |
| 'x-prpc-grpc-code': 0, |
| } |
| self.mock_http.request.return_value = (response, self.success_content) |
| self.assertRaises(prpc.PRPCResponseException, |
| self.client.SendRequest, 'svc', 'm') |
| self.assertEqual(self.mock_http.request.call_count, 1) |
| |
| def testBadHTTPRetry(self): |
| """Test SendRequest with bad HTTP status code causing retry.""" |
| response = { |
| 'status': 503, |
| 'x-prpc-grpc-code': 0, |
| } |
| self.mock_http.request.return_value = (response, self.success_content) |
| self.assertRaises(prpc.PRPCResponseException, |
| self.client.SendRequest, 'svc', 'm') |
| self.assertEqual(self.mock_http.request.call_count, 4) |
| |
| def testMissingPRPCCode(self): |
| """Test SendRequest with missing pRPC status code.""" |
| response = { |
| 'status': 200, |
| } |
| self.mock_http.request.return_value = (response, self.success_content) |
| self.assertRaises(prpc.PRPCResponseException, |
| self.client.SendRequest, 'svc', 'm') |
| self.assertEqual(self.mock_http.request.call_count, 1) |
| |
| def testBadPRPCCode(self): |
| """Test SendRequest with bad pRPC status code.""" |
| response = { |
| 'status': 200, |
| 'x-prpc-grpc-code': 1, |
| } |
| response['x-prpc-grpc-code'] = 1 |
| self.mock_http.request.return_value = (response, self.success_content) |
| self.assertRaises(prpc.PRPCResponseException, |
| self.client.SendRequest, 'svc', 'm') |
| self.assertEqual(self.mock_http.request.call_count, 1) |
| |
| def testBadPRPCRetry(self): |
| """Test SendRequest with bad pRPC status code causing retry.""" |
| response = { |
| 'status': 200, |
| 'x-prpc-grpc-code': prpc.PRPCCode.Unavailable, |
| } |
| self.mock_http.request.return_value = (response, self.success_content) |
| self.assertRaises(prpc.PRPCResponseException, |
| self.client.SendRequest, 'svc', 'm', |
| retry_count=1) |
| self.assertEqual(self.mock_http.request.call_count, 2) |
| |
| def testInvalidXSSI(self): |
| """Test SendRequest with invalid XSSI prefix.""" |
| content = 'x' + self.success_content |
| self.mock_http.request.return_value = (self.success_response, content) |
| self.assertRaises(prpc.PRPCResponseException, |
| self.client.SendRequest, 'svc', 'm') |
| self.assertEqual(self.mock_http.request.call_count, 1) |