# Lint as: python2, python3
# 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.

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import os
import unittest

import common
from autotest_lib.client.bin.result_tools import result_info
from autotest_lib.client.bin.result_tools import throttler_lib
from autotest_lib.client.bin.result_tools import unittest_lib
from autotest_lib.client.bin.result_tools import utils_lib
from six.moves import range


# This unittest doesn't care about the size, so the size info can be shared to
# make the code cleaner.
FILE_SIZE_DICT = {utils_lib.ORIGINAL_SIZE_BYTES: unittest_lib.SIZE}

SAMPLE_SUMMARY = {
  '': {utils_lib.ORIGINAL_SIZE_BYTES: 7 * unittest_lib.SIZE,
       utils_lib.DIRS: [
         {'file1': FILE_SIZE_DICT},
         {'file2.tar': {utils_lib.ORIGINAL_SIZE_BYTES: 2 * unittest_lib.SIZE}},
         {'file.deleted': {utils_lib.ORIGINAL_SIZE_BYTES: unittest_lib.SIZE,
                           utils_lib.TRIMMED_SIZE_BYTES: 0}},
         {'keyval': FILE_SIZE_DICT},
         {'sysinfo':
            {utils_lib.ORIGINAL_SIZE_BYTES: 2 * unittest_lib.SIZE,
             utils_lib.DIRS: [
                {'file3': FILE_SIZE_DICT},
                {'var':
                  {utils_lib.ORIGINAL_SIZE_BYTES: unittest_lib.SIZE,
                   utils_lib.DIRS: [
                     {'log': {utils_lib.ORIGINAL_SIZE_BYTES: unittest_lib.SIZE,
                              utils_lib.DIRS: [
                                 {'file4': FILE_SIZE_DICT}
                                 ],
                              }
                      }
                    ],
                   },
                 }
                ],
             }
            },
          ],
       }
  }

EXPECTED_FILES = [
        ['', 'sysinfo', 'var', 'log', 'file4'],
        ['', 'sysinfo', 'file3'],
        ['', 'file2.tar'],
        ['', 'file1'],
        ['', 'keyval'],
        ['', 'file.deleted'],
        ]

EXPECTED_THROTTABLE_FILES = [
        ['', 'sysinfo', 'var', 'log', 'file4'],
        ['', 'sysinfo', 'file3'],
        ['', 'file2.tar'],
        ]

class ThrottlerLibTest(unittest.TestCase):
    """Test class for methods in throttler_lib."""

    def testSortResultFiles(self):
        """Test method sort_result_files"""
        summary = result_info.ResultInfo(parent_dir='',
                                         original_info=SAMPLE_SUMMARY)
        sorted_files, _ = throttler_lib.sort_result_files(summary)
        self.assertEqual(len(EXPECTED_FILES), len(sorted_files))
        for i in range(len(EXPECTED_FILES)):
            self.assertEqual(os.path.join(*EXPECTED_FILES[i]),
                             sorted_files[i].path)

    def testGetThrottableFiles(self):
        """Test method get_throttleable_files"""
        summary = result_info.ResultInfo(parent_dir='',
                                         original_info=SAMPLE_SUMMARY)
        sorted_files, _ = throttler_lib.sort_result_files(summary)
        throttleables = throttler_lib.get_throttleable_files(
                sorted_files, ['.*file1'])

        throttleables = list(throttleables)
        self.assertEqual(len(EXPECTED_THROTTABLE_FILES), len(throttleables))
        for i in range(len(EXPECTED_THROTTABLE_FILES)):
            self.assertEqual(os.path.join(*EXPECTED_THROTTABLE_FILES[i]),
                             throttleables[i].path)


# this is so the test can be run in standalone mode
if __name__ == '__main__':
    """Main"""
    unittest.main()
