broker_suite_test.go 3.5 KB

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