# -*- 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)
