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