custom-script-extension-linux/main/cmds_test.go

154 строки
4.2 KiB
Go

package main
import (
"io/ioutil"
"net/http/httptest"
"os"
"path/filepath"
"testing"
"github.com/ahmetalpbalkan/go-httpbin"
"github.com/go-kit/kit/log"
"github.com/stretchr/testify/require"
)
func Test_commandsExist(t *testing.T) {
// we expect these subcommands to be handled
expect := []string{"install", "enable", "disable", "uninstall", "update"}
for _, c := range expect {
_, ok := cmds[c]
if !ok {
t.Fatalf("cmd '%s' is not handled", c)
}
}
}
func Test_commands_shouldReportStatus(t *testing.T) {
// - certain extension invocations are supposed to write 'N.status' files and some do not.
// these subcommands should NOT report status
require.False(t, cmds["install"].shouldReportStatus, "install should not report status")
require.False(t, cmds["uninstall"].shouldReportStatus, "uninstall should not report status")
// these subcommands SHOULD report status
require.True(t, cmds["enable"].shouldReportStatus, "enable should report status")
require.True(t, cmds["disable"].shouldReportStatus, "disable should report status")
require.True(t, cmds["update"].shouldReportStatus, "update should report status")
}
func Test_checkAndSaveSeqNum_fails(t *testing.T) {
// pass in invalid seqnum format
_, err := checkAndSaveSeqNum(log.NewNopLogger(), 0, "/non/existing/dir")
require.NotNil(t, err)
require.Contains(t, err.Error(), `failed to save sequence number`)
}
func Test_checkAndSaveSeqNum(t *testing.T) {
dir, err := ioutil.TempDir("", "")
require.Nil(t, err)
fp := filepath.Join(dir, "seqnum")
defer os.RemoveAll(dir)
nop := log.NewNopLogger()
// no sequence number, 0 comes in.
shouldExit, err := checkAndSaveSeqNum(nop, 0, fp)
require.Nil(t, err)
require.False(t, shouldExit)
// file=0, seq=0 comes in. (should exit)
shouldExit, err = checkAndSaveSeqNum(nop, 0, fp)
require.Nil(t, err)
require.True(t, shouldExit)
// file=0, seq=1 comes in.
shouldExit, err = checkAndSaveSeqNum(nop, 1, fp)
require.Nil(t, err)
require.False(t, shouldExit)
// file=1, seq=1 comes in. (should exit)
shouldExit, err = checkAndSaveSeqNum(nop, 1, fp)
require.Nil(t, err)
require.True(t, shouldExit)
// file=1, seq=0 comes in. (should exit)
shouldExit, err = checkAndSaveSeqNum(nop, 1, fp)
require.Nil(t, err)
require.True(t, shouldExit)
}
func Test_runCmd_success(t *testing.T) {
dir, err := ioutil.TempDir("", "")
require.Nil(t, err)
defer os.RemoveAll(dir)
require.Nil(t, runCmd(log.NewNopLogger(), dir, handlerSettings{
publicSettings: publicSettings{CommandToExecute: "date"},
}), "command should run successfully")
// check stdout stderr files
_, err = os.Stat(filepath.Join(dir, "stdout"))
require.Nil(t, err, "stdout should exist")
_, err = os.Stat(filepath.Join(dir, "stderr"))
require.Nil(t, err, "stderr should exist")
}
func Test_runCmd_fail(t *testing.T) {
dir, err := ioutil.TempDir("", "")
require.Nil(t, err)
defer os.RemoveAll(dir)
err = runCmd(log.NewNopLogger(), dir, handlerSettings{
publicSettings: publicSettings{CommandToExecute: "non-existing-cmd"},
})
require.NotNil(t, err, "command terminated with exit status")
require.Contains(t, err.Error(), "failed to execute command")
}
func Test_downloadFiles(t *testing.T) {
dir, err := ioutil.TempDir("", "")
require.Nil(t, err)
defer os.RemoveAll(dir)
srv := httptest.NewServer(httpbin.GetMux())
defer srv.Close()
err = downloadFiles(log.NewContext(log.NewNopLogger()),
dir,
handlerSettings{
publicSettings: publicSettings{
FileURLs: []string{
srv.URL + "/bytes/10",
srv.URL + "/bytes/100",
srv.URL + "/bytes/1000",
}},
})
require.Nil(t, err)
// check the files
f := []string{"10", "100", "1000"}
for _, fn := range f {
fp := filepath.Join(dir, fn)
_, err := os.Stat(fp)
require.Nil(t, err, "%s is missing from download dir", fp)
}
}
func Test_decodeScript(t *testing.T) {
testSubject := "bHMK"
s, info, err := decodeScript(testSubject)
require.NoError(t, err)
require.Equal(t, info, "4;3;gzip=0")
require.Equal(t, s, "ls\n")
}
func Test_decodeScriptGzip(t *testing.T) {
testSubject := "H4sIACD731kAA8sp5gIAfShLWgMAAAA="
s, info, err := decodeScript(testSubject)
require.NoError(t, err)
require.Equal(t, info, "32;3;gzip=1")
require.Equal(t, s, "ls\n")
}