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")
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)