#!/usr/bin/env python
# Copyright 2019 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import shutil
import unittest
import tempfile

import test_env
from lib.args import Args
from lib.cipd import Cipd
from lib.fuzzer import Fuzzer

from cipd_mock import MockCipd
from device_mock import MockDevice


class TestCipd(unittest.TestCase):

  def test_from_args(self):
    fuzzer = Fuzzer(MockDevice(), u'mock-package1', u'mock-target3')
    parser = Args.make_parser('description')

    args = parser.parse_args(['1/3'])
    cipd = Cipd.from_args(fuzzer, args)
    self.assertTrue(os.path.exists(cipd.root))

    tmp_dir = tempfile.mkdtemp()
    try:
      args = parser.parse_args(['1/3', '--staging', tmp_dir])
      cipd = Cipd.from_args(fuzzer, args)
      self.assertEqual(tmp_dir, cipd.root)
    finally:
      shutil.rmtree(tmp_dir)

  def test_install(self):
    mock_cipd = MockCipd()
    mock_cipd.install()
    self.assertIn('CWD=' + mock_cipd.root + ' ' + mock_cipd._bin +
                  ' install fuchsia/test_data/fuzzing/' +
                  str(mock_cipd.fuzzer) + ' latest', mock_cipd.history)
    mock_cipd.label = 'integration:f581cfbbb07fd975f2008ddfed7a9d9f92491375'
    mock_cipd.install()
    self.assertIn(
        'CWD=' + mock_cipd.root + ' ' + mock_cipd._bin +
        ' install fuchsia/test_data/fuzzing/' + str(mock_cipd.fuzzer) +
        ' s4BNxLyjxJIdZWumbZZtIf1a5TdrjGSpvEbSxQhQBE4C', mock_cipd.history)

  def test_create(self):
    mock_cipd = MockCipd()
    mock_cipd.create()
    self.assertIn(mock_cipd._bin + ' create --pkg-def ' + os.path.join(
        mock_cipd.root, 'cipd.yaml') + ' --ref latest --tag integration:' +
                  mock_cipd.host.snapshot(), mock_cipd.history)


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