| # 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. |
| |
| import os |
| import shutil |
| import tempfile |
| import unittest |
| |
| import common |
| from autotest_lib.client.bin.result_tools import delete_file_throttler |
| from autotest_lib.client.bin.result_tools import result_info |
| from autotest_lib.client.bin.result_tools import unittest_lib |
| from autotest_lib.client.bin.result_tools import utils_lib |
| |
| |
| LARGE_SIZE_BYTE = 1000 |
| MEDIUM_SIZE_BYTE = 800 |
| SMALL_SIZE_BYTE = 100 |
| # Maximum result size is set to 3KB so the file with MEDIUM_SIZE_BYTE will be |
| # kept. |
| MAX_RESULT_SIZE_KB = 5 |
| # Any file with size above the threshold is qualified to be deleted. |
| FILE_SIZE_THRESHOLD_BYTE = 512 |
| |
| SUMMARY_AFTER_THROTTLE = { |
| '': {utils_lib.DIRS: [ |
| {'AndroidDeviceXXX': { |
| utils_lib.DIRS: [ |
| {'file5': {utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE}}, |
| ], |
| utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE}}, |
| {'chrome.123.perf.data': { |
| utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE}}, |
| {'file1.xml': {utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE, |
| utils_lib.TRIMMED_SIZE_BYTES: 0}}, |
| {'file2.jpg': {utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE, |
| utils_lib.TRIMMED_SIZE_BYTES: 0}}, |
| {'file3.log': {utils_lib.ORIGINAL_SIZE_BYTES: SMALL_SIZE_BYTE}}, |
| {'file_to_keep': {utils_lib.ORIGINAL_SIZE_BYTES: MEDIUM_SIZE_BYTE}}, |
| {'folder1': { |
| utils_lib.DIRS: [ |
| {'file4': {utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE, |
| utils_lib.TRIMMED_SIZE_BYTES: 0}}, |
| {'keyval': |
| {utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE}}, |
| ], |
| utils_lib.ORIGINAL_SIZE_BYTES: 2 * LARGE_SIZE_BYTE, |
| utils_lib.TRIMMED_SIZE_BYTES: LARGE_SIZE_BYTE}}, |
| {'test_run_details.txt': { |
| utils_lib.ORIGINAL_SIZE_BYTES: LARGE_SIZE_BYTE}}], |
| utils_lib.ORIGINAL_SIZE_BYTES: |
| 7 * LARGE_SIZE_BYTE + SMALL_SIZE_BYTE + MEDIUM_SIZE_BYTE, |
| utils_lib.TRIMMED_SIZE_BYTES: |
| 4 * LARGE_SIZE_BYTE + SMALL_SIZE_BYTE + MEDIUM_SIZE_BYTE} |
| } |
| |
| class ThrottleTest(unittest.TestCase): |
| """Test class for shrink_file_throttler.throttle method.""" |
| |
| def setUp(self): |
| """Setup directory for test.""" |
| self.test_dir = tempfile.mkdtemp() |
| self.files_not_deleted = [] |
| self.files_to_delete = [] |
| |
| file1 = os.path.join(self.test_dir, 'file1.xml') |
| unittest_lib.create_file(file1, LARGE_SIZE_BYTE) |
| self.files_to_delete.append(file1) |
| |
| file2 = os.path.join(self.test_dir, 'file2.jpg') |
| unittest_lib.create_file(file2, LARGE_SIZE_BYTE) |
| self.files_to_delete.append(file2) |
| |
| file_to_keep = os.path.join(self.test_dir, 'file_to_keep') |
| unittest_lib.create_file(file_to_keep, MEDIUM_SIZE_BYTE) |
| self.files_not_deleted.append(file_to_keep) |
| |
| file3 = os.path.join(self.test_dir, 'file3.log') |
| unittest_lib.create_file(file3, SMALL_SIZE_BYTE) |
| self.files_not_deleted.append(file3) |
| |
| folder1 = os.path.join(self.test_dir, 'folder1') |
| os.mkdir(folder1) |
| file4 = os.path.join(folder1, 'file4') |
| unittest_lib.create_file(file4, LARGE_SIZE_BYTE) |
| self.files_to_delete.append(file4) |
| |
| protected_file = os.path.join(folder1, 'keyval') |
| unittest_lib.create_file(protected_file, LARGE_SIZE_BYTE) |
| self.files_not_deleted.append(protected_file) |
| |
| folder2 = os.path.join(self.test_dir, 'AndroidDeviceXXX') |
| os.mkdir(folder2) |
| file5 = os.path.join(folder2, 'file5') |
| unittest_lib.create_file(file5, LARGE_SIZE_BYTE) |
| self.files_not_deleted.append(file5) |
| |
| test_run = os.path.join(self.test_dir, 'test_run_details.txt') |
| unittest_lib.create_file(test_run, LARGE_SIZE_BYTE) |
| self.files_not_deleted.append(test_run) |
| |
| perf_data = os.path.join(self.test_dir, 'chrome.123.perf.data') |
| unittest_lib.create_file(perf_data, LARGE_SIZE_BYTE) |
| self.files_not_deleted.append(perf_data) |
| |
| def tearDown(self): |
| """Cleanup the test directory.""" |
| shutil.rmtree(self.test_dir, ignore_errors=True) |
| |
| def testTrim(self): |
| """Test throttle method.""" |
| summary = result_info.ResultInfo.build_from_path(self.test_dir) |
| delete_file_throttler.throttle( |
| summary, |
| max_result_size_KB=MAX_RESULT_SIZE_KB, |
| file_size_threshold_byte=FILE_SIZE_THRESHOLD_BYTE) |
| |
| self.assertEqual(SUMMARY_AFTER_THROTTLE, summary) |
| |
| # Verify files that should not be deleted still exists. |
| for f in self.files_not_deleted: |
| self.assertTrue(os.stat(f).st_size > 0, |
| 'File %s should not be deleted!' % f) |
| |
| # Verify files that should be deleted no longer exists. |
| for f in self.files_to_delete: |
| self.assertFalse(os.path.exists(f), 'File %s is not deleted!' % f) |
| |
| |
| # this is so the test can be run in standalone mode |
| if __name__ == '__main__': |
| """Main""" |
| unittest.main() |