github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/actor/v7pushaction/create_droplet_for_application_test.go (about) 1 package v7pushaction_test 2 3 import ( 4 "errors" 5 "strings" 6 7 "code.cloudfoundry.org/cli/actor/actionerror" 8 "code.cloudfoundry.org/cli/actor/v7action" 9 . "code.cloudfoundry.org/cli/actor/v7pushaction" 10 "code.cloudfoundry.org/cli/actor/v7pushaction/v7pushactionfakes" 11 "code.cloudfoundry.org/cli/api/cloudcontroller/ccerror" 12 . "github.com/onsi/ginkgo" 13 . "github.com/onsi/gomega" 14 ) 15 16 var _ = Describe("CreateDropletForApplication", func() { 17 var ( 18 actor *Actor 19 fakeV7Actor *v7pushactionfakes.FakeV7Actor 20 fakeSharedActor *v7pushactionfakes.FakeSharedActor 21 22 returnedPushPlan PushPlan 23 paramPlan PushPlan 24 fakeProgressBar *v7pushactionfakes.FakeProgressBar 25 26 warnings Warnings 27 executeErr error 28 29 events []Event 30 ) 31 32 BeforeEach(func() { 33 actor, fakeV7Actor, fakeSharedActor = getTestPushActor() 34 35 fakeProgressBar = new(v7pushactionfakes.FakeProgressBar) 36 37 fakeSharedActor.ReadArchiveReturns(new(v7pushactionfakes.FakeReadCloser), 0, nil) 38 39 paramPlan = PushPlan{ 40 Application: v7action.Application{ 41 GUID: "some-app-guid", 42 }, 43 } 44 }) 45 46 JustBeforeEach(func() { 47 events = EventFollower(func(eventStream chan<- *PushEvent) { 48 returnedPushPlan, warnings, executeErr = actor.CreateDropletForApplication(paramPlan, eventStream, fakeProgressBar) 49 }) 50 }) 51 52 When("the plan has a droplet path specified", func() { 53 BeforeEach(func() { 54 paramPlan.DropletPath = "path/to/some-droplet.tgz" 55 }) 56 57 When("creating the droplet for app fails", func() { 58 var createError = errors.New("create droplet failed") 59 60 BeforeEach(func() { 61 fakeV7Actor.CreateApplicationDropletReturns( 62 v7action.Droplet{}, 63 v7action.Warnings{"create-droplet-warning"}, 64 createError, 65 ) 66 }) 67 68 It("only records an event for creating droplet", func() { 69 Expect(events).To(Equal([]Event{ 70 CreatingDroplet, 71 })) 72 }) 73 74 It("returns the unmodified plan, warnings, and error", func() { 75 Expect(returnedPushPlan).To(Equal(paramPlan)) 76 Expect(warnings).To(ConsistOf("create-droplet-warning")) 77 Expect(executeErr).To(Equal(createError)) 78 }) 79 }) 80 81 When("reading droplet file fails", func() { 82 var readError = errors.New("reading file failed") 83 84 BeforeEach(func() { 85 fakeV7Actor.CreateApplicationDropletReturns( 86 v7action.Droplet{}, 87 v7action.Warnings{"create-droplet-warning"}, 88 nil, 89 ) 90 91 fakeSharedActor.ReadArchiveReturns( 92 nil, 93 0, 94 readError, 95 ) 96 }) 97 98 It("records events for creating droplet, reading archive", func() { 99 Expect(events).To(Equal([]Event{ 100 CreatingDroplet, 101 ReadingArchive, 102 })) 103 }) 104 105 It("returns the unmodified plan, warnings, and error", func() { 106 Expect(returnedPushPlan).To(Equal(paramPlan)) 107 Expect(warnings).To(ConsistOf("create-droplet-warning")) 108 Expect(executeErr).To(Equal(readError)) 109 }) 110 }) 111 112 When("uploading droplet fails", func() { 113 var createdDroplet = v7action.Droplet{GUID: "created-droplet-guid"} 114 var progressReader = strings.NewReader("123456") 115 var uploadError = errors.New("uploading droplet failed") 116 117 BeforeEach(func() { 118 fakeV7Actor.CreateApplicationDropletReturns( 119 createdDroplet, 120 v7action.Warnings{"create-droplet-warning"}, 121 nil, 122 ) 123 124 fakeSharedActor.ReadArchiveReturns( 125 new(v7pushactionfakes.FakeReadCloser), 126 int64(128), 127 nil, 128 ) 129 130 fakeProgressBar.NewProgressBarWrapperReturns(progressReader) 131 132 fakeV7Actor.UploadDropletReturns( 133 v7action.Warnings{"upload-droplet-warning"}, 134 uploadError, 135 ) 136 }) 137 138 It("tries to upload the droplet with given path", func() { 139 Expect(fakeV7Actor.UploadDropletCallCount()).To(Equal(1)) 140 givenDropletGUID, givenDropletPath, givenProgressReader, givenSize := fakeV7Actor.UploadDropletArgsForCall(0) 141 Expect(givenDropletGUID).To(Equal(createdDroplet.GUID)) 142 Expect(givenDropletPath).To(Equal(paramPlan.DropletPath)) 143 Expect(givenProgressReader).To(Equal(progressReader)) 144 Expect(givenSize).To(Equal(int64(128))) 145 }) 146 147 It("records events for creating droplet, reading archive, uploading droplet", func() { 148 Expect(events).To(Equal([]Event{ 149 CreatingDroplet, 150 ReadingArchive, 151 UploadingDroplet, 152 UploadDropletComplete, 153 })) 154 }) 155 156 It("returns the unmodified plan, warnings, and error", func() { 157 Expect(returnedPushPlan).To(Equal(paramPlan)) 158 Expect(warnings).To(ConsistOf("create-droplet-warning", "upload-droplet-warning")) 159 Expect(executeErr).To(Equal(uploadError)) 160 }) 161 }) 162 163 When("a retryable failure occurs", func() { 164 var createdDroplet = v7action.Droplet{GUID: "created-droplet-guid"} 165 var progressReader = strings.NewReader("123456") 166 var retryableError = ccerror.PipeSeekError{ 167 Err: errors.New("network error"), 168 } 169 170 BeforeEach(func() { 171 fakeV7Actor.CreateApplicationDropletReturns( 172 createdDroplet, 173 v7action.Warnings{"create-droplet-warning"}, 174 nil, 175 ) 176 177 fakeSharedActor.ReadArchiveReturns( 178 new(v7pushactionfakes.FakeReadCloser), 179 int64(128), 180 nil, 181 ) 182 183 fakeProgressBar.NewProgressBarWrapperReturns(progressReader) 184 }) 185 186 When("all upload attempts fail", func() { 187 BeforeEach(func() { 188 fakeV7Actor.UploadDropletReturns( 189 v7action.Warnings{"upload-droplet-warning"}, 190 retryableError, 191 ) 192 }) 193 194 It("records events for creating droplet, reading archive, uploading droplet, retrying", func() { 195 Expect(events).To(Equal([]Event{ 196 CreatingDroplet, 197 ReadingArchive, 198 UploadingDroplet, 199 RetryUpload, 200 ReadingArchive, 201 UploadingDroplet, 202 RetryUpload, 203 ReadingArchive, 204 UploadingDroplet, 205 RetryUpload, 206 })) 207 }) 208 209 It("returns the unmodified plan, all warnings, and wrapped error", func() { 210 Expect(returnedPushPlan).To(Equal(paramPlan)) 211 Expect(warnings).To(ConsistOf( 212 "create-droplet-warning", 213 "upload-droplet-warning", 214 "upload-droplet-warning", 215 "upload-droplet-warning", 216 )) 217 Expect(executeErr).To(Equal(actionerror.UploadFailedError{ 218 Err: retryableError.Err, 219 })) 220 }) 221 }) 222 223 When("the upload eventually succeeds", func() { 224 BeforeEach(func() { 225 fakeV7Actor.UploadDropletReturnsOnCall(0, 226 v7action.Warnings{"upload-droplet-warning"}, 227 retryableError, 228 ) 229 230 fakeV7Actor.UploadDropletReturnsOnCall(1, 231 v7action.Warnings{"upload-droplet-warning"}, 232 retryableError, 233 ) 234 235 fakeV7Actor.UploadDropletReturnsOnCall(2, 236 v7action.Warnings{"upload-droplet-warning"}, 237 nil, 238 ) 239 }) 240 241 It("records events for creating droplet, reading archive, uploading droplet, retrying, completing", func() { 242 Expect(events).To(Equal([]Event{ 243 CreatingDroplet, 244 ReadingArchive, 245 UploadingDroplet, 246 RetryUpload, 247 ReadingArchive, 248 UploadingDroplet, 249 RetryUpload, 250 ReadingArchive, 251 UploadingDroplet, 252 UploadDropletComplete, 253 })) 254 }) 255 256 It("returns the modified plan, all warnings, and no error", func() { 257 Expect(returnedPushPlan.DropletGUID).To(Equal(createdDroplet.GUID)) 258 Expect(warnings).To(ConsistOf( 259 "create-droplet-warning", 260 "upload-droplet-warning", 261 "upload-droplet-warning", 262 "upload-droplet-warning", 263 )) 264 Expect(executeErr).NotTo(HaveOccurred()) 265 }) 266 }) 267 }) 268 269 When("upload completes successfully", func() { 270 var createdDroplet = v7action.Droplet{GUID: "created-droplet-guid"} 271 var progressReader = strings.NewReader("123456") 272 273 BeforeEach(func() { 274 fakeV7Actor.CreateApplicationDropletReturns( 275 createdDroplet, 276 v7action.Warnings{"create-droplet-warning"}, 277 nil, 278 ) 279 280 fakeSharedActor.ReadArchiveReturns( 281 new(v7pushactionfakes.FakeReadCloser), 282 int64(128), 283 nil, 284 ) 285 286 fakeProgressBar.NewProgressBarWrapperReturns(progressReader) 287 288 fakeV7Actor.UploadDropletReturns( 289 v7action.Warnings{"upload-droplet-warning"}, 290 nil, 291 ) 292 }) 293 294 It("records events for creating droplet, reading archive, uploading droplet, retrying, completing", func() { 295 Expect(events).To(Equal([]Event{ 296 CreatingDroplet, 297 ReadingArchive, 298 UploadingDroplet, 299 UploadDropletComplete, 300 })) 301 }) 302 303 It("returns the modified plan, all warnings, and no error", func() { 304 Expect(returnedPushPlan.DropletGUID).To(Equal(createdDroplet.GUID)) 305 Expect(warnings).To(ConsistOf( 306 "create-droplet-warning", 307 "upload-droplet-warning", 308 )) 309 Expect(executeErr).NotTo(HaveOccurred()) 310 }) 311 }) 312 }) 313 })