14c8d173674447fc4e7b872f4f4a1b46cebbdef7
[sdc/sdc-distribution-client.git] /
1 # Copyright 2012 Red Hat, Inc.
2 # Copyright 2012-2013 Hewlett-Packard Development Company, L.P.
3 #
4 #    Licensed under the Apache License, Version 2.0 (the "License"); you may
5 #    not use this file except in compliance with the License. You may obtain
6 #    a copy of the License at
7 #
8 #         http://www.apache.org/licenses/LICENSE-2.0
9 #
10 #    Unless required by applicable law or agreed to in writing, software
11 #    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 #    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 #    License for the specific language governing permissions and limitations
14 #    under the License.
15
16 import itertools
17
18 from testtools import matchers
19
20 from pbr.tests import base
21 from pbr import version
22
23
24 from_pip_string = version.SemanticVersion.from_pip_string
25
26
27 class TestSemanticVersion(base.BaseTestCase):
28
29     def test_ordering(self):
30         ordered_versions = [
31             "1.2.3.dev6",
32             "1.2.3.dev7",
33             "1.2.3.a4.dev12",
34             "1.2.3.a4.dev13",
35             "1.2.3.a4",
36             "1.2.3.a5.dev1",
37             "1.2.3.a5",
38             "1.2.3.b3.dev1",
39             "1.2.3.b3",
40             "1.2.3.rc2.dev1",
41             "1.2.3.rc2",
42             "1.2.3.rc3.dev1",
43             "1.2.3",
44             "1.2.4",
45             "1.3.3",
46             "2.2.3",
47         ]
48         for v in ordered_versions:
49             sv = version.SemanticVersion.from_pip_string(v)
50             self.expectThat(sv, matchers.Equals(sv))
51         for left, right in itertools.combinations(ordered_versions, 2):
52             l_pos = ordered_versions.index(left)
53             r_pos = ordered_versions.index(right)
54             if l_pos < r_pos:
55                 m1 = matchers.LessThan
56                 m2 = matchers.GreaterThan
57             else:
58                 m1 = matchers.GreaterThan
59                 m2 = matchers.LessThan
60             left_sv = version.SemanticVersion.from_pip_string(left)
61             right_sv = version.SemanticVersion.from_pip_string(right)
62             self.expectThat(left_sv, m1(right_sv))
63             self.expectThat(right_sv, m2(left_sv))
64
65     def test_from_pip_string_legacy_alpha(self):
66         expected = version.SemanticVersion(
67             1, 2, 0, prerelease_type='rc', prerelease=1)
68         parsed = from_pip_string('1.2.0rc1')
69         self.assertEqual(expected, parsed)
70
71     def test_from_pip_string_legacy_postN(self):
72         # When pbr trunk was incompatible with PEP-440, a stable release was
73         # made that used postN versions to represent developer builds. As
74         # we expect only to be parsing versions of our own, we map those
75         # into dev builds of the next version.
76         expected = version.SemanticVersion(1, 2, 4, dev_count=5)
77         parsed = from_pip_string('1.2.3.post5')
78         self.expectThat(expected, matchers.Equals(parsed))
79         expected = version.SemanticVersion(1, 2, 3, 'a', 5, dev_count=6)
80         parsed = from_pip_string('1.2.3.0a4.post6')
81         self.expectThat(expected, matchers.Equals(parsed))
82         # We can't define a mapping for .postN.devM, so it should raise.
83         self.expectThat(
84             lambda: from_pip_string('1.2.3.post5.dev6'),
85             matchers.raises(ValueError))
86
87     def test_from_pip_string_legacy_nonzero_lead_in(self):
88         # reported in bug 1361251
89         expected = version.SemanticVersion(
90             0, 0, 1, prerelease_type='a', prerelease=2)
91         parsed = from_pip_string('0.0.1a2')
92         self.assertEqual(expected, parsed)
93
94     def test_from_pip_string_legacy_short_nonzero_lead_in(self):
95         expected = version.SemanticVersion(
96             0, 1, 0, prerelease_type='a', prerelease=2)
97         parsed = from_pip_string('0.1a2')
98         self.assertEqual(expected, parsed)
99
100     def test_from_pip_string_legacy_no_0_prerelease(self):
101         expected = version.SemanticVersion(
102             2, 1, 0, prerelease_type='rc', prerelease=1)
103         parsed = from_pip_string('2.1.0.rc1')
104         self.assertEqual(expected, parsed)
105
106     def test_from_pip_string_legacy_no_0_prerelease_2(self):
107         expected = version.SemanticVersion(
108             2, 0, 0, prerelease_type='rc', prerelease=1)
109         parsed = from_pip_string('2.0.0.rc1')
110         self.assertEqual(expected, parsed)
111
112     def test_from_pip_string_legacy_non_440_beta(self):
113         expected = version.SemanticVersion(
114             2014, 2, prerelease_type='b', prerelease=2)
115         parsed = from_pip_string('2014.2.b2')
116         self.assertEqual(expected, parsed)
117
118     def test_from_pip_string_pure_git_hash(self):
119         self.assertRaises(ValueError, from_pip_string, '6eed5ae')
120
121     def test_from_pip_string_non_digit_start(self):
122         self.assertRaises(ValueError, from_pip_string,
123                           'non-release-tag/2014.12.16-1')
124
125     def test_final_version(self):
126         semver = version.SemanticVersion(1, 2, 3)
127         self.assertEqual((1, 2, 3, 'final', 0), semver.version_tuple())
128         self.assertEqual("1.2.3", semver.brief_string())
129         self.assertEqual("1.2.3", semver.debian_string())
130         self.assertEqual("1.2.3", semver.release_string())
131         self.assertEqual("1.2.3", semver.rpm_string())
132         self.assertEqual(semver, from_pip_string("1.2.3"))
133
134     def test_parsing_short_forms(self):
135         semver = version.SemanticVersion(1, 0, 0)
136         self.assertEqual(semver, from_pip_string("1"))
137         self.assertEqual(semver, from_pip_string("1.0"))
138         self.assertEqual(semver, from_pip_string("1.0.0"))
139
140     def test_dev_version(self):
141         semver = version.SemanticVersion(1, 2, 4, dev_count=5)
142         self.assertEqual((1, 2, 4, 'dev', 4), semver.version_tuple())
143         self.assertEqual("1.2.4", semver.brief_string())
144         self.assertEqual("1.2.4~dev5", semver.debian_string())
145         self.assertEqual("1.2.4.dev5", semver.release_string())
146         self.assertEqual("1.2.3.dev5", semver.rpm_string())
147         self.assertEqual(semver, from_pip_string("1.2.4.dev5"))
148
149     def test_dev_no_git_version(self):
150         semver = version.SemanticVersion(1, 2, 4, dev_count=5)
151         self.assertEqual((1, 2, 4, 'dev', 4), semver.version_tuple())
152         self.assertEqual("1.2.4", semver.brief_string())
153         self.assertEqual("1.2.4~dev5", semver.debian_string())
154         self.assertEqual("1.2.4.dev5", semver.release_string())
155         self.assertEqual("1.2.3.dev5", semver.rpm_string())
156         self.assertEqual(semver, from_pip_string("1.2.4.dev5"))
157
158     def test_dev_zero_version(self):
159         semver = version.SemanticVersion(1, 2, 0, dev_count=5)
160         self.assertEqual((1, 2, 0, 'dev', 4), semver.version_tuple())
161         self.assertEqual("1.2.0", semver.brief_string())
162         self.assertEqual("1.2.0~dev5", semver.debian_string())
163         self.assertEqual("1.2.0.dev5", semver.release_string())
164         self.assertEqual("1.1.9999.dev5", semver.rpm_string())
165         self.assertEqual(semver, from_pip_string("1.2.0.dev5"))
166
167     def test_alpha_dev_version(self):
168         semver = version.SemanticVersion(1, 2, 4, 'a', 1, 12)
169         self.assertEqual((1, 2, 4, 'alphadev', 12), semver.version_tuple())
170         self.assertEqual("1.2.4", semver.brief_string())
171         self.assertEqual("1.2.4~a1.dev12", semver.debian_string())
172         self.assertEqual("1.2.4.0a1.dev12", semver.release_string())
173         self.assertEqual("1.2.3.a1.dev12", semver.rpm_string())
174         self.assertEqual(semver, from_pip_string("1.2.4.0a1.dev12"))
175
176     def test_alpha_version(self):
177         semver = version.SemanticVersion(1, 2, 4, 'a', 1)
178         self.assertEqual((1, 2, 4, 'alpha', 1), semver.version_tuple())
179         self.assertEqual("1.2.4", semver.brief_string())
180         self.assertEqual("1.2.4~a1", semver.debian_string())
181         self.assertEqual("1.2.4.0a1", semver.release_string())
182         self.assertEqual("1.2.3.a1", semver.rpm_string())
183         self.assertEqual(semver, from_pip_string("1.2.4.0a1"))
184
185     def test_alpha_zero_version(self):
186         semver = version.SemanticVersion(1, 2, 0, 'a', 1)
187         self.assertEqual((1, 2, 0, 'alpha', 1), semver.version_tuple())
188         self.assertEqual("1.2.0", semver.brief_string())
189         self.assertEqual("1.2.0~a1", semver.debian_string())
190         self.assertEqual("1.2.0.0a1", semver.release_string())
191         self.assertEqual("1.1.9999.a1", semver.rpm_string())
192         self.assertEqual(semver, from_pip_string("1.2.0.0a1"))
193
194     def test_alpha_major_zero_version(self):
195         semver = version.SemanticVersion(1, 0, 0, 'a', 1)
196         self.assertEqual((1, 0, 0, 'alpha', 1), semver.version_tuple())
197         self.assertEqual("1.0.0", semver.brief_string())
198         self.assertEqual("1.0.0~a1", semver.debian_string())
199         self.assertEqual("1.0.0.0a1", semver.release_string())
200         self.assertEqual("0.9999.9999.a1", semver.rpm_string())
201         self.assertEqual(semver, from_pip_string("1.0.0.0a1"))
202
203     def test_alpha_default_version(self):
204         semver = version.SemanticVersion(1, 2, 4, 'a')
205         self.assertEqual((1, 2, 4, 'alpha', 0), semver.version_tuple())
206         self.assertEqual("1.2.4", semver.brief_string())
207         self.assertEqual("1.2.4~a0", semver.debian_string())
208         self.assertEqual("1.2.4.0a0", semver.release_string())
209         self.assertEqual("1.2.3.a0", semver.rpm_string())
210         self.assertEqual(semver, from_pip_string("1.2.4.0a0"))
211
212     def test_beta_dev_version(self):
213         semver = version.SemanticVersion(1, 2, 4, 'b', 1, 12)
214         self.assertEqual((1, 2, 4, 'betadev', 12), semver.version_tuple())
215         self.assertEqual("1.2.4", semver.brief_string())
216         self.assertEqual("1.2.4~b1.dev12", semver.debian_string())
217         self.assertEqual("1.2.4.0b1.dev12", semver.release_string())
218         self.assertEqual("1.2.3.b1.dev12", semver.rpm_string())
219         self.assertEqual(semver, from_pip_string("1.2.4.0b1.dev12"))
220
221     def test_beta_version(self):
222         semver = version.SemanticVersion(1, 2, 4, 'b', 1)
223         self.assertEqual((1, 2, 4, 'beta', 1), semver.version_tuple())
224         self.assertEqual("1.2.4", semver.brief_string())
225         self.assertEqual("1.2.4~b1", semver.debian_string())
226         self.assertEqual("1.2.4.0b1", semver.release_string())
227         self.assertEqual("1.2.3.b1", semver.rpm_string())
228         self.assertEqual(semver, from_pip_string("1.2.4.0b1"))
229
230     def test_decrement_nonrelease(self):
231         # The prior version of any non-release is a release
232         semver = version.SemanticVersion(1, 2, 4, 'b', 1)
233         self.assertEqual(
234             version.SemanticVersion(1, 2, 3), semver.decrement())
235
236     def test_decrement_nonrelease_zero(self):
237         # We set an arbitrary max version of 9999 when decrementing versions
238         # - this is part of handling rpm support.
239         semver = version.SemanticVersion(1, 0, 0)
240         self.assertEqual(
241             version.SemanticVersion(0, 9999, 9999), semver.decrement())
242
243     def test_decrement_release(self):
244         # The next patch version of a release version requires a change to the
245         # patch level.
246         semver = version.SemanticVersion(2, 2, 5)
247         self.assertEqual(
248             version.SemanticVersion(2, 2, 4), semver.decrement())
249
250     def test_increment_nonrelease(self):
251         # The next patch version of a non-release version is another
252         # non-release version as the next release doesn't need to be
253         # incremented.
254         semver = version.SemanticVersion(1, 2, 4, 'b', 1)
255         self.assertEqual(
256             version.SemanticVersion(1, 2, 4, 'b', 2), semver.increment())
257         # Major and minor increments however need to bump things.
258         self.assertEqual(
259             version.SemanticVersion(1, 3, 0), semver.increment(minor=True))
260         self.assertEqual(
261             version.SemanticVersion(2, 0, 0), semver.increment(major=True))
262
263     def test_increment_release(self):
264         # The next patch version of a release version requires a change to the
265         # patch level.
266         semver = version.SemanticVersion(1, 2, 5)
267         self.assertEqual(
268             version.SemanticVersion(1, 2, 6), semver.increment())
269         self.assertEqual(
270             version.SemanticVersion(1, 3, 0), semver.increment(minor=True))
271         self.assertEqual(
272             version.SemanticVersion(2, 0, 0), semver.increment(major=True))
273
274     def test_rc_dev_version(self):
275         semver = version.SemanticVersion(1, 2, 4, 'rc', 1, 12)
276         self.assertEqual((1, 2, 4, 'candidatedev', 12), semver.version_tuple())
277         self.assertEqual("1.2.4", semver.brief_string())
278         self.assertEqual("1.2.4~rc1.dev12", semver.debian_string())
279         self.assertEqual("1.2.4.0rc1.dev12", semver.release_string())
280         self.assertEqual("1.2.3.rc1.dev12", semver.rpm_string())
281         self.assertEqual(semver, from_pip_string("1.2.4.0rc1.dev12"))
282
283     def test_rc_version(self):
284         semver = version.SemanticVersion(1, 2, 4, 'rc', 1)
285         self.assertEqual((1, 2, 4, 'candidate', 1), semver.version_tuple())
286         self.assertEqual("1.2.4", semver.brief_string())
287         self.assertEqual("1.2.4~rc1", semver.debian_string())
288         self.assertEqual("1.2.4.0rc1", semver.release_string())
289         self.assertEqual("1.2.3.rc1", semver.rpm_string())
290         self.assertEqual(semver, from_pip_string("1.2.4.0rc1"))
291
292     def test_to_dev(self):
293         self.assertEqual(
294             version.SemanticVersion(1, 2, 3, dev_count=1),
295             version.SemanticVersion(1, 2, 3).to_dev(1))
296         self.assertEqual(
297             version.SemanticVersion(1, 2, 3, 'rc', 1, dev_count=1),
298             version.SemanticVersion(1, 2, 3, 'rc', 1).to_dev(1))