github.com/franc20/ayesa_sap@v7.0.0-beta.28.0.20200124003224-302d4d52fa6c+incompatible/actor/v7action/build_test.go (about) 1 package v7action_test 2 3 import ( 4 "errors" 5 "time" 6 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 . "code.cloudfoundry.org/cli/actor/v7action" 9 "code.cloudfoundry.org/cli/actor/v7action/v7actionfakes" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 12 "code.cloudfoundry.org/clock" 13 . "github.com/onsi/ginkgo" 14 . "github.com/onsi/gomega" 15 ) 16 17 var _ = Describe("Build Actions", func() { 18 var ( 19 actor *Actor 20 fakeCloudControllerClient *v7actionfakes.FakeCloudControllerClient 21 fakeConfig *v7actionfakes.FakeConfig 22 ) 23 24 BeforeEach(func() { 25 fakeCloudControllerClient = new(v7actionfakes.FakeCloudControllerClient) 26 fakeConfig = new(v7actionfakes.FakeConfig) 27 actor = NewActor(fakeCloudControllerClient, fakeConfig, nil, nil, clock.NewClock()) 28 }) 29 30 Describe("StagePackage", func() { 31 var ( 32 dropletStream <-chan Droplet 33 warningsStream <-chan Warnings 34 errorStream <-chan error 35 36 appName string 37 appGUID string 38 buildGUID string 39 dropletGUID string 40 spaceGUID string 41 packageGUID string 42 ) 43 44 BeforeEach(func() { 45 appName = "some-app" 46 appGUID = "app-guid" 47 spaceGUID = "space-guid" 48 packageGUID = "some-package-guid" 49 }) 50 51 AfterEach(func() { 52 Eventually(errorStream).Should(BeClosed()) 53 Eventually(warningsStream).Should(BeClosed()) 54 Eventually(dropletStream).Should(BeClosed()) 55 }) 56 57 JustBeforeEach(func() { 58 dropletStream, warningsStream, errorStream = actor.StagePackage(packageGUID, appName, spaceGUID) 59 }) 60 61 When("finding the app fails", func() { 62 var expectedErr error 63 64 BeforeEach(func() { 65 expectedErr = errors.New("I am a tomato") 66 fakeCloudControllerClient.GetApplicationsReturns(nil, ccv3.Warnings{"get-apps-warning"}, expectedErr) 67 }) 68 69 It("returns the error and warnings", func() { 70 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 71 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 72 }) 73 }) 74 75 When("app is not found", func() { 76 BeforeEach(func() { 77 fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{}, ccv3.Warnings{"get-apps-warning"}, nil) 78 }) 79 80 It("returns the error and warnings", func() { 81 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 82 Eventually(errorStream).Should(Receive(MatchError(actionerror.ApplicationNotFoundError{Name: appName}))) 83 }) 84 }) 85 86 When("finding the package fails", func() { 87 var expectedErr error 88 89 BeforeEach(func() { 90 expectedErr = errors.New("I am a passion fruit") 91 fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil) 92 fakeCloudControllerClient.GetPackagesReturns([]ccv3.Package{}, ccv3.Warnings{"get-packages-warning"}, expectedErr) 93 }) 94 95 It("returns the error and warnings", func() { 96 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 97 Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning"))) 98 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 99 }) 100 }) 101 102 When("the package belongs to a different app", func() { 103 BeforeEach(func() { 104 fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil) 105 fakeCloudControllerClient.GetPackagesReturns( 106 []ccv3.Package{}, 107 ccv3.Warnings{"get-packages-warning"}, 108 nil, 109 ) 110 }) 111 112 It("returns a not found error and warnings", func() { 113 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 114 Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning"))) 115 Eventually(errorStream).Should(Receive(MatchError(actionerror.PackageNotFoundInAppError{GUID: packageGUID, AppName: appName}))) 116 }) 117 }) 118 119 When("the creation is successful", func() { 120 BeforeEach(func() { 121 fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil) 122 fakeCloudControllerClient.GetPackagesReturns( 123 []ccv3.Package{{GUID: packageGUID}}, 124 ccv3.Warnings{"get-packages-warning"}, 125 nil, 126 ) 127 128 buildGUID = "some-build-guid" 129 dropletGUID = "some-droplet-guid" 130 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, nil) 131 fakeConfig.StagingTimeoutReturns(time.Minute) 132 }) 133 134 When("the polling is successful", func() { 135 BeforeEach(func() { 136 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil) 137 fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{CreatedAt: "some-time", GUID: buildGUID, State: constant.BuildStaged, DropletGUID: "some-droplet-guid"}, ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, nil) 138 }) 139 140 //TODO: uncommend after #150569020 141 // FWhen("looking up the droplet fails", func() { 142 // BeforeEach(func() { 143 // fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, errors.New("some-droplet-error")) 144 // }) 145 146 // It("returns the warnings and the droplet error", func() { 147 // Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 148 // Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning"))) 149 // Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 150 // Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 151 // Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 152 // Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2"))) 153 154 // Eventually(errorStream).Should(Receive(MatchError("some-droplet-error"))) 155 // }) 156 // }) 157 158 // When("looking up the droplet succeeds", func() { 159 // BeforeEach(func() { 160 // fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{GUID: dropletGUID, State: ccv3.DropletStateStaged}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, nil) 161 // }) 162 163 It("polls until build is finished and returns the final droplet", func() { 164 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 165 Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning"))) 166 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 167 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 168 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 169 // Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2"))) 170 171 Eventually(dropletStream).Should(Receive(Equal(Droplet{GUID: dropletGUID, State: constant.DropletStaged, CreatedAt: "some-time"}))) 172 Consistently(errorStream).ShouldNot(Receive()) 173 174 Expect(fakeCloudControllerClient.GetApplicationsCallCount()).To(Equal(1)) 175 Expect(fakeCloudControllerClient.GetApplicationsArgsForCall(0)).To(Equal([]ccv3.Query{ 176 {Key: ccv3.NameFilter, Values: []string{appName}}, 177 {Key: ccv3.SpaceGUIDFilter, Values: []string{spaceGUID}}, 178 })) 179 180 Expect(fakeCloudControllerClient.GetPackagesCallCount()).To(Equal(1)) 181 Expect(fakeCloudControllerClient.GetPackagesArgsForCall(0)).To(Equal([]ccv3.Query{ 182 {Key: ccv3.AppGUIDFilter, Values: []string{appGUID}}, 183 })) 184 185 Expect(fakeCloudControllerClient.CreateBuildCallCount()).To(Equal(1)) 186 Expect(fakeCloudControllerClient.CreateBuildArgsForCall(0)).To(Equal(ccv3.Build{ 187 PackageGUID: "some-package-guid", 188 })) 189 190 Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2)) 191 Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID)) 192 Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID)) 193 194 Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1)) 195 }) 196 // }) 197 198 When("polling returns a failed build", func() { 199 BeforeEach(func() { 200 fakeCloudControllerClient.GetBuildReturnsOnCall( 201 1, 202 ccv3.Build{ 203 GUID: buildGUID, 204 State: constant.BuildFailed, 205 Error: "some staging error", 206 }, 207 ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, nil) 208 }) 209 210 It("returns an error and all warnings", func() { 211 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 212 Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning"))) 213 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 214 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 215 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 216 stagingErr := errors.New("some staging error") 217 Eventually(errorStream).Should(Receive(&stagingErr)) 218 Eventually(dropletStream).ShouldNot(Receive()) 219 220 Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2)) 221 Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID)) 222 Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID)) 223 224 Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1)) 225 }) 226 }) 227 }) 228 229 When("polling times out", func() { 230 var expectedErr error 231 232 BeforeEach(func() { 233 expectedErr = actionerror.StagingTimeoutError{AppName: "some-app", Timeout: 0} 234 fakeConfig.StagingTimeoutReturns(0) 235 }) 236 237 It("returns the error and warnings", func() { 238 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 239 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 240 }) 241 }) 242 243 When("the polling errors", func() { 244 var expectedErr error 245 246 BeforeEach(func() { 247 expectedErr = errors.New("I am a banana") 248 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil) 249 fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{}, ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, expectedErr) 250 }) 251 252 It("returns the error and warnings", func() { 253 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 254 Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning"))) 255 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 256 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 257 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 258 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 259 }) 260 }) 261 }) 262 263 When("creation errors", func() { 264 var expectedErr error 265 266 BeforeEach(func() { 267 fakeCloudControllerClient.GetApplicationsReturns([]ccv3.Application{{GUID: appGUID}}, ccv3.Warnings{"get-apps-warning"}, nil) 268 fakeCloudControllerClient.GetPackagesReturns( 269 []ccv3.Package{{GUID: packageGUID}}, 270 ccv3.Warnings{"get-packages-warning"}, 271 nil, 272 ) 273 274 expectedErr = errors.New("I am a banana") 275 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, expectedErr) 276 }) 277 278 It("returns the error and warnings", func() { 279 Eventually(warningsStream).Should(Receive(ConsistOf("get-apps-warning"))) 280 Eventually(warningsStream).Should(Receive(ConsistOf("get-packages-warning"))) 281 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 282 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 283 }) 284 }) 285 }) 286 287 Describe("StageApplicationPackage", func() { 288 var ( 289 build Build 290 warnings Warnings 291 executeErr error 292 ) 293 294 JustBeforeEach(func() { 295 build, warnings, executeErr = actor.StageApplicationPackage("some-package-guid") 296 }) 297 298 When("the creation is successful", func() { 299 BeforeEach(func() { 300 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{GUID: "some-build-guid"}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, nil) 301 }) 302 303 It("returns the build and warnings", func() { 304 Expect(executeErr).ToNot(HaveOccurred()) 305 Expect(build).To(Equal(Build{GUID: "some-build-guid"})) 306 Expect(warnings).To(ConsistOf("create-warnings-1", "create-warnings-2")) 307 }) 308 }) 309 310 When("the creation fails", func() { 311 BeforeEach(func() { 312 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, errors.New("blurp")) 313 }) 314 315 It("returns the error and warnings", func() { 316 Expect(executeErr).To(MatchError("blurp")) 317 Expect(warnings).To(ConsistOf("create-warnings-1", "create-warnings-2")) 318 }) 319 }) 320 }) 321 322 Describe("PollBuild", func() { 323 var ( 324 droplet Droplet 325 warnings Warnings 326 executeErr error 327 ) 328 329 JustBeforeEach(func() { 330 droplet, warnings, executeErr = actor.PollBuild("some-build-guid", "some-app") 331 }) 332 333 When("getting the build yields a 'Staged' build", func() { 334 BeforeEach(func() { 335 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{State: constant.BuildStaging}, ccv3.Warnings{"some-get-build-warnings"}, nil) 336 fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{GUID: "some-build-guid", DropletGUID: "some-droplet-guid", State: constant.BuildStaged}, ccv3.Warnings{"some-get-build-warnings"}, nil) 337 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 338 }) 339 340 It("gets the droplet", func() { 341 Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2)) 342 343 Expect(fakeCloudControllerClient.GetDropletCallCount()).To(Equal(1)) 344 Expect(fakeCloudControllerClient.GetDropletArgsForCall(0)).To(Equal("some-droplet-guid")) 345 }) 346 347 When("getting the droplet is successful", func() { 348 BeforeEach(func() { 349 fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{GUID: "some-droplet-guid", CreatedAt: "some-droplet-time", State: constant.DropletStaged}, ccv3.Warnings{"some-get-droplet-warnings"}, nil) 350 }) 351 352 It("returns the droplet and warnings", func() { 353 Expect(executeErr).ToNot(HaveOccurred()) 354 355 Expect(warnings).To(ConsistOf("some-get-build-warnings", "some-get-build-warnings", "some-get-droplet-warnings")) 356 Expect(droplet).To(Equal(Droplet{ 357 GUID: "some-droplet-guid", 358 CreatedAt: "some-droplet-time", 359 State: constant.DropletStaged, 360 })) 361 }) 362 }) 363 364 When("getting the droplet fails", func() { 365 BeforeEach(func() { 366 fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{}, ccv3.Warnings{"some-get-droplet-warnings"}, errors.New("no rain")) 367 }) 368 369 It("returns the error and warnings", func() { 370 Expect(executeErr).To(MatchError("no rain")) 371 Expect(warnings).To(ConsistOf("some-get-build-warnings", "some-get-build-warnings", "some-get-droplet-warnings")) 372 }) 373 }) 374 }) 375 376 When("getting the build yields a 'Failed' build", func() { 377 BeforeEach(func() { 378 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{State: constant.BuildFailed, Error: "ded build"}, ccv3.Warnings{"some-get-build-warnings"}, nil) 379 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 380 }) 381 382 It("returns the error and warnings", func() { 383 Expect(executeErr).To(MatchError("ded build")) 384 Expect(warnings).To(ConsistOf("some-get-build-warnings")) 385 }) 386 }) 387 388 When("getting the build fails", func() { 389 BeforeEach(func() { 390 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{}, ccv3.Warnings{"some-get-build-warnings"}, errors.New("some-poll-build-error")) 391 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 392 }) 393 394 It("returns the error and warnings", func() { 395 Expect(executeErr).To(MatchError("some-poll-build-error")) 396 Expect(warnings).To(ConsistOf("some-get-build-warnings")) 397 }) 398 }) 399 400 When("polling the build times out", func() { 401 BeforeEach(func() { 402 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{}, ccv3.Warnings{"some-get-build-warnings"}, nil) 403 fakeConfig.StagingTimeoutReturns(500 * time.Millisecond) 404 }) 405 406 It("returns the error and warnings", func() { 407 Expect(executeErr).To(MatchError(actionerror.StagingTimeoutError{AppName: "some-app", Timeout: 500 * time.Millisecond})) 408 Expect(warnings).To(ConsistOf("some-get-build-warnings")) 409 }) 410 }) 411 }) 412 })