github.com/Ilhicas/nomad@v1.0.4-0.20210304152020-e86851182bc3/client/fingerprint/bridge_linux_test.go (about) 1 package fingerprint 2 3 import ( 4 "fmt" 5 "io" 6 "io/ioutil" 7 "os" 8 "strings" 9 "testing" 10 11 "github.com/hashicorp/nomad/helper/testlog" 12 "github.com/stretchr/testify/require" 13 ) 14 15 func TestBridgeFingerprint_detect(t *testing.T) { 16 f := &BridgeFingerprint{logger: testlog.HCLogger(t)} 17 require.NoError(t, f.detect("ip_tables")) 18 19 err := f.detect("nonexistentmodule") 20 require.Error(t, err) 21 require.Contains(t, err.Error(), "3 errors occurred") 22 } 23 24 func writeFile(t *testing.T, prefix, content string) string { 25 f, err := ioutil.TempFile("", "bridge-fp-") 26 require.NoError(t, err) 27 28 _, err = io.Copy(f, strings.NewReader(content)) 29 require.NoError(t, err) 30 31 err = f.Close() 32 require.NoError(t, err) 33 34 return f.Name() 35 } 36 37 func cleanupFile(t *testing.T, name string) { 38 err := os.Remove(name) 39 require.NoError(t, err) 40 } 41 42 const ( 43 dynamicModuleContent = ` 44 ip_tables 32768 0 - Live 0xffffffffc03ee000 45 x_tables 40960 1 ip_tables, Live 0xffffffffc03e3000 46 autofs4 45056 2 - Live 0xffffffffc03d7000 47 bpfilter 32768 0 - Live 0x0000000000000000 48 br_netfilter 28672 0 - Live 0x0000000000000000 49 bridge 176128 1 br_netfilter, Live 0x0000000000000000 50 btrfs 1253376 0 - Live 0xffffffffc02a4000 51 ` 52 53 builtinModuleContent = ` 54 kernel/drivers/mfd/max14577.ko 55 kernel/drivers/mfd/max77693.ko 56 kernel/drivers/mfd/sec-core.ko 57 kernel/drivers/mfd/sec-irq.ko 58 kernel/drivers/net/bridge.ko 59 kernel/drivers/net/tun.ko 60 kernel/drivers/net/xen-netfront.k 61 ` 62 63 dependsModuleContent = ` 64 kernel/net/bridge/netfilter/ebt_log.ko: kernel/net/netfilter/x_tables.ko 65 kernel/net/bridge/netfilter/ebt_nflog.ko: kernel/net/netfilter/x_tables.ko 66 kernel/net/bridge/bridge.ko: kernel/net/802/stp.ko kernel/net/llc/llc.ko 67 kernel/net/bridge/br_netfilter.ko: kernel/net/bridge/bridge.ko kernel/net/802/stp.ko kernel/net/llc/llc.ko 68 kernel/net/appletalk/appletalk.ko: kernel/net/802/psnap.ko kernel/net/llc/llc.ko 69 kernel/net/x25/x25.ko: 70 # Dummy module to test RHEL modules.dep format 71 kernel/net/bridge/bridgeRHEL.ko.xz: kernel/net/802/stp.ko.xz kernel/net/llc/llc.ko.xz 72 ` 73 ) 74 75 func TestBridgeFingerprint_search(t *testing.T) { 76 f := &BridgeFingerprint{logger: testlog.HCLogger(t)} 77 78 t.Run("dynamic loaded module", func(t *testing.T) { 79 t.Run("present", func(t *testing.T) { 80 file := writeFile(t, "bridge-fp-", dynamicModuleContent) 81 defer cleanupFile(t, file) 82 83 err := f.searchFile("bridge", file, f.regexp(dynamicModuleRe, "bridge")) 84 require.NoError(t, err) 85 }) 86 87 t.Run("absent", func(t *testing.T) { 88 file := writeFile(t, "bridge-fp-", dynamicModuleContent) 89 defer cleanupFile(t, file) 90 91 err := f.searchFile("nonexistent", file, f.regexp(dynamicModuleRe, "nonexistent")) 92 require.EqualError(t, err, fmt.Sprintf("module nonexistent not in %s", file)) 93 }) 94 }) 95 96 t.Run("builtin module", func(t *testing.T) { 97 t.Run("present", func(t *testing.T) { 98 file := writeFile(t, "bridge-fp-", builtinModuleContent) 99 defer cleanupFile(t, file) 100 101 err := f.searchFile("bridge", file, f.regexp(builtinModuleRe, "bridge")) 102 require.NoError(t, err) 103 }) 104 105 t.Run("absent", func(t *testing.T) { 106 file := writeFile(t, "bridge-fp-", builtinModuleContent) 107 defer cleanupFile(t, file) 108 109 err := f.searchFile("nonexistent", file, f.regexp(builtinModuleRe, "nonexistent")) 110 require.EqualError(t, err, fmt.Sprintf("module nonexistent not in %s", file)) 111 }) 112 }) 113 114 t.Run("dynamic unloaded module", func(t *testing.T) { 115 t.Run("present", func(t *testing.T) { 116 file := writeFile(t, "bridge-fp-", dependsModuleContent) 117 defer cleanupFile(t, file) 118 119 err := f.searchFile("bridge", file, f.regexp(dependsModuleRe, "bridge")) 120 require.NoError(t, err) 121 122 err = f.searchFile("bridgeRHEL", file, f.regexp(dependsModuleRe, "bridgeRHEL")) 123 require.NoError(t, err) 124 }) 125 126 t.Run("absent", func(t *testing.T) { 127 file := writeFile(t, "bridge-fp-", dependsModuleContent) 128 defer cleanupFile(t, file) 129 130 err := f.searchFile("nonexistent", file, f.regexp(dependsModuleRe, "nonexistent")) 131 require.EqualError(t, err, fmt.Sprintf("module nonexistent not in %s", file)) 132 }) 133 }) 134 }