1
from twisted.internet.defer import Deferred
3
from landscape.sysinfo.sysinfo import SysInfoPluginRegistry
4
from landscape.sysinfo.disk import Disk, format_megabytes
5
from landscape.tests.helpers import LandscapeTest
7
class DiskTest(LandscapeTest):
10
super(DiskTest, self).setUp()
11
self.mount_file = self.make_path("")
12
self.stat_results = {}
14
self.disk = Disk(mounts_file=self.mount_file,
15
statvfs=self.stat_results.get)
16
self.sysinfo = SysInfoPluginRegistry()
17
self.sysinfo.add(self.disk)
19
def add_mount(self, point, block_size=4096, capacity=1000, unused=1000,
20
fs="ext3", device=None):
22
device = "/dev/" + point.replace("/", "_")
23
self.stat_results[point] = (block_size, 0, capacity, unused,
25
f = open(self.mount_file, "a")
26
f.write("/dev/%s %s %s rw 0 0\n" % (device, point, fs))
29
def test_run_returns_succeeded_deferred(self):
31
result = self.disk.run()
32
self.assertTrue(isinstance(result, Deferred))
36
result.addCallback(callback)
37
self.assertTrue(called)
39
def test_everything_is_cool(self):
42
self.assertEquals(self.sysinfo.get_notes(), [])
44
def test_zero_total_space(self):
46
When the total space for a mount is 0, the plugin shouldn't flip out
49
This is a regression test for a ZeroDivisionError!
51
self.add_mount("/sys", capacity=0, unused=0)
54
self.assertEquals(self.sysinfo.get_notes(), [])
56
def test_over_85_percent(self):
58
When a filesystem is using more than 85% capacity, a note will be
61
self.add_mount("/", capacity=1000000, unused=150000)
63
self.assertEquals(self.sysinfo.get_notes(),
64
["/ is using 85.0% of 3.81GB"])
66
def test_under_85_percent(self):
67
"""No note is displayed for a filesystem using less than 85% capacity.
69
self.add_mount("/", block_size=1024, capacity=1000000, unused=151000)
71
self.assertEquals(self.sysinfo.get_notes(), [])
73
def test_multiple_notes(self):
75
A note will be displayed for each filesystem using 85% or more capacity.
77
self.add_mount("/", block_size=1024, capacity=1000000, unused=150000)
78
self.add_mount("/use", block_size=2048, capacity=2000000, unused=200000)
79
self.add_mount("/emp", block_size=4096, capacity=3000000, unused=460000)
81
self.assertEquals(self.sysinfo.get_notes(),
82
["/ is using 85.0% of 976MB",
83
"/use is using 90.0% of 3.81GB"])
85
def test_format_megabytes(self):
86
self.assertEquals(format_megabytes(100), "100MB")
87
self.assertEquals(format_megabytes(1023), "1023MB")
88
self.assertEquals(format_megabytes(1024), "1.00GB")
89
self.assertEquals(format_megabytes(1024*1024-1), "1024.00GB")
90
self.assertEquals(format_megabytes(1024*1024), "1.00TB")
92
def test_header(self):
94
A header is printed with usage for the 'primary' filesystem, where
95
'primary' means 'filesystem that has /home on it'.
98
self.add_mount("/home", capacity=1024, unused=512)
100
self.assertEquals(self.sysinfo.get_headers(),
101
[("Usage of /home", "50.0% of 4MB")])
103
def test_header_shows_actual_filesystem(self):
105
If /home isn't on its own filesystem, the header will show whatever
106
filesystem it's a part of.
108
self.add_mount("/", capacity=1024, unused=512)
110
self.assertEquals(self.sysinfo.get_headers(),
111
[("Usage of /", "50.0% of 4MB")])
113
def test_ignore_optical_drives(self):
115
Optical drives (those with filesystems of udf or iso9660) should be
118
self.add_mount("/", capacity=1000, unused=1000, fs="ext3")
119
self.add_mount("/media/dvdrom", capacity=1000, unused=0, fs="udf")
120
self.add_mount("/media/cdrom", capacity=1000, unused=0, fs="iso9660")
122
self.assertEquals(self.sysinfo.get_notes(), [])
124
def test_no_duplicate_roots(self):
125
self.add_mount("/", capacity=0, unused=0, fs="rootfs")
126
self.add_mount("/", capacity=1000, unused=1, fs="ext3")
128
self.assertEquals(self.sysinfo.get_notes(),
129
["/ is using 100.0% of 3MB"])
131
def test_no_duplicate_devices(self):
132
self.add_mount("/", capacity=1000, unused=1, device="/dev/horgle")
133
self.add_mount("/dev/.static/dev", capacity=1000, unused=1,
134
device="/dev/horgle")
136
self.assertEquals(self.sysinfo.get_notes(),
137
["/ is using 100.0% of 3MB"])
139
def test_shorter_mount_point_in_case_of_duplicate_devices(self):
140
self.add_mount("/dev/.static/dev", capacity=1000, unused=1,
141
device="/dev/horgle")
142
self.add_mount("/", capacity=1000, unused=1, device="/dev/horgle")
144
self.assertEquals(self.sysinfo.get_notes(),
145
["/ is using 100.0% of 3MB"])
147
def test_shorter_not_lexical(self):
149
This is a test for a fix for a regression, because I accidentally took
150
the lexically "smallest" mount point instead of the shortest one.
153
self.add_mount("/abc", capacity=1000, unused=1, device="/dev/horgle")
154
self.add_mount("/b", capacity=1000, unused=1, device="/dev/horgle")
156
self.assertEquals(self.sysinfo.get_notes(),
157
["/b is using 100.0% of 3MB"])