diff --git a/shoebox/shoebox.py b/shoebox/shoebox.py index 2a4451b..13fbb73 100644 --- a/shoebox/shoebox.py +++ b/shoebox/shoebox.py @@ -48,6 +48,10 @@ TODO: How will the ReadingRollManager know which files to read from, and in which order, if the filename is templated? """ +def now(): + """Broken out for testing.""" + return datetime.datetime.utcnow() + class RollChecker(object): def start(self, archive): @@ -62,11 +66,11 @@ class TimeRollChecker(RollChecker): self.timedelta = timedelta def start(self, archive): - self.start_time = datetime.datetime.utcnow() + self.start_time = now() self.end_time = self.start_time + self.timedelta def check(self, archive): - return datetime.datetime.utcnow() >= self.end_time + return now() >= self.end_time class SizeRollChecker(RollChecker): @@ -75,7 +79,7 @@ class SizeRollChecker(RollChecker): def check(self, archive): size = archive._get_file_handle().tell() - return size / 1073741824 > self.size_in_gb + return size / 1073741824 >= self.size_in_gb class RollManager(object): @@ -86,9 +90,9 @@ class RollManager(object): self.active_archive = None def _make_filename(self): - now = datetime.datetime.utcnow() + now = now() return now.strftime(self.filename_template) - + def get_active_archive(self): if not self.active_archive: filename = self._make_filename() @@ -107,7 +111,7 @@ class RollManager(object): class ReadingRollManager(RollManager): def __init__(self, filename_template, roll_checker): - super(ReadingRollManager, self).__init__(filename_template, + super(ReadingRollManager, self).__init__(filename_template, roll_checker) self.archive_class = ArchiveReader @@ -123,7 +127,7 @@ class ReadingRollManager(RollManager): class WritingRollManager(RollManager): def __init__(self, filename_template, roll_checker): - super(ReadingRollManager, self).__init__(filename_template, + super(ReadingRollManager, self).__init__(filename_template, roll_checker) self.archive_class = ArchiveWriter @@ -152,7 +156,7 @@ class ArchiveWriter(object): def write(self, payload): pass - + class ArchiveReader(object): """The active Archive for consuming. diff --git a/test/test_shoebox.py b/test/test_shoebox.py index 6da01d6..cd0f808 100644 --- a/test/test_shoebox.py +++ b/test/test_shoebox.py @@ -1,3 +1,4 @@ +import datetime import mock import unittest @@ -5,9 +6,48 @@ from shoebox import shoebox class TestRollChecker(unittest.TestCase): + def test_time_roll_checker_start(self): + one_hour = datetime.timedelta(hours=1) + x = shoebox.TimeRollChecker(one_hour) + now = datetime.datetime.utcnow() + with mock.patch.object(shoebox, 'now') as dt: + dt.return_value = now + x.start(None) + self.assertEqual(x.start_time, now) + self.assertEqual(x.end_time, now + one_hour) - def test_time_roll_checker(self): - pass + def test_time_roll_checker_end(self): + one_hour = datetime.timedelta(hours=1) + x = shoebox.TimeRollChecker(one_hour) + now = datetime.datetime.utcnow() + x.start_time = now + x.end_time = now + one_hour + with mock.patch.object(shoebox, 'now') as dt: + dt.return_value = now + one_hour + self.assertTrue(x.check(None)) -#if __name__ == '__main__': -# unittest.main() \ No newline at end of file + with mock.patch.object(shoebox, 'now') as dt: + dt.return_value = now + self.assertFalse(x.check(None)) + + with mock.patch.object(shoebox, 'now') as dt: + dt.return_value = now + one_hour - datetime.timedelta(seconds = 1) + self.assertFalse(x.check(None)) + + def test_size_roll_checker_end(self): + one_gig = 1073741824 + x = shoebox.SizeRollChecker(10) + + archive = mock.Mock() + archive._get_file_handle.return_value.tell.return_value = one_gig * 5 + self.assertFalse(x.check(archive)) + + archive._get_file_handle.return_value.tell.return_value = one_gig * 10 + self.assertTrue(x.check(archive)) + + archive._get_file_handle.return_value.tell.return_value = one_gig * 11 + self.assertTrue(x.check(archive)) + + +class TestRollManager(unittest.TestCase): + pass # Next ...