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+
15package chain
26
37import (
48 "testing"
59)
610
7- // Testing a variety of version schemes for the serverCompatibe()
811func 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
63122func 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