OSDN Git Service

add test case (#1636)
[bytom/bytom.git] / version / version_test.go
1 package version
2
3 import (
4         "testing"
5
6         "gopkg.in/fatih/set.v0"
7         gover "github.com/hashicorp/go-version"
8 )
9
10 func TestCompare(t *testing.T) {
11         v1, err := gover.NewVersion(Version)
12         if err != nil {
13                 t.Fatal("Version 1 format error.")
14         }
15         v2, err := gover.NewVersion(Version + "+f873dfca")
16         if err != nil {
17                 t.Fatal("Version 2 format error.")
18         }
19         if v1.GreaterThan(v2) || v1.GreaterThan(v2) {
20                 t.Error("Version comparison error.")
21         }
22 }
23
24 func TestCompatibleWith(t *testing.T) {
25         cases := []struct {
26                 a      string
27                 b      string
28                 result bool
29         }{
30                 {
31                         "1.0.4",
32                         "1.0.4",
33                         true,
34                 },
35                 {
36                         "1.0.4",
37                         "1.0.5",
38                         true,
39                 },
40                 {
41                         "1.0.4",
42                         "1.1.5",
43                         true,
44                 },
45                 {
46                         "1.0.5",
47                         "1.0.5-90825109",
48                         true,
49                 },
50                 {
51                         "1.0.5",
52                         "1.0.5+90825109",
53                         true,
54                 },
55                 {
56                         "1.0.5",
57                         "2.0.5",
58                         false,
59                 },
60                 {
61                         "1.0.5-90825109",
62                         "1.0.5+90825109",
63                         true,
64                 },
65         }
66
67         for i, c := range cases {
68                 Version = c.a
69                 if result, _ := CompatibleWith(c.b); c.result != result {
70                         t.Errorf("case %d: got %t want %t", i, c.result, result)
71                 }
72         }
73 }
74
75 func TestCheckUpdate(t *testing.T) {
76         cases := []struct {
77                 desc           string
78                 localVer       string
79                 remotePeers    map[string]string
80                 wantStatus     uint16
81                 wantmaxVerSeen string
82                 wantNotified   bool
83         }{
84                 {
85                         desc:           "has large version number update",
86                         localVer:       "1.0",
87                         remotePeers:    map[string]string{"peer1": "1.0", "peer2": "2.0", "peer3": "1.0.3"},
88                         wantStatus:     hasMUpdate,
89                         wantmaxVerSeen: "2.0",
90                         wantNotified:   true,
91                 },
92                 {
93                         desc:           "some remote version less than local version, but some remote verison larger than local version",
94                         localVer:       "1.0",
95                         remotePeers:    map[string]string{"peer1": "0.8", "peer2": "1.1", "peer3": "1.0.3", "peer4": "0.9"},
96                         wantStatus:     hasUpdate,
97                         wantmaxVerSeen: "1.1",
98                         wantNotified:   true,
99                 },
100                 {
101                         desc:           "has small version number update",
102                         localVer:       "1.0",
103                         remotePeers:    map[string]string{"peer1": "1.0", "peer2": "1.0.3", "peer3": "1.0.2"},
104                         wantStatus:     hasUpdate,
105                         wantmaxVerSeen: "1.0.3",
106                         wantNotified:   true,
107                 },
108                 {
109                         desc:           "the remote equals to local version",
110                         localVer:       "1.0",
111                         remotePeers:    map[string]string{"peer1": "1.0", "peer2": "1.0", "peer3": "1.0"},
112                         wantStatus:     noUpdate,
113                         wantmaxVerSeen: "1.0",
114                         wantNotified:   false,
115                 },
116                 {
117                         desc:           "the remote version less than local version",
118                         localVer:       "1.0",
119                         remotePeers:    map[string]string{"peer1": "0.8", "peer2": "0.8", "peer3": "0.8"},
120                         wantStatus:     noUpdate,
121                         wantmaxVerSeen: "1.0",
122                         wantNotified:   false,
123                 },
124         }
125
126         for i, c := range cases {
127                 status := &UpdateStatus{
128                         maxVerSeen:    c.localVer,
129                         notified:      false,
130                         seedSet:       set.New(),
131                         versionStatus: noUpdate,
132                 }
133                 for peer, remoteVer := range c.remotePeers {
134                         status.seedSet.Add(peer)
135                         if err := status.CheckUpdate(c.localVer, remoteVer, peer); err != nil {
136                                 t.Fatal(err)
137                         }
138                 }
139
140                 if status.versionStatus != c.wantStatus {
141                         t.Errorf("got version status:%d, want version status:%d", status.versionStatus, c.wantStatus)
142                 }
143
144                 if status.notified != c.wantNotified {
145                         t.Errorf("got notified:%t, want notified:%t", status.notified, c.wantNotified)
146                 }
147
148                 if status.maxVerSeen != c.wantmaxVerSeen {
149                         t.Errorf("#%d(%s) got max version seen%s, want max version seen%s", i, c.desc, status.maxVerSeen, c.wantmaxVerSeen)
150                 }
151         }
152 }
153
154 // In case someone edit the iota part and have the mapping changed:
155 // noUpdate: 0
156 // hasUpdate: 1
157 // hasMUpdate: 2
158 func TestFlag(t *testing.T) {
159         if noUpdate != 0 {
160                 t.Error("noUpdate value error")
161         }
162         if hasUpdate != 1 {
163                 t.Error("hasUpdate value error")
164         }
165         if hasMUpdate != 2 {
166                 t.Error("noUpdate value error")
167         }
168 }