#!/usr/bin/python2
#
# Copyright (c) 2012 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 downloader module."""

from __future__ import print_function

import mox
import os
import shutil
import tempfile
import unittest

import build_artifact
import downloader


# pylint: disable=W0212,E1120
class DownloaderTestBase(mox.MoxTestBase):
  """Downloader Unittests."""

  def setUp(self):
    mox.MoxTestBase.setUp(self)
    self._work_dir = tempfile.mkdtemp('downloader-test')
    self.board = 'x86-mario-release'
    self.build = 'R17-1413.0.0-a1-b1346'
    self.archive_url = (
        'gs://chromeos-image-archive/%s/%s' % (self.board, self.build))
    self.local_path = ('/local/path/x86-mario-release/R17-1413.0.0-a1-b1346')

  def tearDown(self):
    shutil.rmtree(self._work_dir, ignore_errors=True)

  def _SimpleDownloadOfTestSuites(self, downloader_instance):
    """Helper to verify test_suites are downloaded correctly.

    Args:
      downloader_instance: Downloader object to test with.
    """
    factory = build_artifact.ChromeOSArtifactFactory(
        downloader_instance.GetBuildDir(), ['test_suites'],
        None, downloader_instance.GetBuild())
    self.mox.StubOutWithMock(downloader.Downloader,
                             '_DownloadArtifactsSerially')
    self.mox.StubOutWithMock(downloader.Downloader,
                             '_DownloadArtifactsInBackground')

    downloader.Downloader._DownloadArtifactsInBackground(mox.In(mox.IsA(
        build_artifact.AutotestTarball)))
    downloader.Downloader._DownloadArtifactsSerially(
        [mox.IsA(build_artifact.BundledArtifact)], no_wait=True)
    self.mox.ReplayAll()
    downloader_instance.Download(factory)
    # Sanity check the timestamp file exists.
    self.assertTrue(os.path.exists(
        os.path.join(self._work_dir, self.board, self.build,
                     downloader.Downloader._TIMESTAMP_FILENAME)))
    self.mox.VerifyAll()

  def testSimpleDownloadOfTestSuitesFromGS(self):
    """Basic test_suites test.

    Verifies that if we request the test_suites from Google Storage, it gets
    downloaded and the autotest tarball is attempted in the background.
    """
    self._SimpleDownloadOfTestSuites(
        downloader.GoogleStorageDownloader(self._work_dir, self.archive_url))

  def testSimpleDownloadOfTestSuitesFromLocal(self):
    """Basic test_suites test.

    Verifies that if we request the test_suites from a local path, it gets
    downloaded and the autotest tarball is attempted in the background.
    """
    self._SimpleDownloadOfTestSuites(
        downloader.LocalDownloader(self._work_dir, self.local_path))

  def _DownloadSymbolsHelper(self, downloader_instance):
    """Basic symbols download."""
    factory = build_artifact.ChromeOSArtifactFactory(
        downloader_instance.GetBuildDir(), ['symbols'],
        None, downloader_instance.GetBuild())

    self.mox.StubOutWithMock(downloader.Downloader,
                             '_DownloadArtifactsSerially')
    # Should not get called but mocking so that we know it wasn't called.
    self.mox.StubOutWithMock(downloader.Downloader,
                             '_DownloadArtifactsInBackground')
    downloader.Downloader._DownloadArtifactsSerially(
        [mox.IsA(build_artifact.BundledArtifact)], no_wait=True)
    self.mox.ReplayAll()
    downloader_instance.Download(factory)
    self.mox.VerifyAll()

  def testDownloadSymbolsFromGS(self):
    """Basic symbols download from Google Storage."""
    self._DownloadSymbolsHelper(
        downloader.GoogleStorageDownloader(self._work_dir, self.archive_url))

  def testDownloadSymbolsFromLocal(self):
    """Basic symbols download from a Local Path."""
    self._DownloadSymbolsHelper(
        downloader.LocalDownloader(self._work_dir, self.local_path))


class AndroidDownloaderTestBase(mox.MoxTestBase):
  """Android Downloader Unittests."""

  def setUp(self):
    mox.MoxTestBase.setUp(self)
    self._work_dir = tempfile.mkdtemp('downloader-test')
    self.branch = 'release'
    self.target = 'shamu-userdebug'
    self.build_id = '123456'

  def tearDown(self):
    shutil.rmtree(self._work_dir, ignore_errors=True)

  def testDownloadFromAndroidBuildServer(self):
    """Basic test to check download from Android's build server works."""
    downloader_instance = downloader.AndroidBuildDownloader(
        self._work_dir, self.branch, self.build_id, self.target)
    factory = build_artifact.AndroidArtifactFactory(
        downloader_instance.GetBuildDir(), ['fastboot'],
        None, downloader_instance.GetBuild())
    self.mox.StubOutWithMock(downloader.Downloader,
                             '_DownloadArtifactsSerially')
    self.mox.StubOutWithMock(downloader.Downloader,
                             '_DownloadArtifactsInBackground')

    downloader.Downloader._DownloadArtifactsSerially(
        [mox.IsA(build_artifact.Artifact)], no_wait=True)
    self.mox.ReplayAll()
    downloader_instance.Download(factory)
    # Sanity check the timestamp file exists.
    self.assertTrue(os.path.exists(
        os.path.join(self._work_dir, self.branch, self.target, self.build_id,
                     downloader.Downloader._TIMESTAMP_FILENAME)))
    self.mox.VerifyAll()


if __name__ == '__main__':
  unittest.main()
