github.com/davidmanzanares/dsd@v0.1.2-0.20210106152357-a35988f5d245/dsdl/run_test.go (about)

     1  package dsdl
     2  
     3  import (
     4  	"fmt"
     5  	"io/ioutil"
     6  	"runtime"
     7  	"strings"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/davidmanzanares/dsd/types"
    12  )
    13  
    14  var testPatterns []string = []string{"test-asset*", "*/*", "*/*/*"}
    15  
    16  func TestRunBasic(t *testing.T) {
    17  	createTestAssets()
    18  	defer deleteTestAssets()
    19  
    20  	service := "s3://dsd-s3-test/tests"
    21  	v, err := Deploy(Target{Name: "test", Service: service, Patterns: testPatterns})
    22  	if err != nil {
    23  		t.Fatal(err)
    24  	}
    25  	r, err := Run("s3://dsd-s3-test/tests", RunConf{})
    26  	if err != nil {
    27  		t.Fatal(err)
    28  	}
    29  	ev := r.WaitForEvent()
    30  	if ev.Type != AppStarted {
    31  		t.Fatal(ev)
    32  	}
    33  	ev = r.WaitForEvent()
    34  	if ev.Type != AppExit {
    35  		t.Fatal(ev)
    36  	}
    37  	ev = r.WaitForEvent()
    38  	if ev.Type != Stopped {
    39  		t.Fatal(ev)
    40  	}
    41  	checkFiles(v, t)
    42  	checkExecution(t, v, 1)
    43  }
    44  
    45  func TestRunFailureRestart(t *testing.T) {
    46  	var testPatterns []string = []string{"test-asset-failure-script", "*/*", "*/*/*"}
    47  	createTestAssets()
    48  	defer deleteTestAssets()
    49  
    50  	service := "s3://dsd-s3-test/tests"
    51  	v, err := Deploy(Target{Name: "test", Service: service, Patterns: testPatterns})
    52  	if err != nil {
    53  		t.Fatal(err)
    54  	}
    55  	r, err := Run("s3://dsd-s3-test/tests", RunConf{OnFailure: Restart})
    56  	if err != nil {
    57  		t.Fatal(err)
    58  	}
    59  
    60  	// First execution
    61  	ev := r.WaitForEvent()
    62  	if ev.Type != AppStarted {
    63  		t.Fatal(ev)
    64  	}
    65  	ev = r.WaitForEvent()
    66  	if ev.Type != AppExit {
    67  		t.Fatal(ev)
    68  	}
    69  
    70  	// Second execution
    71  	ev = r.WaitForEvent()
    72  	if ev.Type != AppStarted {
    73  		t.Fatal(ev)
    74  	}
    75  	ev = r.WaitForEvent()
    76  	if ev.Type != AppExit {
    77  		t.Fatal(ev)
    78  	}
    79  	r.Stop()
    80  	execs := 2
    81  	for {
    82  		ev := r.WaitForEvent()
    83  		if ev.Type == Stopped {
    84  			break
    85  		}
    86  		if ev.Type == AppExit {
    87  			execs++
    88  		}
    89  	}
    90  	checkExecution(t, v, execs)
    91  }
    92  
    93  func TestRunHotReload(t *testing.T) {
    94  	var testPatterns []string = []string{"test-asset-sleep-script", "*/*", "*/*/*"}
    95  	createTestAssets()
    96  	defer deleteTestAssets()
    97  
    98  	service := "s3://dsd-s3-test/tests"
    99  	v, err := Deploy(Target{Name: "test", Service: service, Patterns: testPatterns})
   100  	if err != nil {
   101  		t.Fatal(err)
   102  	}
   103  	r, err := Run("s3://dsd-s3-test/tests", RunConf{HotReload: true, Polling: 50 * time.Millisecond})
   104  	if err != nil {
   105  		t.Fatal(err)
   106  	}
   107  	ev := r.WaitForEvent()
   108  	if ev.Type != AppStarted {
   109  		t.Fatal(ev)
   110  	}
   111  	time.Sleep(50 * time.Millisecond)
   112  	checkExecution(t, v, 1)
   113  	v, err = Deploy(Target{Name: "test", Service: service, Patterns: testPatterns})
   114  	if err != nil {
   115  		t.Fatal(err)
   116  	}
   117  	ev = r.WaitForEvent()
   118  	if ev.Type != AppStarted {
   119  		t.Fatal(ev)
   120  	}
   121  	time.Sleep(50 * time.Millisecond)
   122  	checkExecution(t, v, 2)
   123  	r.Stop()
   124  	ev = r.WaitForEvent()
   125  	if ev.Type != Stopped {
   126  		t.Fatal(ev)
   127  	}
   128  }
   129  
   130  func TestRunSuccessWait(t *testing.T) {
   131  	createTestAssets()
   132  	defer deleteTestAssets()
   133  
   134  	service := "s3://dsd-s3-test/tests"
   135  	v, err := Deploy(Target{Name: "test", Service: service, Patterns: testPatterns})
   136  	if err != nil {
   137  		t.Fatal(err)
   138  	}
   139  	r, err := Run("s3://dsd-s3-test/tests", RunConf{OnSuccess: Wait})
   140  	if err != nil {
   141  		t.Fatal(err)
   142  	}
   143  	ev := r.WaitForEvent()
   144  	if ev.Type != AppStarted {
   145  		t.Fatal(ev)
   146  	}
   147  	ev = r.WaitForEvent()
   148  	if ev.Type != AppExit {
   149  		t.Fatal(ev)
   150  	}
   151  	checkFiles(v, t)
   152  	checkExecution(t, v, 1)
   153  	v, err = Deploy(Target{Name: "test", Service: service, Patterns: testPatterns})
   154  	if err != nil {
   155  		t.Fatal(err)
   156  	}
   157  	r.commands <- "update"
   158  	ev = r.WaitForEvent()
   159  	if ev.Type != AppStarted {
   160  		t.Fatal(ev)
   161  	}
   162  	ev = r.WaitForEvent()
   163  	if ev.Type != AppExit {
   164  		t.Fatal(ev)
   165  	}
   166  	checkFiles(v, t)
   167  	checkExecution(t, v, 2)
   168  	r.Stop()
   169  	ev = r.WaitForEvent()
   170  	if ev.Type != Stopped {
   171  		t.Fatal(ev)
   172  	}
   173  }
   174  
   175  func TestDefaultPolling(t *testing.T) {
   176  	r, err := Run("s3://dsd-s3-test/tests", RunConf{OnSuccess: Wait})
   177  	if err != nil {
   178  		t.Fatal(err)
   179  	}
   180  	if r.conf.Polling != DefaultPolling {
   181  		t.Fatal("Wrong polling time")
   182  	}
   183  	r.Stop()
   184  }
   185  func TestCustomPolling(t *testing.T) {
   186  	r, err := Run("s3://dsd-s3-test/tests", RunConf{OnSuccess: Wait, Polling: time.Minute})
   187  	if err != nil {
   188  		t.Fatal(err)
   189  	}
   190  	if r.conf.Polling != time.Minute {
   191  		t.Fatal("Wrong polling time")
   192  	}
   193  	r.Stop()
   194  }
   195  
   196  func checkExecution(t *testing.T, v types.Version, executionTimes int) {
   197  	d, err := ioutil.ReadFile("./assets/test-script-output")
   198  	if err != nil {
   199  		_, file, no, ok := runtime.Caller(1)
   200  		if ok {
   201  			fmt.Printf("called from %s#%d\n", file, no)
   202  		}
   203  		t.Fatal(err)
   204  	}
   205  	expected := strings.Repeat("I ran\n", executionTimes)
   206  	if string(d) != expected {
   207  		_, file, no, ok := runtime.Caller(1)
   208  		if ok {
   209  			fmt.Printf("called from %s#%d\n", file, no)
   210  		}
   211  		fmt.Println(executionTimes)
   212  		t.Fatal("test-script-output unexpected result:", string(d), string(expected), d, []byte(expected))
   213  	}
   214  }