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  }