diff --git a/generator.go b/generator.go index 4257761..5c1dd98 100644 --- a/generator.go +++ b/generator.go @@ -284,9 +284,11 @@ func newFromHash(h hash.Hash, ns UUID, name string) UUID { return u } +var netInterfaces = net.Interfaces + // Returns the hardware address. func defaultHWAddrFunc() (net.HardwareAddr, error) { - ifaces, err := net.Interfaces() + ifaces, err := netInterfaces() if err != nil { return []byte{}, err } diff --git a/generator_test.go b/generator_test.go index 35b59b7..f1eeeea 100644 --- a/generator_test.go +++ b/generator_test.go @@ -24,8 +24,10 @@ package uuid import ( "bytes" "crypto/rand" + "errors" "fmt" "net" + "strings" "testing" "time" ) @@ -376,6 +378,103 @@ func testNewV5DifferentNamespaces(t *testing.T) { } } +func Test_defaultHWAddrFunc(t *testing.T) { + tests := []struct { + n string + fn func() ([]net.Interface, error) + hw net.HardwareAddr + e string + }{ + { + n: "error", + fn: func() ([]net.Interface, error) { + return nil, errors.New("controlled failure") + }, + e: "controlled failure", + }, + { + n: "no_valid_hwaddr_returned", + fn: func() ([]net.Interface, error) { + s := []net.Interface{ + { + Index: 1, + MTU: 1500, + Name: "test0", + HardwareAddr: net.HardwareAddr{1, 2, 3, 4}, + }, + { + Index: 2, + MTU: 1500, + Name: "lo0", + HardwareAddr: net.HardwareAddr{5, 6, 7, 8}, + }, + } + + return s, nil + }, + e: "uuid: no HW address found", + }, + { + n: "valid_hwaddr_returned", + fn: func() ([]net.Interface, error) { + s := []net.Interface{ + { + Index: 1, + MTU: 1500, + Name: "test0", + HardwareAddr: net.HardwareAddr{1, 2, 3, 4}, + }, + { + Index: 2, + MTU: 1500, + Name: "lo0", + HardwareAddr: net.HardwareAddr{5, 6, 7, 8, 9, 0}, + }, + } + + return s, nil + }, + hw: net.HardwareAddr{5, 6, 7, 8, 9, 0}, + }, + } + + for _, tt := range tests { + t.Run(tt.n, func(t *testing.T) { + // set the netInterfaces variable (function) for the test + // and then set it back to default in the deferred function + netInterfaces = tt.fn + defer func() { + netInterfaces = net.Interfaces + }() + + var hw net.HardwareAddr + var err error + + hw, err = defaultHWAddrFunc() + + if len(tt.e) > 0 { + if err == nil { + t.Fatalf("defaultHWAddrFunc() error = , should contain %q", tt.e) + } + + if !strings.Contains(err.Error(), tt.e) { + t.Fatalf("defaultHWAddrFunc() error = %q, should contain %q", err.Error(), tt.e) + } + + return + } + + if err != nil && tt.e == "" { + t.Fatalf("defaultHWAddrFunc() error = %q, want ", err.Error()) + } + + if !bytes.Equal(hw, tt.hw) { + t.Fatalf("hw = %#v, want %#v", hw, tt.hw) + } + }) + } +} + func BenchmarkGenerator(b *testing.B) { b.Run("NewV1", func(b *testing.B) { for i := 0; i < b.N; i++ {