github.com/qri-io/qri@v0.10.1-0.20220104210721-c771715036cb/automation/run/run_test.go (about)

     1  package run
     2  
     3  import (
     4  	"encoding/json"
     5  	"fmt"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/google/go-cmp/cmp"
    10  	"github.com/qri-io/qri/event"
    11  )
    12  
    13  func ExampleNewID() {
    14  	myString := "SomeRandomStringThatIsLong-SoYouCanCallItAsMuchAsNeeded..."
    15  	SetIDRand(strings.NewReader(myString))
    16  	a := NewID()
    17  	SetIDRand(strings.NewReader(myString))
    18  	b := NewID()
    19  
    20  	fmt.Printf("a:  %s\nb:  %s\neq: %t", a, b, a == b)
    21  	// Output:
    22  	// a:  536f6d65-5261-4e64-af6d-537472696e67
    23  	// b:  536f6d65-5261-4e64-af6d-537472696e67
    24  	// eq: true
    25  }
    26  
    27  func TestStateAddTransformEvent(t *testing.T) {
    28  	runID := NewID()
    29  	states := getStates(runID)
    30  	for i, s := range states {
    31  		t.Run(fmt.Sprintf("after_event_%d", i), func(t *testing.T) {
    32  			got := NewState(runID)
    33  			for j := 0; j <= i; j++ {
    34  				if err := got.AddTransformEvent(states[j].e); err != nil {
    35  					t.Fatal(err)
    36  				}
    37  			}
    38  
    39  			if diff := cmp.Diff(s.r, got); diff != "" {
    40  				t.Errorf("result mismatch. (-want +got):\n%s", diff)
    41  			}
    42  		})
    43  	}
    44  }
    45  
    46  func getStates(runID string) []struct {
    47  	e event.Event
    48  	r *State
    49  } {
    50  	states := []struct {
    51  		e event.Event
    52  		r *State
    53  	}{
    54  		{
    55  			event.Event{Type: event.ETTransformStart, Timestamp: 1609460600090, SessionID: runID, Payload: event.TransformLifecycle{StepCount: 4, Status: "running"}},
    56  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning},
    57  		},
    58  		{
    59  			event.Event{Type: event.ETTransformStepStart, Timestamp: 1609460700090, SessionID: runID, Payload: event.TransformStepLifecycle{Name: "setup"}},
    60  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning, Steps: []*StepState{
    61  				{Name: "setup", StartTime: toTimePointer(1609460700090), Status: RSRunning},
    62  			}},
    63  		},
    64  		// {
    65  		//	event.Event{ Type: event.ETVersionPulled,           Timestamp: 1609460800090, SessionID: runID, Payload: {"refstring": "rico/presidents@QmFoo", "remote": "https://registy.qri.cloud" }},
    66  		//	&State{},
    67  		//	},
    68  		{
    69  			event.Event{Type: event.ETTransformStepStop, Timestamp: 1609460900090, SessionID: runID, Payload: event.TransformStepLifecycle{Name: "setup", Status: "succeeded"}},
    70  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning, Steps: []*StepState{
    71  				{Name: "setup", StartTime: toTimePointer(1609460700090), StopTime: toTimePointer(1609460900090), Duration: 200000, Status: RSSucceeded},
    72  			}},
    73  		},
    74  		{
    75  			event.Event{Type: event.ETTransformStepStart, Timestamp: 1609461000090, SessionID: runID, Payload: event.TransformStepLifecycle{Name: "download"}},
    76  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning, Steps: []*StepState{
    77  				{Name: "setup", StartTime: toTimePointer(1609460700090), StopTime: toTimePointer(1609460900090), Duration: 200000, Status: RSSucceeded},
    78  				{Name: "download", StartTime: toTimePointer(1609461000090), Status: RSRunning},
    79  			}},
    80  		},
    81  		{
    82  			event.Event{Type: event.ETTransformPrint, Timestamp: 1609461100090, SessionID: runID, Payload: event.TransformMessage{Msg: "oh hai there"}},
    83  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning, Steps: []*StepState{
    84  				{Name: "setup", StartTime: toTimePointer(1609460700090), StopTime: toTimePointer(1609460900090), Duration: 200000, Status: RSSucceeded},
    85  				{Name: "download", StartTime: toTimePointer(1609461000090), Status: RSRunning, Output: []event.Event{
    86  					{Type: event.ETTransformPrint, Timestamp: 1609461100090, SessionID: runID, Payload: event.TransformMessage{Msg: "oh hai there"}},
    87  				}},
    88  			}},
    89  		},
    90  		// {
    91  		// 	event.Event{ Type: event.ETHttpRequestStart, Timestamp: 1609461200090, SessionID: runID, Payload: {"id": runID, "downloadSize": 230409, "method": "Gevent.ET", "url": "https://registy.qri.cloud" }},
    92  		// 	&State{},
    93  		// {
    94  		// {
    95  		// event.Event{ Type: event.ETHttpRequestStop, Timestamp: 1609461300090, SessionID: runID, Payload: {"size": 230409, "method": "Gevent.ET", "url": "https://registy.qri.cloud" }},
    96  		// &State{},
    97  		// },
    98  		{
    99  			event.Event{Type: event.ETTransformStepStop, Timestamp: 1609461400090, SessionID: runID, Payload: event.TransformStepLifecycle{Name: "download", Status: "succeeded"}},
   100  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning, Steps: []*StepState{
   101  				{Name: "setup", StartTime: toTimePointer(1609460700090), StopTime: toTimePointer(1609460900090), Duration: 200000, Status: RSSucceeded},
   102  				{Name: "download", StartTime: toTimePointer(1609461000090), StopTime: toTimePointer(1609461400090), Duration: 400000, Status: RSSucceeded, Output: []event.Event{
   103  					{Type: event.ETTransformPrint, Timestamp: 1609461100090, SessionID: runID, Payload: event.TransformMessage{Msg: "oh hai there"}},
   104  				}},
   105  			}},
   106  		},
   107  		{
   108  			event.Event{Type: event.ETTransformStepStart, Timestamp: 1609461500090, SessionID: runID, Payload: event.TransformStepLifecycle{Name: "transform"}},
   109  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning, Steps: []*StepState{
   110  				{Name: "setup", StartTime: toTimePointer(1609460700090), StopTime: toTimePointer(1609460900090), Duration: 200000, Status: RSSucceeded},
   111  				{Name: "download", StartTime: toTimePointer(1609461000090), StopTime: toTimePointer(1609461400090), Duration: 400000, Status: RSSucceeded, Output: []event.Event{
   112  					{Type: event.ETTransformPrint, Timestamp: 1609461100090, SessionID: runID, Payload: event.TransformMessage{Msg: "oh hai there"}},
   113  				}},
   114  				{Name: "transform", StartTime: toTimePointer(1609461500090), Status: RSRunning},
   115  			}},
   116  		},
   117  		{
   118  			event.Event{Type: event.ETTransformStepStop, Timestamp: 1609461600090, SessionID: runID, Payload: event.TransformStepLifecycle{Name: "transform", Status: "succeeded"}},
   119  			&State{ID: runID, StartTime: toTimePointer(1609460600090), Status: RSRunning, Steps: []*StepState{
   120  				{Name: "setup", StartTime: toTimePointer(1609460700090), StopTime: toTimePointer(1609460900090), Duration: 200000, Status: RSSucceeded},
   121  				{Name: "download", StartTime: toTimePointer(1609461000090), StopTime: toTimePointer(1609461400090), Duration: 400000, Status: RSSucceeded, Output: []event.Event{
   122  					{Type: event.ETTransformPrint, Timestamp: 1609461100090, SessionID: runID, Payload: event.TransformMessage{Msg: "oh hai there"}},
   123  				}},
   124  				{Name: "transform", StartTime: toTimePointer(1609461500090), StopTime: toTimePointer(1609461600090), Duration: 100000, Status: RSSucceeded},
   125  			}},
   126  		},
   127  		{
   128  			event.Event{Type: event.ETTransformStop, Timestamp: 1609461900090, SessionID: runID, Payload: event.TransformLifecycle{Status: "failed"}},
   129  			&State{ID: runID, StartTime: toTimePointer(1609460600090), StopTime: toTimePointer(1609461900090), Duration: 1300000, Status: RSFailed, Steps: []*StepState{
   130  				{Name: "setup", StartTime: toTimePointer(1609460700090), StopTime: toTimePointer(1609460900090), Duration: 200000, Status: RSSucceeded},
   131  				{Name: "download", StartTime: toTimePointer(1609461000090), StopTime: toTimePointer(1609461400090), Duration: 400000, Status: RSSucceeded, Output: []event.Event{
   132  					{Type: event.ETTransformPrint, Timestamp: 1609461100090, SessionID: runID, Payload: event.TransformMessage{Msg: "oh hai there"}},
   133  				}},
   134  				{Name: "transform", StartTime: toTimePointer(1609461500090), StopTime: toTimePointer(1609461600090), Duration: 100000, Status: RSSucceeded},
   135  			}},
   136  		},
   137  	}
   138  	return states
   139  }
   140  
   141  func TestRunStateMarshaling(t *testing.T) {
   142  	runID := NewID()
   143  	states := getStates(runID)
   144  	for i, s := range states {
   145  		t.Run(fmt.Sprintf("after_event_%d", i), func(t *testing.T) {
   146  			got := NewState(runID)
   147  			for j := 0; j <= i; j++ {
   148  				if err := got.AddTransformEvent(states[j].e); err != nil {
   149  					t.Fatal(err)
   150  				}
   151  			}
   152  
   153  			serializedRun, err := json.Marshal(got)
   154  			if err != nil {
   155  				t.Fatal(err)
   156  			}
   157  			deserializedRun := &State{}
   158  			err = json.Unmarshal(serializedRun, deserializedRun)
   159  			if err != nil {
   160  				t.Fatal(err)
   161  			}
   162  
   163  			if diff := cmp.Diff(got, deserializedRun); diff != "" {
   164  				t.Errorf("serialization mismatch (-want +got):\n %s", diff)
   165  			}
   166  
   167  			if diff := cmp.Diff(s.r, got); diff != "" {
   168  				t.Errorf("result mismatch. (-want +got):\n%s", diff)
   169  			}
   170  		})
   171  	}
   172  }