github.com/vlifesystems/rulehunter@v0.0.0-20180501090014-673078aa4a83/internal/testhelpers/testhelpers.go (about) 1 // Copyright (C) 2016-2017 vLife Systems Ltd <http://vlifesystems.com> 2 // Licensed under an MIT licence. Please see LICENSE.md for details. 3 4 // Package testhelpers contains routines to help test rulehunter 5 package testhelpers 6 7 import ( 8 "io/ioutil" 9 "os" 10 "path/filepath" 11 "testing" 12 "time" 13 14 "github.com/vlifesystems/rulehunter/config" 15 "gopkg.in/yaml.v2" 16 ) 17 18 type errorReporter interface { 19 Fatalf(format string, args ...interface{}) 20 } 21 22 func MustWriteConfig( 23 e errorReporter, 24 baseDir string, 25 maxNumRecords int64, 26 args ...int, 27 ) { 28 const mode = 0600 29 cfg := &config.Config{ 30 ExperimentsDir: filepath.Join(baseDir, "experiments"), 31 WWWDir: filepath.Join(baseDir, "www"), 32 BuildDir: filepath.Join(baseDir, "build"), 33 MaxNumProcesses: 2, 34 MaxNumRecords: maxNumRecords, 35 } 36 if len(args) == 1 { 37 cfg.HTTPPort = args[0] 38 } else if len(args) > 1 { 39 e.Fatalf("too many arguments: %d", len(args)) 40 } 41 cfgFilename := filepath.Join(baseDir, "config.yaml") 42 y, err := yaml.Marshal(cfg) 43 if err != nil { 44 e.Fatalf("Marshal: %s", err) 45 } 46 if err := ioutil.WriteFile(cfgFilename, y, mode); err != nil { 47 e.Fatalf("WriteFile(%s, ...) err: %s", cfgFilename, err) 48 } 49 } 50 51 func BuildConfigDirs(e errorReporter, buildAllDirs bool) string { 52 // File mode permission: 53 // No special permission bits 54 // User: Read, Write Execute 55 // Group: None 56 // Other: None 57 const modePerm = 0700 58 var subDirs []string 59 60 tmpDir := TempDir(e) 61 62 if buildAllDirs { 63 subDirs = []string{ 64 "experiments", 65 "datasets", 66 filepath.Join("www", "reports"), 67 filepath.Join("build", "progress"), 68 filepath.Join("build", "reports"), 69 } 70 } else { 71 subDirs = []string{ 72 "experiments", 73 "datasets", 74 } 75 } 76 for _, subDir := range subDirs { 77 fullSubDir := filepath.Join(tmpDir, subDir) 78 if err := os.MkdirAll(fullSubDir, modePerm); err != nil { 79 e.Fatalf("MkDirAll(%s, ...) err: %v", fullSubDir, err) 80 } 81 } 82 83 return tmpDir 84 } 85 86 func CopyFile(e errorReporter, srcFilename, dstDir string, args ...string) { 87 contents, err := ioutil.ReadFile(srcFilename) 88 if err != nil { 89 e.Fatalf("ReadFile(%s) err: %v", srcFilename, err) 90 } 91 info, err := os.Stat(srcFilename) 92 if err != nil { 93 e.Fatalf("Stat(%s) err: %v", srcFilename, err) 94 } 95 mode := info.Mode() 96 dstFilename := filepath.Join(dstDir, filepath.Base(srcFilename)) 97 if len(args) == 1 { 98 dstFilename = filepath.Join(dstDir, args[0]) 99 } 100 if err := ioutil.WriteFile(dstFilename, contents, mode); err != nil { 101 e.Fatalf("WriteFile(%s, ...) err: %v", dstFilename, err) 102 } 103 } 104 105 func TempDir(e errorReporter) string { 106 tmpDir, err := ioutil.TempDir("", "rulehunter_test") 107 if err != nil { 108 e.Fatalf("TempDir() err: %s", err) 109 } 110 return tmpDir 111 } 112 113 func MustParse(layout, s string) time.Time { 114 t, err := time.Parse(layout, s) 115 if err != nil { 116 panic(err) 117 } 118 return t 119 } 120 121 func GetFilesInDir(t *testing.T, dir string) []string { 122 files, err := ioutil.ReadDir(dir) 123 if err != nil { 124 t.Fatalf("ioutil.ReadDir(%s) err: %s", dir, err) 125 } 126 127 r := []string{} 128 for _, file := range files { 129 if !file.IsDir() { 130 r = append(r, file.Name()) 131 } 132 } 133 return r 134 }