| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 package memory | 5 package memory |
| 6 | 6 |
| 7 import ( | 7 import ( |
| 8 "fmt" | 8 "fmt" |
| 9 "math/rand" | 9 "math/rand" |
| 10 "net/http" | 10 "net/http" |
| 11 "testing" | 11 "testing" |
| 12 "time" | 12 "time" |
| 13 | 13 |
| 14 » "github.com/luci/gae" | 14 » rdsS "github.com/luci/gae/service/rawdatastore" |
| 15 » tqS "github.com/luci/gae/service/taskqueue" |
| 15 "github.com/luci/luci-go/common/clock" | 16 "github.com/luci/luci-go/common/clock" |
| 16 "github.com/luci/luci-go/common/clock/testclock" | 17 "github.com/luci/luci-go/common/clock/testclock" |
| 18 "github.com/luci/luci-go/common/mathrand" |
| 17 . "github.com/smartystreets/goconvey/convey" | 19 . "github.com/smartystreets/goconvey/convey" |
| 18 "golang.org/x/net/context" | 20 "golang.org/x/net/context" |
| 19 ) | 21 ) |
| 20 | 22 |
| 21 func TestTaskQueue(t *testing.T) { | 23 func TestTaskQueue(t *testing.T) { |
| 22 t.Parallel() | 24 t.Parallel() |
| 23 | 25 |
| 24 Convey("TaskQueue", t, func() { | 26 Convey("TaskQueue", t, func() { |
| 25 now := time.Date(2000, time.January, 1, 1, 1, 1, 1, time.UTC) | 27 now := time.Date(2000, time.January, 1, 1, 1, 1, 1, time.UTC) |
| 26 c, tc := testclock.UseTime(context.Background(), now) | 28 c, tc := testclock.UseTime(context.Background(), now) |
| 27 » » c = gae.SetMathRand(c, rand.New(rand.NewSource(clock.Now(c).Unix
Nano()))) | 29 » » c = mathrand.Set(c, rand.New(rand.NewSource(clock.Now(c).UnixNan
o()))) |
| 28 c = Use(c) | 30 c = Use(c) |
| 29 | 31 |
| 30 » » tq := gae.GetTQ(c).(interface { | 32 » » tq := tqS.Get(c).(interface { |
| 31 » » » gae.TaskQueue | 33 » » » tqS.Interface |
| 32 » » » gae.TQTestable | 34 » » » tqS.Testable |
| 33 }) | 35 }) |
| 34 | 36 |
| 35 So(tq, ShouldNotBeNil) | 37 So(tq, ShouldNotBeNil) |
| 36 | 38 |
| 37 Convey("implements TQMultiReadWriter", func() { | 39 Convey("implements TQMultiReadWriter", func() { |
| 38 Convey("Add", func() { | 40 Convey("Add", func() { |
| 39 » » » » t := &gae.TQTask{Path: "/hello/world"} | 41 » » » » t := &tqS.Task{Path: "/hello/world"} |
| 40 | 42 |
| 41 Convey("works", func() { | 43 Convey("works", func() { |
| 42 t.Delay = 4 * time.Second | 44 t.Delay = 4 * time.Second |
| 43 t.Header = http.Header{} | 45 t.Header = http.Header{} |
| 44 t.Header.Add("Cat", "tabby") | 46 t.Header.Add("Cat", "tabby") |
| 45 t.Payload = []byte("watwatwat") | 47 t.Payload = []byte("watwatwat") |
| 46 » » » » » t.RetryOptions = &gae.TQRetryOptions{Age
Limit: 7 * time.Second} | 48 » » » » » t.RetryOptions = &tqS.RetryOptions{AgeLi
mit: 7 * time.Second} |
| 47 _, err := tq.Add(t, "") | 49 _, err := tq.Add(t, "") |
| 48 So(err, ShouldBeNil) | 50 So(err, ShouldBeNil) |
| 49 name := "Z_UjshxM9ecyMQfGbZmUGOEcgxWU0_5
CGLl_-RntudwAw2DqQ5-58bzJiWQN4OKzeuUb9O4JrPkUw2rOvk2Ax46THojnQ6avBQgZdrKcJmrwQ6o
4qKfJdiyUbGXvy691yRfzLeQhs6cBhWrgf3wH-VPMcA4SC-zlbJ2U8An7I0zJQA5nBFnMNoMgT-2peGo
ay3rCSbj4z9VFFm9kS_i6JCaQH518ujLDSNCYdjTq6B6lcWrZAh0U_q3a1S2nXEwrKiw_t9MTNQFgAQZ
WyGBbvZQPmeRYtu8SPaWzTfd25v_YWgBuVL2rRSPSMvlDwE04nNdtvVzE8vNNiA1zRimmdzKeqATQF9_
ReUvj4D7U8dcS703DZWfKMBLgBffY9jqCassOOOw77V72Oq5EVauUw3Qw0L6bBsfM9FtahTKUdabzRZj
XUoze3EK4KXPt3-wdidau-8JrVf2XFocjjZbwHoxcGvbtT3b4nGLDlgwdC00bwaFBZWff" | 51 name := "Z_UjshxM9ecyMQfGbZmUGOEcgxWU0_5
CGLl_-RntudwAw2DqQ5-58bzJiWQN4OKzeuUb9O4JrPkUw2rOvk2Ax46THojnQ6avBQgZdrKcJmrwQ6o
4qKfJdiyUbGXvy691yRfzLeQhs6cBhWrgf3wH-VPMcA4SC-zlbJ2U8An7I0zJQA5nBFnMNoMgT-2peGo
ay3rCSbj4z9VFFm9kS_i6JCaQH518ujLDSNCYdjTq6B6lcWrZAh0U_q3a1S2nXEwrKiw_t9MTNQFgAQZ
WyGBbvZQPmeRYtu8SPaWzTfd25v_YWgBuVL2rRSPSMvlDwE04nNdtvVzE8vNNiA1zRimmdzKeqATQF9_
ReUvj4D7U8dcS703DZWfKMBLgBffY9jqCassOOOw77V72Oq5EVauUw3Qw0L6bBsfM9FtahTKUdabzRZj
XUoze3EK4KXPt3-wdidau-8JrVf2XFocjjZbwHoxcGvbtT3b4nGLDlgwdC00bwaFBZWff" |
| 50 » » » » » So(*tq.GetScheduledTasks()["default"][na
me], ShouldResemble, gae.TQTask{ | 52 » » » » » So(*tq.GetScheduledTasks()["default"][na
me], ShouldResemble, tqS.Task{ |
| 51 ETA: now.Add(4 * time.S
econd), | 53 ETA: now.Add(4 * time.S
econd), |
| 52 Header: http.Header{"Cat":
[]string{"tabby"}}, | 54 Header: http.Header{"Cat":
[]string{"tabby"}}, |
| 53 Method: "POST", | 55 Method: "POST", |
| 54 Name: name, | 56 Name: name, |
| 55 Path: "/hello/world", | 57 Path: "/hello/world", |
| 56 Payload: []byte("watwatwat"
), | 58 Payload: []byte("watwatwat"
), |
| 57 » » » » » » RetryOptions: &gae.TQRetryOption
s{AgeLimit: 7 * time.Second}, | 59 » » » » » » RetryOptions: &tqS.RetryOptions{
AgeLimit: 7 * time.Second}, |
| 58 }) | 60 }) |
| 59 }) | 61 }) |
| 60 | 62 |
| 61 Convey("cannot add to bad queues", func() { | 63 Convey("cannot add to bad queues", func() { |
| 62 _, err := tq.Add(nil, "waaat") | 64 _, err := tq.Add(nil, "waaat") |
| 63 So(err.Error(), ShouldContainSubstring,
"UNKNOWN_QUEUE") | 65 So(err.Error(), ShouldContainSubstring,
"UNKNOWN_QUEUE") |
| 64 | 66 |
| 65 Convey("but you can add Queues when test
ing", func() { | 67 Convey("but you can add Queues when test
ing", func() { |
| 66 tq.CreateQueue("waaat") | 68 tq.CreateQueue("waaat") |
| 67 _, err := tq.Add(t, "waaat") | 69 _, err := tq.Add(t, "waaat") |
| (...skipping 12 matching lines...) Expand all Loading... |
| 80 So(tr.Path, ShouldEqual, "/_ah/queue/def
ault") | 82 So(tr.Path, ShouldEqual, "/_ah/queue/def
ault") |
| 81 }) | 83 }) |
| 82 | 84 |
| 83 Convey("cannot add twice", func() { | 85 Convey("cannot add twice", func() { |
| 84 t.Name = "bob" | 86 t.Name = "bob" |
| 85 _, err := tq.Add(t, "") | 87 _, err := tq.Add(t, "") |
| 86 So(err, ShouldBeNil) | 88 So(err, ShouldBeNil) |
| 87 | 89 |
| 88 // can't add the same one twice! | 90 // can't add the same one twice! |
| 89 _, err = tq.Add(t, "") | 91 _, err = tq.Add(t, "") |
| 90 » » » » » So(err, ShouldEqual, gae.ErrTQTaskAlread
yAdded) | 92 » » » » » So(err, ShouldEqual, tqS.ErrTaskAlreadyA
dded) |
| 91 }) | 93 }) |
| 92 | 94 |
| 93 Convey("cannot add deleted task", func() { | 95 Convey("cannot add deleted task", func() { |
| 94 t.Name = "bob" | 96 t.Name = "bob" |
| 95 _, err := tq.Add(t, "") | 97 _, err := tq.Add(t, "") |
| 96 So(err, ShouldBeNil) | 98 So(err, ShouldBeNil) |
| 97 | 99 |
| 98 err = tq.Delete(t, "") | 100 err = tq.Delete(t, "") |
| 99 So(err, ShouldBeNil) | 101 So(err, ShouldBeNil) |
| 100 | 102 |
| 101 // can't add a deleted task! | 103 // can't add a deleted task! |
| 102 _, err = tq.Add(t, "") | 104 _, err = tq.Add(t, "") |
| 103 » » » » » So(err, ShouldEqual, gae.ErrTQTaskAlread
yAdded) | 105 » » » » » So(err, ShouldEqual, tqS.ErrTaskAlreadyA
dded) |
| 104 }) | 106 }) |
| 105 | 107 |
| 106 Convey("cannot set ETA+Delay", func() { | 108 Convey("cannot set ETA+Delay", func() { |
| 107 t.ETA = clock.Now(c).Add(time.Hour) | 109 t.ETA = clock.Now(c).Add(time.Hour) |
| 108 tc.Add(time.Second) | 110 tc.Add(time.Second) |
| 109 t.Delay = time.Hour | 111 t.Delay = time.Hour |
| 110 So(func() { tq.Add(t, "") }, ShouldPanic
) | 112 So(func() { tq.Add(t, "") }, ShouldPanic
) |
| 111 }) | 113 }) |
| 112 | 114 |
| 113 Convey("must use a reasonable method", func() { | 115 Convey("must use a reasonable method", func() { |
| (...skipping 16 matching lines...) Expand all Loading... |
| 130 Convey("invalid names are rejected", func() { | 132 Convey("invalid names are rejected", func() { |
| 131 t.Name = "happy times" | 133 t.Name = "happy times" |
| 132 _, err := tq.Add(t, "") | 134 _, err := tq.Add(t, "") |
| 133 So(err.Error(), ShouldContainSubstring,
"INVALID_TASK_NAME") | 135 So(err.Error(), ShouldContainSubstring,
"INVALID_TASK_NAME") |
| 134 }) | 136 }) |
| 135 | 137 |
| 136 Convey("AddMulti also works", func() { | 138 Convey("AddMulti also works", func() { |
| 137 t2 := dupTask(t) | 139 t2 := dupTask(t) |
| 138 t2.Path = "/hi/city" | 140 t2.Path = "/hi/city" |
| 139 | 141 |
| 140 » » » » » expect := []*gae.TQTask{t, t2} | 142 » » » » » expect := []*tqS.Task{t, t2} |
| 141 | 143 |
| 142 tasks, err := tq.AddMulti(expect, "defau
lt") | 144 tasks, err := tq.AddMulti(expect, "defau
lt") |
| 143 So(err, ShouldBeNil) | 145 So(err, ShouldBeNil) |
| 144 So(len(tasks), ShouldEqual, 2) | 146 So(len(tasks), ShouldEqual, 2) |
| 145 So(len(tq.GetScheduledTasks()["default"]
), ShouldEqual, 2) | 147 So(len(tq.GetScheduledTasks()["default"]
), ShouldEqual, 2) |
| 146 | 148 |
| 147 for i := range expect { | 149 for i := range expect { |
| 148 Convey(fmt.Sprintf("task %d: %s"
, i, expect[i].Path), func() { | 150 Convey(fmt.Sprintf("task %d: %s"
, i, expect[i].Path), func() { |
| 149 expect[i].Method = "POST
" | 151 expect[i].Method = "POST
" |
| 150 expect[i].ETA = now | 152 expect[i].ETA = now |
| 151 So(expect[i].Name, Shoul
dEqual, "") | 153 So(expect[i].Name, Shoul
dEqual, "") |
| 152 So(len(tasks[i].Name), S
houldEqual, 500) | 154 So(len(tasks[i].Name), S
houldEqual, 500) |
| 153 tasks[i].Name = "" | 155 tasks[i].Name = "" |
| 154 So(tasks[i], ShouldResem
ble, expect[i]) | 156 So(tasks[i], ShouldResem
ble, expect[i]) |
| 155 }) | 157 }) |
| 156 } | 158 } |
| 157 }) | 159 }) |
| 158 }) | 160 }) |
| 159 | 161 |
| 160 Convey("Delete", func() { | 162 Convey("Delete", func() { |
| 161 » » » » t := &gae.TQTask{Path: "/hello/world"} | 163 » » » » t := &tqS.Task{Path: "/hello/world"} |
| 162 tEnQ, err := tq.Add(t, "") | 164 tEnQ, err := tq.Add(t, "") |
| 163 So(err, ShouldBeNil) | 165 So(err, ShouldBeNil) |
| 164 | 166 |
| 165 Convey("works", func() { | 167 Convey("works", func() { |
| 166 t.Name = tEnQ.Name | 168 t.Name = tEnQ.Name |
| 167 err := tq.Delete(t, "") | 169 err := tq.Delete(t, "") |
| 168 So(err, ShouldBeNil) | 170 So(err, ShouldBeNil) |
| 169 So(len(tq.GetScheduledTasks()["default"]
), ShouldEqual, 0) | 171 So(len(tq.GetScheduledTasks()["default"]
), ShouldEqual, 0) |
| 170 So(len(tq.GetTombstonedTasks()["default"
]), ShouldEqual, 1) | 172 So(len(tq.GetTombstonedTasks()["default"
]), ShouldEqual, 1) |
| 171 So(tq.GetTombstonedTasks()["default"][tE
nQ.Name], ShouldResemble, tEnQ) | 173 So(tq.GetTombstonedTasks()["default"][tE
nQ.Name], ShouldResemble, tEnQ) |
| (...skipping 27 matching lines...) Expand all Loading... |
| 199 So(err.Error(), ShouldContainSubstring,
"UNKNOWN_TASK") | 201 So(err.Error(), ShouldContainSubstring,
"UNKNOWN_TASK") |
| 200 }) | 202 }) |
| 201 | 203 |
| 202 Convey("DeleteMulti also works", func() { | 204 Convey("DeleteMulti also works", func() { |
| 203 t2 := dupTask(t) | 205 t2 := dupTask(t) |
| 204 t2.Path = "/hi/city" | 206 t2.Path = "/hi/city" |
| 205 tEnQ2, err := tq.Add(t2, "") | 207 tEnQ2, err := tq.Add(t2, "") |
| 206 So(err, ShouldBeNil) | 208 So(err, ShouldBeNil) |
| 207 | 209 |
| 208 Convey("usually works", func() { | 210 Convey("usually works", func() { |
| 209 » » » » » » err = tq.DeleteMulti([]*gae.TQTa
sk{tEnQ, tEnQ2}, "") | 211 » » » » » » err = tq.DeleteMulti([]*tqS.Task
{tEnQ, tEnQ2}, "") |
| 210 So(err, ShouldBeNil) | 212 So(err, ShouldBeNil) |
| 211 So(len(tq.GetScheduledTasks()["d
efault"]), ShouldEqual, 0) | 213 So(len(tq.GetScheduledTasks()["d
efault"]), ShouldEqual, 0) |
| 212 So(len(tq.GetTombstonedTasks()["
default"]), ShouldEqual, 2) | 214 So(len(tq.GetTombstonedTasks()["
default"]), ShouldEqual, 2) |
| 213 }) | 215 }) |
| 214 }) | 216 }) |
| 215 }) | 217 }) |
| 216 }) | 218 }) |
| 217 | 219 |
| 218 Convey("works with transactions", func() { | 220 Convey("works with transactions", func() { |
| 219 » » » t := &gae.TQTask{Path: "/hello/world"} | 221 » » » t := &tqS.Task{Path: "/hello/world"} |
| 220 tEnQ, err := tq.Add(t, "") | 222 tEnQ, err := tq.Add(t, "") |
| 221 So(err, ShouldBeNil) | 223 So(err, ShouldBeNil) |
| 222 | 224 |
| 223 » » » t2 := &gae.TQTask{Path: "/hi/city"} | 225 » » » t2 := &tqS.Task{Path: "/hi/city"} |
| 224 tEnQ2, err := tq.Add(t2, "") | 226 tEnQ2, err := tq.Add(t2, "") |
| 225 So(err, ShouldBeNil) | 227 So(err, ShouldBeNil) |
| 226 | 228 |
| 227 err = tq.Delete(tEnQ2, "") | 229 err = tq.Delete(tEnQ2, "") |
| 228 So(err, ShouldBeNil) | 230 So(err, ShouldBeNil) |
| 229 | 231 |
| 230 Convey("can view regular tasks", func() { | 232 Convey("can view regular tasks", func() { |
| 231 » » » » gae.GetRDS(c).RunInTransaction(func(c context.Co
ntext) error { | 233 » » » » rdsS.Get(c).RunInTransaction(func(c context.Cont
ext) error { |
| 232 » » » » » tq := gae.GetTQ(c).(interface { | 234 » » » » » tq := tqS.Get(c).(interface { |
| 233 » » » » » » gae.TQTestable | 235 » » » » » » tqS.Testable |
| 234 » » » » » » gae.TaskQueue | 236 » » » » » » tqS.Interface |
| 235 }) | 237 }) |
| 236 | 238 |
| 237 So(tq.GetScheduledTasks()["default"][tEn
Q.Name], ShouldResemble, tEnQ) | 239 So(tq.GetScheduledTasks()["default"][tEn
Q.Name], ShouldResemble, tEnQ) |
| 238 So(tq.GetTombstonedTasks()["default"][tE
nQ2.Name], ShouldResemble, tEnQ2) | 240 So(tq.GetTombstonedTasks()["default"][tE
nQ2.Name], ShouldResemble, tEnQ2) |
| 239 So(tq.GetTransactionTasks()["default"],
ShouldBeNil) | 241 So(tq.GetTransactionTasks()["default"],
ShouldBeNil) |
| 240 return nil | 242 return nil |
| 241 }, nil) | 243 }, nil) |
| 242 }) | 244 }) |
| 243 | 245 |
| 244 Convey("can add a new task", func() { | 246 Convey("can add a new task", func() { |
| 245 » » » » tEnQ3 := (*gae.TQTask)(nil) | 247 » » » » tEnQ3 := (*tqS.Task)(nil) |
| 246 | 248 |
| 247 » » » » gae.GetRDS(c).RunInTransaction(func(c context.Co
ntext) error { | 249 » » » » rdsS.Get(c).RunInTransaction(func(c context.Cont
ext) error { |
| 248 » » » » » tq := gae.GetTQ(c).(interface { | 250 » » » » » tq := tqS.Get(c).(interface { |
| 249 » » » » » » gae.TQTestable | 251 » » » » » » tqS.Testable |
| 250 » » » » » » gae.TaskQueue | 252 » » » » » » tqS.Interface |
| 251 }) | 253 }) |
| 252 | 254 |
| 253 » » » » » t3 := &gae.TQTask{Path: "/sandwitch/vict
ory"} | 255 » » » » » t3 := &tqS.Task{Path: "/sandwitch/victor
y"} |
| 254 tEnQ3, err = tq.Add(t3, "") | 256 tEnQ3, err = tq.Add(t3, "") |
| 255 So(err, ShouldBeNil) | 257 So(err, ShouldBeNil) |
| 256 | 258 |
| 257 So(tq.GetScheduledTasks()["default"][tEn
Q.Name], ShouldResemble, tEnQ) | 259 So(tq.GetScheduledTasks()["default"][tEn
Q.Name], ShouldResemble, tEnQ) |
| 258 So(tq.GetTombstonedTasks()["default"][tE
nQ2.Name], ShouldResemble, tEnQ2) | 260 So(tq.GetTombstonedTasks()["default"][tE
nQ2.Name], ShouldResemble, tEnQ2) |
| 259 So(tq.GetTransactionTasks()["default"][0
], ShouldResemble, tEnQ3) | 261 So(tq.GetTransactionTasks()["default"][0
], ShouldResemble, tEnQ3) |
| 260 return nil | 262 return nil |
| 261 }, nil) | 263 }, nil) |
| 262 | 264 |
| 263 // name gets generated at transaction-commit-tim
e | 265 // name gets generated at transaction-commit-tim
e |
| 264 for name := range tq.GetScheduledTasks()["defaul
t"] { | 266 for name := range tq.GetScheduledTasks()["defaul
t"] { |
| 265 if name == tEnQ.Name { | 267 if name == tEnQ.Name { |
| 266 continue | 268 continue |
| 267 } | 269 } |
| 268 tEnQ3.Name = name | 270 tEnQ3.Name = name |
| 269 break | 271 break |
| 270 } | 272 } |
| 271 | 273 |
| 272 So(tq.GetScheduledTasks()["default"][tEnQ.Name],
ShouldResemble, tEnQ) | 274 So(tq.GetScheduledTasks()["default"][tEnQ.Name],
ShouldResemble, tEnQ) |
| 273 So(tq.GetScheduledTasks()["default"][tEnQ3.Name]
, ShouldResemble, tEnQ3) | 275 So(tq.GetScheduledTasks()["default"][tEnQ3.Name]
, ShouldResemble, tEnQ3) |
| 274 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name
], ShouldResemble, tEnQ2) | 276 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name
], ShouldResemble, tEnQ2) |
| 275 So(tq.GetTransactionTasks()["default"], ShouldBe
Nil) | 277 So(tq.GetTransactionTasks()["default"], ShouldBe
Nil) |
| 276 }) | 278 }) |
| 277 | 279 |
| 278 Convey("can a new task (but reset the state in a test)",
func() { | 280 Convey("can a new task (but reset the state in a test)",
func() { |
| 279 » » » » tEnQ3 := (*gae.TQTask)(nil) | 281 » » » » tEnQ3 := (*tqS.Task)(nil) |
| 280 | 282 |
| 281 ttq := interface { | 283 ttq := interface { |
| 282 » » » » » gae.TQTestable | 284 » » » » » tqS.Testable |
| 283 » » » » » gae.TaskQueue | 285 » » » » » tqS.Interface |
| 284 }(nil) | 286 }(nil) |
| 285 | 287 |
| 286 » » » » gae.GetRDS(c).RunInTransaction(func(c context.Co
ntext) error { | 288 » » » » rdsS.Get(c).RunInTransaction(func(c context.Cont
ext) error { |
| 287 » » » » » ttq = gae.GetTQ(c).(interface { | 289 » » » » » ttq = tqS.Get(c).(interface { |
| 288 » » » » » » gae.TQTestable | 290 » » » » » » tqS.Testable |
| 289 » » » » » » gae.TaskQueue | 291 » » » » » » tqS.Interface |
| 290 }) | 292 }) |
| 291 | 293 |
| 292 » » » » » t3 := &gae.TQTask{Path: "/sandwitch/vict
ory"} | 294 » » » » » t3 := &tqS.Task{Path: "/sandwitch/victor
y"} |
| 293 tEnQ3, err = ttq.Add(t3, "") | 295 tEnQ3, err = ttq.Add(t3, "") |
| 294 So(err, ShouldBeNil) | 296 So(err, ShouldBeNil) |
| 295 | 297 |
| 296 So(ttq.GetScheduledTasks()["default"][tE
nQ.Name], ShouldResemble, tEnQ) | 298 So(ttq.GetScheduledTasks()["default"][tE
nQ.Name], ShouldResemble, tEnQ) |
| 297 So(ttq.GetTombstonedTasks()["default"][t
EnQ2.Name], ShouldResemble, tEnQ2) | 299 So(ttq.GetTombstonedTasks()["default"][t
EnQ2.Name], ShouldResemble, tEnQ2) |
| 298 So(ttq.GetTransactionTasks()["default"][
0], ShouldResemble, tEnQ3) | 300 So(ttq.GetTransactionTasks()["default"][
0], ShouldResemble, tEnQ3) |
| 299 | 301 |
| 300 ttq.ResetTasks() | 302 ttq.ResetTasks() |
| 301 | 303 |
| 302 So(len(ttq.GetScheduledTasks()["default"
]), ShouldEqual, 0) | 304 So(len(ttq.GetScheduledTasks()["default"
]), ShouldEqual, 0) |
| 303 So(len(ttq.GetTombstonedTasks()["default
"]), ShouldEqual, 0) | 305 So(len(ttq.GetTombstonedTasks()["default
"]), ShouldEqual, 0) |
| 304 So(len(ttq.GetTransactionTasks()["defaul
t"]), ShouldEqual, 0) | 306 So(len(ttq.GetTransactionTasks()["defaul
t"]), ShouldEqual, 0) |
| 305 | 307 |
| 306 return nil | 308 return nil |
| 307 }, nil) | 309 }, nil) |
| 308 | 310 |
| 309 So(len(tq.GetScheduledTasks()["default"]), Shoul
dEqual, 0) | 311 So(len(tq.GetScheduledTasks()["default"]), Shoul
dEqual, 0) |
| 310 So(len(tq.GetTombstonedTasks()["default"]), Shou
ldEqual, 0) | 312 So(len(tq.GetTombstonedTasks()["default"]), Shou
ldEqual, 0) |
| 311 So(len(tq.GetTransactionTasks()["default"]), Sho
uldEqual, 0) | 313 So(len(tq.GetTransactionTasks()["default"]), Sho
uldEqual, 0) |
| 312 | 314 |
| 313 Convey("and reusing a closed context is bad time
s", func() { | 315 Convey("and reusing a closed context is bad time
s", func() { |
| 314 _, err := ttq.Add(nil, "") | 316 _, err := ttq.Add(nil, "") |
| 315 So(err.Error(), ShouldContainSubstring,
"expired") | 317 So(err.Error(), ShouldContainSubstring,
"expired") |
| 316 }) | 318 }) |
| 317 }) | 319 }) |
| 318 | 320 |
| 319 Convey("you can AddMulti as well", func() { | 321 Convey("you can AddMulti as well", func() { |
| 320 » » » » gae.GetRDS(c).RunInTransaction(func(c context.Co
ntext) error { | 322 » » » » rdsS.Get(c).RunInTransaction(func(c context.Cont
ext) error { |
| 321 » » » » » tq := gae.GetTQ(c).(interface { | 323 » » » » » tq := tqS.Get(c).(interface { |
| 322 » » » » » » gae.TQTestable | 324 » » » » » » tqS.Testable |
| 323 » » » » » » gae.TaskQueue | 325 » » » » » » tqS.Interface |
| 324 }) | 326 }) |
| 325 » » » » » _, err := tq.AddMulti([]*gae.TQTask{t, t
, t}, "") | 327 » » » » » _, err := tq.AddMulti([]*tqS.Task{t, t,
t}, "") |
| 326 So(err, ShouldBeNil) | 328 So(err, ShouldBeNil) |
| 327 So(len(tq.GetScheduledTasks()["default"]
), ShouldEqual, 1) | 329 So(len(tq.GetScheduledTasks()["default"]
), ShouldEqual, 1) |
| 328 So(len(tq.GetTransactionTasks()["default
"]), ShouldEqual, 3) | 330 So(len(tq.GetTransactionTasks()["default
"]), ShouldEqual, 3) |
| 329 return nil | 331 return nil |
| 330 }, nil) | 332 }, nil) |
| 331 So(len(tq.GetScheduledTasks()["default"]), Shoul
dEqual, 4) | 333 So(len(tq.GetScheduledTasks()["default"]), Shoul
dEqual, 4) |
| 332 So(len(tq.GetTransactionTasks()["default"]), Sho
uldEqual, 0) | 334 So(len(tq.GetTransactionTasks()["default"]), Sho
uldEqual, 0) |
| 333 }) | 335 }) |
| 334 | 336 |
| 335 Convey("unless you add too many things", func() { | 337 Convey("unless you add too many things", func() { |
| 336 » » » » gae.GetRDS(c).RunInTransaction(func(c context.Co
ntext) error { | 338 » » » » rdsS.Get(c).RunInTransaction(func(c context.Cont
ext) error { |
| 337 for i := 0; i < 5; i++ { | 339 for i := 0; i < 5; i++ { |
| 338 » » » » » » _, err = gae.GetTQ(c).Add(t, "") | 340 » » » » » » _, err = tqS.Get(c).Add(t, "") |
| 339 So(err, ShouldBeNil) | 341 So(err, ShouldBeNil) |
| 340 } | 342 } |
| 341 » » » » » _, err = gae.GetTQ(c).Add(t, "") | 343 » » » » » _, err = tqS.Get(c).Add(t, "") |
| 342 So(err.Error(), ShouldContainSubstring,
"BAD_REQUEST") | 344 So(err.Error(), ShouldContainSubstring,
"BAD_REQUEST") |
| 343 return nil | 345 return nil |
| 344 }, nil) | 346 }, nil) |
| 345 }) | 347 }) |
| 346 | 348 |
| 347 Convey("unless you Add to a bad queue", func() { | 349 Convey("unless you Add to a bad queue", func() { |
| 348 » » » » gae.GetRDS(c).RunInTransaction(func(c context.Co
ntext) error { | 350 » » » » rdsS.Get(c).RunInTransaction(func(c context.Cont
ext) error { |
| 349 » » » » » _, err = gae.GetTQ(c).Add(t, "meat") | 351 » » » » » _, err = tqS.Get(c).Add(t, "meat") |
| 350 So(err.Error(), ShouldContainSubstring,
"UNKNOWN_QUEUE") | 352 So(err.Error(), ShouldContainSubstring,
"UNKNOWN_QUEUE") |
| 351 | 353 |
| 352 Convey("unless you add it!", func() { | 354 Convey("unless you add it!", func() { |
| 353 » » » » » » gae.GetTQ(c).(gae.TQTestable).Cr
eateQueue("meat") | 355 » » » » » » tqS.Get(c).(tqS.Testable).Create
Queue("meat") |
| 354 » » » » » » _, err = gae.GetTQ(c).Add(t, "me
at") | 356 » » » » » » _, err = tqS.Get(c).Add(t, "meat
") |
| 355 So(err, ShouldBeNil) | 357 So(err, ShouldBeNil) |
| 356 }) | 358 }) |
| 357 | 359 |
| 358 return nil | 360 return nil |
| 359 }, nil) | 361 }, nil) |
| 360 }) | 362 }) |
| 361 | 363 |
| 362 Convey("No other features are available, however", func(
) { | 364 Convey("No other features are available, however", func(
) { |
| 363 err := error(nil) | 365 err := error(nil) |
| 364 func() { | 366 func() { |
| 365 defer func() { err = recover().(error) }
() | 367 defer func() { err = recover().(error) }
() |
| 366 » » » » » gae.GetRDS(c).RunInTransaction(func(c co
ntext.Context) error { | 368 » » » » » rdsS.Get(c).RunInTransaction(func(c cont
ext.Context) error { |
| 367 » » » » » » gae.GetTQ(c).Delete(t, "") | 369 » » » » » » tqS.Get(c).Delete(t, "") |
| 368 return nil | 370 return nil |
| 369 }, nil) | 371 }, nil) |
| 370 }() | 372 }() |
| 371 So(err.Error(), ShouldContainSubstring, "TaskQue
ue.Delete") | 373 So(err.Error(), ShouldContainSubstring, "TaskQue
ue.Delete") |
| 372 }) | 374 }) |
| 373 | 375 |
| 374 Convey("adding a new task only happens if we don't errou
t", func() { | 376 Convey("adding a new task only happens if we don't errou
t", func() { |
| 375 » » » » gae.GetRDS(c).RunInTransaction(func(c context.Co
ntext) error { | 377 » » » » rdsS.Get(c).RunInTransaction(func(c context.Cont
ext) error { |
| 376 » » » » » t3 := &gae.TQTask{Path: "/sandwitch/vict
ory"} | 378 » » » » » t3 := &tqS.Task{Path: "/sandwitch/victor
y"} |
| 377 » » » » » _, err = gae.GetTQ(c).Add(t3, "") | 379 » » » » » _, err = tqS.Get(c).Add(t3, "") |
| 378 So(err, ShouldBeNil) | 380 So(err, ShouldBeNil) |
| 379 return fmt.Errorf("nooooo") | 381 return fmt.Errorf("nooooo") |
| 380 }, nil) | 382 }, nil) |
| 381 | 383 |
| 382 So(tq.GetScheduledTasks()["default"][tEnQ.Name],
ShouldResemble, tEnQ) | 384 So(tq.GetScheduledTasks()["default"][tEnQ.Name],
ShouldResemble, tEnQ) |
| 383 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name
], ShouldResemble, tEnQ2) | 385 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name
], ShouldResemble, tEnQ2) |
| 384 So(tq.GetTransactionTasks()["default"], ShouldBe
Nil) | 386 So(tq.GetTransactionTasks()["default"], ShouldBe
Nil) |
| 385 }) | 387 }) |
| 386 | 388 |
| 387 Convey("likewise, a panic doesn't schedule anything", fu
nc() { | 389 Convey("likewise, a panic doesn't schedule anything", fu
nc() { |
| 388 func() { | 390 func() { |
| 389 defer func() { recover() }() | 391 defer func() { recover() }() |
| 390 » » » » » gae.GetRDS(c).RunInTransaction(func(c co
ntext.Context) error { | 392 » » » » » rdsS.Get(c).RunInTransaction(func(c cont
ext.Context) error { |
| 391 » » » » » » tq := gae.GetTQ(c).(interface { | 393 » » » » » » tq := tqS.Get(c).(interface { |
| 392 » » » » » » » gae.TQTestable | 394 » » » » » » » tqS.Testable |
| 393 » » » » » » » gae.TaskQueue | 395 » » » » » » » tqS.Interface |
| 394 }) | 396 }) |
| 395 | 397 |
| 396 » » » » » » t3 := &gae.TQTask{Path: "/sandwi
tch/victory"} | 398 » » » » » » t3 := &tqS.Task{Path: "/sandwitc
h/victory"} |
| 397 _, err = tq.Add(t3, "") | 399 _, err = tq.Add(t3, "") |
| 398 So(err, ShouldBeNil) | 400 So(err, ShouldBeNil) |
| 399 | 401 |
| 400 panic(fmt.Errorf("nooooo")) | 402 panic(fmt.Errorf("nooooo")) |
| 401 }, nil) | 403 }, nil) |
| 402 }() | 404 }() |
| 403 | 405 |
| 404 So(tq.GetScheduledTasks()["default"][tEnQ.Name],
ShouldResemble, tEnQ) | 406 So(tq.GetScheduledTasks()["default"][tEnQ.Name],
ShouldResemble, tEnQ) |
| 405 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name
], ShouldResemble, tEnQ2) | 407 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name
], ShouldResemble, tEnQ2) |
| 406 So(tq.GetTransactionTasks()["default"], ShouldBe
Nil) | 408 So(tq.GetTransactionTasks()["default"], ShouldBe
Nil) |
| 407 }) | 409 }) |
| 408 | 410 |
| 409 }) | 411 }) |
| 410 }) | 412 }) |
| 411 } | 413 } |
| OLD | NEW |