in saga/saga_generators.go [32:101]
func genSagaState(genParams *gopter.GenParameters, includeJob bool) *SagaState {
sagaId := genId(genParams)
data, _ := gen.SliceOf(gen.UInt8()).Sample()
if !includeJob {
data = []uint8{}
}
job := data.([]byte)
state, err := makeSagaState(sagaId, job)
if err != nil {
log.Info(err)
}
// is saga aborted or not
isAborted := genParams.NextBool()
state.sagaAborted = isAborted
//number of tasks to run in this saga
numTasks := int(genParams.NextUint64() % 100)
for i := 0; i < numTasks; i++ {
taskId := genId(genParams)
flags := TaskStarted
// randomly decide if task has been completed
if genParams.NextBool() {
flags = flags | TaskCompleted
err := genTaskCompletedData(state, taskId, genParams)
if err != nil {
log.Infof(fmt.Sprintf("Error generating complete task data for %s, %s", taskId, err.Error()))
}
}
if isAborted {
// randomly decide if comp tasks have started/completed
if genParams.NextBool() {
flags = flags | CompTaskStarted
if genParams.NextBool() {
flags = flags | CompTaskCompleted
}
}
}
state.taskState[taskId] = flags
}
// check if saga is in completed state then coin flip to decide if we actually log
// the end complete message
isCompleted := true
for _, id := range state.GetTaskIds() {
if state.IsSagaAborted() {
if !(state.IsTaskStarted(id) && state.IsCompTaskStarted(id) && state.IsCompTaskCompleted(id)) {
isCompleted = false
break
}
} else {
if !(state.IsTaskStarted(id) && state.IsTaskCompleted(id)) {
isCompleted = false
break
}
}
}
if isCompleted && genParams.NextBool() {
state.sagaCompleted = true
}
return state
}