Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(81)

Side by Side Diff: go/src/infra/gae/libs/wrapper/memory/taskqueue_test.go

Issue 1154213012: Add context-aware "time" library wrapper. (Closed) Base URL: https://chromium.googlesource.com/infra/infra.git@master
Patch Set: Removed goroutine safety from testtimer. Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "infra/gae/libs/wrapper" 9 "infra/gae/libs/wrapper"
10 "infra/libs/clock"
11 "infra/libs/clock/testclock"
10 "math/rand" 12 "math/rand"
11 "net/http" 13 "net/http"
12 "testing" 14 "testing"
13 "time" 15 "time"
14 16
15 . "github.com/smartystreets/goconvey/convey" 17 . "github.com/smartystreets/goconvey/convey"
16 "golang.org/x/net/context" 18 "golang.org/x/net/context"
17 19
18 "appengine/taskqueue" 20 "appengine/taskqueue"
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 » » timeNow := func(context.Context) time.Time { 28 » » tc := testclock.New(now)
27 » » » ret := now 29 » » c := clock.SetClock(context.Background(), tc)
28 » » » now = now.Add(time.Second) 30 » » c = wrapper.SetMathRand(c, rand.New(rand.NewSource(clock.Now(c). UnixNano())))
29 » » » return ret
30 » » }
31 » » c := wrapper.SetTimeNowFactory(context.Background(), timeNow)
32 » » c = wrapper.SetMathRand(c, rand.New(rand.NewSource(wrapper.GetTi meNow(c).UnixNano())))
33 c = Use(c) 31 c = Use(c)
34 32
35 tq := wrapper.GetTQ(c).(interface { 33 tq := wrapper.GetTQ(c).(interface {
36 wrapper.TQMultiReadWriter 34 wrapper.TQMultiReadWriter
37 wrapper.TQTestable 35 wrapper.TQTestable
38 }) 36 })
39 37
40 So(tq, ShouldNotBeNil) 38 So(tq, ShouldNotBeNil)
41 39
42 Convey("implements TQMultiReadWriter", func() { 40 Convey("implements TQMultiReadWriter", func() {
43 Convey("Add", func() { 41 Convey("Add", func() {
44 t := &taskqueue.Task{Path: "/hello/world"} 42 t := &taskqueue.Task{Path: "/hello/world"}
45 43
46 Convey("works", func() { 44 Convey("works", func() {
47 curTime := now
48 t.Delay = 4 * time.Second 45 t.Delay = 4 * time.Second
49 t.Header = http.Header{} 46 t.Header = http.Header{}
50 t.Header.Add("Cat", "tabby") 47 t.Header.Add("Cat", "tabby")
51 t.Payload = []byte("watwatwat") 48 t.Payload = []byte("watwatwat")
52 t.RetryOptions = &taskqueue.RetryOptions {AgeLimit: 7 * time.Second} 49 t.RetryOptions = &taskqueue.RetryOptions {AgeLimit: 7 * time.Second}
53 _, err := tq.Add(t, "") 50 _, err := tq.Add(t, "")
54 So(err, ShouldBeNil) 51 So(err, ShouldBeNil)
55 name := "Z_UjshxM9ecyMQfGbZmUGOEcgxWU0_5 CGLl_-RntudwAw2DqQ5-58bzJiWQN4OKzeuUb9O4JrPkUw2rOvk2Ax46THojnQ6avBQgZdrKcJmrwQ6o 4qKfJdiyUbGXvy691yRfzLeQhs6cBhWrgf3wH-VPMcA4SC-zlbJ2U8An7I0zJQA5nBFnMNoMgT-2peGo ay3rCSbj4z9VFFm9kS_i6JCaQH518ujLDSNCYdjTq6B6lcWrZAh0U_q3a1S2nXEwrKiw_t9MTNQFgAQZ WyGBbvZQPmeRYtu8SPaWzTfd25v_YWgBuVL2rRSPSMvlDwE04nNdtvVzE8vNNiA1zRimmdzKeqATQF9_ ReUvj4D7U8dcS703DZWfKMBLgBffY9jqCassOOOw77V72Oq5EVauUw3Qw0L6bBsfM9FtahTKUdabzRZj XUoze3EK4KXPt3-wdidau-8JrVf2XFocjjZbwHoxcGvbtT3b4nGLDlgwdC00bwaFBZWff" 52 name := "Z_UjshxM9ecyMQfGbZmUGOEcgxWU0_5 CGLl_-RntudwAw2DqQ5-58bzJiWQN4OKzeuUb9O4JrPkUw2rOvk2Ax46THojnQ6avBQgZdrKcJmrwQ6o 4qKfJdiyUbGXvy691yRfzLeQhs6cBhWrgf3wH-VPMcA4SC-zlbJ2U8An7I0zJQA5nBFnMNoMgT-2peGo ay3rCSbj4z9VFFm9kS_i6JCaQH518ujLDSNCYdjTq6B6lcWrZAh0U_q3a1S2nXEwrKiw_t9MTNQFgAQZ WyGBbvZQPmeRYtu8SPaWzTfd25v_YWgBuVL2rRSPSMvlDwE04nNdtvVzE8vNNiA1zRimmdzKeqATQF9_ ReUvj4D7U8dcS703DZWfKMBLgBffY9jqCassOOOw77V72Oq5EVauUw3Qw0L6bBsfM9FtahTKUdabzRZj XUoze3EK4KXPt3-wdidau-8JrVf2XFocjjZbwHoxcGvbtT3b4nGLDlgwdC00bwaFBZWff"
56 So(*tq.GetScheduledTasks()["default"][na me], ShouldResemble, taskqueue.Task{ 53 So(*tq.GetScheduledTasks()["default"][na me], ShouldResemble, taskqueue.Task{
57 » » » » » » ETA: curTime.Add(4 * ti me.Second), 54 » » » » » » ETA: now.Add(4 * time.S econd),
58 Header: http.Header{"Cat": []string{"tabby"}}, 55 Header: http.Header{"Cat": []string{"tabby"}},
59 Method: "POST", 56 Method: "POST",
60 Name: name, 57 Name: name,
61 Path: "/hello/world", 58 Path: "/hello/world",
62 Payload: []byte("watwatwat" ), 59 Payload: []byte("watwatwat" ),
63 RetryOptions: &taskqueue.RetryOp tions{AgeLimit: 7 * time.Second}, 60 RetryOptions: &taskqueue.RetryOp tions{AgeLimit: 7 * time.Second},
64 }) 61 })
65 }) 62 })
66 63
67 Convey("cannot add to bad queues", func() { 64 Convey("cannot add to bad queues", func() {
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
103 100
104 err = tq.Delete(t, "") 101 err = tq.Delete(t, "")
105 So(err, ShouldBeNil) 102 So(err, ShouldBeNil)
106 103
107 // can't add a deleted task! 104 // can't add a deleted task!
108 _, err = tq.Add(t, "") 105 _, err = tq.Add(t, "")
109 So(err, ShouldEqual, taskqueue.ErrTaskAl readyAdded) 106 So(err, ShouldEqual, taskqueue.ErrTaskAl readyAdded)
110 }) 107 })
111 108
112 Convey("cannot set ETA+Delay", func() { 109 Convey("cannot set ETA+Delay", func() {
113 » » » » » t.ETA = wrapper.GetTimeNow(c).Add(time.H our) 110 » » » » » t.ETA = clock.Now(c).Add(time.Hour)
111 » » » » » tc.Add(time.Second)
114 t.Delay = time.Hour 112 t.Delay = time.Hour
115 So(func() { tq.Add(t, "") }, ShouldPanic ) 113 So(func() { tq.Add(t, "") }, ShouldPanic )
116 }) 114 })
117 115
118 Convey("must use a reasonable method", func() { 116 Convey("must use a reasonable method", func() {
119 t.Method = "Crystal" 117 t.Method = "Crystal"
120 _, err := tq.Add(t, "") 118 _, err := tq.Add(t, "")
121 So(err.Error(), ShouldContainSubstring, "bad method") 119 So(err.Error(), ShouldContainSubstring, "bad method")
122 }) 120 })
123 121
(...skipping 14 matching lines...) Expand all
138 So(err.Error(), ShouldContainSubstring, "INVALID_TASK_NAME") 136 So(err.Error(), ShouldContainSubstring, "INVALID_TASK_NAME")
139 }) 137 })
140 138
141 Convey("can be broken", func() { 139 Convey("can be broken", func() {
142 tq.BreakFeatures(nil, "Add") 140 tq.BreakFeatures(nil, "Add")
143 _, err := tq.Add(t, "") 141 _, err := tq.Add(t, "")
144 So(err.Error(), ShouldContainSubstring, "TRANSIENT_ERROR") 142 So(err.Error(), ShouldContainSubstring, "TRANSIENT_ERROR")
145 }) 143 })
146 144
147 Convey("AddMulti also works", func() { 145 Convey("AddMulti also works", func() {
148 curTime := now
149
150 t2 := dupTask(t) 146 t2 := dupTask(t)
151 t2.Path = "/hi/city" 147 t2.Path = "/hi/city"
152 148
153 expect := []*taskqueue.Task{t, t2} 149 expect := []*taskqueue.Task{t, t2}
154 150
155 tasks, err := tq.AddMulti(expect, "defau lt") 151 tasks, err := tq.AddMulti(expect, "defau lt")
156 So(err, ShouldBeNil) 152 So(err, ShouldBeNil)
157 So(len(tasks), ShouldEqual, 2) 153 So(len(tasks), ShouldEqual, 2)
158 So(len(tq.GetScheduledTasks()["default"] ), ShouldEqual, 2) 154 So(len(tq.GetScheduledTasks()["default"] ), ShouldEqual, 2)
159 155
160 for i := range expect { 156 for i := range expect {
161 Convey(fmt.Sprintf("task %d: %s" , i, expect[i].Path), func() { 157 Convey(fmt.Sprintf("task %d: %s" , i, expect[i].Path), func() {
162 expect[i].Method = "POST " 158 expect[i].Method = "POST "
163 » » » » » » » expect[i].ETA = curTime. Add(time.Duration(i) * time.Second) 159 » » » » » » » expect[i].ETA = now
164 So(expect[i].Name, Shoul dEqual, "") 160 So(expect[i].Name, Shoul dEqual, "")
165 So(len(tasks[i].Name), S houldEqual, 500) 161 So(len(tasks[i].Name), S houldEqual, 500)
166 tasks[i].Name = "" 162 tasks[i].Name = ""
167 So(tasks[i], ShouldResem ble, expect[i]) 163 So(tasks[i], ShouldResem ble, expect[i])
168 }) 164 })
169 } 165 }
170 166
171 Convey("can be broken", func() { 167 Convey("can be broken", func() {
172 tq.BreakFeatures(nil, "AddMulti" ) 168 tq.BreakFeatures(nil, "AddMulti" )
173 _, err := tq.AddMulti([]*taskque ue.Task{t}, "") 169 _, err := tq.AddMulti([]*taskque ue.Task{t}, "")
(...skipping 289 matching lines...) Expand 10 before | Expand all | Expand 10 after
463 }() 459 }()
464 460
465 So(tq.GetScheduledTasks()["default"][tEnQ.Name], ShouldResemble, tEnQ) 461 So(tq.GetScheduledTasks()["default"][tEnQ.Name], ShouldResemble, tEnQ)
466 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name ], ShouldResemble, tEnQ2) 462 So(tq.GetTombstonedTasks()["default"][tEnQ2.Name ], ShouldResemble, tEnQ2)
467 So(tq.GetTransactionTasks()["default"], ShouldBe Nil) 463 So(tq.GetTransactionTasks()["default"], ShouldBe Nil)
468 }) 464 })
469 465
470 }) 466 })
471 }) 467 })
472 } 468 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698