fixed Compatible and added a small test case
Henry committed
Oct 16, 2014 at 12:29 UTC
78eb349360d5b27d34cca8bdcedd5182f28bc0d6
3 files changed
+34
-11
net/swarm/conn.go
+4
-4
@@ -194,7 +194,7 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
194
remote.Secure.Out <- our
195
sendMine = true
196
close(outBuf) // only send local version once
197
- log.Debug("[peer: %s] Send my version(%s) to %s", s.local, myVersion, remote.Peer)
197
+ log.Debug("Send my version(%s) [to = %s]", myVersion, remote.Peer)
198
}
199
200
case data, ok := <-remote.Secure.In:
@@ -202,8 +202,6 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
202
return fmt.Errorf("Error retrieving from conn: %v", remote.Peer)
203
}
204
205
- log.Debug("[peer: %s] Received message [from = %s]", s.local, remote.Peer)
206
-
205
remoteVersion = new(version.SemVer)
206
err = proto.Unmarshal(data, remoteVersion)
207
if err != nil {
@@ -211,16 +209,18 @@ func (s *Swarm) connVersionExchange(remote *conn.Conn) error {
209
return fmt.Errorf("connSetup: could not decode remote version: %q", err)
210
}
211
gotTheirs = true
212
+ log.Debug("Received remote version(%s) [from = %s]", remoteVersion, remote.Peer)
213
214
// BUG(cryptix): could add another case here to trigger resending our version
215
}
216
}
217
219
- if !version.Compatible(myVersion, remoteVersion) {
218
+ if !version.Compatible(myVersion.Convert(), remoteVersion.Convert()) {
219
remote.Close()
220
return errors.New("protocol missmatch")
221
}
222
223
+ log.Debug("[peer: %s] Version compatible", remote.Peer)
224
return nil
225
}
226
net/version/version.go
+5
-7
@@ -14,10 +14,8 @@ func Current() *SemVer {
14
}
15
16
// Compatible checks wether two versions are compatible
17
-func Compatible(a, b *SemVer) bool {
18
- aConv := fromPBSemVer(a)
19
- bConv := fromPBSemVer(b)
20
- return aConv.LessThan(*bConv)
17
+func Compatible(a, b semver.Version) bool {
18
+ return !a.LessThan(b)
19
}
20
21
// toPBSemVar converts a coreos/semver to our protobuf SemVer
@@ -30,9 +28,9 @@ func toPBSemVer(in *semver.Version) (out *SemVer) {
28
}
29
}
30
33
-// toPBSemVar converts our protobuf SemVer to a coreos/semver
34
-func fromPBSemVer(in *SemVer) *semver.Version {
35
- return &semver.Version{
31
+// Convert our protobuf SemVer to a coreos/semver
32
+func (in SemVer) Convert() semver.Version {
33
+ return semver.Version{
34
Major: *in.Major,
35
Minor: *in.Minor,
36
Patch: *in.Patch,
net/version/version_test.go
new
+25
@@ -0,0 +1,25 @@
1
+package version
2
+
3
+import (
4
+ "testing"
5
+
6
+ semver "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/coreos/go-semver/semver"
7
+)
8
+
9
+func TestCompatible(t *testing.T) {
10
+ tcases := []struct {
11
+ a, b semver.Version
12
+ expected bool
13
+ }{
14
+ {semver.Version{Major: 0}, semver.Version{Major: 0}, true},
15
+ {semver.Version{Major: 1}, semver.Version{Major: 0}, true},
16
+ {semver.Version{Major: 1}, semver.Version{Major: 1}, true},
17
+ {semver.Version{Major: 0}, semver.Version{Major: 1}, false},
18
+ }
19
+
20
+ for i, tcase := range tcases {
21
+ if Compatible(tcase.a, tcase.b) != tcase.expected {
22
+ t.Fatalf("case[%d] failed", i)
23
+ }
24
+ }
25
+}