authelia/cmd/authelia-scripts/cmd_suites.go
2019-11-01 19:03:22 +01:00

235 lines
4.9 KiB
Go

package main
import (
"errors"
"fmt"
"io/ioutil"
"os"
"os/exec"
"os/signal"
"strings"
"syscall"
"github.com/spf13/cobra"
)
func listDirectories(path string) ([]string, error) {
files, err := ioutil.ReadDir(path)
if err != nil {
return nil, err
}
dirs := make([]string, 0)
for _, f := range files {
if f.IsDir() {
dirs = append(dirs, f.Name())
}
}
return dirs, nil
}
func listSuites() ([]string, error) {
return listDirectories("./test/suites/")
}
func suiteAvailable(suite string, suites []string) (bool, error) {
suites, err := listSuites()
if err != nil {
return false, err
}
for _, s := range suites {
if s == suite {
return true, nil
}
}
return false, nil
}
// SuitesListCmd Command for listing the available suites
var SuitesListCmd = &cobra.Command{
Use: "list",
Short: "List available suites.",
Run: func(cmd *cobra.Command, args []string) {
suites, err := listSuites()
if err != nil {
panic(err)
}
fmt.Println(strings.Join(suites, "\n"))
},
Args: cobra.ExactArgs(0),
}
// SuitesCleanCmd Command for cleaning suite environments
var SuitesCleanCmd = &cobra.Command{
Use: "clean",
Short: "Clean suite environments.",
Run: func(cmd *cobra.Command, args []string) {
command := CommandWithStdout("bash", "-c",
"./node_modules/.bin/ts-node -P test/tsconfig.json -- ./scripts/clean-environment.ts")
err := command.Run()
if err != nil {
panic(err)
}
},
Args: cobra.ExactArgs(0),
}
// SuitesStartCmd Command for starting a suite
var SuitesStartCmd = &cobra.Command{
Use: "start [suite]",
Short: "Start a suite. Suites can be listed using the list command.",
Run: func(cmd *cobra.Command, args []string) {
suites, err := listSuites()
if err != nil {
panic(err)
}
selectedSuite := args[0]
available, err := suiteAvailable(selectedSuite, suites)
if err != nil {
panic(err)
}
if !available {
panic(errors.New("Suite named " + selectedSuite + " does not exist"))
}
err = ioutil.WriteFile(RunningSuiteFile, []byte(selectedSuite), 0644)
if err != nil {
panic(err)
}
signalChannel := make(chan os.Signal)
signal.Notify(signalChannel, os.Interrupt, syscall.SIGTERM)
cmdline := "./node_modules/.bin/ts-node -P test/tsconfig.json -- ./scripts/run-environment.ts " + selectedSuite
command := CommandWithStdout("bash", "-c", cmdline)
command.Env = append(os.Environ(), "ENVIRONMENT=dev")
err = command.Run()
if err != nil {
panic(err)
}
err = os.Remove(RunningSuiteFile)
if err != nil {
panic(err)
}
},
Args: cobra.ExactArgs(1),
}
// SuitesTestCmd Command for testing a suite
var SuitesTestCmd = &cobra.Command{
Use: "test [suite]",
Short: "Test a suite. Suites can be listed using the list command.",
Run: func(cmd *cobra.Command, args []string) {
runningSuite, err := getRunningSuite()
if err != nil {
panic(err)
}
if len(args) == 1 {
suite := args[0]
if runningSuite != "" && suite != runningSuite {
panic(errors.New("Running suite (" + runningSuite + ") is different than suite to be tested (" + suite + "). Shutdown running suite and retry"))
}
runSuiteTests(suite, runningSuite == "")
} else {
if runningSuite != "" {
fmt.Println("Running suite (" + runningSuite + ") detected. Run tests of that suite")
runSuiteTests(runningSuite, false)
} else {
fmt.Println("No suite provided therefore all suites will be tested")
runAllSuites()
}
}
},
Args: cobra.MaximumNArgs(1),
}
func getRunningSuite() (string, error) {
exist, err := FileExists(RunningSuiteFile)
if err != nil {
return "", err
}
if !exist {
return "", nil
}
b, err := ioutil.ReadFile(RunningSuiteFile)
return string(b), err
}
func runSuiteTests(suite string, withEnv bool) {
mochaArgs := []string{"--exit", "--colors", "--require", "ts-node/register", "test/suites/" + suite + "/test.ts"}
if onlyForbidden {
mochaArgs = append(mochaArgs, "--forbid-only", "--forbid-pending")
}
mochaCmdLine := "./node_modules/.bin/mocha " + strings.Join(mochaArgs, " ")
fmt.Println(mochaCmdLine)
headlessValue := "n"
if headless {
headlessValue = "y"
}
var cmd *exec.Cmd
if withEnv {
cmd = CommandWithStdout("bash", "-c",
"./node_modules/.bin/ts-node ./scripts/run-environment.ts "+suite+" '"+mochaCmdLine+"'")
} else {
cmd = CommandWithStdout("bash", "-c", mochaCmdLine)
}
cmd.Env = append(os.Environ(),
"TS_NODE_PROJECT=test/tsconfig.json",
"HEADLESS="+headlessValue,
"ENVIRONMENT=dev")
err := cmd.Run()
if err != nil {
panic(err)
}
}
func runAllSuites() {
suites, err := listSuites()
if err != nil {
panic(err)
}
for _, s := range suites {
runSuiteTests(s, true)
}
}
var headless bool
var onlyForbidden bool
func init() {
SuitesTestCmd.Flags().BoolVar(&headless, "headless", false, "Run tests in headless mode")
SuitesTestCmd.Flags().BoolVar(&onlyForbidden, "only-forbidden", false, "Mocha 'only' filters are forbidden")
}