# -*- coding: utf-8 -*-
# Copyright 2015 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.

"""Tests for the androidbuild module."""

from __future__ import print_function

import os
import pwd

import googleapiclient.discovery
import googleapiclient.http
import httplib2
import mock
import oauth2client
from six.moves import builtins

from chromite.lib import androidbuild
from chromite.lib import cros_test_lib

TESTDATA_PATH = os.path.join(os.path.dirname(__file__), 'testdata')


class AndroidBuildTests(cros_test_lib.TestCase):
  """Tests for the androidbuild module."""

  def testFindCredentialsFile(self):
    """Checks that we can correctly locate the JSON files."""

    def RelativeToHome(fpath):
      """Builds paths relative to the home directory."""
      return os.path.relpath(fpath, os.environ['HOME'])

    authorized_user_path = os.path.join(
        TESTDATA_PATH, 'androidbuild', 'test_creds_authorized_user.json')
    service_account_path = os.path.join(
        TESTDATA_PATH, 'androidbuild', 'test_creds_service_account.json')
    nonexistent_path = os.path.join(
        TESTDATA_PATH, 'androidbuild', 'nonexistent.json')

    # Check that we find the authorized user file if it exists.
    json_path = androidbuild.FindCredentialsFile(
        homedir_json_credentials_path=RelativeToHome(authorized_user_path))
    self.assertEqual(os.path.abspath(json_path),
                     os.path.abspath(authorized_user_path))

    # Check that we fail if it can't be found.
    with self.assertRaises(androidbuild.CredentialsNotFoundError):
      json_path = androidbuild.FindCredentialsFile(
          homedir_json_credentials_path=RelativeToHome(nonexistent_path))

    # Check that the ovverride with the service account takes precedence.
    json_path = androidbuild.FindCredentialsFile(
        service_account_path,
        homedir_json_credentials_path=RelativeToHome(authorized_user_path))
    self.assertEqual(os.path.abspath(json_path),
                     os.path.abspath(service_account_path))

  def testFindCredentialsFile_PortageUsername(self):
    """Checks that we can locate the JSON files under $PORTAGE_USERNAME."""
    copy_environ = os.environ.copy()
    copy_environ['HOME'] = '/nonexistent'
    copy_environ['PORTAGE_USERNAME'] = 'fakeuser'

    fakeuser_homedir = os.path.join(TESTDATA_PATH, 'androidbuild')
    fakeuser_pwent = pwd.struct_passwd(('fakeuser', 'x', 1234, 1234,
                                        'Fake User', fakeuser_homedir,
                                        '/bin/sh'))

    service_account_name = 'test_creds_authorized_user.json'

    with mock.patch.dict(os.environ, copy_environ), \
        mock.patch.object(pwd, 'getpwnam') as mock_getpwnam:
      mock_getpwnam.return_value = fakeuser_pwent

      json_path = androidbuild.FindCredentialsFile(
          homedir_json_credentials_path=service_account_name)

      mock_getpwnam.assert_called_once_with('fakeuser')

      self.assertEqual(json_path,
                       os.path.join(fakeuser_homedir, service_account_name))

  def testLoadCredentials_ServiceAccount(self):
    """Checks that loading a service account from JSON works."""
    creds = androidbuild.LoadCredentials(os.path.join(
        TESTDATA_PATH, 'androidbuild', 'test_creds_service_account.json'))

    # In this method, for service accounts, we need to check inside private
    # attributes, so pylint: disable=protected-access

    # Check that this was indeed recognized as a service account.
    self.assertIsInstance(
        creds, oauth2client.service_account._ServiceAccountCredentials)

    # Check identification of this service account.
    self.assertEqual(
        creds._service_account_id,
        '78539106351-7rmgdpp1v64a3dpqqqpoi2qeir3tse0k'
        '.apps.googleusercontent.com')
    self.assertEqual(
        creds._service_account_email,
        '78539106351-7rmgdpp1v64a3dpqqqpoi2qeir3tse0k'
        '@developer.gserviceaccount.com')

    # Check that the test private key matches the one we expected to see.
    self.assertEqual(
        creds._private_key_id,
        'c3f27df17b54445bf56fab801323563537405f35')

    # Check that the scope has been set correctly.
    self.assertEqual(
        creds._scopes,
        'https://www.googleapis.com/auth/androidbuild.internal')

  def testLoadCredentials_AuthorizedUser(self):
    """Checks that loading authorized user credentials works."""
    creds = androidbuild.LoadCredentials(os.path.join(
        TESTDATA_PATH, 'androidbuild', 'test_creds_authorized_user.json'))

    # Check that this was indeed recognized as a service account.
    self.assertIsInstance(creds, oauth2client.client.GoogleCredentials)

    # Check identification of the client.
    self.assertEqual(
        creds.client_id,
        '78539106351-iijlq710v1ia1g6dadm3bcvb1vmiotq5'
        '.apps.googleusercontent.com')

    # Check that the client secret matches the one we expected to see.
    self.assertEqual(
        creds.client_secret,
        'W40GFz7qWi8RdtTh5dx7J_zv')

    # Authorized user credentials are scopeless.
    self.assertFalse(creds.create_scoped_required())

  def testGetApiClient(self):
    """Checks that the correct calls are used to connect the API client."""
    creds = mock.Mock()
    with mock.patch.object(httplib2, 'Http') as mock_http, \
        mock.patch.object(googleapiclient.discovery, 'build') as mock_build:

      # Create the ab_client.
      ab_client = androidbuild.GetApiClient(creds)

      # Check that creds were used to authorize the Http server.
      mock_http.assert_called_once_with()
      creds.authorize.assert_called_once_with(mock_http.return_value)
      mock_build.assert_called_once_with(
          'androidbuildinternal', 'v2beta1',
          http=creds.authorize.return_value)
      self.assertEqual(ab_client, mock_build.return_value)

  def testFetchArtifact(self):
    """Checks that FetchArtifact makes the correct androidbuild API calls."""
    ab_client = mock.Mock()

    with mock.patch.object(googleapiclient.http, 'MediaIoBaseDownload') \
        as mock_download, \
        mock.patch.object(builtins, 'open') as mock_open, \
        mock.patch.object(os, 'makedirs') as mock_makedirs:

      # Make sure downloader.next_chunk() will return done=True.
      mock_download.return_value.next_chunk.return_value = (None, True)

      androidbuild.FetchArtifact(
          ab_client, 'git_mnc-dev', 'mickey-userdebug', 123456,
          'abc/mickey-img-123456.zip')

      mock_makedirs.assert_called_once_with('abc')
      mock_open.assert_called_once_with('abc/mickey-img-123456.zip', 'wb')

      ab_client.buildartifact.assert_called_once_with()
      ab_client.buildartifact.return_value.get_media.assert_called_once_with(
          target='mickey-userdebug',
          buildId=123456,
          attemptId='latest',
          resourceId='abc/mickey-img-123456.zip')

      # Check that first argument is open('...', 'wb') file handle (as a
      # context manager), the second is the media_id returned from the
      # get_media(...) call and the third is a 20MiB chunk size setting.
      mock_download.assert_called_once_with(
          mock_open.return_value.__enter__.return_value,
          ab_client.buildartifact.return_value.get_media.return_value,
          chunksize=20971520)

  def testFindRecentBuilds(self):
    """Checks that FindRecentBuilds uses the correct API."""
    ab_client = mock.Mock()
    ab_client.build.return_value.list.return_value.execute.return_value = {
        'builds': [{'buildId': '122556'}, {'buildId': '123456'}]}
    build_ids = androidbuild.FindRecentBuilds(
        ab_client, 'git_mnc-dev', 'mickey-userdebug')
    ab_client.build.assert_called_once_with()
    ab_client.build.return_value.list.assert_called_once_with(
        buildType='submitted',
        branch='git_mnc-dev',
        target='mickey-userdebug')
    # Confirm that it returns them newest to oldest.
    self.assertEqual(build_ids, [123456, 122556])

  def testFindLatestGreenBuildId(self):
    """Checks that FindLatestGreenBuildId uses the correct API."""
    ab_client = mock.Mock()
    ab_client.build.return_value.list.return_value.execute.return_value = {
        'builds': [{'buildId': '122556'}, {'buildId': '123456'}]}
    build_id = androidbuild.FindLatestGreenBuildId(
        ab_client, 'git_mnc-dev', 'mickey-userdebug')
    ab_client.build.assert_called_once_with()
    ab_client.build.return_value.list.assert_called_once_with(
        buildType='submitted',
        branch='git_mnc-dev',
        target='mickey-userdebug',
        successful=True)
    self.assertEqual(build_id, 123456)

  def testSplitAbUrl(self):
    """Checks that SplitAbUrl works as expected."""

    # Full URL.
    branch, target, build_id, filepath = androidbuild.SplitAbUrl(
        'ab://android-build/git_mnc-dev/mickey-userdebug/123456/'
        'abc/mickey-img-123456.zip')
    self.assertEqual(branch, 'git_mnc-dev')
    self.assertEqual(target, 'mickey-userdebug')
    self.assertEqual(build_id, 123456)
    self.assertEqual(filepath, 'abc/mickey-img-123456.zip')

    # Without the filepath.
    branch, target, build_id, filepath = androidbuild.SplitAbUrl(
        'ab://android-build/git_mnc-dev/mickey-userdebug/123456')
    self.assertEqual(branch, 'git_mnc-dev')
    self.assertEqual(target, 'mickey-userdebug')
    self.assertEqual(build_id, 123456)
    self.assertIsNone(filepath)

    # Only branch and target.
    branch, target, build_id, filepath = androidbuild.SplitAbUrl(
        'ab://android-build/git_mnc-dev/mickey-userdebug')
    self.assertEqual(branch, 'git_mnc-dev')
    self.assertEqual(target, 'mickey-userdebug')
    self.assertIsNone(build_id)
    self.assertIsNone(filepath)

    # Less than that it's an error.
    with self.assertRaisesRegex(ValueError, r'\btoo short\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'ab://android-build/git_mnc-dev')

    with self.assertRaisesRegex(ValueError, r'\btoo short\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'ab://android-build')

    with self.assertRaisesRegex(ValueError, r'\btoo short\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'ab://android-build/')

    with self.assertRaisesRegex(ValueError, r'\bempty target\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'ab://android-build/git_mnc-dev/')

    # Non-numeric build_id.
    with self.assertRaisesRegex(ValueError, r'\bnon-numeric build_id\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'ab://android-build/git_mnc-dev/mickey-userdebug/NaN/test.zip')

    # Wrong protocol.
    with self.assertRaisesRegex(ValueError, r'\bab:// protocol\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'gs://android-build/git_mnc-dev/mickey-userdebug/123456/'
          'abc/mickey-img-123456.zip')

    with self.assertRaisesRegex(ValueError, r'\bab:// protocol\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'http://android-build/git_mnc-dev/mickey-userdebug/123456')

    # Wrong bucket.
    with self.assertRaisesRegex(ValueError, r'\s"android-build" bucket\b'):
      branch, target, build_id, filepath = androidbuild.SplitAbUrl(
          'ab://cros-build/git_mnc-dev/mickey-userdebug/123456')
