public void AuthenticationTest() { var config = new Configuration.MemcacheClientConfiguration { Authenticator = Configuration.MemcacheClientConfiguration.SaslPlainAuthenticatorFactory(string.Empty, "NoLogin", "NoPass"), }; using (var serverMock = new ServerMock()) using (var transport = new MemcacheTransport(serverMock.ListenEndPoint, config, t => { }, t => { }, false, null)) { var mutex = new ManualResetEventSlim(); new MemcacheResponseHeader { Opaque = 0, Opcode = Opcode.StartAuth, Status = Status.NoError, }.ToData(serverMock.ResponseHeader); Status responseStatus = Status.InternalError; Assert.IsTrue(transport.TrySend(new NoOpRequest { RequestId = 0, Callback = h => { mutex.Set(); responseStatus = h.Status; } }) , "Unable to send a request on authenticated transport"); Assert.IsTrue(mutex.Wait(1000), "No response retrived on authenticated transport"); Assert.AreEqual(Status.NoError, responseStatus, "The response returned on error"); } }
public void QueueFullTest() { var config = new Configuration.MemcacheClientConfiguration { QueueLength = 1, }; int transportAvailablized = 0; using (var serverMock = new ServerMock()) using (var transportToTest = new MemcacheTransport(serverMock.ListenEndPoint, config, t => { }, t => Interlocked.Increment(ref transportAvailablized), false, null)) { var requestHeader = new MemcacheResponseHeader { Cas = 1, DataType = 2, ExtraLength = 4, KeyLength = 0, Opaque = 42, Opcode = Opcode.Get, Status = Headers.Status.KeyNotFound, TotalBodyLength = 4, }; requestHeader.ToData(serverMock.ResponseHeader); serverMock.ResponseBody = new byte[4]; serverMock.ReceiveMutex = new ManualResetEventSlim(); var clientMutex = new ManualResetEventSlim(); var request1 = new GetRequest { RequestId = (uint)42, Key = "Hello, world".Select(c => (byte)c).ToArray(), RequestOpcode = Opcode.Get, CallBack = (r, v) => clientMutex.Set(), }; var request2 = new GetRequest { RequestId = (uint)42, Key = "Hello, world".Select(c => (byte)c).ToArray(), RequestOpcode = Opcode.Get, CallBack = (r, v) => { }, }; // we sent a first request and let the server wait before respond Assert.IsTrue(transportToTest.TrySend(request1), "The first request failed to be sent"); Assert.That(() => transportAvailablized, Is.EqualTo(2).After(1000, 50)); // we check that the queue is full, and the transport fail to send a new request Assert.IsFalse(transportToTest.TrySend(request2), "The second request should not have been sent"); // unblocks both server response and callback from client serverMock.ReceiveMutex.Set(); Assert.IsTrue(clientMutex.Wait(1000), "The response callback has not been triggered for the first request"); // make sure that we triggered the transport available after the queue is not full anymore Assert.That(() => transportAvailablized, Is.EqualTo(3).After(1000, 50)); // checks if we can send a new request since the queue is not full anymore Assert.IsTrue(transportToTest.TrySend(request2), "The third request failed to be sent"); Assert.That(() => transportAvailablized, Is.EqualTo(4).After(1000, 50)); } }
public void QueueFullTest() { var config = new Configuration.MemcacheClientConfiguration { QueueLength = 1, }; int transportAvailablized = 0; using (var serverMock = new ServerMock()) using (var transportToTest = new MemcacheTransport(serverMock.ListenEndPoint, config, t => { }, t => Interlocked.Increment(ref transportAvailablized), false, null)) { var requestHeader = new MemcacheResponseHeader { Cas = 1, DataType = 2, ExtraLength = 4, KeyLength = 0, Opaque = 42, Opcode = Opcode.Get, Status = Headers.Status.KeyNotFound, TotalBodyLength = 4, }; requestHeader.ToData(serverMock.ResponseHeader); serverMock.ResponseBody = new byte[4]; serverMock.ReceiveMutex = new ManualResetEventSlim(); var clientMutex = new ManualResetEventSlim(); var request1 = new GetRequest { RequestId = (uint)42, Key = "Hello, world".Select(c => (byte)c).ToArray(), RequestOpcode = Opcode.Get, CallBack = (r, v) => clientMutex.Set(), }; var request2 = new GetRequest { RequestId = (uint)42, Key = "Hello, world".Select(c => (byte)c).ToArray(), RequestOpcode = Opcode.Get, CallBack = (r, v) => { }, }; // we sent a first request and let the server wait before respond Assert.IsTrue(transportToTest.TrySend(request1), "The first request failed to be sent"); Assert.That(() => transportAvailablized, Is.EqualTo(2).After(1000, 50)); // we check that the queue is full, and the transport fail to send a new request Assert.IsFalse(transportToTest.TrySend(request2), "The second request should not have been sent"); // unblocks both server response and callback from client serverMock.ReceiveMutex.Set(); Assert.IsTrue(clientMutex.Wait(1000), "The response callback has not been triggered for the first request"); // make sure that we triggered the transport available after the queue is not full anymore Assert.That(() => transportAvailablized, Is.EqualTo(3).After(1000, 50)); // checks if we can send a new request since the queue is not full anymore Assert.IsTrue(transportToTest.TrySend(request2), "The third request failed to be sent"); Assert.That(() => transportAvailablized, Is.EqualTo(4).After(1000, 50)); } }
public void AuthenticationTest() { var config = new Configuration.MemcacheClientConfiguration { Authenticator = Configuration.MemcacheClientConfiguration.SaslPlainAuthenticatorFactory(string.Empty, "NoLogin", "NoPass"), }; using (var serverMock = new ServerMock()) using (var transport = new MemcacheTransport(serverMock.ListenEndPoint, config, t => { }, t => { }, false, null)) { var mutex = new ManualResetEventSlim(); new MemcacheResponseHeader { Opaque = 0, Opcode = Opcode.StartAuth, Status = Status.NoError, }.ToData(serverMock.ResponseHeader); Status responseStatus = Status.InternalError; Assert.IsTrue(transport.TrySend(new NoOpRequest { RequestId = 0, Callback = h => { mutex.Set(); responseStatus = h.Status; } }) , "Unable to send a request on authenticated transport"); Assert.IsTrue(mutex.Wait(1000), "No response retrived on authenticated transport"); Assert.AreEqual(Status.NoError, responseStatus, "The response returned on error"); } }