github.com/loggregator/cli@v6.33.1-0.20180224010324-82334f081791+incompatible/actor/v3action/build_test.go (about) 1 package v3action_test 2 3 import ( 4 "errors" 5 "time" 6 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 . "code.cloudfoundry.org/cli/actor/v3action" 9 "code.cloudfoundry.org/cli/actor/v3action/v3actionfakes" 10 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccv3/constant" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("Build Actions", func() { 17 var ( 18 actor *Actor 19 fakeCloudControllerClient *v3actionfakes.FakeCloudControllerClient 20 fakeConfig *v3actionfakes.FakeConfig 21 ) 22 23 BeforeEach(func() { 24 fakeCloudControllerClient = new(v3actionfakes.FakeCloudControllerClient) 25 fakeConfig = new(v3actionfakes.FakeConfig) 26 actor = NewActor(fakeCloudControllerClient, fakeConfig, nil, nil) 27 }) 28 29 Describe("StagePackage", func() { 30 var ( 31 dropletStream <-chan Droplet 32 warningsStream <-chan Warnings 33 errorStream <-chan error 34 35 buildGUID string 36 dropletGUID string 37 ) 38 39 AfterEach(func() { 40 Eventually(errorStream).Should(BeClosed()) 41 Eventually(warningsStream).Should(BeClosed()) 42 Eventually(dropletStream).Should(BeClosed()) 43 }) 44 45 JustBeforeEach(func() { 46 dropletStream, warningsStream, errorStream = actor.StagePackage("some-package-guid", "some-app") 47 }) 48 49 Context("when the creation is successful", func() { 50 BeforeEach(func() { 51 buildGUID = "some-build-guid" 52 dropletGUID = "some-droplet-guid" 53 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, nil) 54 fakeConfig.StagingTimeoutReturns(time.Minute) 55 }) 56 57 Context("when the polling is successful", func() { 58 BeforeEach(func() { 59 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil) 60 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) 61 }) 62 63 //TODO: uncommend after #150569020 64 // FContext("when looking up the droplet fails", func() { 65 // BeforeEach(func() { 66 // fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, errors.New("some-droplet-error")) 67 // }) 68 69 // It("returns the warnings and the droplet error", func() { 70 // Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 71 // Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 72 // Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 73 // Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2"))) 74 75 // Eventually(errorStream).Should(Receive(MatchError("some-droplet-error"))) 76 // }) 77 // }) 78 79 // Context("when looking up the droplet succeeds", func() { 80 // BeforeEach(func() { 81 // fakeCloudControllerClient.GetDropletReturns(ccv3.Droplet{GUID: dropletGUID, State: ccv3.DropletStateStaged}, ccv3.Warnings{"droplet-warnings-1", "droplet-warnings-2"}, nil) 82 // }) 83 84 It("polls until build is finished and returns the final droplet", func() { 85 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 86 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 87 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 88 // Eventually(warningsStream).Should(Receive(ConsistOf("droplet-warnings-1", "droplet-warnings-2"))) 89 90 Eventually(dropletStream).Should(Receive(Equal(Droplet{GUID: dropletGUID, State: constant.DropletStaged, CreatedAt: "some-time"}))) 91 Consistently(errorStream).ShouldNot(Receive()) 92 93 Expect(fakeCloudControllerClient.CreateBuildCallCount()).To(Equal(1)) 94 Expect(fakeCloudControllerClient.CreateBuildArgsForCall(0)).To(Equal(ccv3.Build{ 95 PackageGUID: "some-package-guid", 96 })) 97 98 Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2)) 99 Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID)) 100 Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID)) 101 102 Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1)) 103 }) 104 // }) 105 106 Context("when polling returns a failed build", func() { 107 BeforeEach(func() { 108 fakeCloudControllerClient.GetBuildReturnsOnCall( 109 1, 110 ccv3.Build{ 111 GUID: buildGUID, 112 State: constant.BuildFailed, 113 Error: "some staging error", 114 }, 115 ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, nil) 116 }) 117 118 It("returns an error and all warnings", func() { 119 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 120 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 121 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 122 stagingErr := errors.New("some staging error") 123 Eventually(errorStream).Should(Receive(&stagingErr)) 124 Eventually(dropletStream).ShouldNot(Receive()) 125 126 Expect(fakeCloudControllerClient.GetBuildCallCount()).To(Equal(2)) 127 Expect(fakeCloudControllerClient.GetBuildArgsForCall(0)).To(Equal(buildGUID)) 128 Expect(fakeCloudControllerClient.GetBuildArgsForCall(1)).To(Equal(buildGUID)) 129 130 Expect(fakeConfig.PollingIntervalCallCount()).To(Equal(1)) 131 }) 132 }) 133 }) 134 135 Context("when polling times out", func() { 136 var expectedErr error 137 138 BeforeEach(func() { 139 expectedErr = actionerror.StagingTimeoutError{AppName: "some-app", Timeout: 0} 140 fakeConfig.StagingTimeoutReturns(0) 141 }) 142 143 It("returns the error and warnings", func() { 144 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 145 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 146 }) 147 }) 148 149 Context("when the polling errors", func() { 150 var expectedErr error 151 152 BeforeEach(func() { 153 expectedErr = errors.New("I am a banana") 154 fakeCloudControllerClient.GetBuildReturnsOnCall(0, ccv3.Build{GUID: buildGUID, State: constant.BuildStaging}, ccv3.Warnings{"get-warnings-1", "get-warnings-2"}, nil) 155 fakeCloudControllerClient.GetBuildReturnsOnCall(1, ccv3.Build{}, ccv3.Warnings{"get-warnings-3", "get-warnings-4"}, expectedErr) 156 }) 157 158 It("returns the error and warnings", func() { 159 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 160 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-1", "get-warnings-2"))) 161 Eventually(warningsStream).Should(Receive(ConsistOf("get-warnings-3", "get-warnings-4"))) 162 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 163 }) 164 }) 165 }) 166 167 Context("when creation errors", func() { 168 var expectedErr error 169 BeforeEach(func() { 170 expectedErr = errors.New("I am a banana") 171 fakeCloudControllerClient.CreateBuildReturns(ccv3.Build{}, ccv3.Warnings{"create-warnings-1", "create-warnings-2"}, expectedErr) 172 }) 173 174 It("returns the error and warnings", func() { 175 Eventually(warningsStream).Should(Receive(ConsistOf("create-warnings-1", "create-warnings-2"))) 176 Eventually(errorStream).Should(Receive(MatchError(expectedErr))) 177 }) 178 }) 179 }) 180 })