blob: b2ac4c3814c9621906be011a919ddc8ec1c0b963 [file] [log] [blame]
#!/usr/bin/env python3
#
# Copyright 2022 The Fuchsia Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
import mock
import unittest
from antlion.libs.uicd.uicd_cli import UicdCli
from antlion.libs.uicd.uicd_cli import UicdError
_MOCK_WALK = {'/dir1': [('/dir1', (), ('file1', 'file2'))],
'/dir2': [('/dir2', ('dir3',), ('file3',)),
('/dir2/dir3', (), ())],
'/dir3': [('/dir3', (), ('file1',))]}
def _mock_walk(path, **_):
return _MOCK_WALK.get(path, [])
class UicdCliTest(unittest.TestCase):
"""Tests the antlion.libs.uicd.uicd_cli.UicdCli class."""
# _set_workflows
@mock.patch('os.walk', _mock_walk)
@mock.patch('os.makedirs')
@mock.patch('tempfile.mkdtemp')
@mock.patch('shutil.rmtree')
@mock.patch.object(UicdCli, '_setup_cli')
def test_set_workflows_sets_correct_file_path(self, *_):
"""Tests that the workflow name is mapped correctly to its path."""
nc = UicdCli('', '/dir1')
self.assertIn('file1', nc._workflows,
'Workflow file not added to dictionary.')
self.assertEqual(nc._workflows['file1'], '/dir1/file1',
'Workflow name does not point to the correct path.')
@mock.patch('os.walk', _mock_walk)
@mock.patch('os.makedirs')
@mock.patch('tempfile.mkdtemp')
@mock.patch('shutil.rmtree')
@mock.patch.object(UicdCli, '_setup_cli')
def test_set_workflows_adds_workflows_from_directories(self, *_):
"""Tests that providing a directory name adds all files from that
directory. Also tests that no directories are added to the dictionary.
"""
nc = UicdCli('', ['/dir1', '/dir2'])
for file_name in ['file1', 'file2', 'file3']:
self.assertIn(file_name, nc._workflows,
'Workflow file not added to dictionary.')
for dir_name in ['dir1', 'dir2', 'dir3']:
self.assertNotIn(dir_name, nc._workflows,
'Directories should not be added to dictionary.')
@mock.patch('os.walk', _mock_walk)
@mock.patch('os.makedirs')
@mock.patch('tempfile.mkdtemp')
@mock.patch('shutil.rmtree')
@mock.patch.object(UicdCli, '_setup_cli')
def test_set_workflows_rejects_duplicate_workflow_names(self, *_):
"""Tests that _set_workflows raises an exception if two or more
workflows of the same name are provided.
"""
expected_msg = 'Uicd workflows may not share the same name.'
with self.assertRaisesRegex(UicdError, expected_msg):
nc = UicdCli('', ['/dir1', '/dir3'])
# run
@mock.patch('os.makedirs')
@mock.patch('tempfile.mkdtemp', return_value='/base')
@mock.patch('shutil.rmtree')
@mock.patch.object(UicdCli, '_setup_cli')
@mock.patch.object(UicdCli, '_set_workflows')
def test_run_generates_correct_uicd_cmds(self, *_):
"""Tests that the correct cmds are generated upon calling run()."""
nc = UicdCli('', [])
nc._workflows = {'test': '/workflows/test'}
# No log path set
with mock.patch('antlion.libs.proc.job.run') as job_run:
nc.run('SERIAL', 'test')
expected_cmd = 'java -jar /base/uicd-commandline.jar ' \
'-d SERIAL -i /workflows/test'
job_run.assert_called_with(expected_cmd.split(), timeout=120)
# Log path set
nc._log_path = '/logs'
with mock.patch('antlion.libs.proc.job.run') as job_run:
nc.run('SERIAL', 'test')
expected_cmd = 'java -jar /base/uicd-commandline.jar ' \
'-d SERIAL -i /workflows/test -o /logs'
job_run.assert_called_with(expected_cmd.split(), timeout=120)
if __name__ == '__main__':
unittest.main()