Skip to content

Commit e420387

Browse files
theckmancameracker
andauthored
Enhance defaultHWAddrFunc() and tests to hit 100% coverage (#57)
This updates `defaultHWAddrFunc` to use a package-level variable for calling `net.Interfaces()`, so that we can mock it in unit tests. Doing so, and writing the related test, allows us to hit 100% coverage. Signed-off-by: Tim Heckman <t@heckman.io> Signed-off-by: Tim Heckman <t@heckman.io> Co-authored-by: Cameron Ackerman <Cameron_Ackerman@selinc.com>
1 parent f267b3d commit e420387

File tree

2 files changed

+160
-1
lines changed

2 files changed

+160
-1
lines changed

generator.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -339,9 +339,11 @@ func newFromHash(h hash.Hash, ns UUID, name string) UUID {
339339
return u
340340
}
341341

342+
var netInterfaces = net.Interfaces
343+
342344
// Returns the hardware address.
343345
func defaultHWAddrFunc() (net.HardwareAddr, error) {
344-
ifaces, err := net.Interfaces()
346+
ifaces, err := netInterfaces()
345347
if err != nil {
346348
return []byte{}, err
347349
}

generator_test.go

Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,8 @@ package uuid
2424
import (
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+
585742
func BenchmarkGenerator(b *testing.B) {
586743
b.Run("NewV1", func(b *testing.B) {
587744
for i := 0; i < b.N; i++ {

0 commit comments

Comments
 (0)