普通文本  |  134行  |  5.26 KB

# 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()