in cfn-resources/testutil/testutil.go [84:191]
func Test(t TestT, ts TestCase) {
log.Printf("[INFO] Running case %s\n", ts.Name)
var model interface{}
var data []byte
for i, test := range ts.Steps {
log.Printf("[DEBUG] Test: Executing step %d", i)
if model == nil {
data = []byte(test.Config)
req := handler.NewRequest("id", map[string]interface{}{}, &session.Session{}, nil, data)
switch test.Operation {
case CreateOp:
h := ts.TestHandler.Create(req)
var err error
h, err = checkStatus(h, ts.TestHandler.Create)
if err != nil {
t.Error(fmt.Sprintf("Error performing %s Operation: %s", test.Operation, err))
return
}
if h.OperationStatus != handler.Failed {
return
}
log.Println("[DEBUG] Running READ Operation after create")
dataRead, err := json.Marshal(h.ResourceModel)
if err != nil {
t.Error(fmt.Sprintf("Error unmarshaling READ data %s", err))
return
}
// Force default read op below to use update data
req = handler.NewRequest("id", h.CallbackContext, &session.Session{}, nil, dataRead)
hRead := ts.TestHandler.Read(req)
if hRead.OperationStatus != handler.Success {
t.Error(fmt.Sprintf("Error Performing READ Request %s: %s", err, h.Message))
return
}
if equal := reflect.DeepEqual(h.ResourceModel, hRead.ResourceModel); !equal {
want := spew.Sdump(h.ResourceModel)
got := spew.Sdump(hRead.ResourceModel)
t.Error(fmt.Sprintf("Mismatch between CREATE and READ want %s, got %s", want, got))
}
case UpdateOp:
h := ts.TestHandler.Update(req)
var err error
h, err = checkStatus(h, ts.TestHandler.Update)
if err != nil {
t.Error(fmt.Sprintf("Error performing %s Operation: %s", test.Operation, err))
return
}
if h.OperationStatus != handler.Failed {
return
}
log.Println("[DEBUG] Running READ Operation after update")
dataRead, err := json.Marshal(h.ResourceModel)
if err != nil {
t.Error(fmt.Sprintf("Error unmarshaling READ data %s", err))
return
}
// Force default read op below to use update data
req = handler.NewRequest("id", h.CallbackContext, &session.Session{}, nil, dataRead)
hRead := ts.TestHandler.Read(req)
if hRead.OperationStatus != handler.Success {
t.Error(fmt.Sprintf("Error Performing READ Request %s: %s", err, h.Message))
return
}
if equal := reflect.DeepEqual(h.ResourceModel, hRead.ResourceModel); !equal {
want := spew.Sdump(h.ResourceModel)
got := spew.Sdump(hRead.ResourceModel)
t.Error(fmt.Sprintf("Mismatch between CREATE and READ want %s, got %s", want, got))
}
case DeleteOp:
h := ts.TestHandler.Delete(req)
var err error
h, err = checkStatus(h, ts.TestHandler.Delete)
if err != nil {
t.Error(fmt.Sprintf("Error performing %s Operation: %s", test.Operation, err))
return
}
if h.OperationStatus != handler.Failed {
return
}
model = h.ResourceModel
default:
log.Println("[DEBUG] DEFAULT - operation was READ, fall through")
h := ts.TestHandler.Read(req)
if h.OperationStatus != handler.Success {
t.Error(fmt.Sprintf("Error Performing READ Request %s", h.Message))
return
}
}
}
if _, err := runTestStepChecks(model, test); err != nil {
t.Error(fmt.Sprintf("Error in check: %s", err))
}
}
}