@@ -24,7 +24,7 @@ import (
2424 "github.com/aws/amazon-ssm-agent/agent/log"
2525 contextmocks "github.com/aws/amazon-ssm-agent/agent/mocks/context"
2626 logmocks "github.com/aws/amazon-ssm-agent/agent/mocks/log"
27- channel "github.com/aws/amazon-ssm-agent/common/channel"
27+ "github.com/aws/amazon-ssm-agent/common/channel"
2828 channelmocks "github.com/aws/amazon-ssm-agent/common/channel/mocks"
2929 "github.com/aws/amazon-ssm-agent/common/message"
3030 "github.com/stretchr/testify/mock"
@@ -66,6 +66,109 @@ func (suite *MessageBusTestSuite) SetupTest() {
6666 }
6767}
6868
69+ func (suite * MessageBusTestSuite ) TestProcessHealthRequest_Successful () {
70+ // Arrange
71+ suite .mockHealthChannel .On ("IsChannelInitialized" ).Return (true ).Once ()
72+ suite .mockHealthChannel .On ("IsDialSuccessful" ).Return (true ).Once ()
73+ suite .mockHealthChannel .On ("Close" ).Return (nil ).Once ()
74+ request := message .CreateHealthRequest ()
75+ requestString , _ := jsonutil .Marshal (request )
76+ suite .mockHealthChannel .On ("Recv" ).Return ([]byte (requestString ), nil ).Once ()
77+ suite .mockHealthChannel .On ("Send" , mock .Anything ).Return (nil )
78+ // Kills the infinite loop
79+ suite .mockHealthChannel .On ("Recv" ).Return (nil , fmt .Errorf ("failed to receive message on channel" )).Times (maxRecvErrCount )
80+
81+ // Act
82+ suite .messageBus .ProcessHealthRequest ()
83+
84+ // Assert
85+ suite .mockHealthChannel .AssertExpectations (suite .T ())
86+ }
87+
88+ func (suite * MessageBusTestSuite ) TestProcessHealthRequest_RecvError () {
89+ // Arrange
90+ suite .mockHealthChannel .On ("IsChannelInitialized" ).Return (true ).Once ()
91+ suite .mockHealthChannel .On ("IsDialSuccessful" ).Return (true ).Once ()
92+ suite .mockHealthChannel .On ("Close" ).Return (nil ).Once ()
93+ suite .mockHealthChannel .On ("Recv" ).Return (nil , fmt .Errorf ("failed to receive message on channel" )).Times (maxRecvErrCount )
94+
95+ // Act
96+ suite .messageBus .ProcessHealthRequest ()
97+
98+ // Assert
99+ suite .mockHealthChannel .AssertExpectations (suite .T ())
100+ }
101+
102+ func (suite * MessageBusTestSuite ) TestProcessHealthRequest_RecvErrorCount_Resets () {
103+ // Arrange
104+ suite .mockHealthChannel .On ("IsChannelInitialized" ).Return (true ).Once ()
105+ suite .mockHealthChannel .On ("IsDialSuccessful" ).Return (true ).Once ()
106+ suite .mockHealthChannel .On ("Close" ).Return (nil ).Once ()
107+ suite .mockHealthChannel .On ("Recv" ).Return (nil , fmt .Errorf ("failed to receive message on channel" )).Times (maxRecvErrCount - 1 )
108+ request := message .CreateHealthRequest ()
109+ requestString , _ := jsonutil .Marshal (request )
110+ suite .mockHealthChannel .On ("Recv" ).Return ([]byte (requestString ), nil ).Once ()
111+ suite .mockHealthChannel .On ("Send" , mock .Anything ).Return (nil )
112+ // Kills the infinite loop
113+ suite .mockHealthChannel .On ("Recv" ).Return (nil , fmt .Errorf ("failed to receive message on channel" )).Times (maxRecvErrCount )
114+
115+ // Act
116+ suite .messageBus .ProcessHealthRequest ()
117+
118+ // Assert
119+ suite .mockHealthChannel .AssertExpectations (suite .T ())
120+ }
121+
122+ func (suite * MessageBusTestSuite ) TestProcessTerminationRequest_Error () {
123+ suite .mockTerminateChannel .On ("IsDialSuccessful" ).Return (true ).Once ()
124+ suite .mockTerminateChannel .On ("IsChannelInitialized" ).Return (true ).Once ()
125+ suite .mockTerminateChannel .On ("Close" ).Return (nil ).Once ()
126+ suite .mockTerminateChannel .On ("Recv" ).Return (nil , fmt .Errorf ("failed to receive message on channel" )).Times (maxRecvErrCount )
127+
128+ suite .messageBus .ProcessTerminationRequest ()
129+
130+ suite .mockTerminateChannel .AssertExpectations (suite .T ())
131+
132+ // Assert termination channel connected and that a termination message is sent
133+ suite .Assertions .Equal (true , <- suite .messageBus .GetTerminationChannelConnectedChan ())
134+ suite .Assertions .Equal (true , <- suite .messageBus .GetTerminationRequestChan ())
135+ }
136+
137+ func (suite * MessageBusTestSuite ) TestProcessTerminationRequest_RecvRetried () {
138+ suite .mockTerminateChannel .On ("IsDialSuccessful" ).Return (true ).Once ()
139+ suite .mockTerminateChannel .On ("IsChannelInitialized" ).Return (true ).Once ()
140+ suite .mockTerminateChannel .On ("Close" ).Return (nil ).Once ()
141+ suite .mockTerminateChannel .On ("Recv" ).Return (nil , fmt .Errorf ("failed to receive message on channel" )).Times (maxRecvErrCount - 1 )
142+ request := message .CreateTerminateWorkerRequest ()
143+ requestString , _ := jsonutil .Marshal (request )
144+ suite .mockTerminateChannel .On ("Recv" ).Return ([]byte (requestString ), nil )
145+ suite .mockTerminateChannel .On ("Send" , mock .Anything ).Return (nil )
146+ suite .messageBus .ProcessTerminationRequest ()
147+ suite .mockTerminateChannel .AssertExpectations (suite .T ())
148+
149+ // Assert termination channel connected and that a termination message is sent
150+ suite .Assertions .Equal (true , <- suite .messageBus .GetTerminationChannelConnectedChan ())
151+ suite .Assertions .Equal (true , <- suite .messageBus .GetTerminationRequestChan ())
152+ }
153+
154+ func (suite * MessageBusTestSuite ) TestProcessTerminationRequest_RecvRetriesReset () {
155+ suite .mockTerminateChannel .On ("IsDialSuccessful" ).Return (true ).Once ()
156+ suite .mockTerminateChannel .On ("IsChannelInitialized" ).Return (true ).Once ()
157+ suite .mockTerminateChannel .On ("Close" ).Return (nil ).Once ()
158+ suite .mockTerminateChannel .On ("Recv" ).Return (nil , fmt .Errorf ("failed to receive message on channel" )).Times (maxRecvErrCount - 1 )
159+ suite .mockTerminateChannel .On ("Recv" ).Return ([]byte ("not valid json message" ), nil ).Once ()
160+ request := message .CreateTerminateWorkerRequest ()
161+ requestString , _ := jsonutil .Marshal (request )
162+ suite .mockTerminateChannel .On ("Recv" ).Return ([]byte (requestString ), nil ).Once ()
163+ suite .mockTerminateChannel .On ("Send" , mock .Anything ).Return (nil )
164+ suite .messageBus .ProcessTerminationRequest ()
165+ suite .mockTerminateChannel .AssertExpectations (suite .T ())
166+
167+ // Assert termination channel connected and that a termination message is sent
168+ suite .Assertions .Equal (true , <- suite .messageBus .GetTerminationChannelConnectedChan ())
169+ suite .Assertions .Equal (true , <- suite .messageBus .GetTerminationRequestChan ())
170+ }
171+
69172// Execute the test suite
70173func TestMessageBusTestSuite (t * testing.T ) {
71174 suite .Run (t , new (MessageBusTestSuite ))
@@ -113,7 +216,7 @@ func (suite *MessageBusTestSuite) TestProcessTerminationRequest_SuccessfulConnec
113216 suite .mockTerminateChannel .On ("Recv" ).Return ([]byte (requestString ), nil )
114217 suite .mockTerminateChannel .On ("Send" , mock .Anything ).Return (nil )
115218
116- // Fourth call to isConnect succeeds, fourth call is for defer where it will call close
219+ // Fourth call to IsChannelInitialized succeeds, fourth call is for defer where it will call close
117220 suite .mockTerminateChannel .On ("IsChannelInitialized" ).Return (true ).Once ()
118221 suite .mockTerminateChannel .On ("Close" ).Return (nil ).Once ()
119222
0 commit comments