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  }