github.com/vlifesystems/rulehunter@v0.0.0-20180501090014-673078aa4a83/rulehunter_su_test.go (about)

     1  // +build su
     2  
     3  package main
     4  
     5  import (
     6  	"fmt"
     7  	"log"
     8  	"os"
     9  	"path/filepath"
    10  	"reflect"
    11  	"strings"
    12  	"testing"
    13  	"time"
    14  
    15  	"github.com/vlifesystems/rulehunter/cmd"
    16  	"github.com/vlifesystems/rulehunter/internal"
    17  	"github.com/vlifesystems/rulehunter/internal/testhelpers"
    18  )
    19  
    20  func TestMain(m *testing.M) {
    21  	if len(os.Args) >= 2 && (os.Args[1] == "serve" || os.Args[1] == "service") {
    22  		for _, arg := range os.Args[2:] {
    23  			if strings.HasPrefix(arg, "--config") {
    24  				cfgFilename := strings.Split(arg, "=")[1]
    25  				cfgDir := filepath.Dir(cfgFilename)
    26  				pwd, err := os.Getwd()
    27  				if err != nil {
    28  					log.Fatalf("os.Getwd: %s", err)
    29  				}
    30  				if err := os.Chdir(cfgDir); err != nil {
    31  					log.Fatalf("os.Chdir: %s", err)
    32  				}
    33  				defer os.Chdir(pwd)
    34  			}
    35  		}
    36  		if err := cmd.RootCmd.Execute(); err != nil {
    37  			log.Fatal(err)
    38  			os.Exit(1)
    39  		}
    40  		os.Exit(0)
    41  	}
    42  	os.Exit(m.Run())
    43  }
    44  
    45  func TestRulehunter_service_install(t *testing.T) {
    46  	for _, user := range knownUsers {
    47  		t.Logf("user: %s", user)
    48  		cfgDir := testhelpers.BuildConfigDirs(t, false)
    49  		defer os.RemoveAll(cfgDir)
    50  		testhelpers.MustWriteConfig(t, cfgDir, 10)
    51  
    52  		if user != "" {
    53  			runOSCmd(t,
    54  				true,
    55  				os.Args[0],
    56  				"service",
    57  				"install",
    58  				fmt.Sprintf("--config=%s", filepath.Join(cfgDir, "config.yaml")),
    59  				fmt.Sprintf("--user=%s", user),
    60  			)
    61  		} else {
    62  			runOSCmd(t,
    63  				true,
    64  				os.Args[0],
    65  				"service",
    66  				"install",
    67  				fmt.Sprintf("--config=%s", filepath.Join(cfgDir, "config.yaml")),
    68  			)
    69  		}
    70  
    71  		startService(t, "rulehunter")
    72  		defer stopService(t, "rulehunter")
    73  
    74  		testhelpers.CopyFile(
    75  			t,
    76  			filepath.Join("fixtures", "debt.csv"),
    77  			filepath.Join(cfgDir, "datasets"),
    78  		)
    79  
    80  		if !testing.Short() {
    81  			time.Sleep(4 * time.Second)
    82  		}
    83  		testhelpers.CopyFile(
    84  			t,
    85  			filepath.Join("fixtures", "debt_datasets.json"),
    86  			filepath.Join(cfgDir, "experiments"),
    87  		)
    88  		testhelpers.CopyFile(
    89  			t,
    90  			filepath.Join("fixtures", "debt_datasets.yaml"),
    91  			filepath.Join(cfgDir, "experiments"),
    92  		)
    93  		testhelpers.CopyFile(
    94  			t,
    95  			filepath.Join("fixtures", "debt_datasets.jso"),
    96  			filepath.Join(cfgDir, "experiments"),
    97  		)
    98  		testhelpers.CopyFile(
    99  			t,
   100  			filepath.Join("fixtures", "debt2_datasets.json"),
   101  			filepath.Join(cfgDir, "experiments"),
   102  		)
   103  
   104  		wantReportFiles := []string{
   105  			// "debt_datasets.yaml": test
   106  			internal.MakeBuildFilename(
   107  				"test",
   108  				"testing",
   109  				"What is most likely to indicate success",
   110  			),
   111  			// "debt2_datasets.json"
   112  			internal.MakeBuildFilename(
   113  				"train",
   114  				"",
   115  				"What is most likely to indicate success (2)",
   116  			),
   117  			// "debt_datasets.yaml": train
   118  			internal.MakeBuildFilename(
   119  				"train",
   120  				"testing",
   121  				"What is most likely to indicate success",
   122  			),
   123  			// "debt_datasets.json"
   124  			internal.MakeBuildFilename(
   125  				"train",
   126  				"",
   127  				"What is most likely to indicate success",
   128  			),
   129  		}
   130  		isFinished := false
   131  		files := []string{}
   132  		timeoutC := time.NewTimer(20 * time.Second).C
   133  		tickerC := time.NewTicker(400 * time.Millisecond).C
   134  		for !isFinished {
   135  			select {
   136  			case <-tickerC:
   137  				files = testhelpers.GetFilesInDir(
   138  					t,
   139  					filepath.Join(cfgDir, "build", "reports"),
   140  				)
   141  				if reflect.DeepEqual(files, wantReportFiles) {
   142  					isFinished = true
   143  					break
   144  				}
   145  			case <-timeoutC:
   146  				t.Errorf("(user: %s) didn't generate correct files within time period, got: %v, want: %v",
   147  					user, files, wantReportFiles)
   148  				isFinished = true
   149  				break
   150  			}
   151  		}
   152  		stopService(t, "rulehunter")
   153  	}
   154  }
   155  
   156  func TestRulehunter_service_uninstall(t *testing.T) {
   157  	cfgDir := testhelpers.BuildConfigDirs(t, false)
   158  	defer os.RemoveAll(cfgDir)
   159  	testhelpers.MustWriteConfig(t, cfgDir, 10)
   160  	runOSCmd(t,
   161  		true,
   162  		os.Args[0],
   163  		"service",
   164  		"uninstall",
   165  		fmt.Sprintf("--config=%s", filepath.Join(cfgDir, "config.yaml")),
   166  	)
   167  	runOSCmd(t,
   168  		true,
   169  		os.Args[0],
   170  		"service",
   171  		"install",
   172  		fmt.Sprintf("--config=%s", filepath.Join(cfgDir, "config.yaml")),
   173  	)
   174  
   175  	startService(t, "rulehunter")
   176  	defer stopService(t, "rulehunter")
   177  	runOSCmd(t,
   178  		true,
   179  		os.Args[0],
   180  		"service",
   181  		"uninstall",
   182  		fmt.Sprintf("--config=%s", filepath.Join(cfgDir, "config.yaml")),
   183  	)
   184  }