@@ -13,6 +13,20 @@ import (
1313)
1414
1515type successfulCompletionHandler struct {
16+ expectedStartTime time.Time
17+ expectedCloseTime time.Time
18+ }
19+
20+ // validateExpectedTime returns false if the times are set but aren't equal.
21+ func validateExpectedTime (expected , actual time.Time , resolution time.Duration ) bool {
22+ if expected .IsZero () {
23+ return true
24+ }
25+
26+ expected = expected .Truncate (resolution )
27+ actual = actual .Truncate (resolution )
28+
29+ return expected .Equal (actual )
1630}
1731
1832func (h * successfulCompletionHandler ) CompleteOperation (ctx context.Context , completion * CompletionRequest ) error {
@@ -37,6 +51,12 @@ func (h *successfulCompletionHandler) CompleteOperation(ctx context.Context, com
3751 if len (completion .Links ) == 0 {
3852 return HandlerErrorf (HandlerErrorTypeBadRequest , "expected Links to be set on CompletionRequest" )
3953 }
54+ if ! validateExpectedTime (h .expectedStartTime , completion .StartTime , time .Second ) {
55+ return HandlerErrorf (HandlerErrorTypeBadRequest , "expected StartTime to be equal" )
56+ }
57+ if ! validateExpectedTime (h .expectedCloseTime , completion .CloseTime , time .Millisecond ) {
58+ return HandlerErrorf (HandlerErrorTypeBadRequest , "expected CloseTime to be equal" )
59+ }
4060 var result int
4161 err := completion .Result .Consume (& result )
4262 if err != nil {
@@ -49,12 +69,19 @@ func (h *successfulCompletionHandler) CompleteOperation(ctx context.Context, com
4969}
5070
5171func TestSuccessfulCompletion (t * testing.T ) {
52- ctx , callbackURL , teardown := setupForCompletion (t , & successfulCompletionHandler {}, nil , nil )
72+ startTime := time .Now ().Add (- time .Hour ).UTC ()
73+ closeTime := time .Now ().UTC ()
74+
75+ ctx , callbackURL , teardown := setupForCompletion (t , & successfulCompletionHandler {
76+ expectedStartTime : startTime ,
77+ expectedCloseTime : closeTime ,
78+ }, nil , nil )
5379 defer teardown ()
5480
5581 completion , err := NewOperationCompletionSuccessful (666 , OperationCompletionSuccessfulOptions {
5682 OperationToken : "test-operation-token" ,
57- StartTime : time .Now (),
83+ StartTime : startTime ,
84+ CloseTime : closeTime ,
5885 Links : []Link {{
5986 URL : & url.URL {
6087 Scheme : "https" ,
@@ -113,7 +140,9 @@ func TestSuccessfulCompletion_CustomSerializer(t *testing.T) {
113140}
114141
115142type failureExpectingCompletionHandler struct {
116- errorChecker func (error ) error
143+ errorChecker func (error ) error
144+ expectedStartTime time.Time
145+ expectedCloseTime time.Time
117146}
118147
119148func (h * failureExpectingCompletionHandler ) CompleteOperation (ctx context.Context , completion * CompletionRequest ) error {
@@ -135,24 +164,36 @@ func (h *failureExpectingCompletionHandler) CompleteOperation(ctx context.Contex
135164 if len (completion .Links ) == 0 {
136165 return HandlerErrorf (HandlerErrorTypeBadRequest , "expected Links to be set on CompletionRequest" )
137166 }
167+ if ! validateExpectedTime (h .expectedStartTime , completion .StartTime , time .Second ) {
168+ return HandlerErrorf (HandlerErrorTypeBadRequest , "expected StartTime to be equal" )
169+ }
170+ if ! validateExpectedTime (h .expectedCloseTime , completion .CloseTime , time .Millisecond ) {
171+ return HandlerErrorf (HandlerErrorTypeBadRequest , "expected CloseTime to be equal" )
172+ }
138173
139174 return nil
140175}
141176
142177func TestFailureCompletion (t * testing.T ) {
178+ startTime := time .Now ().Add (- time .Hour ).UTC ()
179+ closeTime := time .Now ().UTC ()
180+
143181 ctx , callbackURL , teardown := setupForCompletion (t , & failureExpectingCompletionHandler {
144182 errorChecker : func (err error ) error {
145183 if err .Error () != "expected message" {
146184 return HandlerErrorf (HandlerErrorTypeBadRequest , "invalid failure: %v" , err )
147185 }
148186 return nil
149187 },
188+ expectedStartTime : startTime ,
189+ expectedCloseTime : closeTime ,
150190 }, nil , nil )
151191 defer teardown ()
152192
153193 completion , err := NewOperationCompletionUnsuccessful (NewCanceledOperationError (errors .New ("expected message" )), OperationCompletionUnsuccessfulOptions {
154194 OperationToken : "test-operation-token" ,
155- StartTime : time .Now (),
195+ StartTime : startTime ,
196+ CloseTime : closeTime ,
156197 Links : []Link {{
157198 URL : & url.URL {
158199 Scheme : "https" ,
@@ -177,20 +218,26 @@ func TestFailureCompletion(t *testing.T) {
177218
178219func TestFailureCompletion_CustomFailureConverter (t * testing.T ) {
179220 fc := customFailureConverter {}
221+ startTime := time .Now ().Add (- time .Hour ).UTC ()
222+ closeTime := time .Now ().UTC ()
223+
180224 ctx , callbackURL , teardown := setupForCompletion (t , & failureExpectingCompletionHandler {
181225 errorChecker : func (err error ) error {
182226 if ! errors .Is (err , errCustom ) {
183227 return HandlerErrorf (HandlerErrorTypeBadRequest , "invalid failure, expected a custom error: %v" , err )
184228 }
185229 return nil
186230 },
231+ expectedStartTime : startTime ,
232+ expectedCloseTime : closeTime ,
187233 }, nil , fc )
188234 defer teardown ()
189235
190236 completion , err := NewOperationCompletionUnsuccessful (NewCanceledOperationError (errors .New ("expected message" )), OperationCompletionUnsuccessfulOptions {
191237 FailureConverter : fc ,
192238 OperationToken : "test-operation-token" ,
193- StartTime : time .Now (),
239+ StartTime : startTime ,
240+ CloseTime : closeTime ,
194241 Links : []Link {{
195242 URL : & url.URL {
196243 Scheme : "https" ,
0 commit comments