1
# Copyright (c) 2006-2008 Twisted Matrix Laboratories.
2
# See LICENSE for details.
5
from cStringIO import StringIO
7
from twisted.python.versions import getVersionString, IncomparableVersions
8
from twisted.python.versions import Version, _inf
9
from twisted.python.filepath import FilePath
11
from twisted.trial import unittest
15
VERSION_4_ENTRIES = """\
16
<?xml version="1.0" encoding="utf-8"?>
22
committed-date="2006-09-21T04:43:09.542953Z"
23
url="svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk/twisted"
26
uuid="bbbe8e31-12d6-0310-92fd-ac37d47ddeeb"
27
repos="svn+ssh://svn.twistedmatrix.com/svn/Twisted"
34
VERSION_8_ENTRIES = """\
39
svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk
43
VERSION_9_ENTRIES = """\
48
svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk
52
VERSION_10_ENTRIES = """\
57
svn+ssh://svn.twistedmatrix.com/svn/Twisted/trunk
61
class VersionsTest(unittest.TestCase):
63
def test_versionComparison(self):
65
Versions can be compared for equality and order.
67
va = Version("dummy", 1, 0, 0)
68
vb = Version("dummy", 0, 1, 0)
69
self.failUnless(va > vb)
70
self.failUnless(vb < va)
71
self.failUnless(va >= vb)
72
self.failUnless(vb <= va)
73
self.failUnless(va != vb)
74
self.failUnless(vb == Version("dummy", 0, 1, 0))
75
self.failUnless(vb == vb)
83
self.failIf(vb != Version("dummy", 0, 1, 0))
87
def test_comparingPrereleasesWithReleases(self):
89
Prereleases are always less than versions without prereleases.
91
va = Version("whatever", 1, 0, 0, prerelease=1)
92
vb = Version("whatever", 1, 0, 0)
93
self.assertTrue(va < vb)
94
self.assertFalse(va > vb)
95
self.assertNotEquals(vb, va)
98
def test_comparingPrereleases(self):
100
The value specified as the prerelease is used in version comparisons.
102
va = Version("whatever", 1, 0, 0, prerelease=1)
103
vb = Version("whatever", 1, 0, 0, prerelease=2)
104
self.assertTrue(va < vb)
105
self.assertFalse(va > vb)
106
self.assertNotEqual(va, vb)
109
def test_infComparison(self):
111
L{_inf} is equal to L{_inf}.
113
This is a regression test.
115
self.assertEquals(_inf, _inf)
118
def testDontAllowBuggyComparisons(self):
119
self.assertRaises(IncomparableVersions,
121
Version("dummy", 1, 0, 0),
122
Version("dumym", 1, 0, 0))
127
Calling C{repr} on a version returns a human-readable string
128
representation of the version.
130
self.assertEquals(repr(Version("dummy", 1, 2, 3)),
131
"Version('dummy', 1, 2, 3)")
134
def test_reprWithPrerelease(self):
136
Calling C{repr} on a version with a prerelease returns a human-readable
137
string representation of the version including the prerelease.
139
self.assertEquals(repr(Version("dummy", 1, 2, 3, prerelease=4)),
140
"Version('dummy', 1, 2, 3, prerelease=4)")
145
Calling C{str} on a version returns a human-readable string
146
representation of the version.
148
self.assertEquals(str(Version("dummy", 1, 2, 3)),
149
"[dummy, version 1.2.3]")
152
def test_strWithPrerelease(self):
154
Calling C{str} on a version with a prerelease includes the prerelease.
156
self.assertEquals(str(Version("dummy", 1, 0, 0, prerelease=1)),
157
"[dummy, version 1.0.0pre1]")
161
self.assertEquals(Version('dummy', 1, 2, 3).short(), '1.2.3')
164
def test_goodSVNEntries_4(self):
166
Version should be able to parse an SVN format 4 entries file.
168
version = Version("dummy", 1, 0, 0)
170
version._parseSVNEntries_4(StringIO(VERSION_4_ENTRIES)), '18211')
173
def test_goodSVNEntries_8(self):
175
Version should be able to parse an SVN format 8 entries file.
177
version = Version("dummy", 1, 0, 0)
179
version._parseSVNEntries_8(StringIO(VERSION_8_ENTRIES)), '22715')
182
def test_goodSVNEntries_9(self):
184
Version should be able to parse an SVN format 9 entries file.
186
version = Version("dummy", 1, 0, 0)
188
version._parseSVNEntries_9(StringIO(VERSION_9_ENTRIES)), '22715')
191
def test_goodSVNEntriesTenPlus(self):
193
Version should be able to parse an SVN format 10 entries file.
195
version = Version("dummy", 1, 0, 0)
197
version._parseSVNEntriesTenPlus(StringIO(VERSION_10_ENTRIES)), '22715')
200
def test_getVersionString(self):
202
L{getVersionString} returns a string with the package name and the
203
short version number.
206
'Twisted 8.0.0', getVersionString(Version('Twisted', 8, 0, 0)))
209
def test_getVersionStringWithPrerelease(self):
211
L{getVersionString} includes the prerelease, if any.
214
getVersionString(Version("whatever", 8, 0, 0, prerelease=1)),
215
"whatever 8.0.0pre1")
220
The L{base} method returns a very simple representation of the version.
222
self.assertEquals(Version("foo", 1, 0, 0).base(), "1.0.0")
225
def test_baseWithPrerelease(self):
227
The base version includes 'preX' for versions with prereleases.
229
self.assertEquals(Version("foo", 1, 0, 0, prerelease=8).base(),
234
class FormatDiscoveryTests(unittest.TestCase):
236
Tests which discover the parsing method based on the imported module name.
241
Create a temporary directory with a package structure in it.
243
self.entry = FilePath(self.mktemp())
244
self.preTestModules = sys.modules.copy()
245
sys.path.append(self.entry.path)
246
pkg = self.entry.child("twisted_python_versions_package")
248
pkg.child("__init__.py").setContent(
249
"from twisted.python.versions import Version\n"
250
"version = Version('twisted_python_versions_package', 1, 0, 0)\n")
251
self.svnEntries = pkg.child(".svn")
252
self.svnEntries.makedirs()
257
Remove the imported modules and sys.path modifications.
260
sys.modules.update(self.preTestModules)
261
sys.path.remove(self.entry.path)
264
def checkSVNFormat(self, formatVersion, entriesText, expectedRevision):
266
Check for the given revision being detected after setting the SVN
267
entries text and format version of the test directory structure.
269
self.svnEntries.child("format").setContent(formatVersion+"\n")
270
self.svnEntries.child("entries").setContent(entriesText)
271
self.assertEqual(self.getVersion()._getSVNVersion(), expectedRevision)
274
def getVersion(self):
276
Import and retrieve the Version object from our dynamically created
279
import twisted_python_versions_package
280
return twisted_python_versions_package.version
283
def test_detectVersion4(self):
285
Verify that version 4 format file will be properly detected and parsed.
287
self.checkSVNFormat("4", VERSION_4_ENTRIES, '18211')
290
def test_detectVersion8(self):
292
Verify that version 8 format files will be properly detected and
295
self.checkSVNFormat("8", VERSION_8_ENTRIES, '22715')
298
def test_detectVersion9(self):
300
Verify that version 9 format files will be properly detected and
303
self.checkSVNFormat("9", VERSION_9_ENTRIES, '22715')
306
def test_detectVersion10(self):
308
Verify that version 10 format files will be properly detected and
311
Differing from previous formats, the version 10 format lacks a
312
I{format} file and B{only} has the version information on the first
313
line of the I{entries} file.
315
self.svnEntries.child("entries").setContent(VERSION_10_ENTRIES)
316
self.assertEquals(self.getVersion()._getSVNVersion(), '22715')
319
def test_detectUnknownVersion(self):
321
Verify that a new version of SVN will result in the revision 'Unknown'.
323
self.checkSVNFormat("some-random-new-version", "ooga booga!", 'Unknown')