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