func genSagaState()

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
}