def test_file_readable_to_bad_user(self): builder = Builder() builder.can_read = lambda fn, u, g: True builder.can_execute = lambda fn, u, g: True file_readable_to = builder.file_readable_to self.assertTrue( file_readable_to(__file__, 'no-such-user', self.mygroup))
def test_compute_derived_warns_about_unreadable_changelog(self): builder = Builder() builder.verbose = True builder.file_readable_to = lambda fn, u, g: False builder._compute_derived() self.assertFalse(builder.vars['CHANGELOG']) self.assertEqual(self.stdout.getvalue(), "Skipping changelog view since /root/Changelog is not readable by user www-data\n")
def test_delete_old_files(self, mock_glob, mock_unlink): mock_glob.return_value = ['du-2015-11-03.gz', 'du-2015-11-02.gz'] Builder.DiskUsage().delete_old_files(self.tmpdir, keep_daily=1, keep_monthly=0, keep_yearly=0) mock_unlink.assert_called_once_with('du-2015-11-02.gz')
def test_Symlink_skips(self): pathname = os.path.join(self.tmpdir, 'subdir', 'symlink') self.builder.skip.append(pathname) Builder.Symlink('/dev/null').build(pathname, self.builder) self.assertEqual(self.stdout.getvalue(), "Skipping %s/subdir/symlink\n" % self.tmpdir) self.assertFalse(os.path.exists(pathname))
def test_Symlink(self): pathname = os.path.join(self.tmpdir, 'subdir', 'symlink') Builder.Symlink('/dev/null').build(pathname, self.builder) self.assertEqual(self.stdout.getvalue(), "Created %s/subdir/symlink\n" % self.tmpdir) self.assertTrue(os.path.islink(pathname)) self.assertEqual(os.readlink(pathname), '/dev/null')
def test_Template(self): pathname = os.path.join(self.tmpdir, 'subdir', 'index.html') Builder.Template('test.html.in').build(pathname, self.builder) with open(pathname, 'rb') as f: self.assertEqual(f.read(), HTML_MARKER + b'\n<p>This is a test template.\n') self.assertEqual(self.stdout.getvalue(), "Created %s/subdir/index.html\n" % self.tmpdir)
def test_compute_derived(self, mock_datetime): mock_datetime.now().__str__.return_value = '2015-11-01 14:35:03' builder = Builder({ 'HOSTNAME': 'frog.example.com', 'SERVER_ALIASES': 'frog frog.lan', 'DISK_USAGE': '/frog /pond', 'EXTRA_LINKS': '/foo=also foo\n/bar=also bar', }) builder.file_readable_to = lambda fn, u, g: True builder._compute_derived() self.assertEqual(builder.vars['SHORTHOSTNAME'], 'frog') self.assertEqual(builder.vars['TIMESTAMP'], '2015-11-01 14:35:03') self.assertEqual(builder.vars['SERVER_ALIAS_LIST'], ['frog', 'frog.lan']) self.assertEqual(builder.vars['EXTRA_LINKS_MAP'], [('/foo', 'also foo'), ('/bar', 'also bar')]) self.assertEqual(builder.vars['CHANGELOG2HTML_SCRIPT'], CHANGELOG2HTML_SCRIPT) self.assertTrue(builder.vars['CHANGELOG'])
def test_Template_with_extra_vars(self): pathname = os.path.join(self.tmpdir, 'subdir', 'index.html') Builder.Template('test-vars.html.in').build(pathname, self.builder, extra_vars=dict(pi='3.14')) with open(pathname, 'rb') as f: self.assertEqual(f.read(), HTML_MARKER + b'\n<p>pi ~= 3.14\n') self.assertEqual(self.stdout.getvalue(), "Created %s/subdir/index.html\n" % self.tmpdir)
def test_build_fresh_ionice(self, mock_pipeline): self.builder.vars['DISK_USAGE_LIST'] = ['/frog'] self.builder.vars['DISK_USAGE_DELETE_OLD'] = False Builder.DiskUsage().build(os.path.join(self.tmpdir, 'du'), self.builder) self.assertEqual( self.stdout.getvalue().replace(self.tmpdir, '/var/www/frog.example.com'), "Created /var/www/frog.example.com/du/index.html\n" "Created /var/www/frog.example.com/du/webtreemap\n" "Creating /var/www/frog.example.com/du/frog/du-2015-11-01.gz\n" "Creating /var/www/frog.example.com/du/frog/du.js\n" "Created /var/www/frog.example.com/du/frog/index.html\n") self.assertEqual(mock_pipeline.call_count, 2)
def setUp(self): FilesystemTests.setUp(self) self.stdout = self.patch('sys.stdout', StringIO()) self.stderr = self.patch('sys.stderr', StringIO()) self.builder = Builder({ 'foo': 'two', 'HOSTNAME': 'frog.example.com' }, destdir=self.tmpdir) self.builder.verbose = True self.builder.skip = [] template_dir = os.path.join(os.path.dirname(__file__), 'templates') self.builder.html_lookup.directories.append( os.path.normpath(template_dir)) self.builder.lookup.directories.append(os.path.normpath(template_dir))
def test_compute_derived_warns_about_unreadable_changelog(self): builder = Builder() builder.verbose = True builder.file_readable_to = lambda fn, u, g: False builder._compute_derived() self.assertFalse(builder.vars['CHANGELOG']) self.assertEqual( self.stdout.getvalue(), "Skipping changelog view since /root/Changelog is not readable by user www-data\n" )
def test_build_up_to_date(self, mock_exists, mock_newer, mock_pipeline): mock_exists.return_value = True mock_newer.return_value = False self.builder.vars['DISK_USAGE_LIST'] = ['/frog', '/pond'] Builder.DiskUsage().build(os.path.join(self.tmpdir, 'du'), self.builder) self.assertEqual( self.stdout.getvalue().replace(self.tmpdir, '/var/www/frog.example.com'), "Created /var/www/frog.example.com/du/index.html\n" "Created /var/www/frog.example.com/du/webtreemap\n" "Deleting old snapshots in /var/www/frog.example.com/du/frog\n" "Created /var/www/frog.example.com/du/frog/index.html\n" "Deleting old snapshots in /var/www/frog.example.com/du/pond\n" "Created /var/www/frog.example.com/du/pond/index.html\n") self.assertEqual(mock_pipeline.call_count, 0)
def test_can_execute_haha_cant_even(self, mock_stat): mock_stat.side_effect = OSError("nope") can_execute = Builder().can_execute self.assertFalse(can_execute('/root', 1000, 100))
def test_can_execute_other_allows(self, mock_stat): mock_stat.return_value.st_uid = 0 mock_stat.return_value.st_gid = 0 mock_stat.return_value.st_mode = 0o040755 can_execute = Builder().can_execute self.assertTrue(can_execute('/root', 1000, 100))
def test_can_execute_haha_cant(self, mock_stat): mock_stat.return_value.st_uid = 0 mock_stat.return_value.st_gid = 100 mock_stat.return_value.st_mode = 0o040700 can_execute = Builder().can_execute self.assertFalse(can_execute('/root', 1000, 100))
def test_can_read_haha_cant(self, mock_stat): mock_stat.return_value.st_uid = 0 mock_stat.return_value.st_gid = 100 mock_stat.return_value.st_mode = 0o100600 can_read = Builder().can_read self.assertFalse(can_read('/root/Changelog', 1000, 100))
def test_can_read_haha_cant_even(self, mock_stat): mock_stat.side_effect = OSError("nope") can_read = Builder().can_read self.assertFalse(can_read('/root/Changelog', 1000, 100))
def test_file_readable_when_parent_not_executable(self): builder = Builder() builder.can_execute = lambda fn, u, g: False file_readable_to = builder.file_readable_to self.assertFalse(file_readable_to(__file__, 'www-data', 'www-data'))
def test_can_read_other_allows(self, mock_stat): mock_stat.return_value.st_uid = 0 mock_stat.return_value.st_gid = 0 mock_stat.return_value.st_mode = 0o100644 can_read = Builder().can_read self.assertTrue(can_read('/root/Changelog', 1000, 100))
def test_Builder_from_config_all_defaults(self): cp = Builder.ConfigParser() Builder.from_config(cp) # should not raise
def test_Builder(self): Builder() # should not raise
def test_get_motd(self): get_motd = Builder().get_motd self.assertEqual(get_motd("/dev/null"), "") self.assertIsNone(get_motd("/no-such-file"))
def test_build_none(self): self.builder.vars['DISK_USAGE_LIST'] = [] Builder.DiskUsage().build(self.tmpdir, self.builder) self.assertEqual(self.stdout.getvalue(), "")
def test_Directory(self): dirname = os.path.join(self.tmpdir, 'subdir') Builder.Directory().build(dirname, self.builder) self.assertEqual(self.stdout.getvalue(), "Created %s/subdir/\n" % self.tmpdir) self.assertTrue(os.path.isdir(dirname))
def test_file_readable_to_bad_group(self): builder = Builder() builder.can_read = lambda fn, u, g: True builder.can_execute = lambda fn, u, g: True file_readable_to = builder.file_readable_to self.assertTrue(file_readable_to(__file__, self.me, 'no-such-group'))
def test_build_quick(self): self.builder.vars['DISK_USAGE_LIST'] = ['/pond'] self.builder.quick = True Builder.DiskUsage().build(self.tmpdir, self.builder) self.assertNotIn('Deleting old snapshots', self.stdout.getvalue()) self.assertNotIn('du.js', self.stdout.getvalue())
def test_parse_pairs(self): parse_pairs = Builder().parse_pairs self.assertEqual(parse_pairs(""), []) self.assertEqual(parse_pairs("a=b"), [("a", "b")]) self.assertEqual(parse_pairs(" a = b "), [("a", "b")]) self.assertEqual(parse_pairs("a=b\nc = d"), [("a", "b"), ("c", "d")])
def test_parse_pairs_ignore_everything_else(self): parse_pairs = Builder().parse_pairs self.assertEqual(parse_pairs("a=b\n# c\nd = e"), [("a", "b"), ("d", "e")])
def setUp(self): self.builder = Builder.DiskUsage() self.builder.collectd_hostname = 'frog.example.com' self.builder.hostname = 'frog'
def test_file_readable_to(self): builder = Builder() builder.can_read = lambda fn, u, g: True builder.can_execute = lambda fn, u, g: True file_readable_to = builder.file_readable_to self.assertTrue(file_readable_to(__file__, self.me, self.mygroup))
def test_parse_pairs_embedded_equals(self): parse_pairs = Builder().parse_pairs self.assertEqual(parse_pairs("a = b = c"), [("a", "b = c")]) self.assertEqual(parse_pairs("a=b = c"), [("a=b", "c")]) self.assertEqual(parse_pairs("a = b=c"), [("a", "b=c")]) self.assertEqual(parse_pairs("a=b=c"), [("a", "b=c")])
def test_parse_map(self): parse_map = Builder().parse_map self.assertEqual(parse_map("a = b\nc = d"), {'a': 'b', 'c': 'd'})