# Copyright 2020 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging
import os
import shutil
import stat
import winerror
LOGGER = logging.getLogger('installer_test')
def VerifyFileExpectation(expectation_name, expectation, variable_expander):
"""Verifies that a file is present or absent, throwing an AssertionError if
the expectation is not met.
Args:
expectation_name: Path to the file being verified (may contain variables
to be expanded).
expectation: A dictionary with the following key and value:
'exists' a boolean indicating whether the file should exist.
variable_expander: A VariableExpander object.
Raises:
AssertionError: If an expectation is not satisfied.
"""
def GetDirContents(path):
"""Returns a list of all files and directories in a directory."""
contents = []
for dirpath, dirnames, filenames in os.walk(path):
for a_dir in dirnames:
contents.append('%s\\' % os.path.join(dirpath, a_dir))
for a_file in filenames:
contents.append(os.path.join(dirpath, a_file))
contents.sort()
return '\n'.join(contents)
file_path = variable_expander.Expand(expectation_name)
file_exists = os.path.exists(file_path)
if file_exists:
is_dir = False
try:
is_dir = stat.S_ISDIR(os.lstat(file_path).st_mode)
except WindowsError:
pass
if is_dir:
assert expectation['exists'], (
'Directory %s exists with contents: %s\n' %
(file_path, GetDirContents(file_path)))
else:
assert expectation['exists'], ('File %s exists' % file_path)
else:
assert not expectation['exists'], ('File %s is missing' % file_path)
def CleanFile(expectation_name, expectation, variable_expander):
"""Deletes files or directories based on expectations.
Args:
expectation_name: Path to the file/directory to be cleaned.
expectation: A dictionary describing the state of the path:
'exists': A boolean False indicating that the path must not exist.
variable_expander: A VariableExpander object.
Raises:
AssertionError: If an expectation is not satisfied.
WindowsError: If an error occurs while deleting the path.
"""
file_path = variable_expander.Expand(expectation_name)
assert not expectation['exists'], (
'Invalid expectation for CleanFile operation: \'exists\' property for '
+ 'path %s must not be True' % file_path)
try:
if stat.S_ISDIR(os.lstat(file_path).st_mode):
shutil.rmtree(file_path)
LOGGER.info('CleanFile deleted directory %s' % file_path)
else:
os.remove(file_path)
LOGGER.info('CleanFile deleted file %s' % file_path)
except WindowsError as e:
if (e.winerror != winerror.ERROR_FILE_NOT_FOUND
and e.winerror != winerror.ERROR_PATH_NOT_FOUND):
raise