1#!/usr/bin/env vpython3 2# Copyright 2022 The Chromium Authors 3# Use of this source code is governed by a BSD-style license that can be 4# found in the LICENSE file. 5"""File for testing serve_repo.py.""" 6 7import argparse 8import unittest 9import unittest.mock as mock 10 11import serve_repo 12 13from common import REPO_ALIAS 14 15_REPO_DIR = 'test_repo_dir' 16_REPO_NAME = 'test_repo_name' 17_TARGET = 'test_target' 18 19 20class ServeRepoTest(unittest.TestCase): 21 """Unittests for serve_repo.py.""" 22 23 def setUp(self) -> None: 24 self._namespace = argparse.Namespace(repo=_REPO_DIR, 25 repo_name=_REPO_NAME, 26 target_id=_TARGET) 27 28 @mock.patch('serve_repo.run_ffx_command') 29 def test_run_serve_cmd_start(self, mock_ffx) -> None: 30 """Test |run_serve_cmd| function for start.""" 31 32 serve_repo.run_serve_cmd('start', self._namespace) 33 self.assertEqual(mock_ffx.call_count, 4) 34 second_call = mock_ffx.call_args_list[1] 35 self.assertEqual(mock.call(cmd=['repository', 'server', 'start']), 36 second_call) 37 third_call = mock_ffx.call_args_list[2] 38 self.assertEqual( 39 mock.call( 40 cmd=['repository', 'add-from-pm', _REPO_DIR, '-r', _REPO_NAME 41 ]), third_call) 42 fourth_call = mock_ffx.call_args_list[3] 43 self.assertEqual( 44 mock.call(cmd=[ 45 'target', 'repository', 'register', '-r', _REPO_NAME, 46 '--alias', REPO_ALIAS 47 ], 48 target_id=_TARGET), fourth_call) 49 50 @mock.patch('serve_repo.run_ffx_command') 51 def test_run_serve_cmd_stop(self, mock_ffx) -> None: 52 """Test |run_serve_cmd| function for stop.""" 53 54 serve_repo.run_serve_cmd('stop', self._namespace) 55 self.assertEqual(mock_ffx.call_count, 3) 56 first_call = mock_ffx.call_args_list[0] 57 self.assertEqual( 58 mock.call( 59 cmd=['target', 'repository', 'deregister', '-r', _REPO_NAME], 60 target_id=_TARGET, 61 check=False), first_call) 62 second_call = mock_ffx.call_args_list[1] 63 self.assertEqual( 64 mock.call(cmd=['repository', 'remove', _REPO_NAME], check=False), 65 second_call) 66 third_call = mock_ffx.call_args_list[2] 67 self.assertEqual( 68 mock.call(cmd=['repository', 'server', 'stop'], check=False), 69 third_call) 70 71 @mock.patch('serve_repo.serve_repository') 72 def test_run_serve_cmd_run(self, mock_serve) -> None: 73 """Test |run_serve_cmd| function for run.""" 74 75 with mock.patch('common.time.sleep', side_effect=KeyboardInterrupt): 76 serve_repo.run_serve_cmd('run', self._namespace) 77 self.assertEqual(mock_serve.call_count, 1) 78 79 @mock.patch('serve_repo.run_serve_cmd') 80 def test_serve_repository(self, mock_serve) -> None: 81 """Tests |serve_repository| context manager.""" 82 83 with serve_repo.serve_repository(self._namespace): 84 self.assertEqual(mock_serve.call_count, 1) 85 self.assertEqual(mock_serve.call_count, 2) 86 87 def test_main_start_no_serve_repo_flag(self) -> None: 88 """Tests not specifying directory for start raises a ValueError.""" 89 90 with mock.patch('sys.argv', ['serve_repo.py', 'start']): 91 with self.assertRaises(ValueError): 92 serve_repo.main() 93 94 @mock.patch('serve_repo.run_serve_cmd') 95 def test_main_stop(self, mock_serve) -> None: 96 """Tests |main| function.""" 97 98 with mock.patch('sys.argv', ['serve_repo.py', 'stop']): 99 serve_repo.main() 100 self.assertEqual(mock_serve.call_count, 1) 101 102 @mock.patch('serve_repo.run_serve_cmd') 103 def test_main_run(self, mock_serve) -> None: 104 """Tests |main| function.""" 105 106 with mock.patch('sys.argv', [ 107 'serve_repo.py', 'run', '--serve-repo', _REPO_NAME 108 ]), \ 109 mock.patch('common.time.sleep', side_effect=KeyboardInterrupt): 110 serve_repo.main() 111 self.assertEqual(mock_serve.call_count, 1) 112 113 114if __name__ == '__main__': 115 unittest.main() 116