blob: 6fb5bd31deffbae0293e5b2c96cb84f7b60242ea [file] [log] [blame]
#!/usr/bin/python
import os, unittest, StringIO
import common
from autotest_lib.client.common_lib import utils
from autotest_lib.client.common_lib.test_utils import mock
class test_read_one_line(unittest.TestCase):
def setUp(self):
self.god = mock.mock_god()
self.god.stub_function(utils, "open")
def tearDown(self):
self.god.unstub_all()
def create_test_file(self, contents):
test_file = StringIO.StringIO(contents)
utils.open.expect_call("filename", "r").and_return(test_file)
def test_reads_one_line_file(self):
self.create_test_file("abc\n")
self.assertEqual("abc", utils.read_one_line("filename"))
self.god.check_playback()
def test_strips_read_lines(self):
self.create_test_file("abc \n")
self.assertEqual("abc ", utils.read_one_line("filename"))
self.god.check_playback()
def test_drops_extra_lines(self):
self.create_test_file("line 1\nline 2\nline 3\n")
self.assertEqual("line 1", utils.read_one_line("filename"))
self.god.check_playback()
def test_works_on_empty_file(self):
self.create_test_file("")
self.assertEqual("", utils.read_one_line("filename"))
self.god.check_playback()
def test_works_on_file_with_no_newlines(self):
self.create_test_file("line but no newline")
self.assertEqual("line but no newline",
utils.read_one_line("filename"))
self.god.check_playback()
def test_preserves_leading_whitespace(self):
self.create_test_file(" has leading whitespace")
self.assertEqual(" has leading whitespace",
utils.read_one_line("filename"))
class test_write_one_line(unittest.TestCase):
def setUp(self):
self.god = mock.mock_god()
self.god.stub_function(utils, "open")
def tearDown(self):
self.god.unstub_all()
def get_write_one_line_output(self, content):
test_file = StringIO.StringIO(content)
utils.open.expect_call("filename", "w").and_return(test_file)
utils.write_one_line("filename", content)
self.god.check_playback()
return test_file.getvalue()
def test_writes_one_line_file(self):
self.assertEqual("abc\n", self.get_write_one_line_output("abc"))
def test_preserves_existing_newline(self):
self.assertEqual("abc\n", self.get_write_one_line_output("abc\n"))
def test_preserves_leading_whitespace(self):
self.assertEqual(" abc\n", self.get_write_one_line_output(" abc"))
def test_preserves_trailing_whitespace(self):
self.assertEqual("abc \n", self.get_write_one_line_output("abc "))
def test_handles_empty_input(self):
self.assertEqual("\n", self.get_write_one_line_output(""))
class test_read_keyval(unittest.TestCase):
def setUp(self):
self.god = mock.mock_god()
self.god.stub_function(utils, "open")
self.god.stub_function(os.path, "isdir")
def tearDown(self):
self.god.unstub_all()
def create_test_file(self, filename, contents):
test_file = StringIO.StringIO(contents)
utils.open.expect_call(filename).and_return(test_file)
def read_keyval(self, contents):
os.path.isdir.expect_call("file").and_return(False)
self.create_test_file("file", contents)
keyval = utils.read_keyval("file")
self.god.check_playback()
return keyval
def test_accesses_files_directly(self):
os.path.isdir.expect_call("file").and_return(False)
self.create_test_file("file", "")
utils.read_keyval("file")
self.god.check_playback()
def test_accesses_directories_through_keyval_file(self):
os.path.isdir.expect_call("dir").and_return(True)
self.create_test_file("dir/keyval", "")
utils.read_keyval("dir")
self.god.check_playback()
def test_values_are_rstripped(self):
keyval = self.read_keyval("a=b \n")
self.assertEquals(keyval, {"a": "b"})
def test_comments_are_ignored(self):
keyval = self.read_keyval("a=b # a comment\n")
self.assertEquals(keyval, {"a": "b"})
def test_integers_become_ints(self):
keyval = self.read_keyval("a=1\n")
self.assertEquals(keyval, {"a": 1})
self.assertEquals(int, type(keyval["a"]))
def test_float_values_become_floats(self):
keyval = self.read_keyval("a=1.5\n")
self.assertEquals(keyval, {"a": 1.5})
self.assertEquals(float, type(keyval["a"]))
def test_multiple_lines(self):
keyval = self.read_keyval("a=one\nb=two\n")
self.assertEquals(keyval, {"a": "one", "b": "two"})
def test_the_last_duplicate_line_is_used(self):
keyval = self.read_keyval("a=one\nb=two\na=three\n")
self.assertEquals(keyval, {"a": "three", "b": "two"})
def test_extra_equals_are_included_in_values(self):
keyval = self.read_keyval("a=b=c\n")
self.assertEquals(keyval, {"a": "b=c"})
def test_non_alphanumeric_keynames_are_rejected(self):
self.assertRaises(ValueError, self.read_keyval, "a$=one\n")
def test_underscores_are_allowed_in_key_names(self):
keyval = self.read_keyval("a_b=value\n")
self.assertEquals(keyval, {"a_b": "value"})
def test_dashes_are_allowed_in_key_names(self):
keyval = self.read_keyval("a-b=value\n")
self.assertEquals(keyval, {"a-b": "value"})
if __name__ == "__main__":
unittest.main()