github.com/lirm/aeron-go@v0.0.0-20230415210743-920325491dc4/aeron/clientconductor_test.go (about)

     1  // Copyright 2022 Steven Stern
     2  //
     3  // Licensed under the Apache License, Version 2.0 (the "License");
     4  // you may not use this file except in compliance with the License.
     5  // You may obtain a copy of the License at
     6  //
     7  // http://www.apache.org/licenses/LICENSE-2.0
     8  //
     9  // Unless required by applicable law or agreed to in writing, software
    10  // distributed under the License is distributed on an "AS IS" BASIS,
    11  // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    12  // See the License for the specific language governing permissions and
    13  // limitations under the License.
    14  
    15  package aeron
    16  
    17  import (
    18  	"fmt"
    19  	"github.com/lirm/aeron-go/aeron/atomic"
    20  	"github.com/lirm/aeron-go/aeron/counters"
    21  	"github.com/lirm/aeron-go/aeron/testdata"
    22  	"github.com/stretchr/testify/mock"
    23  	"github.com/stretchr/testify/suite"
    24  	"testing"
    25  	"time"
    26  )
    27  
    28  const (
    29  	StreamId1                          = int32(1002)
    30  	CorrelationId1                     = int64(2000)
    31  	SessionId1                         = int32(13)
    32  	SourceInfo                         = "127.0.0.1:40789"
    33  	SubscriptionPositionId             = int32(2)
    34  	SubscriptionPositionRegistrationId = int64(4001)
    35  	CounterTypeId                      = int32(102)
    36  	CounterLabel                       = "counter label"
    37  	CounterRegId                       = int64(42)
    38  	CounterRegId2                      = int64(43)
    39  	CounterId                          = int32(3)
    40  )
    41  
    42  type ClientConductorTestSuite struct {
    43  	suite.Suite
    44  	cc          ClientConductor
    45  	driverProxy *MockDriverProxy
    46  }
    47  
    48  func (c *ClientConductorTestSuite) SetupTest() {
    49  	metaBuf := atomic.MakeBuffer(make([]byte, 256*1024))
    50  	meta := counters.InitAndWrapMetaData(metaBuf, 0, 0, 0, 24*1024, 24*1024, 0)
    51  	c.driverProxy = new(MockDriverProxy)
    52  	c.cc.Init(c.driverProxy, nil, time.Millisecond*100, time.Millisecond*100,
    53  		time.Millisecond*100, time.Millisecond*100, meta)
    54  	c.driverProxy.On("NextCorrelationID").Return(int64(123))
    55  }
    56  
    57  func (c *ClientConductorTestSuite) TestAddPublicationShouldNotifyMediaDriver() {
    58  	c.driverProxy.On("AddPublication", Channel, StreamId1).
    59  		Return(CorrelationId1, nil)
    60  	reg, err := c.cc.AddPublication(Channel, StreamId1)
    61  	c.Assert().NoError(err)
    62  	c.Assert().Equal(reg, CorrelationId1)
    63  }
    64  
    65  func (c *ClientConductorTestSuite) TestAddPublicationShouldTimeoutWithoutReadyMessage() {
    66  	c.driverProxy.On("AddPublication", Channel, StreamId1).
    67  		Return(CorrelationId1, nil)
    68  	reg, err := c.cc.AddPublication(Channel, StreamId1)
    69  	c.Require().NoError(err)
    70  	c.Require().Equal(reg, CorrelationId1)
    71  
    72  	// First a temporary error.
    73  	pub, err := c.cc.FindPublication(CorrelationId1)
    74  	c.Require().NoError(err)
    75  	c.Assert().Nil(pub)
    76  
    77  	// Then a permanent error.
    78  	oldTimeout := c.cc.driverTimeoutNs
    79  	c.cc.driverTimeoutNs = 1
    80  	defer func() { c.cc.driverTimeoutNs = oldTimeout }()
    81  	pub, err = c.cc.FindPublication(CorrelationId1)
    82  	c.Assert().Error(err)
    83  	c.Assert().Nil(pub)
    84  }
    85  
    86  func (c *ClientConductorTestSuite) TestShouldFailToAddPublicationOnMediaDriverError() {
    87  	c.driverProxy.On("AddPublication", Channel, StreamId1).
    88  		Return(CorrelationId1, nil)
    89  	reg, err := c.cc.AddPublication(Channel, StreamId1)
    90  	c.Require().NoError(err)
    91  	c.Require().Equal(reg, CorrelationId1)
    92  
    93  	c.cc.OnErrorResponse(CorrelationId1, 1, "error")
    94  	pub, err := c.cc.FindPublication(CorrelationId1)
    95  	c.Assert().Nil(pub)
    96  	c.Assert().Error(err)
    97  }
    98  
    99  func (c *ClientConductorTestSuite) TestAddSubscriptionShouldNotifyMediaDriver() {
   100  	c.driverProxy.On("AddSubscription", Channel, StreamId1).
   101  		Return(CorrelationId1, nil)
   102  	reg, err := c.cc.AddSubscription(Channel, StreamId1)
   103  	c.Assert().NoError(err)
   104  	c.Assert().Equal(reg, CorrelationId1)
   105  }
   106  
   107  func (c *ClientConductorTestSuite) TestAddSubscriptionShouldTimeoutWithoutOperationSuccessful() {
   108  	c.driverProxy.On("AddSubscription", Channel, StreamId1).
   109  		Return(CorrelationId1, nil)
   110  	reg, err := c.cc.AddSubscription(Channel, StreamId1)
   111  	c.Require().NoError(err)
   112  	c.Require().Equal(reg, CorrelationId1)
   113  
   114  	// First a temporary error.
   115  	sub, err := c.cc.FindSubscription(CorrelationId1)
   116  	c.Assert().NoError(err)
   117  	c.Assert().Nil(sub)
   118  
   119  	// Then a permanent error.
   120  	oldTimeout := c.cc.driverTimeoutNs
   121  	c.cc.driverTimeoutNs = 1
   122  	defer func() { c.cc.driverTimeoutNs = oldTimeout }()
   123  	sub, err = c.cc.FindSubscription(CorrelationId1)
   124  	c.Assert().Error(err)
   125  	c.Assert().Nil(sub)
   126  }
   127  
   128  func (c *ClientConductorTestSuite) TestShouldFailToAddSubscriptionOnMediaDriverError() {
   129  	c.driverProxy.On("AddSubscription", Channel, StreamId1).
   130  		Return(CorrelationId1, nil)
   131  	reg, err := c.cc.AddSubscription(Channel, StreamId1)
   132  	c.Require().NoError(err)
   133  	c.Require().Equal(reg, CorrelationId1)
   134  
   135  	c.cc.OnErrorResponse(CorrelationId1, 1, "error")
   136  	sub, err := c.cc.FindSubscription(CorrelationId1)
   137  	c.Assert().Nil(sub)
   138  	c.Assert().Error(err)
   139  }
   140  
   141  func (c *ClientConductorTestSuite) TestClientNotifiedOfNewAndInactiveImagesWithDefaultHandler() {
   142  	var availableHandler = FakeImageHandler{}
   143  	var unavailableHandler = FakeImageHandler{}
   144  	c.cc.onAvailableImageHandler = availableHandler.Handle
   145  	c.cc.onUnavailableImageHandler = unavailableHandler.Handle
   146  	c.driverProxy.On("AddSubscription", Channel, StreamId1).
   147  		Return(CorrelationId1, nil)
   148  	reg, err := c.cc.AddSubscription(Channel, StreamId1)
   149  	c.Require().NoError(err)
   150  	c.Require().Equal(reg, CorrelationId1)
   151  
   152  	c.cc.OnSubscriptionReady(CorrelationId1, -1)
   153  	sub, err := c.cc.FindSubscription(CorrelationId1)
   154  	c.Require().NoError(err)
   155  	c.Require().NotNil(sub)
   156  
   157  	var image MockImage
   158  	c.cc.imageFactory = func(_ int32, _ int64, _ string, _ int64, _ string, _ *atomic.Buffer, _ int32) Image {
   159  		return &image
   160  	}
   161  
   162  	c.Require().Equal(sub.ImageCount(), 0)
   163  	c.cc.OnAvailableImage(StreamId1, SessionId1, fmt.Sprintf("%d-log", SessionId1), SourceInfo,
   164  		SubscriptionPositionId, CorrelationId1, CorrelationId1)
   165  	c.Require().Equal(sub.ImageCount(), 1)
   166  	c.Require().Equal(availableHandler.GetHandledImage(), &image)
   167  	c.Require().Nil(availableHandler.GetHandledImage())
   168  	c.Require().Nil(unavailableHandler.GetHandledImage())
   169  
   170  	image.On("CorrelationID").Return(CorrelationId1)
   171  	c.cc.OnUnavailableImage(CorrelationId1, sub.RegistrationID())
   172  	c.Require().Equal(sub.ImageCount(), 0)
   173  	c.Require().Equal(unavailableHandler.GetHandledImage(), &image)
   174  	c.Require().Nil(unavailableHandler.GetHandledImage())
   175  	c.Require().Nil(availableHandler.GetHandledImage())
   176  }
   177  
   178  func (c *ClientConductorTestSuite) TestClientNotifiedOfNewAndInactiveImagesWithSpecificHandler() {
   179  	var failHandler = func(_ Image) {
   180  		c.Fail("Default handler called instead of specified handler")
   181  	}
   182  	c.cc.onAvailableImageHandler = failHandler
   183  	c.cc.onUnavailableImageHandler = failHandler
   184  
   185  	var availableHandler = FakeImageHandler{}
   186  	var unavailableHandler = FakeImageHandler{}
   187  
   188  	c.driverProxy.On("AddSubscription", Channel, StreamId1).
   189  		Return(CorrelationId1, nil)
   190  	reg, err := c.cc.AddSubscriptionWithHandlers(Channel, StreamId1, availableHandler.Handle, unavailableHandler.Handle)
   191  	c.Require().NoError(err)
   192  	c.Require().Equal(reg, CorrelationId1)
   193  
   194  	c.cc.OnSubscriptionReady(CorrelationId1, -1)
   195  	sub, err := c.cc.FindSubscription(CorrelationId1)
   196  	c.Require().NoError(err)
   197  	c.Require().NotNil(sub)
   198  
   199  	var image MockImage
   200  	c.cc.imageFactory = func(_ int32, _ int64, _ string, _ int64, _ string, _ *atomic.Buffer, _ int32) Image {
   201  		return &image
   202  	}
   203  
   204  	c.Require().Equal(sub.ImageCount(), 0)
   205  	c.cc.OnAvailableImage(StreamId1, SessionId1, fmt.Sprintf("%d-log", SessionId1), SourceInfo,
   206  		SubscriptionPositionId, CorrelationId1, CorrelationId1)
   207  	c.Require().Equal(sub.ImageCount(), 1)
   208  	c.Require().Equal(availableHandler.GetHandledImage(), &image)
   209  	c.Require().Nil(availableHandler.GetHandledImage())
   210  	c.Require().Nil(unavailableHandler.GetHandledImage())
   211  
   212  	image.On("CorrelationID").Return(CorrelationId1)
   213  	c.cc.OnUnavailableImage(CorrelationId1, sub.RegistrationID())
   214  	c.Require().Equal(sub.ImageCount(), 0)
   215  	c.Require().Equal(unavailableHandler.GetHandledImage(), &image)
   216  	c.Require().Nil(unavailableHandler.GetHandledImage())
   217  	c.Require().Nil(availableHandler.GetHandledImage())
   218  }
   219  
   220  func (c *ClientConductorTestSuite) TestShouldIgnoreUnknownNewImage() {
   221  	var failHandler = func(_ Image) {
   222  		c.Fail("Unknown image should not trigger any handler")
   223  	}
   224  	c.cc.onAvailableImageHandler = failHandler
   225  	c.cc.onUnavailableImageHandler = failHandler
   226  
   227  	c.cc.OnAvailableImage(StreamId1, SessionId1, fmt.Sprintf("%d-log", SessionId1), SourceInfo,
   228  		SubscriptionPositionId, SubscriptionPositionRegistrationId, CorrelationId1)
   229  }
   230  
   231  func (c *ClientConductorTestSuite) TestShouldIgnoreUnknownInactiveImage() {
   232  	var failHandler = func(_ Image) {
   233  		c.Fail("Unknown image should not trigger any handler")
   234  	}
   235  	c.cc.onAvailableImageHandler = failHandler
   236  	c.cc.onUnavailableImageHandler = failHandler
   237  
   238  	c.cc.OnUnavailableImage(CorrelationId1, SubscriptionPositionRegistrationId)
   239  }
   240  
   241  func (c *ClientConductorTestSuite) TestShouldReturnNullForUnknownCounter() {
   242  	counter, err := c.cc.FindCounter(100)
   243  	c.Assert().Nil(counter)
   244  	c.Assert().Error(err)
   245  }
   246  
   247  // Also indirectly tests C++'s shouldSendAddCounterToDriver.  We mock out driverProxy.  They check that driverProxy
   248  // wrote the correct data to a test ring buffer.
   249  func (c *ClientConductorTestSuite) TestShouldReturnNullForCounterWithoutOnAvailableCounter() {
   250  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   251  		Return(CounterRegId, nil)
   252  
   253  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   254  	c.Require().NoError(err)
   255  	c.Require().Equal(id, CounterRegId)
   256  
   257  	counter, err := c.cc.FindCounter(id)
   258  	c.Assert().Nil(counter)
   259  	c.Assert().NoError(err)
   260  }
   261  
   262  func (c *ClientConductorTestSuite) TestShouldReturnCounterAfterOnAvailableCounter() {
   263  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   264  		Return(CounterRegId, nil)
   265  	handler := testdata.NewMockAvailableCounterHandler(c.T())
   266  	handler.On("Handle", mock.Anything, CounterRegId, CounterId).Once()
   267  	c.cc.AddAvailableCounterHandler(handler)
   268  
   269  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   270  	c.Require().NoError(err)
   271  	c.Require().Equal(id, CounterRegId)
   272  
   273  	c.cc.OnAvailableCounter(CounterRegId, CounterId)
   274  
   275  	counter, err := c.cc.FindCounter(id)
   276  	c.Require().NotNil(counter)
   277  	c.Require().NoError(err)
   278  	c.Assert().Equal(counter.RegistrationId(), CounterRegId)
   279  	c.Assert().Equal(counter.counterId, CounterId)
   280  }
   281  
   282  // C++ uses a shared_ptr's implicit destructor to call Close().  Here we just call Close() manually.
   283  func (c *ClientConductorTestSuite) TestShouldReleaseCounterAfterGoingOutOfScope() {
   284  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   285  		Return(CounterRegId, nil)
   286  
   287  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   288  	c.Require().NoError(err)
   289  	c.Require().Equal(id, CounterRegId)
   290  
   291  	c.cc.OnAvailableCounter(CounterRegId, CounterId)
   292  
   293  	counter, err := c.cc.FindCounter(id)
   294  	c.Require().NotNil(counter)
   295  	c.Require().NoError(err)
   296  
   297  	c.driverProxy.On("RemoveCounter", CounterRegId).
   298  		Return(int64(123), nil)
   299  	counter.Close()
   300  
   301  	counter, err = c.cc.FindCounter(id)
   302  	c.Require().Nil(counter)
   303  	c.Require().Error(err)
   304  }
   305  
   306  func (c *ClientConductorTestSuite) TestShouldReturnDifferentIdsForDuplicateAddCounter() {
   307  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   308  		Once().Return(CounterRegId, nil)
   309  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   310  	c.Require().NoError(err)
   311  	c.Require().Equal(id, CounterRegId)
   312  
   313  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   314  		Once().Return(CounterRegId2, nil)
   315  	id, err = c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   316  	c.Require().NoError(err)
   317  	c.Require().Equal(id, CounterRegId2)
   318  }
   319  
   320  func (c *ClientConductorTestSuite) TestShouldReturnSameFindCounterAfterOnAvailableCounter() {
   321  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   322  		Return(CounterRegId, nil)
   323  
   324  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   325  
   326  	c.cc.OnAvailableCounter(CounterRegId, CounterId)
   327  
   328  	counter1, err := c.cc.FindCounter(id)
   329  	c.Require().NotNil(counter1)
   330  	c.Require().NoError(err)
   331  	counter2, err := c.cc.FindCounter(id)
   332  	c.Require().NotNil(counter2)
   333  	c.Require().NoError(err)
   334  	c.Require().Equal(counter1, counter2)
   335  }
   336  
   337  func (c *ClientConductorTestSuite) TestShouldReturnDifferentCounterAfterOnAvailableCounter() {
   338  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   339  		Once().Return(CounterRegId, nil)
   340  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   341  		Once().Return(CounterRegId2, nil)
   342  	handler := testdata.NewMockAvailableCounterHandler(c.T())
   343  	handler.On("Handle", mock.Anything, CounterRegId, CounterId).Once()
   344  	handler.On("Handle", mock.Anything, CounterRegId2, CounterId).Once()
   345  	c.cc.AddAvailableCounterHandler(handler)
   346  
   347  	id1, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   348  	c.Require().Equal(id1, CounterRegId)
   349  	id2, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   350  	c.Require().Equal(id2, CounterRegId2)
   351  
   352  	c.cc.OnAvailableCounter(CounterRegId, CounterId)
   353  	c.cc.OnAvailableCounter(CounterRegId2, CounterId)
   354  
   355  	counter1, err := c.cc.FindCounter(id1)
   356  	c.Require().NotNil(counter1)
   357  	c.Require().NoError(err)
   358  	counter2, err := c.cc.FindCounter(id2)
   359  	c.Require().NotNil(counter2)
   360  	c.Require().NoError(err)
   361  	c.Require().NotEqual(counter1, counter2)
   362  }
   363  
   364  func (c *ClientConductorTestSuite) TestShouldNotFindCounterOnAvailableCounterForUnknownCorrelationId() {
   365  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   366  		Return(CounterRegId, nil)
   367  	handler := testdata.NewMockAvailableCounterHandler(c.T())
   368  	handler.On("Handle", mock.Anything, CounterRegId2, CounterId).Once()
   369  	c.cc.AddAvailableCounterHandler(handler)
   370  
   371  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   372  
   373  	c.cc.OnAvailableCounter(CounterRegId2, CounterId)
   374  
   375  	counter1, err := c.cc.FindCounter(id)
   376  	c.Require().Nil(counter1)
   377  	c.Require().NoError(err)
   378  }
   379  
   380  func (c *ClientConductorTestSuite) TestShouldTimeoutAddCounterWithoutOnAvailableCounter() {
   381  	c.cc.driverTimeoutNs = 1
   382  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   383  		Return(CounterRegId, nil)
   384  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   385  
   386  	counter, err := c.cc.FindCounter(id)
   387  	c.Require().Nil(counter)
   388  	c.Require().Error(err)
   389  }
   390  
   391  func (c *ClientConductorTestSuite) TestShouldErrorOnFindWhenReceivingErrorResponseOnAddCounter() {
   392  	c.driverProxy.On("AddCounterByLabel", CounterTypeId, CounterLabel).
   393  		Return(CounterRegId, nil)
   394  	id, err := c.cc.AddCounterByLabel(CounterTypeId, CounterLabel)
   395  
   396  	c.cc.OnErrorResponse(id, 123, "can't add counter")
   397  
   398  	counter, err := c.cc.FindCounter(id)
   399  	c.Require().Nil(counter)
   400  	c.Require().ErrorContains(err, "can't add counter")
   401  }
   402  
   403  func (c *ClientConductorTestSuite) TestShouldCallOnUnavailableCounter() {
   404  	id := int64(101)
   405  	handler := testdata.NewMockUnavailableCounterHandler(c.T())
   406  	handler.On("Handle", mock.Anything, id, CounterId).Once()
   407  	c.cc.AddUnavailableCounterHandler(handler)
   408  
   409  	c.cc.OnUnavailableCounter(id, CounterId)
   410  }
   411  
   412  func TestClientConductor(t *testing.T) {
   413  	suite.Run(t, new(ClientConductorTestSuite))
   414  }
   415  
   416  type FakeImageHandler struct {
   417  	images []Image
   418  }
   419  
   420  func (f *FakeImageHandler) Handle(image Image) {
   421  	if f.images == nil {
   422  		f.images = make([]Image, 0)
   423  	}
   424  	f.images = append(f.images, image)
   425  }
   426  
   427  func (f *FakeImageHandler) GetHandledImage() Image {
   428  	if len(f.images) == 0 {
   429  		return nil
   430  	}
   431  	ret := f.images[0]
   432  	f.images = f.images[1:]
   433  	return ret
   434  }
   435  
   436  // Everything below is auto generated by mockery using this command:
   437  // mockery --name=DriverProxy --inpackage --structname=MockDriverProxy --print
   438  
   439  // Code generated by mockery v2.14.0. DO NOT EDIT.
   440  
   441  // MockDriverProxy is an autogenerated mock type for the DriverProxy type
   442  type MockDriverProxy struct {
   443  	mock.Mock
   444  }
   445  
   446  // AddCounter provides a mock function with given fields: typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength
   447  func (_m *MockDriverProxy) AddCounter(typeId int32, keyBuffer *atomic.Buffer, keyOffset int32, keyLength int32, labelBuffer *atomic.Buffer, labelOffset int32, labelLength int32) (int64, error) {
   448  	ret := _m.Called(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength)
   449  
   450  	var r0 int64
   451  	if rf, ok := ret.Get(0).(func(int32, *atomic.Buffer, int32, int32, *atomic.Buffer, int32, int32) int64); ok {
   452  		r0 = rf(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength)
   453  	} else {
   454  		r0 = ret.Get(0).(int64)
   455  	}
   456  
   457  	var r1 error
   458  	if rf, ok := ret.Get(1).(func(int32, *atomic.Buffer, int32, int32, *atomic.Buffer, int32, int32) error); ok {
   459  		r1 = rf(typeId, keyBuffer, keyOffset, keyLength, labelBuffer, labelOffset, labelLength)
   460  	} else {
   461  		r1 = ret.Error(1)
   462  	}
   463  
   464  	return r0, r1
   465  }
   466  
   467  // AddCounterByLabel provides a mock function with given fields: typeId, label
   468  func (_m *MockDriverProxy) AddCounterByLabel(typeId int32, label string) (int64, error) {
   469  	ret := _m.Called(typeId, label)
   470  
   471  	var r0 int64
   472  	if rf, ok := ret.Get(0).(func(int32, string) int64); ok {
   473  		r0 = rf(typeId, label)
   474  	} else {
   475  		r0 = ret.Get(0).(int64)
   476  	}
   477  
   478  	var r1 error
   479  	if rf, ok := ret.Get(1).(func(int32, string) error); ok {
   480  		r1 = rf(typeId, label)
   481  	} else {
   482  		r1 = ret.Error(1)
   483  	}
   484  
   485  	return r0, r1
   486  }
   487  
   488  // AddDestination provides a mock function with given fields: registrationID, channel
   489  func (_m *MockDriverProxy) AddDestination(registrationID int64, channel string) (int64, error) {
   490  	ret := _m.Called(registrationID, channel)
   491  
   492  	var r0 int64
   493  	if rf, ok := ret.Get(0).(func(int64, string) int64); ok {
   494  		r0 = rf(registrationID, channel)
   495  	} else {
   496  		r0 = ret.Get(0).(int64)
   497  	}
   498  
   499  	var r1 error
   500  	if rf, ok := ret.Get(1).(func(int64, string) error); ok {
   501  		r1 = rf(registrationID, channel)
   502  	} else {
   503  		r1 = ret.Error(1)
   504  	}
   505  
   506  	return r0, r1
   507  }
   508  
   509  // AddExclusivePublication provides a mock function with given fields: channel, streamID
   510  func (_m *MockDriverProxy) AddExclusivePublication(channel string, streamID int32) (int64, error) {
   511  	ret := _m.Called(channel, streamID)
   512  
   513  	var r0 int64
   514  	if rf, ok := ret.Get(0).(func(string, int32) int64); ok {
   515  		r0 = rf(channel, streamID)
   516  	} else {
   517  		r0 = ret.Get(0).(int64)
   518  	}
   519  
   520  	var r1 error
   521  	if rf, ok := ret.Get(1).(func(string, int32) error); ok {
   522  		r1 = rf(channel, streamID)
   523  	} else {
   524  		r1 = ret.Error(1)
   525  	}
   526  
   527  	return r0, r1
   528  }
   529  
   530  // AddPublication provides a mock function with given fields: channel, streamID
   531  func (_m *MockDriverProxy) AddPublication(channel string, streamID int32) (int64, error) {
   532  	ret := _m.Called(channel, streamID)
   533  
   534  	var r0 int64
   535  	if rf, ok := ret.Get(0).(func(string, int32) int64); ok {
   536  		r0 = rf(channel, streamID)
   537  	} else {
   538  		r0 = ret.Get(0).(int64)
   539  	}
   540  
   541  	var r1 error
   542  	if rf, ok := ret.Get(1).(func(string, int32) error); ok {
   543  		r1 = rf(channel, streamID)
   544  	} else {
   545  		r1 = ret.Error(1)
   546  	}
   547  
   548  	return r0, r1
   549  }
   550  
   551  // AddRcvDestination provides a mock function with given fields: registrationID, channel
   552  func (_m *MockDriverProxy) AddRcvDestination(registrationID int64, channel string) (int64, error) {
   553  	ret := _m.Called(registrationID, channel)
   554  
   555  	var r0 int64
   556  	if rf, ok := ret.Get(0).(func(int64, string) int64); ok {
   557  		r0 = rf(registrationID, channel)
   558  	} else {
   559  		r0 = ret.Get(0).(int64)
   560  	}
   561  
   562  	var r1 error
   563  	if rf, ok := ret.Get(1).(func(int64, string) error); ok {
   564  		r1 = rf(registrationID, channel)
   565  	} else {
   566  		r1 = ret.Error(1)
   567  	}
   568  
   569  	return r0, r1
   570  }
   571  
   572  // AddSubscription provides a mock function with given fields: channel, streamID
   573  func (_m *MockDriverProxy) AddSubscription(channel string, streamID int32) (int64, error) {
   574  	ret := _m.Called(channel, streamID)
   575  
   576  	var r0 int64
   577  	if rf, ok := ret.Get(0).(func(string, int32) int64); ok {
   578  		r0 = rf(channel, streamID)
   579  	} else {
   580  		r0 = ret.Get(0).(int64)
   581  	}
   582  
   583  	var r1 error
   584  	if rf, ok := ret.Get(1).(func(string, int32) error); ok {
   585  		r1 = rf(channel, streamID)
   586  	} else {
   587  		r1 = ret.Error(1)
   588  	}
   589  
   590  	return r0, r1
   591  }
   592  
   593  // ClientClose provides a mock function with given fields:
   594  func (_m *MockDriverProxy) ClientClose() error {
   595  	ret := _m.Called()
   596  
   597  	var r0 error
   598  	if rf, ok := ret.Get(0).(func() error); ok {
   599  		r0 = rf()
   600  	} else {
   601  		r0 = ret.Error(0)
   602  	}
   603  
   604  	return r0
   605  }
   606  
   607  // ClientID provides a mock function with given fields:
   608  func (_m *MockDriverProxy) ClientID() int64 {
   609  	ret := _m.Called()
   610  
   611  	var r0 int64
   612  	if rf, ok := ret.Get(0).(func() int64); ok {
   613  		r0 = rf()
   614  	} else {
   615  		r0 = ret.Get(0).(int64)
   616  	}
   617  
   618  	return r0
   619  }
   620  
   621  // NextCorrelationID provides a mock function with given fields:
   622  func (_m *MockDriverProxy) NextCorrelationID() int64 {
   623  	ret := _m.Called()
   624  
   625  	var r0 int64
   626  	if rf, ok := ret.Get(0).(func() int64); ok {
   627  		r0 = rf()
   628  	} else {
   629  		r0 = ret.Get(0).(int64)
   630  	}
   631  
   632  	return r0
   633  }
   634  
   635  // RemoveCounter provides a mock function with given fields: registrationId
   636  func (_m *MockDriverProxy) RemoveCounter(registrationId int64) (int64, error) {
   637  	ret := _m.Called(registrationId)
   638  
   639  	var r0 int64
   640  	if rf, ok := ret.Get(0).(func(int64) int64); ok {
   641  		r0 = rf(registrationId)
   642  	} else {
   643  		r0 = ret.Get(0).(int64)
   644  	}
   645  
   646  	var r1 error
   647  	if rf, ok := ret.Get(1).(func(int64) error); ok {
   648  		r1 = rf(registrationId)
   649  	} else {
   650  		r1 = ret.Error(1)
   651  	}
   652  
   653  	return r0, r1
   654  }
   655  
   656  // RemoveDestination provides a mock function with given fields: registrationID, channel
   657  func (_m *MockDriverProxy) RemoveDestination(registrationID int64, channel string) (int64, error) {
   658  	ret := _m.Called(registrationID, channel)
   659  
   660  	var r0 int64
   661  	if rf, ok := ret.Get(0).(func(int64, string) int64); ok {
   662  		r0 = rf(registrationID, channel)
   663  	} else {
   664  		r0 = ret.Get(0).(int64)
   665  	}
   666  
   667  	var r1 error
   668  	if rf, ok := ret.Get(1).(func(int64, string) error); ok {
   669  		r1 = rf(registrationID, channel)
   670  	} else {
   671  		r1 = ret.Error(1)
   672  	}
   673  
   674  	return r0, r1
   675  }
   676  
   677  // RemovePublication provides a mock function with given fields: registrationID
   678  func (_m *MockDriverProxy) RemovePublication(registrationID int64) error {
   679  	ret := _m.Called(registrationID)
   680  
   681  	var r0 error
   682  	if rf, ok := ret.Get(0).(func(int64) error); ok {
   683  		r0 = rf(registrationID)
   684  	} else {
   685  		r0 = ret.Error(0)
   686  	}
   687  
   688  	return r0
   689  }
   690  
   691  // RemoveRcvDestination provides a mock function with given fields: registrationID, channel
   692  func (_m *MockDriverProxy) RemoveRcvDestination(registrationID int64, channel string) (int64, error) {
   693  	ret := _m.Called(registrationID, channel)
   694  
   695  	var r0 int64
   696  	if rf, ok := ret.Get(0).(func(int64, string) int64); ok {
   697  		r0 = rf(registrationID, channel)
   698  	} else {
   699  		r0 = ret.Get(0).(int64)
   700  	}
   701  
   702  	var r1 error
   703  	if rf, ok := ret.Get(1).(func(int64, string) error); ok {
   704  		r1 = rf(registrationID, channel)
   705  	} else {
   706  		r1 = ret.Error(1)
   707  	}
   708  
   709  	return r0, r1
   710  }
   711  
   712  // RemoveSubscription provides a mock function with given fields: registrationID
   713  func (_m *MockDriverProxy) RemoveSubscription(registrationID int64) error {
   714  	ret := _m.Called(registrationID)
   715  
   716  	var r0 error
   717  	if rf, ok := ret.Get(0).(func(int64) error); ok {
   718  		r0 = rf(registrationID)
   719  	} else {
   720  		r0 = ret.Error(0)
   721  	}
   722  
   723  	return r0
   724  }
   725  
   726  // TimeOfLastDriverKeepalive provides a mock function with given fields:
   727  func (_m *MockDriverProxy) TimeOfLastDriverKeepalive() int64 {
   728  	ret := _m.Called()
   729  
   730  	var r0 int64
   731  	if rf, ok := ret.Get(0).(func() int64); ok {
   732  		r0 = rf()
   733  	} else {
   734  		r0 = ret.Get(0).(int64)
   735  	}
   736  
   737  	return r0
   738  }
   739  
   740  type mockConstructorTestingTNewMockDriverProxy interface {
   741  	mock.TestingT
   742  	Cleanup(func())
   743  }
   744  
   745  // NewMockDriverProxy creates a new instance of MockDriverProxy. It also registers a testing interface on the mock and a cleanup function to assert the mocks expectations.
   746  func NewMockDriverProxy(t mockConstructorTestingTNewMockDriverProxy) *MockDriverProxy {
   747  	mock := &MockDriverProxy{}
   748  	mock.Mock.Test(t)
   749  
   750  	t.Cleanup(func() { mock.AssertExpectations(t) })
   751  
   752  	return mock
   753  }