github.com/vnforks/kid@v5.11.1+incompatible/plugin/supervisor_test.go (about)

     1  // Copyright (c) 2017-present Mattermost, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package plugin
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"os/exec"
    10  	"path/filepath"
    11  	"testing"
    12  
    13  	"github.com/mattermost/mattermost-server/mlog"
    14  	"github.com/mattermost/mattermost-server/model"
    15  	"github.com/stretchr/testify/assert"
    16  	"github.com/stretchr/testify/require"
    17  )
    18  
    19  func TestSupervisor(t *testing.T) {
    20  	for name, f := range map[string]func(*testing.T){
    21  		"Supervisor_InvalidExecutablePath":     testSupervisor_InvalidExecutablePath,
    22  		"Supervisor_NonExistentExecutablePath": testSupervisor_NonExistentExecutablePath,
    23  		"Supervisor_StartTimeout":              testSupervisor_StartTimeout,
    24  	} {
    25  		t.Run(name, f)
    26  	}
    27  }
    28  
    29  func compileGo(t *testing.T, sourceCode, outputPath string) {
    30  	dir, err := ioutil.TempDir(".", "")
    31  	require.NoError(t, err)
    32  	defer os.RemoveAll(dir)
    33  	require.NoError(t, ioutil.WriteFile(filepath.Join(dir, "main.go"), []byte(sourceCode), 0600))
    34  	cmd := exec.Command("go", "build", "-o", outputPath, "main.go")
    35  	cmd.Dir = dir
    36  	cmd.Stdout = os.Stdout
    37  	cmd.Stderr = os.Stderr
    38  	require.NoError(t, cmd.Run())
    39  }
    40  
    41  func testSupervisor_InvalidExecutablePath(t *testing.T) {
    42  	dir, err := ioutil.TempDir("", "")
    43  	require.NoError(t, err)
    44  	defer os.RemoveAll(dir)
    45  
    46  	ioutil.WriteFile(filepath.Join(dir, "plugin.json"), []byte(`{"id": "foo", "backend": {"executable": "/foo/../../backend.exe"}}`), 0600)
    47  
    48  	bundle := model.BundleInfoForPath(dir)
    49  	log := mlog.NewLogger(&mlog.LoggerConfiguration{
    50  		EnableConsole: true,
    51  		ConsoleJson:   true,
    52  		ConsoleLevel:  "error",
    53  		EnableFile:    false,
    54  	})
    55  	supervisor, err := newSupervisor(bundle, log, nil)
    56  	assert.Nil(t, supervisor)
    57  	assert.Error(t, err)
    58  }
    59  
    60  func testSupervisor_NonExistentExecutablePath(t *testing.T) {
    61  	dir, err := ioutil.TempDir("", "")
    62  	require.NoError(t, err)
    63  	defer os.RemoveAll(dir)
    64  
    65  	ioutil.WriteFile(filepath.Join(dir, "plugin.json"), []byte(`{"id": "foo", "backend": {"executable": "thisfileshouldnotexist"}}`), 0600)
    66  
    67  	bundle := model.BundleInfoForPath(dir)
    68  	log := mlog.NewLogger(&mlog.LoggerConfiguration{
    69  		EnableConsole: true,
    70  		ConsoleJson:   true,
    71  		ConsoleLevel:  "error",
    72  		EnableFile:    false,
    73  	})
    74  	supervisor, err := newSupervisor(bundle, log, nil)
    75  	require.Error(t, err)
    76  	require.Nil(t, supervisor)
    77  }
    78  
    79  // If plugin development goes really wrong, let's make sure plugin activation won't block forever.
    80  func testSupervisor_StartTimeout(t *testing.T) {
    81  	dir, err := ioutil.TempDir("", "")
    82  	require.NoError(t, err)
    83  	defer os.RemoveAll(dir)
    84  
    85  	backend := filepath.Join(dir, "backend.exe")
    86  	compileGo(t, `
    87  		package main
    88  
    89  		func main() {
    90  			for {
    91  			}
    92  		}
    93  	`, backend)
    94  
    95  	ioutil.WriteFile(filepath.Join(dir, "plugin.json"), []byte(`{"id": "foo", "backend": {"executable": "backend.exe"}}`), 0600)
    96  
    97  	bundle := model.BundleInfoForPath(dir)
    98  	log := mlog.NewLogger(&mlog.LoggerConfiguration{
    99  		EnableConsole: true,
   100  		ConsoleJson:   true,
   101  		ConsoleLevel:  "error",
   102  		EnableFile:    false,
   103  	})
   104  	supervisor, err := newSupervisor(bundle, log, nil)
   105  	require.Error(t, err)
   106  	require.Nil(t, supervisor)
   107  }