github.com/tonto/cli@v0.0.0-20180104210444-aec958fa47db/test/funcfile-docker-rt-tests/fn_test.go (about)

     1  package tests
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"io/ioutil"
     7  	"log"
     8  	"os"
     9  	"os/exec"
    10  	"path"
    11  	"testing"
    12  )
    13  
    14  func init() {
    15  	dockerUser := os.Getenv("DOCKER_USER")
    16  	var err error
    17  	if dockerUser == "" {
    18  		dockerUser = "funcster"
    19  	}
    20  	err = os.Setenv("FN_REGISTRY", dockerUser)
    21  	if err != nil {
    22  		log.Fatalf("couldn't set env var: %v", err)
    23  	}
    24  	return
    25  }
    26  
    27  func TestDockerRuntime(t *testing.T) {
    28  	testname := "TestDockerRuntime"
    29  	testfiles := []string{"Dockerfile", "func.go"}
    30  
    31  	currdir, err := os.Getwd()
    32  	if err != nil {
    33  		t.Fatalf("ERROR: Failed to get current directory: err: %v", err)
    34  	}
    35  	testdir, err := ioutil.TempDir("", "cli_test_funcfile-docker-rt_"+testname)
    36  	if err != nil {
    37  		t.Fatalf("ERROR: Failed to make tmp test directory: err: %v", err)
    38  	}
    39  	defer cleanup(t, currdir, testdir)
    40  	fnTestBin := setupTestFiles(t, testname, currdir, testdir, testfiles)
    41  	runFnInit(t, testname, fnTestBin)
    42  	runFnBuild(t, testname, fnTestBin)
    43  	runFnRun(t, testname, fnTestBin)
    44  	t.Logf("INFO: %s SUCCESS", testname)
    45  }
    46  
    47  func TestDockerRuntimeNoDockerfile(t *testing.T) {
    48  	testname := "TestDockerRuntimeNoDockerfile"
    49  	testfiles := []string{"func.yaml", "func.go"}
    50  
    51  	currdir, err := os.Getwd()
    52  	if err != nil {
    53  		t.Fatalf("ERROR: Failed to get current directory: err: %v", err)
    54  	}
    55  	testdir, err := ioutil.TempDir("", "cli_test_funcfile-docker-rt_"+testname)
    56  	if err != nil {
    57  		t.Fatalf("ERROR: Failed to make tmp test directory: err: %v", err)
    58  	}
    59  	defer cleanup(t, currdir, testdir)
    60  	fnTestBin := setupTestFiles(t, testname, currdir, testdir, testfiles)
    61  	runFnBuildNoDockerfile(t, testname, fnTestBin)
    62  	t.Logf("INFO: %s SUCCESS", testname)
    63  }
    64  
    65  func cleanup(t *testing.T, currdir, testdir string) {
    66  	err := os.Chdir(currdir)
    67  	if err != nil {
    68  		t.Fatalf("ERROR: Failed to cd %s directory: err: %v", currdir, err)
    69  	}
    70  	os.Remove(testdir)
    71  }
    72  
    73  func setupTestFiles(t *testing.T,
    74  	testname, currdir, testdir string, testfiles []string) string {
    75  
    76  	t.Logf("INFO: %s Current directory is %s", testname, currdir)
    77  
    78  	testfilesdir := path.Join(currdir, "testfiles")
    79  	for _, testfile := range testfiles {
    80  		err := copyFile(path.Join(testfilesdir, testfile), path.Join(testdir, testfile))
    81  		if err != nil {
    82  			t.Fatalf("ERROR: Failed to copy %s to test directory %s: err: %v", testfile, testdir, err)
    83  		}
    84  	}
    85  
    86  	fnTestBin := path.Join(testdir, "fn")
    87  	err := os.Chdir("../../")
    88  	if err != nil {
    89  		t.Fatalf("ERROR: Failed to cd ../../ directory: err: %v", err)
    90  	}
    91  	res, err := exec.Command("go", "build", "-o", fnTestBin).CombinedOutput()
    92  	if err != nil {
    93  		t.Fatalf("ERROR: Failed to build fn: res: %s, err: %v", string(res), err)
    94  	}
    95  
    96  	t.Logf("INFO: %s cd test directory %s", testname, testdir)
    97  	if err := os.Chdir(testdir); err != nil {
    98  		t.Fatalf("ERROR: Failed to cd test directory %s: err: %v", testdir, err)
    99  	}
   100  	return fnTestBin
   101  }
   102  
   103  func runFnInit(t *testing.T, testname, fnTestBin string) {
   104  	var imagename string = "fn_test_hello_docker_runtime"
   105  
   106  	t.Logf("INFO: %s Run fn init --name %s", testname, imagename)
   107  	res, err := exec.Command(fnTestBin, "init", "--name", imagename).CombinedOutput()
   108  	if err != nil {
   109  		t.Fatalf("ERROR: Failed run fn init: res: %s, err: %v", string(res), err)
   110  	}
   111  }
   112  
   113  func runFnBuild(t *testing.T, testname, fnTestBin string) {
   114  	t.Logf("INFO: %s Run fn build", testname)
   115  	res, err := exec.Command(fnTestBin, "build").CombinedOutput()
   116  	if err != nil {
   117  		t.Fatalf("ERROR: Failed run fn build: res: %s, err: %v", string(res), err)
   118  	}
   119  }
   120  
   121  func runFnBuildNoDockerfile(t *testing.T, testname, fnTestBin string) {
   122  	t.Logf("INFO: %s Run fn build", testname)
   123  	res, err := exec.Command(fnTestBin, "build").CombinedOutput()
   124  	if err != nil {
   125  		if bytes.Contains(res, []byte("Dockerfile does not exist")) {
   126  			t.Logf("INFO: %s Got expected error message %s", testname, string(res))
   127  			return
   128  		}
   129  	}
   130  	t.Fatalf("ERROR: Didn't get expected failure on fn build: res: %s, err: %v", string(res), err)
   131  }
   132  
   133  func runFnRun(t *testing.T, testname, fnTestBin string) {
   134  	t.Logf("INFO: %s Run fn run", testname)
   135  	res, err := exec.Command(fnTestBin, "run").CombinedOutput()
   136  	if err != nil {
   137  		t.Fatalf("ERROR: Failed run fn run: res: %s, err: %v", string(res), err)
   138  	}
   139  
   140  }
   141  
   142  func copyFile(src, dst string) error {
   143  	b, err := ioutil.ReadFile(src)
   144  	if err != nil {
   145  		return fmt.Errorf("copyFile(): failed to read src file "+src+": %s", src)
   146  	}
   147  
   148  	err = ioutil.WriteFile(dst, b, 0777)
   149  	if err != nil {
   150  		return fmt.Errorf("copyFile(): failed to read dst file "+dst+": %s", dst)
   151  	}
   152  	return nil
   153  }