Index: appengine/cmd/dm/mutate/schedule_execution_test.go |
diff --git a/appengine/cmd/dm/mutate/schedule_execution_test.go b/appengine/cmd/dm/mutate/schedule_execution_test.go |
index c953cd7a104ac32ec33f4dac13abc285d24e8ec9..8eb9b0803b80556a1881d6d51f9f6d51c782041b 100644 |
--- a/appengine/cmd/dm/mutate/schedule_execution_test.go |
+++ b/appengine/cmd/dm/mutate/schedule_execution_test.go |
@@ -5,29 +5,97 @@ |
package mutate |
import ( |
+ "fmt" |
"testing" |
+ "time" |
- "github.com/luci/gae/impl/memory" |
- "github.com/luci/luci-go/common/api/dm/service/v1" |
. "github.com/smartystreets/goconvey/convey" |
- "golang.org/x/net/context" |
+ |
+ "github.com/luci/gae/service/datastore" |
+ "github.com/luci/luci-go/appengine/cmd/dm/distributor/fake" |
+ "github.com/luci/luci-go/appengine/cmd/dm/model" |
+ "github.com/luci/luci-go/common/api/dm/service/v1" |
+ "github.com/luci/luci-go/common/errors" |
+ . "github.com/luci/luci-go/common/testing/assertions" |
) |
func TestScheduleExecution(t *testing.T) { |
t.Parallel() |
Convey("ScheduleExecution", t, func() { |
- c := memory.Use(context.Background()) |
- se := &ScheduleExecution{dm.NewAttemptID("quest", 1)} |
+ _, c, dist, _ := fake.Setup(FinishExecutionFn) |
+ |
+ qdesc := fake.QuestDesc("quest") |
+ qid := qdesc.QuestID() |
+ se := &ScheduleExecution{dm.NewAttemptID(qid, 1)} |
Convey("Root", func() { |
- So(se.Root(c).String(), ShouldEqual, `dev~app::/Attempt,"quest|fffffffe"`) |
+ So(se.Root(c).String(), ShouldEqual, fmt.Sprintf(`dev~app::/Attempt,"%s|fffffffe"`, qid)) |
}) |
Convey("RollForward", func() { |
- muts, err := se.RollForward(c) |
- So(err, ShouldBeNil) |
- So(muts, ShouldBeNil) |
+ ds := datastore.Get(c) |
+ q := &model.Quest{ID: qid, Desc: *qdesc} |
+ a := &model.Attempt{ |
+ ID: *se.For, |
+ State: dm.Attempt_SCHEDULING, |
+ } |
+ e := model.ExecutionFromID(c, dm.NewExecutionID(qid, 1, 1)) |
+ So(ds.PutMulti([]interface{}{q, a}), ShouldBeNil) |
+ |
+ Convey("basic", func() { |
+ dist.TimeToStart = time.Minute * 5 |
+ |
+ muts, err := se.RollForward(c) |
+ So(err, ShouldBeNil) |
+ So(muts, ShouldBeNil) |
+ |
+ So(ds.GetMulti([]interface{}{a, e}), ShouldBeNil) |
+ Convey("distributor information is saved", func() { |
+ tok := fake.MkToken(dm.NewExecutionID(qid, 1, 1)) |
+ |
+ So(a.State, ShouldEqual, dm.Attempt_EXECUTING) |
+ So(e.State, ShouldEqual, dm.Execution_SCHEDULING) |
+ So(e.DistributorConfigName, ShouldEqual, "fakeDistributor") |
+ So(e.DistributorToken, ShouldEqual, tok) |
+ So(e.DistributorConfigVersion, ShouldEqual, "testing") |
+ So(e.TimeToStart, ShouldEqual, time.Minute*5) |
+ }) |
+ Convey("a timeout is set", func() { |
+ ex, err := ds.Exists(ds.MakeKey( |
+ "Attempt", a.ID.DMEncoded(), |
+ "Execution", 1, |
+ "tumble.Mutation", "n:timeout")) |
+ So(err, ShouldBeNil) |
+ So(ex.All(), ShouldBeTrue) |
+ }) |
+ }) |
+ |
+ Convey("transient", func() { |
+ dist.RunError = errors.WrapTransient(errors.New("transient failure")) |
+ |
+ muts, err := se.RollForward(c) |
+ So(err, ShouldErrLike, "transient") |
+ So(muts, ShouldBeNil) |
+ }) |
+ |
+ Convey("rejection", func() { |
+ dist.RunError = errors.New("no soup for you") |
+ |
+ muts, err := se.RollForward(c) |
+ So(err, ShouldBeNil) |
+ So(muts, ShouldBeNil) |
+ |
+ So(ds.GetMulti([]interface{}{a, e}), ShouldBeNil) |
+ So(a.State, ShouldEqual, dm.Attempt_ABNORMAL_FINISHED) |
+ So(a.AbnormalFinish.Status, ShouldEqual, dm.AbnormalFinish_REJECTED) |
+ So(a.AbnormalFinish.Reason, ShouldContainSubstring, "non-transient") |
+ |
+ So(e.State, ShouldEqual, dm.Execution_ABNORMAL_FINISHED) |
+ So(e.AbnormalFinish.Status, ShouldEqual, dm.AbnormalFinish_REJECTED) |
+ So(e.AbnormalFinish.Reason, ShouldContainSubstring, "non-transient") |
+ }) |
+ |
}) |
}) |
} |