OSDN Git Service

Merge pull request #1790 from Bytom/dev
[bytom/bytom.git] / version / version_test.go
index 195dbfe..35ebed9 100644 (file)
@@ -2,37 +2,157 @@ package version
 
 import (
        "fmt"
-       "math/rand"
        "testing"
-       "time"
 
+       "gopkg.in/fatih/set.v0"
        gover "github.com/hashicorp/go-version"
 )
 
-func TestRevisionLen(t *testing.T) {
-       if revisionLen > 16 {
-               t.Error("revisionLen too long")
-       }
-}
-
 func TestCompare(t *testing.T) {
-       rand.Seed(time.Now().UnixNano())
-       i := rand.Uint64()
-       rev := fmt.Sprintf("%16x", i)[:revisionLen]
-
        v1, err := gover.NewVersion(Version)
        if err != nil {
-               t.Error("Version 1 format error.")
+               t.Fatal("Version 1 format error.")
        }
-       v2, err := gover.NewVersion(Version + "+" + rev)
+       v2, err := gover.NewVersion(Version + "+f873dfca")
        if err != nil {
-               t.Error("Version 2 format error.")
+               t.Fatal("Version 2 format error.")
        }
        if v1.GreaterThan(v2) || v1.GreaterThan(v2) {
                t.Error("Version comparison error.")
        }
 }
 
+func TestCompatibleWith(t *testing.T) {
+       cases := []struct {
+               a      string
+               b      string
+               result bool
+       }{
+               {
+                       "1.0.4",
+                       "1.0.4",
+                       true,
+               },
+               {
+                       "1.0.4",
+                       "1.0.5",
+                       true,
+               },
+               {
+                       "1.0.4",
+                       "1.1.5",
+                       true,
+               },
+               {
+                       "1.0.5",
+                       "1.0.5-90825109",
+                       true,
+               },
+               {
+                       "1.0.5",
+                       "1.0.5+90825109",
+                       true,
+               },
+               {
+                       "1.0.5",
+                       "2.0.5",
+                       false,
+               },
+               {
+                       "1.0.5-90825109",
+                       "1.0.5+90825109",
+                       true,
+               },
+       }
+
+       for i, c := range cases {
+               Version = c.a
+               if result, _ := CompatibleWith(c.b); c.result != result {
+                       t.Errorf("case %d: got %t want %t", i, c.result, result)
+               }
+       }
+}
+
+func TestCheckUpdate(t *testing.T) {
+       cases := []struct {
+               desc           string
+               localVer       string
+               remotePeers    []string
+               wantStatus     uint16
+               wantmaxVerSeen string
+               wantNotified   bool
+       }{
+               {
+                       desc:           "has large version number update",
+                       localVer:       "1.0",
+                       remotePeers:    []string{"1.0", "2.0", "1.0.3"},
+                       wantStatus:     hasMUpdate,
+                       wantmaxVerSeen: "2.0",
+                       wantNotified:   true,
+               },
+               {
+                       desc:           "some remote version less than local version, but some remote verison larger than local version",
+                       localVer:       "1.0",
+                       remotePeers:    []string{"0.8", "1.1", "1.0.3", "0.9"},
+                       wantStatus:     hasUpdate,
+                       wantmaxVerSeen: "1.1",
+                       wantNotified:   true,
+               },
+               {
+                       desc:           "has small version number update",
+                       localVer:       "1.0",
+                       remotePeers:    []string{"1.0", "1.0.3", "1.0.2"},
+                       wantStatus:     hasUpdate,
+                       wantmaxVerSeen: "1.0.3",
+                       wantNotified:   true,
+               },
+               {
+                       desc:           "the remote equals to local version",
+                       localVer:       "1.0",
+                       remotePeers:    []string{"1.0", "1.0", "1.0"},
+                       wantStatus:     noUpdate,
+                       wantmaxVerSeen: "1.0",
+                       wantNotified:   false,
+               },
+               {
+                       desc:           "the remote version less than local version",
+                       localVer:       "1.0",
+                       remotePeers:    []string{"0.8", "0.8", "0.8"},
+                       wantStatus:     noUpdate,
+                       wantmaxVerSeen: "1.0",
+                       wantNotified:   false,
+               },
+       }
+
+       for i, c := range cases {
+               status := &UpdateStatus{
+                       maxVerSeen:    c.localVer,
+                       notified:      false,
+                       seedSet:       set.New(),
+                       versionStatus: noUpdate,
+               }
+               for i, remoteVer := range c.remotePeers {
+                       peer := fmt.Sprintf("peer%d", i)
+                       status.seedSet.Add(peer)
+                       if err := status.CheckUpdate(c.localVer, remoteVer, peer); err != nil {
+                               t.Fatal(err)
+                       }
+               }
+
+               if status.versionStatus != c.wantStatus {
+                       t.Errorf("#%d(%s) got version status:%d, want version status:%d", i, c.desc, status.versionStatus, c.wantStatus)
+               }
+
+               if status.notified != c.wantNotified {
+                       t.Errorf("#%d(%s) got notified:%t, want notified:%t", i, c.desc, status.notified, c.wantNotified)
+               }
+
+               if status.maxVerSeen != c.wantmaxVerSeen {
+                       t.Errorf("#%d(%s) got max version seen%s, want max version seen%s", i, c.desc, status.maxVerSeen, c.wantmaxVerSeen)
+               }
+       }
+}
+
 // In case someone edit the iota part and have the mapping changed:
 // noUpdate: 0
 // hasUpdate: 1