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  })