github.com/Foodji/aws-lambda-go@v1.20.2/events/codebuild_test.go (about) 1 package events 2 3 import ( 4 "encoding/json" 5 "io/ioutil" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/require" 10 ) 11 12 func TestUnmarshalCodeBuildEvent(t *testing.T) { 13 tests := []struct { 14 input string 15 expect CodeBuildEvent 16 }{ 17 { 18 input: "testdata/codebuild-state-change.json", 19 expect: CodeBuildEvent{ 20 Version: "0", 21 ID: "c030038d-8c4d-6141-9545-00ff7b7153EX", 22 DetailType: CodeBuildStateChangeDetailType, 23 Source: CodeBuildEventSource, 24 AccountID: "123456789012", 25 Time: time.Date(2017, 9, 1, 16, 14, 28, 0, time.UTC), 26 Region: "us-west-2", 27 Resources: []string{ 28 "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", 29 }, 30 Detail: CodeBuildEventDetail{ 31 BuildStatus: CodeBuildPhaseStatusSucceeded, 32 ProjectName: "my-sample-project", 33 BuildID: "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", 34 AdditionalInformation: CodeBuildEventAdditionalInformation{ 35 Artifact: CodeBuildArtifact{ 36 MD5Sum: "da9c44c8a9a3cd4b443126e823168fEX", 37 SHA256Sum: "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX", 38 Location: "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip", 39 }, 40 Environment: CodeBuildEnvironment{ 41 Image: "aws/codebuild/standard:2.0", 42 PrivilegedMode: false, 43 ComputeType: "BUILD_GENERAL1_SMALL", 44 Type: "LINUX_CONTAINER", 45 EnvironmentVariables: []CodeBuildEnvironmentVariable{ 46 { 47 Name: "TEST", 48 Type: "PLAINTEXT", 49 Value: "TEST", 50 }, 51 }, 52 }, 53 Timeout: DurationMinutes(60 * time.Minute), 54 BuildComplete: true, 55 Initiator: "MyCodeBuildDemoUser", 56 BuildStartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 57 Source: CodeBuildSource{ 58 Location: "codebuild-123456789012-input-bucket/my-input-artifact.zip", 59 Type: "S3", 60 }, 61 Logs: CodeBuildLogs{ 62 GroupName: "/aws/codebuild/my-sample-project", 63 StreamName: "8745a7a9-c340-456a-9166-edf953571bEX", 64 DeepLink: "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX", 65 }, 66 Phases: []CodeBuildPhase{ 67 { 68 PhaseContext: []interface{}{}, 69 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 70 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 71 Duration: DurationSeconds(0), 72 PhaseType: CodeBuildPhaseTypeSubmitted, 73 PhaseStatus: CodeBuildPhaseStatusSucceeded, 74 }, 75 { 76 PhaseContext: []interface{}{}, 77 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 78 EndTime: CodeBuildTime(time.Date(2019, 9, 13, 4, 12, 29, 0, time.UTC)), 79 Duration: DurationSeconds(0), 80 PhaseType: CodeBuildPhaseTypeQueued, 81 PhaseStatus: CodeBuildPhaseStatusSucceeded, 82 }, 83 { 84 PhaseContext: []interface{}{}, 85 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 86 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 05, 0, time.UTC)), 87 Duration: DurationSeconds(36 * time.Second), 88 PhaseType: CodeBuildPhaseTypeProvisioning, 89 PhaseStatus: CodeBuildPhaseStatusSucceeded, 90 }, 91 { 92 PhaseContext: []interface{}{}, 93 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 5, 0, time.UTC)), 94 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 95 Duration: DurationSeconds(4 * time.Second), 96 PhaseType: CodeBuildPhaseTypeDownloadSource, 97 PhaseStatus: CodeBuildPhaseStatusSucceeded, 98 }, 99 { 100 PhaseContext: []interface{}{}, 101 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 102 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 103 Duration: DurationSeconds(0), 104 PhaseType: CodeBuildPhaseTypeInstall, 105 PhaseStatus: CodeBuildPhaseStatusSucceeded, 106 }, 107 { 108 PhaseContext: []interface{}{}, 109 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 110 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 111 Duration: DurationSeconds(0), 112 PhaseType: CodeBuildPhaseTypePreBuild, 113 PhaseStatus: CodeBuildPhaseStatusSucceeded, 114 }, 115 { 116 PhaseContext: []interface{}{}, 117 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 118 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 119 Duration: DurationSeconds(70 * time.Second), 120 PhaseType: CodeBuildPhaseTypeBuild, 121 PhaseStatus: CodeBuildPhaseStatusSucceeded, 122 }, 123 { 124 PhaseContext: []interface{}{}, 125 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 126 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 127 Duration: DurationSeconds(0), 128 PhaseType: CodeBuildPhaseTypePostBuild, 129 PhaseStatus: CodeBuildPhaseStatusSucceeded, 130 }, 131 { 132 PhaseContext: []interface{}{}, 133 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 134 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 135 Duration: DurationSeconds(0), 136 PhaseType: CodeBuildPhaseTypeUploadArtifacts, 137 PhaseStatus: CodeBuildPhaseStatusSucceeded, 138 }, 139 { 140 PhaseContext: []interface{}{}, 141 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 142 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)), 143 Duration: DurationSeconds(4 * time.Second), 144 PhaseType: CodeBuildPhaseTypeFinalizing, 145 PhaseStatus: CodeBuildPhaseStatusSucceeded, 146 }, 147 { 148 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)), 149 PhaseType: CodeBuildPhaseTypeCompleted, 150 }, 151 }, 152 }, 153 CurrentPhase: CodeBuildPhaseTypeCompleted, 154 CurrentPhaseContext: "[]", 155 Version: "1", 156 }, 157 }, 158 }, 159 { 160 input: "testdata/codebuild-phase-change.json", 161 expect: CodeBuildEvent{ 162 Version: "0", 163 ID: "43ddc2bd-af76-9ca5-2dc7-b695e15adeEX", 164 DetailType: CodeBuildPhaseChangeDetailType, 165 Source: CodeBuildEventSource, 166 AccountID: "123456789012", 167 Time: time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC), 168 Region: "us-west-2", 169 Resources: []string{ 170 "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", 171 }, 172 Detail: CodeBuildEventDetail{ 173 CompletedPhase: CodeBuildPhaseTypeCompleted, 174 ProjectName: "my-sample-project", 175 BuildID: "arn:aws:codebuild:us-west-2:123456789012:build/my-sample-project:8745a7a9-c340-456a-9166-edf953571bEX", 176 CompletedPhaseContext: "[]", 177 AdditionalInformation: CodeBuildEventAdditionalInformation{ 178 Artifact: CodeBuildArtifact{ 179 MD5Sum: "da9c44c8a9a3cd4b443126e823168fEX", 180 SHA256Sum: "6ccc2ae1df9d155ba83c597051611c42d60e09c6329dcb14a312cecc0a8e39EX", 181 Location: "arn:aws:s3:::codebuild-123456789012-output-bucket/my-output-artifact.zip", 182 }, 183 Environment: CodeBuildEnvironment{ 184 Image: "aws/codebuild/standard:2.0", 185 PrivilegedMode: false, 186 ComputeType: "BUILD_GENERAL1_SMALL", 187 Type: "LINUX_CONTAINER", 188 EnvironmentVariables: []CodeBuildEnvironmentVariable{}, 189 }, 190 Timeout: DurationMinutes(60 * time.Minute), 191 BuildComplete: true, 192 Initiator: "MyCodeBuildDemoUser", 193 BuildStartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 194 Source: CodeBuildSource{ 195 Location: "codebuild-123456789012-input-bucket/my-input-artifact.zip", 196 Type: "S3", 197 }, 198 Logs: CodeBuildLogs{ 199 GroupName: "/aws/codebuild/my-sample-project", 200 StreamName: "8745a7a9-c340-456a-9166-edf953571bEX", 201 DeepLink: "https://console.aws.amazon.com/cloudwatch/home?region=us-west-2#logEvent:group=/aws/codebuild/my-sample-project;stream=8745a7a9-c340-456a-9166-edf953571bEX", 202 }, 203 Phases: []CodeBuildPhase{ 204 { 205 PhaseContext: []interface{}{}, 206 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 207 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 208 Duration: DurationSeconds(0), 209 PhaseType: CodeBuildPhaseTypeSubmitted, 210 PhaseStatus: CodeBuildPhaseStatusSucceeded, 211 }, 212 { 213 PhaseContext: []interface{}{}, 214 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 215 EndTime: CodeBuildTime(time.Date(2019, 9, 13, 4, 12, 29, 0, time.UTC)), 216 Duration: DurationSeconds(0), 217 PhaseType: CodeBuildPhaseTypeQueued, 218 PhaseStatus: CodeBuildPhaseStatusSucceeded, 219 }, 220 { 221 PhaseContext: []interface{}{}, 222 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 12, 29, 0, time.UTC)), 223 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 05, 0, time.UTC)), 224 Duration: DurationSeconds(36 * time.Second), 225 PhaseType: CodeBuildPhaseTypeProvisioning, 226 PhaseStatus: CodeBuildPhaseStatusSucceeded, 227 }, 228 { 229 PhaseContext: []interface{}{}, 230 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 5, 0, time.UTC)), 231 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 232 Duration: DurationSeconds(4 * time.Second), 233 PhaseType: CodeBuildPhaseTypeDownloadSource, 234 PhaseStatus: CodeBuildPhaseStatusSucceeded, 235 }, 236 { 237 PhaseContext: []interface{}{}, 238 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 239 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 240 Duration: DurationSeconds(0), 241 PhaseType: CodeBuildPhaseTypeInstall, 242 PhaseStatus: CodeBuildPhaseStatusSucceeded, 243 }, 244 { 245 PhaseContext: []interface{}{}, 246 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 247 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 248 Duration: DurationSeconds(0), 249 PhaseType: CodeBuildPhaseTypePreBuild, 250 PhaseStatus: CodeBuildPhaseStatusSucceeded, 251 }, 252 { 253 PhaseContext: []interface{}{}, 254 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 13, 10, 0, time.UTC)), 255 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 256 Duration: DurationSeconds(70 * time.Second), 257 PhaseType: CodeBuildPhaseTypeBuild, 258 PhaseStatus: CodeBuildPhaseStatusSucceeded, 259 }, 260 { 261 PhaseContext: []interface{}{}, 262 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 263 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 264 Duration: DurationSeconds(0), 265 PhaseType: CodeBuildPhaseTypePostBuild, 266 PhaseStatus: CodeBuildPhaseStatusSucceeded, 267 }, 268 { 269 PhaseContext: []interface{}{}, 270 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 271 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 272 Duration: DurationSeconds(0), 273 PhaseType: CodeBuildPhaseTypeUploadArtifacts, 274 PhaseStatus: CodeBuildPhaseStatusSucceeded, 275 }, 276 { 277 PhaseContext: []interface{}{}, 278 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 279 EndTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)), 280 Duration: DurationSeconds(4 * time.Second), 281 PhaseType: CodeBuildPhaseTypeFinalizing, 282 PhaseStatus: CodeBuildPhaseStatusSucceeded, 283 }, 284 { 285 StartTime: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)), 286 PhaseType: CodeBuildPhaseTypeCompleted, 287 }, 288 }, 289 }, 290 CompletedPhaseStatus: CodeBuildPhaseStatusSucceeded, 291 CompletedPhaseDuration: DurationSeconds(4 * time.Second), 292 Version: "1", 293 CompletedPhaseStart: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 21, 0, time.UTC)), 294 CompletedPhaseEnd: CodeBuildTime(time.Date(2017, 9, 1, 16, 14, 26, 0, time.UTC)), 295 }, 296 }, 297 }, 298 } 299 300 for _, testcase := range tests { 301 data, err := ioutil.ReadFile(testcase.input) 302 require.NoError(t, err) 303 304 var actual CodeBuildEvent 305 require.NoError(t, json.Unmarshal(data, &actual)) 306 307 require.Equal(t, testcase.expect, actual) 308 } 309 }