Mercurial > treepkg
annotate test/test_status.py @ 310:26c15a0f0e52
When stopping because of an error, do not raise the exception again as
it leads to confusing double tracebacks in the log. Instead, simply log
the reason for the stopping and stop in the same way a stop instruction
is handled.
author | Bernhard Herzog <bh@intevation.de> |
---|---|
date | Wed, 02 Dec 2009 14:46:37 +0000 |
parents | 27824d3add92 |
children |
rev | line source |
---|---|
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
1 # Copyright (C) 2007, 2008, 2009 by Intevation GmbH |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
2 # Authors: |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
3 # Bernhard Herzog <bh@intevation.de> |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
4 # |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
5 # This program is free software under the GPL (>=v2) |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
6 # Read the file COPYING coming with the software for details. |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
7 |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
8 """Tests for the Status classes""" |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
9 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
10 import os |
58
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
11 import stat |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
12 import unittest |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
13 from datetime import datetime |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
14 |
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
15 from treepkg.status import RevisionStatus, Status, EnumFieldDesc, \ |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
16 StringFieldDesc, DateFieldDesc |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
17 from treepkg.util import writefile |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
18 |
187
b19bf5895a55
Use the FileTestMixin for the status tests, too.
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
19 from filesupport import FileTestMixin |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
20 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
21 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
22 |
187
b19bf5895a55
Use the FileTestMixin for the status tests, too.
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
23 class TestStatus(unittest.TestCase, FileTestMixin): |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
24 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
25 def setUp(self): |
187
b19bf5895a55
Use the FileTestMixin for the status tests, too.
Bernhard Herzog <bh@intevation.de>
parents:
58
diff
changeset
|
26 self.filename = self.temp_file_name("status") |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
27 if os.path.exists(self.filename): |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
28 os.remove(self.filename) |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
29 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
30 def test_status(self): |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
31 status = RevisionStatus(self.filename) |
43
3c5ab7a65384
adapt status test cases to the enum fields
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
32 status.error() |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
33 |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
34 otherstatus = RevisionStatus(self.filename) |
43
3c5ab7a65384
adapt status test cases to the enum fields
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
35 self.assertEquals(otherstatus.status.name, "error") |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
36 |
58
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
37 def test_status_file_permissions(self): |
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
38 status = RevisionStatus(self.filename) |
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
39 status.error() |
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
40 |
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
41 mode = os.stat(self.filename).st_mode |
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
42 self.assertEquals(stat.S_IMODE(mode) & 0444, 0444) |
39b2deea8481
make the status files are world readable
Bernhard Herzog <bh@intevation.de>
parents:
43
diff
changeset
|
43 |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
44 def test_getting_unknown_fields(self): |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
45 status = RevisionStatus(self.filename) |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
46 self.assertRaises(AttributeError, getattr, status, "unknown_field") |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
47 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
48 def test_setting_unknown_fields(self): |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
49 status = RevisionStatus(self.filename) |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
50 self.assertRaises(AttributeError, |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
51 setattr, status, "unknown_field", "some value") |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
52 |
32
b1235080e694
add more tests for status defaults
Bernhard Herzog <bh@intevation.de>
parents:
12
diff
changeset
|
53 def test_default_values(self): |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
54 status = RevisionStatus(self.filename) |
43
3c5ab7a65384
adapt status test cases to the enum fields
Bernhard Herzog <bh@intevation.de>
parents:
40
diff
changeset
|
55 self.assertEquals(status.status.name, "unknown") |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
56 self.assertEquals(status.start, None) |
32
b1235080e694
add more tests for status defaults
Bernhard Herzog <bh@intevation.de>
parents:
12
diff
changeset
|
57 self.assertEquals(status.stop, None) |
259
27824d3add92
Add a tags field to the revision status to keep track of which tags
Bernhard Herzog <bh@intevation.de>
parents:
250
diff
changeset
|
58 self.assertEquals(status.tags, "") |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
59 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
60 def test_date(self): |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
61 timestamp = datetime(2007, 3, 9, 17, 32, 55) |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
62 status = RevisionStatus(self.filename) |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
63 status.start = timestamp |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
64 |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
65 otherstatus = RevisionStatus(self.filename) |
12
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
66 self.assertEquals(otherstatus.start, timestamp) |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
67 |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
68 def test_magic(self): |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
69 writefile(self.filename, |
f9f15ee39ed7
New Status class that handles several fields
Bernhard Herzog <bh@intevation.de>
parents:
diff
changeset
|
70 "Some other magic\nstart: 2007-03-09 17:32:55\n") |
36
086c68ca51d2
rename Status to RevisionStatus
Bernhard Herzog <bh@intevation.de>
parents:
32
diff
changeset
|
71 self.assertRaises(ValueError, RevisionStatus, self.filename) |
40
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
72 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
73 def test_status_enum(self): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
74 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
75 class TestStatus(Status): |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
76 status = EnumFieldDesc() |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
77 status.add("not_running", "Process is not running", |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
78 default=True) |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
79 status.add("running", "Process is running") |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
80 status.add("error", "An error occurred") |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
81 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
82 status = TestStatus(self.filename) |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
83 status.running() |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
84 |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
85 otherstatus = TestStatus(self.filename) |
c544903eeced
Add real enums for status information
Bernhard Herzog <bh@intevation.de>
parents:
36
diff
changeset
|
86 self.assertEquals(otherstatus.status.name, "running") |
250
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
87 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
88 def test_serialize(self): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
89 class TestStatus(Status): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
90 _magic = "TestStatus 1.0\n" |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
91 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
92 status = EnumFieldDesc() |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
93 status.add("not_running", "Process is not running", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
94 default=True) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
95 status.add("running", "Process is running") |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
96 status.add("error", "An error occurred") |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
97 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
98 start = DateFieldDesc(default=None) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
99 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
100 name = StringFieldDesc(default="fred") |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
101 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
102 status = TestStatus(None) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
103 status.running() |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
104 status.start = datetime(2007, 3, 9, 17, 32, 55) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
105 status.name = "Dave" |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
106 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
107 self.assertEquals(sorted(status.serialize()), |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
108 ["TestStatus 1.0\n", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
109 "name: Dave\n", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
110 "start: 2007-03-09 17:32:55\n", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
111 "status: running\n"]) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
112 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
113 def test_deserialize(self): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
114 class TestStatus(Status): |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
115 _magic = "TestStatus 1.0\n" |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
116 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
117 status = EnumFieldDesc() |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
118 status.add("not_running", "Process is not running", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
119 default=True) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
120 status.add("running", "Process is running") |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
121 status.add("error", "An error occurred") |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
122 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
123 start = DateFieldDesc(default=None) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
124 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
125 name = StringFieldDesc(default="fred") |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
126 |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
127 status = TestStatus(None) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
128 status.deserialize(iter(["TestStatus 1.0\n", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
129 "name: Dave\n", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
130 "start: 2007-03-09 17:32:55\n", |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
131 "status: running\n"])) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
132 self.assertEquals(status.status.name, "running") |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
133 self.assertEquals(status.start, datetime(2007, 3, 9, 17, 32, 55)) |
b3f9cc956acc
Make the Status class usable without a filename and provide methods to
Bernhard Herzog <bh@intevation.de>
parents:
187
diff
changeset
|
134 self.assertEquals(status.name, "Dave") |