blob: e115808392591b48258294c306e05b79e6200964 [file] [edit]
# Copyright 2023 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import argparse
import os
import tempfile
import unittest
import unittest.mock as mock
import config
class TestConfig(unittest.TestCase):
def test_config_loading(self) -> None:
with tempfile.TemporaryDirectory() as td:
config_path = os.path.join(td, "testrc")
with open(config_path, "w") as f:
f.writelines(
[
" # This is a comment\n",
"--parallel\n",
"2\n",
"# Another comment\n",
"--no-style\n" "--status-lines 40\n\n",
]
)
config_file = config.load_config(config_path)
self.assertTrue(config_file.is_loaded())
self.assertEqual(config_path, config_file.path)
self.assertEqual(
config_file.command_line,
["--parallel", "2", "--no-style", "--status-lines", "40"],
)
assert config_file.default_flags is not None
self.assertEqual(config_file.default_flags.parallel, 2)
self.assertEqual(config_file.default_flags.style, False)
self.assertEqual(config_file.default_flags.status_lines, 40)
def test_config_load_fails(self) -> None:
with tempfile.TemporaryDirectory() as td:
missing_path = os.path.join(td, "missing")
config_file = config.load_config(missing_path)
self.assertFalse(config_file.is_loaded())
self.assertIsNone(config_file.default_flags)
self.assertEqual(missing_path, config_file.path)
@mock.patch.dict(os.environ, {}, clear=True)
def test_no_home_dir(self) -> None:
config_file = config.load_config()
self.assertFalse(config_file.is_loaded())
self.assertIsNone(config_file.path)
def test_load_from_home(self) -> None:
with tempfile.TemporaryDirectory() as td:
with open(os.path.join(td, ".fxtestrc"), "w") as f:
f.writelines(
[
"--parallel 100\n",
]
)
with mock.patch.dict(os.environ, {"HOME": td}):
config_file = config.load_config()
self.assertTrue(config_file.is_loaded())
self.assertIsNotNone(config_file.path)
assert config_file.default_flags is not None
self.assertEqual(config_file.default_flags.parallel, 100)
def test_invalid_flags(self) -> None:
with tempfile.TemporaryDirectory() as td:
config_path = os.path.join(td, "config")
with open(config_path, "w") as f:
f.writelines(
[
"--invalid-arg 33\n",
]
)
self.assertRaises(
(SystemExit, argparse.ArgumentError),
lambda: config.load_config(config_path),
)
def test_load_config_preserves_quoted_arguments_with_spaces(self) -> None:
"""Test that config loading preserves quoted arguments containing spaces and inline comments."""
with tempfile.TemporaryDirectory() as td:
config_path = os.path.join(td, "testrc")
with open(config_path, "w") as f:
f.write('--test-filter "foo bar" # inline comment\n')
f.write("--parallel 4\n")
config_file = config.load_config(config_path)
self.assertTrue(config_file.is_loaded())
self.assertEqual(
config_file.command_line,
["--test-filter", "foo bar", "--parallel", "4"],
)
assert config_file.default_flags is not None
self.assertEqual(config_file.default_flags.test_filter, ["foo bar"])
self.assertEqual(config_file.default_flags.parallel, 4)