github.com/mook-as/cf-cli@v7.0.0-beta.28.0.20200120190804-b91c115fae48+incompatible/command/v6/shared/poll_start_test.go (about)

     1  package shared_test
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"code.cloudfoundry.org/cli/actor/actionerror"
     8  	"code.cloudfoundry.org/cli/actor/v2action"
     9  	"code.cloudfoundry.org/cli/command/commandfakes"
    10  	"code.cloudfoundry.org/cli/command/translatableerror"
    11  	. "code.cloudfoundry.org/cli/command/v6/shared"
    12  
    13  	"code.cloudfoundry.org/cli/util/ui"
    14  
    15  	. "github.com/onsi/ginkgo"
    16  	. "github.com/onsi/ginkgo/extensions/table"
    17  	. "github.com/onsi/gomega"
    18  	. "github.com/onsi/gomega/gbytes"
    19  )
    20  
    21  var _ = Describe("Poll Start", func() {
    22  	var (
    23  		testUI      *ui.UI
    24  		fakeConfig  *commandfakes.FakeConfig
    25  		messages    chan *v2action.LogMessage
    26  		logErrs     chan error
    27  		appState    chan v2action.ApplicationStateChange
    28  		apiWarnings chan string
    29  		apiErrs     chan error
    30  		err         error
    31  		block       chan bool
    32  	)
    33  
    34  	BeforeEach(func() {
    35  		testUI = ui.NewTestUI(nil, NewBuffer(), NewBuffer())
    36  		fakeConfig = new(commandfakes.FakeConfig)
    37  		fakeConfig.BinaryNameReturns("FiveThirtyEight")
    38  
    39  		messages = make(chan *v2action.LogMessage)
    40  		logErrs = make(chan error)
    41  		appState = make(chan v2action.ApplicationStateChange)
    42  		apiWarnings = make(chan string)
    43  		apiErrs = make(chan error)
    44  		block = make(chan bool)
    45  
    46  		err = errors.New("This should never occur.")
    47  	})
    48  
    49  	JustBeforeEach(func() {
    50  		go func() {
    51  			err = PollStart(testUI, fakeConfig, messages, logErrs, appState, apiWarnings, apiErrs)
    52  			close(block)
    53  		}()
    54  	})
    55  
    56  	When("no API errors appear", func() {
    57  		It("passes and exits with no errors", func() {
    58  			appState <- v2action.ApplicationStateStopping
    59  			appState <- v2action.ApplicationStateStaging
    60  			appState <- v2action.ApplicationStateStarting
    61  			logErrs <- actionerror.NOAATimeoutError{}
    62  			apiWarnings <- "some warning"
    63  			logErrs <- errors.New("some logErrhea")
    64  			messages <- v2action.NewLogMessage(
    65  				"some log message",
    66  				1,
    67  				time.Unix(0, 0),
    68  				"STG",
    69  				"some source instance")
    70  			messages <- v2action.NewLogMessage(
    71  				"some other log message",
    72  				1,
    73  				time.Unix(0, 0),
    74  				"APP",
    75  				"some other source instance")
    76  			close(appState)
    77  			apiWarnings <- "some other warning"
    78  			close(apiWarnings)
    79  			close(apiErrs)
    80  
    81  			Eventually(testUI.Out).Should(Say("\nStopping app..."))
    82  			Eventually(testUI.Out).Should(Say("\nStaging app and tracing logs..."))
    83  			Eventually(testUI.Out).Should(Say("\nWaiting for app to start..."))
    84  			Eventually(testUI.Err).Should(Say("timeout connecting to log server, no log will be shown"))
    85  			Eventually(testUI.Err).Should(Say("some warning"))
    86  			Eventually(testUI.Err).Should(Say("some logErrhea"))
    87  			Eventually(testUI.Out).Should(Say("some log message"))
    88  			Consistently(testUI.Out).ShouldNot(Say("some other log messsage"))
    89  			Eventually(testUI.Err).Should(Say("some other warning"))
    90  			Eventually(block).Should(BeClosed())
    91  			Expect(err).ToNot(HaveOccurred())
    92  		})
    93  
    94  		When("state channel is not set", func() {
    95  			BeforeEach(func() {
    96  				appState = nil
    97  			})
    98  
    99  			It("does not wait for it", func() {
   100  				close(apiWarnings)
   101  				close(apiErrs)
   102  
   103  				Eventually(block).Should(BeClosed())
   104  				Expect(err).ToNot(HaveOccurred())
   105  			})
   106  		})
   107  	})
   108  
   109  	DescribeTable("API Errors",
   110  		func(apiErr error, expectedErr error) {
   111  			apiErrs <- apiErr
   112  			Eventually(block).Should(BeClosed())
   113  			Expect(err).To(MatchError(expectedErr))
   114  		},
   115  
   116  		Entry("StagingFailedNoAppDetectedError",
   117  			actionerror.StagingFailedNoAppDetectedError{
   118  				Reason: "some staging failure reason",
   119  			},
   120  			translatableerror.StagingFailedNoAppDetectedError{
   121  				Message:    "some staging failure reason",
   122  				BinaryName: "FiveThirtyEight",
   123  			},
   124  		),
   125  
   126  		Entry("StagingFailedError",
   127  			actionerror.StagingFailedError{
   128  				Reason: "some staging failure reason",
   129  			},
   130  			translatableerror.StagingFailedError{
   131  				Message: "some staging failure reason",
   132  			},
   133  		),
   134  
   135  		Entry("StagingTimeoutError",
   136  			actionerror.StagingTimeoutError{
   137  				AppName: "some staging timeout name",
   138  				Timeout: time.Second,
   139  			},
   140  			translatableerror.StagingTimeoutError{
   141  				AppName: "some staging timeout name",
   142  				Timeout: time.Second,
   143  			},
   144  		),
   145  
   146  		Entry("ApplicationInstanceCrashedError",
   147  			actionerror.ApplicationInstanceCrashedError{
   148  				Name: "some application crashed name",
   149  			},
   150  			translatableerror.ApplicationUnableToStartError{
   151  				AppName:    "some application crashed name",
   152  				BinaryName: "FiveThirtyEight",
   153  			},
   154  		),
   155  
   156  		Entry("ApplicationInstanceFlappingError",
   157  			actionerror.ApplicationInstanceFlappingError{
   158  				Name: "some application flapping name",
   159  			},
   160  			translatableerror.ApplicationUnableToStartError{
   161  				AppName:    "some application flapping name",
   162  				BinaryName: "FiveThirtyEight",
   163  			},
   164  		),
   165  
   166  		Entry("StartupTimeoutError",
   167  			actionerror.StartupTimeoutError{
   168  				Name: "some application timeout name",
   169  			},
   170  			translatableerror.StartupTimeoutError{
   171  				AppName:    "some application timeout name",
   172  				BinaryName: "FiveThirtyEight",
   173  			},
   174  		),
   175  
   176  		Entry("any other error",
   177  			actionerror.HTTPHealthCheckInvalidError{},
   178  			actionerror.HTTPHealthCheckInvalidError{},
   179  		),
   180  	)
   181  })