Skip to content

Commit 5b29137

Browse files
committed
chain: Improve semver compatability test coverage
1 parent c0fee6b commit 5b29137

1 file changed

Lines changed: 75 additions & 14 deletions

File tree

chain/semver_test.go

Lines changed: 75 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,116 @@
1+
// Copyright (c) 2023-2026 The Decred developers
2+
// Use of this source code is governed by an ISC
3+
// license that can be found in the LICENSE file.
4+
15
package chain
26

37
import (
48
"testing"
59
)
610

7-
// Testing a variety of version schemes for the serverCompatibe()
811
func TestSemverCompatible(t *testing.T) {
12+
t.Parallel()
913
testCases := []struct {
1014
name string
1115
required semver
1216
actual semver
1317
expected bool
1418
}{
19+
// Identical versions are always compatible.
1520
{
16-
name: "Equal Versions Case1",
21+
name: "identical versions",
1722
required: semver{Major: 1, Minor: 2, Patch: 3},
1823
actual: semver{Major: 1, Minor: 2, Patch: 3},
1924
expected: true,
2025
},
2126
{
22-
name: "Equal Versions Case2",
27+
name: "identical zero versions",
28+
required: semver{Major: 0, Minor: 0, Patch: 0},
29+
actual: semver{Major: 0, Minor: 0, Patch: 0},
30+
expected: true,
31+
},
32+
{
33+
name: "identical large versions",
2334
required: semver{Major: 450, Minor: 378, Patch: 210},
2435
actual: semver{Major: 450, Minor: 378, Patch: 210},
2536
expected: true,
2637
},
38+
39+
// Major versions must match exactly - a newer major is just as
40+
// incompatible as an older one.
41+
{
42+
name: "major newer by one",
43+
required: semver{Major: 1, Minor: 2, Patch: 3},
44+
actual: semver{Major: 2, Minor: 2, Patch: 3},
45+
expected: false,
46+
},
47+
{
48+
name: "major older by one",
49+
required: semver{Major: 2, Minor: 2, Patch: 3},
50+
actual: semver{Major: 1, Minor: 2, Patch: 3},
51+
expected: false,
52+
},
53+
54+
// With a matching major, a newer minor is compatible regardless of
55+
// the patch version.
56+
{
57+
name: "minor newer, patch equal",
58+
required: semver{Major: 1, Minor: 2, Patch: 3},
59+
actual: semver{Major: 1, Minor: 3, Patch: 3},
60+
expected: true,
61+
},
2762
{
28-
name: "Equal Versions Case3",
29-
required: semver{Major: 78, Minor: 94, Patch: 80},
30-
actual: semver{Major: 78, Minor: 94, Patch: 80},
63+
name: "minor newer, patch older",
64+
required: semver{Major: 1, Minor: 2, Patch: 9},
65+
actual: semver{Major: 1, Minor: 3, Patch: 0},
3166
expected: true,
3267
},
3368
{
34-
name: "Different versions Case1",
69+
name: "minor newer, patch newer",
3570
required: semver{Major: 1, Minor: 2, Patch: 3},
36-
actual: semver{Major: 2, Minor: 0, Patch: 0},
71+
actual: semver{Major: 1, Minor: 3, Patch: 4},
72+
expected: true,
73+
},
74+
75+
// With a matching major, an older minor is never compatible,
76+
// regardless of the patch version.
77+
{
78+
name: "minor older, patch equal",
79+
required: semver{Major: 1, Minor: 3, Patch: 3},
80+
actual: semver{Major: 1, Minor: 2, Patch: 3},
3781
expected: false,
3882
},
3983
{
40-
name: "Different versions Case2",
41-
required: semver{Major: 1, Minor: 2, Patch: 4},
42-
actual: semver{Major: 1, Minor: 0, Patch: 2},
84+
name: "minor older, patch newer",
85+
required: semver{Major: 1, Minor: 3, Patch: 0},
86+
actual: semver{Major: 1, Minor: 2, Patch: 9},
4387
expected: false,
4488
},
4589
{
46-
name: "Different versions Case3",
90+
name: "minor older, patch older",
4791
required: semver{Major: 1, Minor: 3, Patch: 6},
48-
actual: semver{Major: 1, Minor: 3, Patch: 2},
92+
actual: semver{Major: 1, Minor: 2, Patch: 2},
93+
expected: false,
94+
},
95+
96+
// With matching major and minor, the patch must be greater than or
97+
// equal to the required patch.
98+
{
99+
name: "minor equal, patch newer by one",
100+
required: semver{Major: 1, Minor: 2, Patch: 3},
101+
actual: semver{Major: 1, Minor: 2, Patch: 4},
102+
expected: true,
103+
},
104+
{
105+
name: "minor equal, patch older by one",
106+
required: semver{Major: 1, Minor: 2, Patch: 4},
107+
actual: semver{Major: 1, Minor: 2, Patch: 3},
49108
expected: false,
50109
},
51110
}
52111
for _, tc := range testCases {
53112
t.Run(tc.name, func(t *testing.T) {
113+
t.Parallel()
54114
result := semverCompatible(tc.required, tc.actual)
55115
if result != tc.expected {
56116
t.Fatalf("got: %v, want: %v", result, tc.expected)
@@ -59,8 +119,8 @@ func TestSemverCompatible(t *testing.T) {
59119
}
60120
}
61121

62-
// Testing a variety of version schemes to print the right version output
63122
func TestSemverToString(t *testing.T) {
123+
t.Parallel()
64124
testCases := []struct {
65125
name string
66126
version semver
@@ -79,6 +139,7 @@ func TestSemverToString(t *testing.T) {
79139
}
80140
for _, tc := range testCases {
81141
t.Run(tc.name, func(t *testing.T) {
142+
t.Parallel()
82143
result := tc.version.String()
83144
if result != tc.expectedString {
84145
t.Fatalf("got: %v, want: %v", result, tc.expectedString)

0 commit comments

Comments
 (0)