From e4a56acf286dd972ed328789dbc1c6473e3b4486 Mon Sep 17 00:00:00 2001 From: Pete Moore Date: Mon, 17 Jul 2017 17:27:48 +0200 Subject: [PATCH] Bug 1380978 - Resolve with malformed-payload exception if artifact expires after task expiry --- main.go | 3 ++ payload_test.go | 89 ++++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 87 insertions(+), 5 deletions(-) diff --git a/main.go b/main.go index 3e4bbde5..6b3fa5d3 100644 --- a/main.go +++ b/main.go @@ -790,6 +790,9 @@ func (task *TaskRun) validatePayload() *CommandExecutionError { if time.Time(artifact.Expires).Before(time.Time(task.Definition.Deadline)) { return MalformedPayloadError(fmt.Errorf("Malformed payload: artifact '%v' expires before task deadline (%v is before %v)", artifact.Path, artifact.Expires, task.Definition.Deadline)) } + if time.Time(artifact.Expires).After(time.Time(task.Definition.Expires)) { + return MalformedPayloadError(fmt.Errorf("Malformed payload: artifact '%v' expires after task expiry (%v is after %v)", artifact.Path, artifact.Expires, task.Definition.Expires)) + } } return nil } diff --git a/payload_test.go b/payload_test.go index 52e9d907..d8cbc55a 100644 --- a/payload_test.go +++ b/payload_test.go @@ -111,9 +111,20 @@ func TestValidPayload(t *testing.T) { }`)) } +// This little hack is to make sure we get a timestamp which is truncated to +// the millisecond +func NowMillis(t *testing.T) (now time.Time) { + var err error + now, err = time.Parse(time.RFC3339, tcclient.Time(time.Now()).String()) + if err != nil { + t.Fatalf("Error parsing timestamp - %v", err) + } + return +} + // If an artifact expires before task deadline we should get a Malformed Payload func TestArtifactExpiresBeforeDeadline(t *testing.T) { - now := time.Now() + now := NowMillis(t) task := taskWithPayload(`{ "env": { "XPI_NAME": "dist/example_add-on-0.0.1.zip" @@ -129,12 +140,13 @@ func TestArtifactExpiresBeforeDeadline(t *testing.T) { ] }`) task.Definition.Deadline = tcclient.Time(now.Add(time.Minute * 10)) + task.Definition.Expires = tcclient.Time(now.Add(time.Minute * 20)) ensureMalformedPayload(t, task) } -// If artifact expires after task deadline, we should not get a Malformed Payload -func TestArtifactExpiresAfterDeadline(t *testing.T) { - now := time.Now() +// If artifact expires with task deadline, we should not get a Malformed Payload +func TestArtifactExpiresWithDeadline(t *testing.T) { + now := NowMillis(t) task := taskWithPayload(`{ "env": { "XPI_NAME": "dist/example_add-on-0.0.1.zip" @@ -149,6 +161,73 @@ func TestArtifactExpiresAfterDeadline(t *testing.T) { } ] }`) - task.Definition.Deadline = tcclient.Time(now.Add(time.Minute * 5)) + task.Definition.Deadline = tcclient.Time(now.Add(time.Minute * 10)) + task.Definition.Expires = tcclient.Time(now.Add(time.Minute * 20)) + ensureValidPayload(t, task) +} + +// If artifact expires after task deadline, but before task expiry, we should not get a Malformed Payload +func TestArtifactExpiresBetweenDeadlineAndTaskExpiry(t *testing.T) { + now := NowMillis(t) + task := taskWithPayload(`{ + "env": { + "XPI_NAME": "dist/example_add-on-0.0.1.zip" + }, + "maxRunTime": 3, + ` + rawHelloGoodbye() + `, + "artifacts": [ + { + "type": "file", + "path": "public/some/artifact", + "expires": "` + tcclient.Time(now.Add(time.Minute*15)).String() + `" + } + ] +}`) + task.Definition.Deadline = tcclient.Time(now.Add(time.Minute * 10)) + task.Definition.Expires = tcclient.Time(now.Add(time.Minute * 20)) + ensureValidPayload(t, task) +} + +// If artifact expires with task expiry, we should not get a Malformed Payload +func TestArtifactExpiresWithTask(t *testing.T) { + now := NowMillis(t) + task := taskWithPayload(`{ + "env": { + "XPI_NAME": "dist/example_add-on-0.0.1.zip" + }, + "maxRunTime": 3, + ` + rawHelloGoodbye() + `, + "artifacts": [ + { + "type": "file", + "path": "public/some/artifact", + "expires": "` + tcclient.Time(now.Add(time.Minute*20)).String() + `" + } + ] +}`) + task.Definition.Deadline = tcclient.Time(now.Add(time.Minute * 10)) + task.Definition.Expires = tcclient.Time(now.Add(time.Minute * 20)) ensureValidPayload(t, task) } + +// If an artifact expires after task expiry we should get a Malformed Payload +func TestArtifactExpiresAfterTaskExpiry(t *testing.T) { + now := NowMillis(t) + task := taskWithPayload(`{ + "env": { + "XPI_NAME": "dist/example_add-on-0.0.1.zip" + }, + "maxRunTime": 3, + ` + rawHelloGoodbye() + `, + "artifacts": [ + { + "type": "file", + "path": "public/some/artifact", + "expires": "` + tcclient.Time(now.Add(time.Minute*25)).String() + `" + } + ] +}`) + task.Definition.Deadline = tcclient.Time(now.Add(time.Minute * 10)) + task.Definition.Expires = tcclient.Time(now.Add(time.Minute * 20)) + ensureMalformedPayload(t, task) +}