#!/usr/bin/python # 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. """unittest for result_info.py """ import copy import os import shutil import tempfile import unittest import common 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 _SIZE = 100 _EXPECTED_SUMMARY = { '': {utils_lib.ORIGINAL_SIZE_BYTES: 13 * _SIZE, utils_lib.TRIMMED_SIZE_BYTES: 4 * _SIZE, utils_lib.DIRS: [ {'file1': {utils_lib.ORIGINAL_SIZE_BYTES: _SIZE}}, {'folder1': {utils_lib.ORIGINAL_SIZE_BYTES: 11 * _SIZE, utils_lib.TRIMMED_SIZE_BYTES: 2 * _SIZE, utils_lib.DIRS: [ {'file2': { utils_lib.ORIGINAL_SIZE_BYTES: 10 * _SIZE, utils_lib.TRIMMED_SIZE_BYTES: _SIZE}}, {'file3': { utils_lib.ORIGINAL_SIZE_BYTES: _SIZE}}]}}, {'folder2': {utils_lib.ORIGINAL_SIZE_BYTES: _SIZE, utils_lib.DIRS: [{'file2': { utils_lib.ORIGINAL_SIZE_BYTES: _SIZE} }], } } ] } } _EXPECTED_SINGLE_FILE_SUMMARY = { '': {utils_lib.ORIGINAL_SIZE_BYTES: unittest_lib.SIZE, utils_lib.DIRS: [ {'file1': {utils_lib.ORIGINAL_SIZE_BYTES: unittest_lib.SIZE}}, ] } } class ResultInfoUnittest(unittest.TestCase): """Test class for ResultInfo. """ def setUp(self): """Setup directory for test.""" self.test_dir = tempfile.mkdtemp() def tearDown(self): """Cleanup the test directory.""" shutil.rmtree(self.test_dir, ignore_errors=True) def testLoadJson(self): """Test method load_summary_json_file and related update methods.""" summary_file = os.path.join(self.test_dir, 'summary.json') result_info.save_summary(_EXPECTED_SUMMARY, summary_file) summary = result_info.load_summary_json_file(summary_file) self.assertEqual(_EXPECTED_SUMMARY, summary, 'Failed to match the loaded json file.') # Save the json of the new summary, confirm it matches the old one. summary_file_new = os.path.join(self.test_dir, 'summary_new.json') result_info.save_summary(summary, summary_file_new) summary_new = result_info.load_summary_json_file(summary_file_new) self.assertEqual( _EXPECTED_SUMMARY, summary_new, 'Failed to match the loaded json file after it is saved again.') # Validate the details of result_info. self.assertEqual(summary.path, self.test_dir) self.assertEqual(summary.get_file('file1').path, os.path.join(self.test_dir, 'file1')) self.assertEqual(summary.get_file('folder1').get_file('file2').path, os.path.join(self.test_dir, 'folder1', 'file2')) # Validate the details of a deep copy of result_info. new_summary = copy.deepcopy(summary) # Modify old summary, to make sure the clone is not changed. summary._path = None summary.get_file('file1')._path = None summary.get_file('file1').original_size = 0 summary.get_file('folder1').get_file('file2')._path = None self.assertEqual(new_summary.path, self.test_dir) self.assertEqual(new_summary.get_file('file1').path, os.path.join(self.test_dir, 'file1')) self.assertEqual(new_summary.get_file('file1').original_size, _SIZE) self.assertEqual(id(new_summary.get_file('file1')._parent_result_info), id(new_summary)) self.assertNotEqual(id(new_summary), id(summary)) self.assertEqual(new_summary.get_file('folder1').get_file('file2').path, os.path.join(self.test_dir, 'folder1', 'file2')) def testInit(self): """Test __init__ method fails when both name and original_info are set. """ self.assertRaises(result_info.ResultInfoError, result_info.ResultInfo, 'parent_dir', 'file_name', None, {'name': 'file_name'}) def testUpdateSize(self): """Test sizes updated in all parent nodes after leaf node is updated. """ summary_file = os.path.join(self.test_dir, 'summary.json') result_info.save_summary(_EXPECTED_SUMMARY, summary_file) summary = result_info.load_summary_json_file(summary_file) file2 = summary.get_file('folder1').get_file('file2') file2.trimmed_size = 2 * _SIZE # Check all parent result info have size updated. self.assertEqual(file2.trimmed_size, 2 * _SIZE) self.assertEqual(summary.get_file('folder1').trimmed_size, 3 * _SIZE) self.assertEqual(summary.trimmed_size, 5 * _SIZE) file2.original_size = 11 * _SIZE self.assertEqual(summary.get_file('folder1').original_size, 12 * _SIZE) self.assertEqual(summary.original_size, 14 * _SIZE) file2.collected_size = 20 * _SIZE self.assertEqual(summary.get_file('folder1').collected_size, 21 * _SIZE) self.assertEqual(summary.collected_size, 23 * _SIZE) def TestBuildFromPath_SingleFile(self): """Test method build_from_path for a single file.""" file1 = os.path.join(self.test_dir, 'file1') unittest_lib.create_file(file1) summary = result_info.ResultInfo.build_from_path(file1) self.assertEqual(_EXPECTED_SINGLE_FILE_SUMMARY, summary) # this is so the test can be run in standalone mode if __name__ == '__main__': """Main""" unittest.main()