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