Home | History | Annotate | Download | only in result_tools
      1 # Copyright 2017 The Chromium OS Authors. All rights reserved.
      2 # Use of this source code is governed by a BSD-style license that can be
      3 # found in the LICENSE file.
      4 
      5 import os
      6 import shutil
      7 import tempfile
      8 import unittest
      9 
     10 import common
     11 from autotest_lib.client.bin.result_tools import result_info
     12 from autotest_lib.client.bin.result_tools import shrink_file_throttler
     13 from autotest_lib.client.bin.result_tools import unittest_lib
     14 from autotest_lib.client.bin.result_tools import utils_lib
     15 
     16 
     17 ORIGINAL_SIZE_BYTE = 1000
     18 MAX_RESULT_SIZE_KB = 2
     19 FILE_SIZE_LIMIT_BYTE = 512
     20 LARGE_SIZE_BYTE = 100 * 1024
     21 
     22 SUMMARY_AFTER_TRIMMING = {
     23     '': {utils_lib.DIRS: [
     24             {'BUILD_INFO-HT7591A00171': {
     25                     utils_lib.ORIGINAL_SIZE_BYTES: ORIGINAL_SIZE_BYTE}},
     26             {'file1.xml': {utils_lib.ORIGINAL_SIZE_BYTES: ORIGINAL_SIZE_BYTE}},
     27             {'file2.jpg': {utils_lib.ORIGINAL_SIZE_BYTES: ORIGINAL_SIZE_BYTE}},
     28             {'file3.log': {utils_lib.ORIGINAL_SIZE_BYTES: ORIGINAL_SIZE_BYTE,
     29                            utils_lib.TRIMMED_SIZE_BYTES: FILE_SIZE_LIMIT_BYTE}},
     30             {'folder1': {
     31                 utils_lib.DIRS: [
     32                     {'file4': {
     33                         utils_lib.ORIGINAL_SIZE_BYTES: ORIGINAL_SIZE_BYTE,
     34                         utils_lib.TRIMMED_SIZE_BYTES: FILE_SIZE_LIMIT_BYTE}}],
     35                 utils_lib.ORIGINAL_SIZE_BYTES: ORIGINAL_SIZE_BYTE,
     36                 utils_lib.TRIMMED_SIZE_BYTES: FILE_SIZE_LIMIT_BYTE}},
     37             {'test_run_details.txt': {
     38                     utils_lib.ORIGINAL_SIZE_BYTES: ORIGINAL_SIZE_BYTE}}],
     39          utils_lib.ORIGINAL_SIZE_BYTES: 6 * ORIGINAL_SIZE_BYTE,
     40          utils_lib.TRIMMED_SIZE_BYTES: (
     41                  4 * ORIGINAL_SIZE_BYTE + 2 * FILE_SIZE_LIMIT_BYTE)}
     42     }
     43 
     44 OLD_TIME = 1498800000
     45 
     46 class ShrinkFileThrottleTest(unittest.TestCase):
     47     """Test class for shrink_file_throttler.throttle method."""
     48 
     49     def setUp(self):
     50         """Setup directory for test."""
     51         self.test_dir = tempfile.mkdtemp()
     52         self.files_not_shrink = []
     53         self.files_to_shrink = []
     54 
     55         build_info = os.path.join(self.test_dir, 'BUILD_INFO-HT7591A00171')
     56         unittest_lib.create_file(build_info, ORIGINAL_SIZE_BYTE)
     57         self.files_not_shrink.append(build_info)
     58 
     59         file1 = os.path.join(self.test_dir, 'file1.xml')
     60         unittest_lib.create_file(file1, ORIGINAL_SIZE_BYTE)
     61         self.files_not_shrink.append(file1)
     62 
     63         file2 = os.path.join(self.test_dir, 'file2.jpg')
     64         unittest_lib.create_file(file2, ORIGINAL_SIZE_BYTE)
     65         self.files_not_shrink.append(file2)
     66 
     67         file3 = os.path.join(self.test_dir, 'file3.log')
     68         unittest_lib.create_file(file3, ORIGINAL_SIZE_BYTE)
     69         self.files_to_shrink.append(file3)
     70         os.utime(file3, (OLD_TIME, OLD_TIME))
     71 
     72         file4 = os.path.join(self.test_dir, 'test_run_details.txt')
     73         unittest_lib.create_file(file4, ORIGINAL_SIZE_BYTE)
     74         self.files_not_shrink.append(file4)
     75 
     76         folder1 = os.path.join(self.test_dir, 'folder1')
     77         os.mkdir(folder1)
     78         file4 = os.path.join(folder1, 'file4')
     79         unittest_lib.create_file(file4, ORIGINAL_SIZE_BYTE)
     80         self.files_to_shrink.append(file4)
     81         os.utime(file4, (OLD_TIME, OLD_TIME))
     82 
     83     def tearDown(self):
     84         """Cleanup the test directory."""
     85         shutil.rmtree(self.test_dir, ignore_errors=True)
     86 
     87     def testTrim(self):
     88         """Test throttle method."""
     89         summary = result_info.ResultInfo.build_from_path(self.test_dir)
     90         shrink_file_throttler.throttle(
     91                 summary,
     92                 max_result_size_KB=MAX_RESULT_SIZE_KB,
     93                 file_size_limit_byte=FILE_SIZE_LIMIT_BYTE)
     94 
     95         self.assertEqual(SUMMARY_AFTER_TRIMMING, summary)
     96 
     97         # Verify files that should not be shrunk are not changed.
     98         for f in self.files_not_shrink:
     99             self.assertEqual(ORIGINAL_SIZE_BYTE, os.stat(f).st_size,
    100                              'File %s should not be shrank!' % f)
    101 
    102         # Verify files that should be shrunk are updated.
    103         for f in self.files_to_shrink:
    104             stat = os.stat(f)
    105             self.assertTrue(FILE_SIZE_LIMIT_BYTE >= stat.st_size,
    106                             'File %s is not shrank!' % f)
    107             self.assertEqual(OLD_TIME, stat.st_mtime)
    108 
    109 
    110 class MultipleShrinkFileTest(unittest.TestCase):
    111     """Test class for shrink_file_throttler.throttle method for files to be
    112     shrunk multiple times.
    113     """
    114 
    115     def setUp(self):
    116         """Setup directory for test."""
    117         self.test_dir = tempfile.mkdtemp()
    118 
    119         self.file_to_shrink = os.path.join(self.test_dir, 'file1.txt')
    120         unittest_lib.create_file(self.file_to_shrink, LARGE_SIZE_BYTE)
    121 
    122     def tearDown(self):
    123         """Cleanup the test directory."""
    124         shutil.rmtree(self.test_dir, ignore_errors=True)
    125 
    126     def testTrim(self):
    127         """Shrink the file twice and check its content."""
    128         summary = result_info.ResultInfo.build_from_path(
    129                 parent_dir=self.test_dir, name=utils_lib.ROOT_DIR,
    130                 top_dir=self.test_dir, parent_result_info=None)
    131         shrink_file_throttler.throttle(
    132                 summary, max_result_size_KB=60,
    133                 file_size_limit_byte=50 * 1024)
    134         summary = result_info.ResultInfo.build_from_path(self.test_dir)
    135         shrink_file_throttler.throttle(
    136                 summary, max_result_size_KB=30,
    137                 file_size_limit_byte=25 * 1024)
    138 
    139         with open(self.file_to_shrink) as f:
    140             content = f.read()
    141 
    142         original_size_string = (shrink_file_throttler.ORIGINAL_SIZE_TEMPLATE %
    143                                 LARGE_SIZE_BYTE)
    144         self.assertTrue(original_size_string in content)
    145 
    146         trimmed_size_string = (
    147                 shrink_file_throttler.TRIMMED_FILE_INJECT_TEMPLATE % 76990)
    148         self.assertTrue(trimmed_size_string in content)
    149 
    150 
    151 # this is so the test can be run in standalone mode
    152 if __name__ == '__main__':
    153     """Main"""
    154     unittest.main()
    155