github.com/cloudfoundry-incubator/stembuild@v0.0.0-20211223202937-5b61d62226c6/remotemanager/winrm_rebootchecker_test.go (about) 1 package remotemanager_test 2 3 import ( 4 "github.com/cloudfoundry-incubator/stembuild/poller/pollerfakes" 5 . "github.com/cloudfoundry-incubator/stembuild/remotemanager" 6 "github.com/cloudfoundry-incubator/stembuild/remotemanager/remotemanagerfakes" 7 . "github.com/onsi/ginkgo" 8 . "github.com/onsi/gomega" 9 "github.com/pkg/errors" 10 _ "reflect" 11 "time" 12 ) 13 14 const expectedTryCheckRebootCommand = "shutdown /r /f /t 60 /c \"stembuild reboot test\"" 15 16 const expectedAbortRebootCommand = "shutdown /a" 17 18 var _ = Describe("WinRM RebootChecker", func() { 19 20 var ( 21 fakeRemoteManager *remotemanagerfakes.FakeRemoteManager 22 fakePoller *pollerfakes.FakePollerI 23 rc *RebootChecker 24 ) 25 26 BeforeEach(func() { 27 fakeRemoteManager = &remotemanagerfakes.FakeRemoteManager{} 28 fakePoller = &pollerfakes.FakePollerI{} 29 30 rc = NewRebootChecker(fakeRemoteManager) 31 }) 32 Describe("WaitForRebootFinished", func() { 33 It("calls the hasFinished func using the Poller", func() { 34 numberOfPollCalls := 8 35 fakePoller.PollStub = func(duration time.Duration, pollFunc func() (bool, error)) error { 36 for call := 0; call < numberOfPollCalls; call++ { 37 pollFunc() 38 } 39 return nil 40 } 41 42 rc := &remotemanagerfakes.FakeRebootCheckerI{} 43 rc.RebootHasFinishedReturns(false, nil) 44 waiter := NewRebootWaiter(fakePoller, rc) 45 46 _ = waiter.WaitForRebootFinished() 47 48 Expect(fakePoller.PollCallCount()).To(Equal(1)) 49 Expect(rc.RebootHasFinishedCallCount()).To(Equal(numberOfPollCalls)) 50 }) 51 52 It("returns nil if a reboot has finished successfully", func() { 53 fakePoller.PollStub = func(duration time.Duration, pollFunc func() (bool, error)) error { 54 pollFunc() 55 return nil 56 } 57 58 rc := &remotemanagerfakes.FakeRebootCheckerI{} 59 rc.RebootHasFinishedReturns(false, nil) 60 waiter := NewRebootWaiter(fakePoller, rc) 61 62 err := waiter.WaitForRebootFinished() 63 Expect(err).ToNot(HaveOccurred()) 64 }) 65 66 It("returns error if a reboot cannot finish successfully", func() { 67 errorMessage := "unable to abort reboot." 68 fakePoller.PollReturns(errors.New(errorMessage)) 69 70 waiter := NewRebootWaiter(fakePoller, rc) 71 72 err := waiter.WaitForRebootFinished() 73 Expect(err.Error()).To(ContainSubstring(errorMessage)) 74 }) 75 }) 76 77 Describe("RebootHasFinished", func() { 78 It("returns false when reboot is in progress", func() { 79 someNonzeroExitCode := 1 80 fakeRemoteManager.ExecuteCommandReturns(someNonzeroExitCode, nil) 81 82 hasFinished, err := rc.RebootHasFinished() 83 84 Expect(err).NotTo(HaveOccurred()) 85 Expect(hasFinished).To(BeFalse()) 86 }) 87 88 It("returns false when it could not issue test-reboot command", func() { 89 fakeRemoteManager.ExecuteCommandReturns(0, errors.New("")) 90 91 hasFinished, err := rc.RebootHasFinished() 92 93 Expect(hasFinished).To(BeFalse()) 94 Expect(err).ToNot(HaveOccurred()) 95 }) 96 97 Context("after a reboot has been successfully scheduled", func() { 98 99 BeforeEach(func() { 100 fakeRemoteManager.ExecuteCommandReturnsOnCall(0, 0, nil) 101 }) 102 103 It("aborts reboot when test-reboot succeeds", func() { 104 _, err := rc.RebootHasFinished() 105 106 Expect(err).NotTo(HaveOccurred()) 107 Expect(fakeRemoteManager.ExecuteCommandArgsForCall(1)). 108 To(Equal(expectedAbortRebootCommand)) 109 }) 110 111 It("returns an error when abort command could not be issued", func() { 112 ErrorExitCode := 0 113 fakeRemoteManager.ExecuteCommandReturnsOnCall(1, ErrorExitCode, errors.New("unable to issue abort command")) 114 fakeRemoteManager.ExecuteCommandReturnsOnCall(2, ErrorExitCode, errors.New("unable to issue abort command")) 115 fakeRemoteManager.ExecuteCommandReturnsOnCall(3, ErrorExitCode, errors.New("unable to issue abort command")) 116 fakeRemoteManager.ExecuteCommandReturnsOnCall(4, ErrorExitCode, errors.New("unable to issue abort command")) 117 fakeRemoteManager.ExecuteCommandReturnsOnCall(5, ErrorExitCode, errors.New("unable to issue abort command")) 118 119 hasFinished, err := rc.RebootHasFinished() 120 121 Expect(fakeRemoteManager.ExecuteCommandCallCount()).To(Equal(6)) 122 123 Expect(hasFinished).To(BeFalse()) 124 Expect(err).To(MatchError(ContainSubstring("unable to issue abort command"))) 125 }) 126 127 It("returns an error when abort command failed", func() { 128 nonZeroExitCode := 1 129 fakeRemoteManager.ExecuteCommandReturnsOnCall(1, nonZeroExitCode, nil) 130 131 hasFinished, err := rc.RebootHasFinished() 132 133 Expect(hasFinished).To(BeFalse()) 134 Expect(err).To(HaveOccurred()) 135 }) 136 137 It("returns true when reboot has finished and when abort succeeds", func() { 138 fakeRemoteManager.ExecuteCommandReturnsOnCall(1, 0, nil) 139 140 hasFinished, err := rc.RebootHasFinished() 141 142 Expect(err).NotTo(HaveOccurred()) 143 Expect(hasFinished).To(Equal(true)) 144 Expect(fakeRemoteManager.ExecuteCommandCallCount()). 145 To(BeNumerically(">=", 1)) 146 Expect(fakeRemoteManager.ExecuteCommandArgsForCall(0)). 147 To(Equal(expectedTryCheckRebootCommand)) 148 }) 149 }) 150 }) 151 })