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