@@ -24,6 +24,8 @@ package uuid
2424import (
2525 "bytes"
2626 "crypto/rand"
27+ "encoding/binary"
28+ "errors"
2729 "fmt"
2830 "net"
2931 "strings"
@@ -582,6 +584,161 @@ func makeTestNewV7KSortable() func(t *testing.T) {
582584 }
583585}
584586
587+ func testNewV7ClockSequence (t * testing.T ) {
588+ if testing .Short () {
589+ t .Skip ("skipping test in short mode." )
590+ }
591+
592+ g := NewGen ()
593+
594+ // hack to try and reduce race conditions based on when the test starts
595+ nsec := time .Now ().Nanosecond ()
596+ sleepDur := int (time .Second ) - nsec
597+ time .Sleep (time .Duration (sleepDur ))
598+
599+ u1 , err := g .NewV7 ()
600+ if err != nil {
601+ t .Fatalf ("failed to generate V7 UUID #1: %v" , err )
602+ }
603+
604+ u2 , err := g .NewV7 ()
605+ if err != nil {
606+ t .Fatalf ("failed to generate V7 UUID #2: %v" , err )
607+ }
608+
609+ time .Sleep (time .Millisecond )
610+
611+ u3 , err := g .NewV7 ()
612+ if err != nil {
613+ t .Fatalf ("failed to generate V7 UUID #3: %v" , err )
614+ }
615+
616+ time .Sleep (time .Second )
617+
618+ u4 , err := g .NewV7 ()
619+ if err != nil {
620+ t .Fatalf ("failed to generate V7 UUID #3: %v" , err )
621+ }
622+
623+ s1 := binary .BigEndian .Uint16 (u1 [6 :8 ]) & 0xfff
624+ s2 := binary .BigEndian .Uint16 (u2 [6 :8 ]) & 0xfff
625+ s3 := binary .BigEndian .Uint16 (u3 [6 :8 ]) & 0xfff
626+ s4 := binary .BigEndian .Uint16 (u4 [6 :8 ]) & 0xfff
627+
628+ if s1 != 0 {
629+ t .Errorf ("sequence 1 should be zero, was %d" , s1 )
630+ }
631+
632+ if s2 != s1 + 1 {
633+ t .Errorf ("sequence 2 expected to be one above sequence 1; seq 1: %d, seq 2: %d" , s1 , s2 )
634+ }
635+
636+ if s3 != 0 {
637+ t .Errorf ("sequence 3 should be zero, was %d" , s3 )
638+ }
639+
640+ if s4 != 0 {
641+ t .Errorf ("sequence 4 should be zero, was %d" , s4 )
642+ }
643+ }
644+
645+ func TestDefaultHWAddrFunc (t * testing.T ) {
646+ tests := []struct {
647+ n string
648+ fn func () ([]net.Interface , error )
649+ hw net.HardwareAddr
650+ e string
651+ }{
652+ {
653+ n : "Error" ,
654+ fn : func () ([]net.Interface , error ) {
655+ return nil , errors .New ("controlled failure" )
656+ },
657+ e : "controlled failure" ,
658+ },
659+ {
660+ n : "NoValidHWAddrReturned" ,
661+ fn : func () ([]net.Interface , error ) {
662+ s := []net.Interface {
663+ {
664+ Index : 1 ,
665+ MTU : 1500 ,
666+ Name : "test0" ,
667+ HardwareAddr : net.HardwareAddr {1 , 2 , 3 , 4 },
668+ },
669+ {
670+ Index : 2 ,
671+ MTU : 1500 ,
672+ Name : "lo0" ,
673+ HardwareAddr : net.HardwareAddr {5 , 6 , 7 , 8 },
674+ },
675+ }
676+
677+ return s , nil
678+ },
679+ e : "uuid: no HW address found" ,
680+ },
681+ {
682+ n : "ValidHWAddrReturned" ,
683+ fn : func () ([]net.Interface , error ) {
684+ s := []net.Interface {
685+ {
686+ Index : 1 ,
687+ MTU : 1500 ,
688+ Name : "test0" ,
689+ HardwareAddr : net.HardwareAddr {1 , 2 , 3 , 4 },
690+ },
691+ {
692+ Index : 2 ,
693+ MTU : 1500 ,
694+ Name : "lo0" ,
695+ HardwareAddr : net.HardwareAddr {5 , 6 , 7 , 8 , 9 , 0 },
696+ },
697+ }
698+
699+ return s , nil
700+ },
701+ hw : net.HardwareAddr {5 , 6 , 7 , 8 , 9 , 0 },
702+ },
703+ }
704+
705+ for _ , tt := range tests {
706+ t .Run (tt .n , func (t * testing.T ) {
707+ // set the netInterfaces variable (function) for the test
708+ // and then set it back to default in the deferred function
709+ netInterfaces = tt .fn
710+ defer func () {
711+ netInterfaces = net .Interfaces
712+ }()
713+
714+ var hw net.HardwareAddr
715+ var err error
716+
717+ hw , err = defaultHWAddrFunc ()
718+
719+ if len (tt .e ) > 0 {
720+ if err == nil {
721+ t .Fatalf ("defaultHWAddrFunc() error = <nil>, should contain %q" , tt .e )
722+ }
723+
724+ if ! strings .Contains (err .Error (), tt .e ) {
725+ t .Fatalf ("defaultHWAddrFunc() error = %q, should contain %q" , err .Error (), tt .e )
726+ }
727+
728+ return
729+ }
730+
731+ if err != nil && tt .e == "" {
732+ t .Fatalf ("defaultHWAddrFunc() error = %q, want <nil>" , err .Error ())
733+ }
734+
735+ if ! bytes .Equal (hw , tt .hw ) {
736+ t .Fatalf ("hw = %#v, want %#v" , hw , tt .hw )
737+ }
738+ })
739+ }
740+ }
741+
585742func BenchmarkGenerator (b * testing.B ) {
586743 b .Run ("NewV1" , func (b * testing.B ) {
587744 for i := 0 ; i < b .N ; i ++ {
0 commit comments