aboutsummaryrefslogtreecommitdiffstats
path: root/Godeps/_workspace/src/github.com/pborman/uuid
diff options
context:
space:
mode:
authorJeffrey Wilcke <jeffrey@ethereum.org>2016-02-17 20:46:30 +0800
committerJeffrey Wilcke <jeffrey@ethereum.org>2016-02-17 20:46:30 +0800
commitaa36a6ae4f24f07e2c470a21c93ff37ad5861982 (patch)
treedba654e20554d28383c1f3bb8164fa9f5849d1bd /Godeps/_workspace/src/github.com/pborman/uuid
parent4f28c5b69d652e12adf8a88f526f459a492e159e (diff)
parent6ba7bbbe29029c8bf2bf75f8ebcbd3847eafa401 (diff)
downloadgo-tangerine-aa36a6ae4f24f07e2c470a21c93ff37ad5861982.tar
go-tangerine-aa36a6ae4f24f07e2c470a21c93ff37ad5861982.tar.gz
go-tangerine-aa36a6ae4f24f07e2c470a21c93ff37ad5861982.tar.bz2
go-tangerine-aa36a6ae4f24f07e2c470a21c93ff37ad5861982.tar.lz
go-tangerine-aa36a6ae4f24f07e2c470a21c93ff37ad5861982.tar.xz
go-tangerine-aa36a6ae4f24f07e2c470a21c93ff37ad5861982.tar.zst
go-tangerine-aa36a6ae4f24f07e2c470a21c93ff37ad5861982.zip
Merge pull request #2206 from fjl/update-deps
Godeps: update all dependencies
Diffstat (limited to 'Godeps/_workspace/src/github.com/pborman/uuid')
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/.travis.yml10
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/README.md13
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/hash.go2
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/json.go12
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/json_test.go32
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/node.go20
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go66
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/sql.go36
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go53
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/time.go14
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/util.go2
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/uuid.go39
-rw-r--r--Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go390
13 files changed, 115 insertions, 574 deletions
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/.travis.yml b/Godeps/_workspace/src/github.com/pborman/uuid/.travis.yml
new file mode 100644
index 000000000..a6a98db8a
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/.travis.yml
@@ -0,0 +1,10 @@
+language: go
+
+go:
+ - 1.4.3
+ - 1.5.3
+ - release
+ - tip
+
+script:
+ - go test -v ./...
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/README.md b/Godeps/_workspace/src/github.com/pborman/uuid/README.md
new file mode 100644
index 000000000..f023d47ca
--- /dev/null
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/README.md
@@ -0,0 +1,13 @@
+This project was automatically exported from code.google.com/p/go-uuid
+
+# uuid ![build status](https://travis-ci.org/pborman/uuid.svg?branch=master)
+The uuid package generates and inspects UUIDs based on [RFC 412](http://tools.ietf.org/html/rfc4122) and DCE 1.1: Authentication and Security Services.
+
+###### Install
+`go get github.com/pborman/uuid`
+
+###### Documentation
+[![GoDoc](https://godoc.org/github.com/pborman/uuid?status.svg)](http://godoc.org/github.com/pborman/uuid)
+
+Full `go doc` style documentation for the package can be viewed online without installing this package by using the GoDoc site here:
+http://godoc.org/github.com/pborman/uuid
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/hash.go b/Godeps/_workspace/src/github.com/pborman/uuid/hash.go
index cdd4192fd..a0420c1ef 100644
--- a/Godeps/_workspace/src/github.com/pborman/uuid/hash.go
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/hash.go
@@ -19,7 +19,7 @@ var (
NIL = Parse("00000000-0000-0000-0000-000000000000")
)
-// NewHash returns a new UUID dervied from the hash of space concatenated with
+// NewHash returns a new UUID derived from the hash of space concatenated with
// data generated by h. The hash should be at least 16 byte in length. The
// first 16 bytes of the hash are used to form the UUID. The version of the
// UUID will be the lower 4 bits of version. NewHash is used to implement
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/json.go b/Godeps/_workspace/src/github.com/pborman/uuid/json.go
index 760580a50..9dda1dfba 100644
--- a/Godeps/_workspace/src/github.com/pborman/uuid/json.go
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/json.go
@@ -7,17 +7,21 @@ package uuid
import "errors"
func (u UUID) MarshalJSON() ([]byte, error) {
- if len(u) == 0 {
+ if len(u) != 16 {
return []byte(`""`), nil
}
- return []byte(`"` + u.String() + `"`), nil
+ var js [38]byte
+ js[0] = '"'
+ encodeHex(js[1:], u)
+ js[37] = '"'
+ return js[:], nil
}
func (u *UUID) UnmarshalJSON(data []byte) error {
- if len(data) == 0 || string(data) == `""` {
+ if string(data) == `""` {
return nil
}
- if len(data) < 2 || data[0] != '"' || data[len(data)-1] != '"' {
+ if data[0] != '"' {
return errors.New("invalid UUID format")
}
data = data[1 : len(data)-1]
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go
deleted file mode 100644
index b5eae0924..000000000
--- a/Godeps/_workspace/src/github.com/pborman/uuid/json_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
- "encoding/json"
- "reflect"
- "testing"
-)
-
-var testUUID = Parse("f47ac10b-58cc-0372-8567-0e02b2c3d479")
-
-func TestJSON(t *testing.T) {
- type S struct {
- ID1 UUID
- ID2 UUID
- }
- s1 := S{ID1: testUUID}
- data, err := json.Marshal(&s1)
- if err != nil {
- t.Fatal(err)
- }
- var s2 S
- if err := json.Unmarshal(data, &s2); err != nil {
- t.Fatal(err)
- }
- if !reflect.DeepEqual(&s1, &s2) {
- t.Errorf("got %#v, want %#v", s2, s1)
- }
-}
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/node.go b/Godeps/_workspace/src/github.com/pborman/uuid/node.go
index dd0a8ac18..42d60da8f 100644
--- a/Godeps/_workspace/src/github.com/pborman/uuid/node.go
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/node.go
@@ -4,9 +4,13 @@
package uuid
-import "net"
+import (
+ "net"
+ "sync"
+)
var (
+ nodeMu sync.Mutex
interfaces []net.Interface // cached list of interfaces
ifname string // name of interface being used
nodeID []byte // hardware for version 1 UUIDs
@@ -16,6 +20,8 @@ var (
// derived. The interface "user" is returned if the NodeID was set by
// SetNodeID.
func NodeInterface() string {
+ defer nodeMu.Unlock()
+ nodeMu.Lock()
return ifname
}
@@ -26,6 +32,12 @@ func NodeInterface() string {
//
// SetNodeInterface never fails when name is "".
func SetNodeInterface(name string) bool {
+ defer nodeMu.Unlock()
+ nodeMu.Lock()
+ return setNodeInterface(name)
+}
+
+func setNodeInterface(name string) bool {
if interfaces == nil {
var err error
interfaces, err = net.Interfaces()
@@ -59,8 +71,10 @@ func SetNodeInterface(name string) bool {
// NodeID returns a slice of a copy of the current Node ID, setting the Node ID
// if not already set.
func NodeID() []byte {
+ defer nodeMu.Unlock()
+ nodeMu.Lock()
if nodeID == nil {
- SetNodeInterface("")
+ setNodeInterface("")
}
nid := make([]byte, 6)
copy(nid, nodeID)
@@ -71,6 +85,8 @@ func NodeID() []byte {
// of id are used. If id is less than 6 bytes then false is returned and the
// Node ID is not set.
func SetNodeID(id []byte) bool {
+ defer nodeMu.Unlock()
+ nodeMu.Lock()
if setNodeID(id) {
ifname = "user"
return true
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go
deleted file mode 100644
index 3b3d1430d..000000000
--- a/Godeps/_workspace/src/github.com/pborman/uuid/seq_test.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
- "flag"
- "runtime"
- "testing"
- "time"
-)
-
-// This test is only run when --regressions is passed on the go test line.
-var regressions = flag.Bool("regressions", false, "run uuid regression tests")
-
-// TestClockSeqRace tests for a particular race condition of returning two
-// identical Version1 UUIDs. The duration of 1 minute was chosen as the race
-// condition, before being fixed, nearly always occured in under 30 seconds.
-func TestClockSeqRace(t *testing.T) {
- if !*regressions {
- t.Skip("skipping regression tests")
- }
- duration := time.Minute
-
- done := make(chan struct{})
- defer close(done)
-
- ch := make(chan UUID, 10000)
- ncpu := runtime.NumCPU()
- switch ncpu {
- case 0, 1:
- // We can't run the test effectively.
- t.Skip("skipping race test, only one CPU detected")
- return
- default:
- runtime.GOMAXPROCS(ncpu)
- }
- for i := 0; i < ncpu; i++ {
- go func() {
- for {
- select {
- case <-done:
- return
- case ch <- NewUUID():
- }
- }
- }()
- }
-
- uuids := make(map[string]bool)
- cnt := 0
- start := time.Now()
- for u := range ch {
- s := u.String()
- if uuids[s] {
- t.Errorf("duplicate uuid after %d in %v: %s", cnt, time.Since(start), s)
- return
- }
- uuids[s] = true
- if time.Since(start) > duration {
- return
- }
- cnt++
- }
-}
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/sql.go b/Godeps/_workspace/src/github.com/pborman/uuid/sql.go
index 2d7679e2a..d015bfd13 100644
--- a/Godeps/_workspace/src/github.com/pborman/uuid/sql.go
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/sql.go
@@ -5,6 +5,7 @@
package uuid
import (
+ "database/sql/driver"
"errors"
"fmt"
)
@@ -15,6 +16,11 @@ import (
func (uuid *UUID) Scan(src interface{}) error {
switch src.(type) {
case string:
+ // if an empty UUID comes from a table, we return a null UUID
+ if src.(string) == "" {
+ return nil
+ }
+
// see uuid.Parse for required string format
parsed := Parse(src.(string))
@@ -24,17 +30,37 @@ func (uuid *UUID) Scan(src interface{}) error {
*uuid = parsed
case []byte:
- // assumes a simple slice of bytes, just check validity and store
- u := UUID(src.([]byte))
+ b := src.([]byte)
- if u.Variant() == Invalid {
- return errors.New("Scan: invalid UUID format")
+ // if an empty UUID comes from a table, we return a null UUID
+ if len(b) == 0 {
+ return nil
+ }
+
+ // assumes a simple slice of bytes if 16 bytes
+ // otherwise attempts to parse
+ if len(b) == 16 {
+ *uuid = UUID(b)
+ } else {
+ u := Parse(string(b))
+
+ if u == nil {
+ return errors.New("Scan: invalid UUID format")
+ }
+
+ *uuid = u
}
- *uuid = u
default:
return fmt.Errorf("Scan: unable to scan type %T into UUID", src)
}
return nil
}
+
+// Value implements sql.Valuer so that UUIDs can be written to databases
+// transparently. Currently, UUIDs map to strings. Please consult
+// database-specific driver documentation for matching types.
+func (uuid UUID) Value() (driver.Value, error) {
+ return uuid.String(), nil
+}
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go
deleted file mode 100644
index d643567ee..000000000
--- a/Godeps/_workspace/src/github.com/pborman/uuid/sql_test.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright 2015 Google Inc. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
- "strings"
- "testing"
-)
-
-func TestScan(t *testing.T) {
- var stringTest string = "f47ac10b-58cc-0372-8567-0e02b2c3d479"
- var byteTest []byte = Parse(stringTest)
- var badTypeTest int = 6
- var invalidTest string = "f47ac10b-58cc-0372-8567-0e02b2c3d4"
- var invalidByteTest []byte = Parse(invalidTest)
-
- var uuid UUID
- err := (&uuid).Scan(stringTest)
- if err != nil {
- t.Fatal(err)
- }
-
- err = (&uuid).Scan(byteTest)
- if err != nil {
- t.Fatal(err)
- }
-
- err = (&uuid).Scan(badTypeTest)
- if err == nil {
- t.Error("int correctly parsed and shouldn't have")
- }
- if !strings.Contains(err.Error(), "unable to scan type") {
- t.Error("attempting to parse an int returned an incorrect error message")
- }
-
- err = (&uuid).Scan(invalidTest)
- if err == nil {
- t.Error("invalid uuid was parsed without error")
- }
- if !strings.Contains(err.Error(), "invalid UUID") {
- t.Error("attempting to parse an invalid UUID returned an incorrect error message")
- }
-
- err = (&uuid).Scan(invalidByteTest)
- if err == nil {
- t.Error("invalid byte uuid was parsed without error")
- }
- if !strings.Contains(err.Error(), "invalid UUID") {
- t.Error("attempting to parse an invalid byte UUID returned an incorrect error message")
- }
-}
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/time.go b/Godeps/_workspace/src/github.com/pborman/uuid/time.go
index 7ebc9bef1..eedf24219 100644
--- a/Godeps/_workspace/src/github.com/pborman/uuid/time.go
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/time.go
@@ -23,7 +23,7 @@ const (
)
var (
- mu sync.Mutex
+ timeMu sync.Mutex
lasttime uint64 // last time we returned
clock_seq uint16 // clock sequence for this run
@@ -43,8 +43,8 @@ func (t Time) UnixTime() (sec, nsec int64) {
// clock sequence as well as adjusting the clock sequence as needed. An error
// is returned if the current time cannot be determined.
func GetTime() (Time, uint16, error) {
- defer mu.Unlock()
- mu.Lock()
+ defer timeMu.Unlock()
+ timeMu.Lock()
return getTime()
}
@@ -75,8 +75,8 @@ func getTime() (Time, uint16, error) {
// ClockSequence, GetTime, or NewUUID. (section 4.2.1.1) sequence is generated
// for
func ClockSequence() int {
- defer mu.Unlock()
- mu.Lock()
+ defer timeMu.Unlock()
+ timeMu.Lock()
return clockSequence()
}
@@ -90,8 +90,8 @@ func clockSequence() int {
// SetClockSeq sets the clock sequence to the lower 14 bits of seq. Setting to
// -1 causes a new sequence to be generated.
func SetClockSequence(seq int) {
- defer mu.Unlock()
- mu.Lock()
+ defer timeMu.Unlock()
+ timeMu.Lock()
setClockSequence(seq)
}
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/util.go b/Godeps/_workspace/src/github.com/pborman/uuid/util.go
index de40b102c..fc8e052c7 100644
--- a/Godeps/_workspace/src/github.com/pborman/uuid/util.go
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/util.go
@@ -16,7 +16,7 @@ func randomBits(b []byte) {
}
// xvalues returns the value of a byte as a hexadecimal digit or 255.
-var xvalues = []byte{
+var xvalues = [256]byte{
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/uuid.go b/Godeps/_workspace/src/github.com/pborman/uuid/uuid.go
index 2920fae63..c4482cd87 100644
--- a/Godeps/_workspace/src/github.com/pborman/uuid/uuid.go
+++ b/Godeps/_workspace/src/github.com/pborman/uuid/uuid.go
@@ -7,6 +7,7 @@ package uuid
import (
"bytes"
"crypto/rand"
+ "encoding/hex"
"fmt"
"io"
"strings"
@@ -54,8 +55,8 @@ func Parse(s string) UUID {
if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' {
return nil
}
- uuid := make([]byte, 16)
- for i, x := range []int{
+ var uuid [16]byte
+ for i, x := range [16]int{
0, 2, 4, 6,
9, 11,
14, 16,
@@ -67,7 +68,7 @@ func Parse(s string) UUID {
uuid[i] = v
}
}
- return uuid
+ return uuid[:]
}
// Equal returns true if uuid1 and uuid2 are equal.
@@ -78,23 +79,36 @@ func Equal(uuid1, uuid2 UUID) bool {
// String returns the string form of uuid, xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
// , or "" if uuid is invalid.
func (uuid UUID) String() string {
- if uuid == nil || len(uuid) != 16 {
+ if len(uuid) != 16 {
return ""
}
- b := []byte(uuid)
- return fmt.Sprintf("%08x-%04x-%04x-%04x-%012x",
- b[:4], b[4:6], b[6:8], b[8:10], b[10:])
+ var buf [36]byte
+ encodeHex(buf[:], uuid)
+ return string(buf[:])
}
// URN returns the RFC 2141 URN form of uuid,
// urn:uuid:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx, or "" if uuid is invalid.
func (uuid UUID) URN() string {
- if uuid == nil || len(uuid) != 16 {
+ if len(uuid) != 16 {
return ""
}
- b := []byte(uuid)
- return fmt.Sprintf("urn:uuid:%08x-%04x-%04x-%04x-%012x",
- b[:4], b[4:6], b[6:8], b[8:10], b[10:])
+ var buf [36 + 9]byte
+ copy(buf[:], "urn:uuid:")
+ encodeHex(buf[9:], uuid)
+ return string(buf[:])
+}
+
+func encodeHex(dst []byte, uuid UUID) {
+ hex.Encode(dst[:], uuid[:4])
+ dst[8] = '-'
+ hex.Encode(dst[9:13], uuid[4:6])
+ dst[13] = '-'
+ hex.Encode(dst[14:18], uuid[6:8])
+ dst[18] = '-'
+ hex.Encode(dst[19:23], uuid[8:10])
+ dst[23] = '-'
+ hex.Encode(dst[24:], uuid[10:])
}
// Variant returns the variant encoded in uuid. It returns Invalid if
@@ -113,10 +127,9 @@ func (uuid UUID) Variant() Variant {
default:
return Reserved
}
- panic("unreachable")
}
-// Version returns the verison of uuid. It returns false if uuid is not
+// Version returns the version of uuid. It returns false if uuid is not
// valid.
func (uuid UUID) Version() (Version, bool) {
if len(uuid) != 16 {
diff --git a/Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go b/Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go
deleted file mode 100644
index 417ebeb26..000000000
--- a/Godeps/_workspace/src/github.com/pborman/uuid/uuid_test.go
+++ /dev/null
@@ -1,390 +0,0 @@
-// Copyright 2011 Google Inc. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package uuid
-
-import (
- "bytes"
- "fmt"
- "os"
- "strings"
- "testing"
- "time"
-)
-
-type test struct {
- in string
- version Version
- variant Variant
- isuuid bool
-}
-
-var tests = []test{
- {"f47ac10b-58cc-0372-8567-0e02b2c3d479", 0, RFC4122, true},
- {"f47ac10b-58cc-1372-8567-0e02b2c3d479", 1, RFC4122, true},
- {"f47ac10b-58cc-2372-8567-0e02b2c3d479", 2, RFC4122, true},
- {"f47ac10b-58cc-3372-8567-0e02b2c3d479", 3, RFC4122, true},
- {"f47ac10b-58cc-4372-8567-0e02b2c3d479", 4, RFC4122, true},
- {"f47ac10b-58cc-5372-8567-0e02b2c3d479", 5, RFC4122, true},
- {"f47ac10b-58cc-6372-8567-0e02b2c3d479", 6, RFC4122, true},
- {"f47ac10b-58cc-7372-8567-0e02b2c3d479", 7, RFC4122, true},
- {"f47ac10b-58cc-8372-8567-0e02b2c3d479", 8, RFC4122, true},
- {"f47ac10b-58cc-9372-8567-0e02b2c3d479", 9, RFC4122, true},
- {"f47ac10b-58cc-a372-8567-0e02b2c3d479", 10, RFC4122, true},
- {"f47ac10b-58cc-b372-8567-0e02b2c3d479", 11, RFC4122, true},
- {"f47ac10b-58cc-c372-8567-0e02b2c3d479", 12, RFC4122, true},
- {"f47ac10b-58cc-d372-8567-0e02b2c3d479", 13, RFC4122, true},
- {"f47ac10b-58cc-e372-8567-0e02b2c3d479", 14, RFC4122, true},
- {"f47ac10b-58cc-f372-8567-0e02b2c3d479", 15, RFC4122, true},
-
- {"urn:uuid:f47ac10b-58cc-4372-0567-0e02b2c3d479", 4, Reserved, true},
- {"URN:UUID:f47ac10b-58cc-4372-0567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-0567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-1567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-2567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-3567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-4567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-5567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-6567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-7567-0e02b2c3d479", 4, Reserved, true},
- {"f47ac10b-58cc-4372-8567-0e02b2c3d479", 4, RFC4122, true},
- {"f47ac10b-58cc-4372-9567-0e02b2c3d479", 4, RFC4122, true},
- {"f47ac10b-58cc-4372-a567-0e02b2c3d479", 4, RFC4122, true},
- {"f47ac10b-58cc-4372-b567-0e02b2c3d479", 4, RFC4122, true},
- {"f47ac10b-58cc-4372-c567-0e02b2c3d479", 4, Microsoft, true},
- {"f47ac10b-58cc-4372-d567-0e02b2c3d479", 4, Microsoft, true},
- {"f47ac10b-58cc-4372-e567-0e02b2c3d479", 4, Future, true},
- {"f47ac10b-58cc-4372-f567-0e02b2c3d479", 4, Future, true},
-
- {"f47ac10b158cc-5372-a567-0e02b2c3d479", 0, Invalid, false},
- {"f47ac10b-58cc25372-a567-0e02b2c3d479", 0, Invalid, false},
- {"f47ac10b-58cc-53723a567-0e02b2c3d479", 0, Invalid, false},
- {"f47ac10b-58cc-5372-a56740e02b2c3d479", 0, Invalid, false},
- {"f47ac10b-58cc-5372-a567-0e02-2c3d479", 0, Invalid, false},
- {"g47ac10b-58cc-4372-a567-0e02b2c3d479", 0, Invalid, false},
-}
-
-var constants = []struct {
- c interface{}
- name string
-}{
- {Person, "Person"},
- {Group, "Group"},
- {Org, "Org"},
- {Invalid, "Invalid"},
- {RFC4122, "RFC4122"},
- {Reserved, "Reserved"},
- {Microsoft, "Microsoft"},
- {Future, "Future"},
- {Domain(17), "Domain17"},
- {Variant(42), "BadVariant42"},
-}
-
-func testTest(t *testing.T, in string, tt test) {
- uuid := Parse(in)
- if ok := (uuid != nil); ok != tt.isuuid {
- t.Errorf("Parse(%s) got %v expected %v\b", in, ok, tt.isuuid)
- }
- if uuid == nil {
- return
- }
-
- if v := uuid.Variant(); v != tt.variant {
- t.Errorf("Variant(%s) got %d expected %d\b", in, v, tt.variant)
- }
- if v, _ := uuid.Version(); v != tt.version {
- t.Errorf("Version(%s) got %d expected %d\b", in, v, tt.version)
- }
-}
-
-func TestUUID(t *testing.T) {
- for _, tt := range tests {
- testTest(t, tt.in, tt)
- testTest(t, strings.ToUpper(tt.in), tt)
- }
-}
-
-func TestConstants(t *testing.T) {
- for x, tt := range constants {
- v, ok := tt.c.(fmt.Stringer)
- if !ok {
- t.Errorf("%x: %v: not a stringer", x, v)
- } else if s := v.String(); s != tt.name {
- v, _ := tt.c.(int)
- t.Errorf("%x: Constant %T:%d gives %q, expected %q\n", x, tt.c, v, s, tt.name)
- }
- }
-}
-
-func TestRandomUUID(t *testing.T) {
- m := make(map[string]bool)
- for x := 1; x < 32; x++ {
- uuid := NewRandom()
- s := uuid.String()
- if m[s] {
- t.Errorf("NewRandom returned duplicated UUID %s\n", s)
- }
- m[s] = true
- if v, _ := uuid.Version(); v != 4 {
- t.Errorf("Random UUID of version %s\n", v)
- }
- if uuid.Variant() != RFC4122 {
- t.Errorf("Random UUID is variant %d\n", uuid.Variant())
- }
- }
-}
-
-func TestNew(t *testing.T) {
- m := make(map[string]bool)
- for x := 1; x < 32; x++ {
- s := New()
- if m[s] {
- t.Errorf("New returned duplicated UUID %s\n", s)
- }
- m[s] = true
- uuid := Parse(s)
- if uuid == nil {
- t.Errorf("New returned %q which does not decode\n", s)
- continue
- }
- if v, _ := uuid.Version(); v != 4 {
- t.Errorf("Random UUID of version %s\n", v)
- }
- if uuid.Variant() != RFC4122 {
- t.Errorf("Random UUID is variant %d\n", uuid.Variant())
- }
- }
-}
-
-func clockSeq(t *testing.T, uuid UUID) int {
- seq, ok := uuid.ClockSequence()
- if !ok {
- t.Fatalf("%s: invalid clock sequence\n", uuid)
- }
- return seq
-}
-
-func TestClockSeq(t *testing.T) {
- // Fake time.Now for this test to return a monotonically advancing time; restore it at end.
- defer func(orig func() time.Time) { timeNow = orig }(timeNow)
- monTime := time.Now()
- timeNow = func() time.Time {
- monTime = monTime.Add(1 * time.Second)
- return monTime
- }
-
- SetClockSequence(-1)
- uuid1 := NewUUID()
- uuid2 := NewUUID()
-
- if clockSeq(t, uuid1) != clockSeq(t, uuid2) {
- t.Errorf("clock sequence %d != %d\n", clockSeq(t, uuid1), clockSeq(t, uuid2))
- }
-
- SetClockSequence(-1)
- uuid2 = NewUUID()
-
- // Just on the very off chance we generated the same sequence
- // two times we try again.
- if clockSeq(t, uuid1) == clockSeq(t, uuid2) {
- SetClockSequence(-1)
- uuid2 = NewUUID()
- }
- if clockSeq(t, uuid1) == clockSeq(t, uuid2) {
- t.Errorf("Duplicate clock sequence %d\n", clockSeq(t, uuid1))
- }
-
- SetClockSequence(0x1234)
- uuid1 = NewUUID()
- if seq := clockSeq(t, uuid1); seq != 0x1234 {
- t.Errorf("%s: expected seq 0x1234 got 0x%04x\n", uuid1, seq)
- }
-}
-
-func TestCoding(t *testing.T) {
- text := "7d444840-9dc0-11d1-b245-5ffdce74fad2"
- urn := "urn:uuid:7d444840-9dc0-11d1-b245-5ffdce74fad2"
- data := UUID{
- 0x7d, 0x44, 0x48, 0x40,
- 0x9d, 0xc0,
- 0x11, 0xd1,
- 0xb2, 0x45,
- 0x5f, 0xfd, 0xce, 0x74, 0xfa, 0xd2,
- }
- if v := data.String(); v != text {
- t.Errorf("%x: encoded to %s, expected %s\n", data, v, text)
- }
- if v := data.URN(); v != urn {
- t.Errorf("%x: urn is %s, expected %s\n", data, v, urn)
- }
-
- uuid := Parse(text)
- if !Equal(uuid, data) {
- t.Errorf("%s: decoded to %s, expected %s\n", text, uuid, data)
- }
-}
-
-func TestVersion1(t *testing.T) {
- uuid1 := NewUUID()
- uuid2 := NewUUID()
-
- if Equal(uuid1, uuid2) {
- t.Errorf("%s:duplicate uuid\n", uuid1)
- }
- if v, _ := uuid1.Version(); v != 1 {
- t.Errorf("%s: version %s expected 1\n", uuid1, v)
- }
- if v, _ := uuid2.Version(); v != 1 {
- t.Errorf("%s: version %s expected 1\n", uuid2, v)
- }
- n1 := uuid1.NodeID()
- n2 := uuid2.NodeID()
- if !bytes.Equal(n1, n2) {
- t.Errorf("Different nodes %x != %x\n", n1, n2)
- }
- t1, ok := uuid1.Time()
- if !ok {
- t.Errorf("%s: invalid time\n", uuid1)
- }
- t2, ok := uuid2.Time()
- if !ok {
- t.Errorf("%s: invalid time\n", uuid2)
- }
- q1, ok := uuid1.ClockSequence()
- if !ok {
- t.Errorf("%s: invalid clock sequence\n", uuid1)
- }
- q2, ok := uuid2.ClockSequence()
- if !ok {
- t.Errorf("%s: invalid clock sequence", uuid2)
- }
-
- switch {
- case t1 == t2 && q1 == q2:
- t.Errorf("time stopped\n")
- case t1 > t2 && q1 == q2:
- t.Errorf("time reversed\n")
- case t1 < t2 && q1 != q2:
- t.Errorf("clock sequence chaned unexpectedly\n")
- }
-}
-
-func TestNodeAndTime(t *testing.T) {
- // Time is February 5, 1998 12:30:23.136364800 AM GMT
-
- uuid := Parse("7d444840-9dc0-11d1-b245-5ffdce74fad2")
- node := []byte{0x5f, 0xfd, 0xce, 0x74, 0xfa, 0xd2}
-
- ts, ok := uuid.Time()
- if ok {
- c := time.Unix(ts.UnixTime())
- want := time.Date(1998, 2, 5, 0, 30, 23, 136364800, time.UTC)
- if !c.Equal(want) {
- t.Errorf("Got time %v, want %v", c, want)
- }
- } else {
- t.Errorf("%s: bad time\n", uuid)
- }
- if !bytes.Equal(node, uuid.NodeID()) {
- t.Errorf("Expected node %v got %v\n", node, uuid.NodeID())
- }
-}
-
-func TestMD5(t *testing.T) {
- uuid := NewMD5(NameSpace_DNS, []byte("python.org")).String()
- want := "6fa459ea-ee8a-3ca4-894e-db77e160355e"
- if uuid != want {
- t.Errorf("MD5: got %q expected %q\n", uuid, want)
- }
-}
-
-func TestSHA1(t *testing.T) {
- uuid := NewSHA1(NameSpace_DNS, []byte("python.org")).String()
- want := "886313e1-3b8a-5372-9b90-0c9aee199e5d"
- if uuid != want {
- t.Errorf("SHA1: got %q expected %q\n", uuid, want)
- }
-}
-
-func TestNodeID(t *testing.T) {
- nid := []byte{1, 2, 3, 4, 5, 6}
- SetNodeInterface("")
- s := NodeInterface()
- if s == "" || s == "user" {
- t.Errorf("NodeInterface %q after SetInteface\n", s)
- }
- node1 := NodeID()
- if node1 == nil {
- t.Errorf("NodeID nil after SetNodeInterface\n", s)
- }
- SetNodeID(nid)
- s = NodeInterface()
- if s != "user" {
- t.Errorf("Expected NodeInterface %q got %q\n", "user", s)
- }
- node2 := NodeID()
- if node2 == nil {
- t.Errorf("NodeID nil after SetNodeID\n", s)
- }
- if bytes.Equal(node1, node2) {
- t.Errorf("NodeID not changed after SetNodeID\n", s)
- } else if !bytes.Equal(nid, node2) {
- t.Errorf("NodeID is %x, expected %x\n", node2, nid)
- }
-}
-
-func testDCE(t *testing.T, name string, uuid UUID, domain Domain, id uint32) {
- if uuid == nil {
- t.Errorf("%s failed\n", name)
- return
- }
- if v, _ := uuid.Version(); v != 2 {
- t.Errorf("%s: %s: expected version 2, got %s\n", name, uuid, v)
- return
- }
- if v, ok := uuid.Domain(); !ok || v != domain {
- if !ok {
- t.Errorf("%s: %d: Domain failed\n", name, uuid)
- } else {
- t.Errorf("%s: %s: expected domain %d, got %d\n", name, uuid, domain, v)
- }
- }
- if v, ok := uuid.Id(); !ok || v != id {
- if !ok {
- t.Errorf("%s: %d: Id failed\n", name, uuid)
- } else {
- t.Errorf("%s: %s: expected id %d, got %d\n", name, uuid, id, v)
- }
- }
-}
-
-func TestDCE(t *testing.T) {
- testDCE(t, "NewDCESecurity", NewDCESecurity(42, 12345678), 42, 12345678)
- testDCE(t, "NewDCEPerson", NewDCEPerson(), Person, uint32(os.Getuid()))
- testDCE(t, "NewDCEGroup", NewDCEGroup(), Group, uint32(os.Getgid()))
-}
-
-type badRand struct{}
-
-func (r badRand) Read(buf []byte) (int, error) {
- for i, _ := range buf {
- buf[i] = byte(i)
- }
- return len(buf), nil
-}
-
-func TestBadRand(t *testing.T) {
- SetRand(badRand{})
- uuid1 := New()
- uuid2 := New()
- if uuid1 != uuid2 {
- t.Errorf("execpted duplicates, got %q and %q\n", uuid1, uuid2)
- }
- SetRand(nil)
- uuid1 = New()
- uuid2 = New()
- if uuid1 == uuid2 {
- t.Errorf("unexecpted duplicates, got %q\n", uuid1)
- }
-}