github.com/crowdsecurity/crowdsec@v1.6.1/pkg/csplugin/broker_suite_test.go (about) 1 package csplugin 2 3 import ( 4 "io" 5 "os" 6 "os/exec" 7 "path/filepath" 8 "runtime" 9 "testing" 10 11 "github.com/stretchr/testify/require" 12 "github.com/stretchr/testify/suite" 13 14 "github.com/crowdsecurity/crowdsec/pkg/csconfig" 15 ) 16 17 type PluginSuite struct { 18 suite.Suite 19 20 // where the plugin is built - temporary directory for the suite 21 buildDir string 22 // full path to the built plugin binary 23 builtBinary string 24 25 runDir string // temporary directory for each test 26 pluginDir string // (config_paths.plugin_dir) 27 notifDir string // (config_paths.notification_dir) 28 pluginBinary string // full path to the plugin binary (unique for each test) 29 pluginConfig string // full path to the notification config (unique for each test) 30 31 pluginBroker *PluginBroker 32 } 33 34 func TestPluginSuite(t *testing.T) { 35 suite.Run(t, new(PluginSuite)) 36 } 37 38 func (s *PluginSuite) SetupSuite() { 39 var err error 40 41 t := s.T() 42 43 s.buildDir, err = os.MkdirTemp("", "cs_plugin_test_build") 44 require.NoError(t, err) 45 46 s.builtBinary = filepath.Join(s.buildDir, "notification-dummy") 47 48 if runtime.GOOS == "windows" { 49 s.builtBinary += ".exe" 50 } 51 52 cmd := exec.Command("go", "build", "-o", s.builtBinary, "../../cmd/notification-dummy/") 53 err = cmd.Run() 54 require.NoError(t, err, "while building dummy plugin") 55 } 56 57 func (s *PluginSuite) TearDownSuite() { 58 t := s.T() 59 err := os.RemoveAll(s.buildDir) 60 require.NoError(t, err) 61 } 62 63 func copyFile(src string, dst string) error { 64 s, err := os.Open(src) 65 if err != nil { 66 return err 67 } 68 defer s.Close() 69 70 d, err := os.Create(dst) 71 if err != nil { 72 return err 73 } 74 defer d.Close() 75 76 _, err = io.Copy(d, s) 77 if err != nil { 78 return err 79 } 80 81 err = d.Sync() 82 if err != nil { 83 return err 84 } 85 86 return nil 87 } 88 89 func (s *PluginSuite) SetupTest() { 90 s.SetupSubTest() 91 } 92 93 func (s *PluginSuite) TearDownTest() { 94 s.TearDownSubTest() 95 } 96 97 func (s *PluginSuite) SetupSubTest() { 98 var err error 99 t := s.T() 100 101 s.runDir, err = os.MkdirTemp("", "cs_plugin_test") 102 require.NoError(t, err) 103 104 s.pluginDir = filepath.Join(s.runDir, "bin") 105 err = os.MkdirAll(filepath.Join(s.runDir, "bin"), 0o755) 106 require.NoError(t, err, "while creating bin dir") 107 108 s.notifDir = filepath.Join(s.runDir, "config") 109 err = os.MkdirAll(s.notifDir, 0o755) 110 require.NoError(t, err, "while creating config dir") 111 112 s.pluginBinary = filepath.Join(s.pluginDir, "notification-dummy") 113 114 if runtime.GOOS == "windows" { 115 s.pluginBinary += ".exe" 116 } 117 118 err = copyFile(s.builtBinary, s.pluginBinary) 119 require.NoError(t, err, "while copying built binary") 120 err = os.Chmod(s.pluginBinary, 0o744) 121 require.NoError(t, err, "chmod 0744 %s", s.pluginBinary) 122 123 s.pluginConfig = filepath.Join(s.notifDir, "dummy.yaml") 124 err = copyFile("testdata/dummy.yaml", s.pluginConfig) 125 require.NoError(t, err, "while copying plugin config") 126 } 127 128 func (s *PluginSuite) TearDownSubTest() { 129 t := s.T() 130 if s.pluginBroker != nil { 131 s.pluginBroker.Kill() 132 s.pluginBroker = nil 133 } 134 135 err := os.RemoveAll(s.runDir) 136 if runtime.GOOS != "windows" { 137 require.NoError(t, err) 138 } 139 140 os.Remove("./out") 141 } 142 143 func (s *PluginSuite) InitBroker(procCfg *csconfig.PluginCfg) (*PluginBroker, error) { 144 pb := PluginBroker{} 145 if procCfg == nil { 146 procCfg = &csconfig.PluginCfg{} 147 } 148 profiles := csconfig.NewDefaultConfig().API.Server.Profiles 149 profiles = append(profiles, &csconfig.ProfileCfg{ 150 Notifications: []string{"dummy_default"}, 151 }) 152 err := pb.Init(procCfg, profiles, &csconfig.ConfigurationPaths{ 153 PluginDir: s.pluginDir, 154 NotificationDir: s.notifDir, 155 }) 156 s.pluginBroker = &pb 157 return s.pluginBroker, err 158 }