Search in sources :

Example 46 with Header

use of io.aeron.logbuffer.Header in project Aeron by real-logic.

the class EgressAdapterTest method onFragmentShouldInvokeOnMessageCallbackIfSessionIdMatches.

@Test
void onFragmentShouldInvokeOnMessageCallbackIfSessionIdMatches() {
    final int offset = 4;
    final long sessionId = 2973438724L;
    final long timestamp = -46328746238764832L;
    sessionMessageHeaderEncoder.wrapAndApplyHeader(buffer, offset, messageHeaderEncoder).clusterSessionId(sessionId).timestamp(timestamp);
    final EgressListener egressListener = mock(EgressListener.class);
    final Header header = new Header(0, 0);
    final EgressAdapter adapter = new EgressAdapter(egressListener, sessionId, mock(Subscription.class), 3);
    adapter.onFragment(buffer, offset, sessionMessageHeaderEncoder.encodedLength(), header);
    verify(egressListener).onMessage(sessionId, timestamp, buffer, offset + SESSION_HEADER_LENGTH, sessionMessageHeaderEncoder.encodedLength() - SESSION_HEADER_LENGTH, header);
    verifyNoMoreInteractions(egressListener);
}
Also used : Header(io.aeron.logbuffer.Header) Subscription(io.aeron.Subscription) Test(org.junit.jupiter.api.Test)

Example 47 with Header

use of io.aeron.logbuffer.Header in project Aeron by real-logic.

the class PubAndSubTest method shouldContinueAfterRolloverWithMinimalPaddingHeader.

@ParameterizedTest
@MethodSource("channels")
@InterruptAfter(10)
void shouldContinueAfterRolloverWithMinimalPaddingHeader(final String channel) {
    final int termBufferLength = 64 * 1024;
    final int termBufferLengthMinusPaddingHeader = termBufferLength - HEADER_LENGTH;
    final int num1kMessagesInTermBuffer = 63;
    final int lastMessageLength = termBufferLengthMinusPaddingHeader - (num1kMessagesInTermBuffer * 1024) - HEADER_LENGTH;
    final int messageLength = 1024 - HEADER_LENGTH;
    context.publicationTermBufferLength(termBufferLength);
    launch(channel);
    // lock step reception until we get to within 8 messages of the end
    for (int i = 0; i < num1kMessagesInTermBuffer - 7; i++) {
        while (publication.offer(buffer, 0, messageLength) < 0L) {
            Tests.yield();
        }
        pollForFragment();
    }
    for (int i = 7; i > 0; i--) {
        while (publication.offer(buffer, 0, messageLength) < 0L) {
            Tests.yield();
        }
    }
    // small enough to leave room for padding that is just a header
    while (publication.offer(buffer, 0, lastMessageLength) < 0L) {
        Tests.yield();
    }
    // no roll over
    while (publication.offer(buffer, 0, messageLength) < 0L) {
        Tests.yield();
    }
    final MutableInteger fragmentsRead = new MutableInteger();
    Tests.executeUntil(() -> fragmentsRead.value == 9, (j) -> {
        final int fragments = subscription.poll(fragmentHandler, 10);
        if (0 == fragments) {
            Thread.yield();
        }
        fragmentsRead.value += fragments;
    }, Integer.MAX_VALUE, TimeUnit.MILLISECONDS.toNanos(500));
    final InOrder inOrder = inOrder(fragmentHandler);
    inOrder.verify(fragmentHandler, times(num1kMessagesInTermBuffer)).onFragment(any(DirectBuffer.class), anyInt(), eq(messageLength), any(Header.class));
    inOrder.verify(fragmentHandler, times(1)).onFragment(any(DirectBuffer.class), anyInt(), eq(lastMessageLength), any(Header.class));
    inOrder.verify(fragmentHandler, times(1)).onFragment(any(DirectBuffer.class), anyInt(), eq(messageLength), any(Header.class));
}
Also used : DirectBuffer(org.agrona.DirectBuffer) InOrder(org.mockito.InOrder) Header(io.aeron.logbuffer.Header) MutableInteger(org.agrona.collections.MutableInteger) DebugSendChannelEndpoint(io.aeron.driver.ext.DebugSendChannelEndpoint) InterruptAfter(io.aeron.test.InterruptAfter) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) MethodSource(org.junit.jupiter.params.provider.MethodSource)

Example 48 with Header

use of io.aeron.logbuffer.Header in project Aeron by real-logic.

the class FragmentedMessageTest method shouldReceivePublishedMessage.

@ParameterizedTest
@MethodSource("channels")
@InterruptAfter(10)
void shouldReceivePublishedMessage(final String channel) {
    final FragmentAssembler assembler = new FragmentAssembler(mockFragmentHandler);
    try (Subscription subscription = aeron.addSubscription(channel, STREAM_ID);
        Publication publication = aeron.addPublication(channel, STREAM_ID)) {
        final UnsafeBuffer srcBuffer = new UnsafeBuffer(new byte[driver.context().mtuLength() * 4]);
        final int offset = 0;
        final int length = srcBuffer.capacity() / 4;
        for (int i = 0; i < 4; i++) {
            srcBuffer.setMemory(i * length, length, (byte) (65 + i));
        }
        while (publication.offer(srcBuffer, offset, srcBuffer.capacity()) < 0L) {
            Tests.yield();
        }
        final int expectedFragmentsBecauseOfHeader = 5;
        int numFragments = 0;
        do {
            final int fragments = subscription.poll(assembler, FRAGMENT_COUNT_LIMIT);
            if (0 == fragments) {
                Tests.yield();
            }
            numFragments += fragments;
        } while (numFragments < expectedFragmentsBecauseOfHeader);
        final ArgumentCaptor<DirectBuffer> bufferArg = ArgumentCaptor.forClass(DirectBuffer.class);
        final ArgumentCaptor<Header> headerArg = ArgumentCaptor.forClass(Header.class);
        verify(mockFragmentHandler, times(1)).onFragment(bufferArg.capture(), eq(offset), eq(srcBuffer.capacity()), headerArg.capture());
        final DirectBuffer capturedBuffer = bufferArg.getValue();
        for (int i = 0; i < srcBuffer.capacity(); i++) {
            assertEquals(srcBuffer.getByte(i), capturedBuffer.getByte(i), "same at i=" + i);
        }
        assertEquals(END_FRAG_FLAG, headerArg.getValue().flags());
    }
}
Also used : DirectBuffer(org.agrona.DirectBuffer) Header(io.aeron.logbuffer.Header) UnsafeBuffer(org.agrona.concurrent.UnsafeBuffer) InterruptAfter(io.aeron.test.InterruptAfter) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) MethodSource(org.junit.jupiter.params.provider.MethodSource)

Example 49 with Header

use of io.aeron.logbuffer.Header in project aeron by real-logic.

the class ClusterNodeTest method shouldEchoMessageViaServiceUsingDirectOffer.

@Test
@InterruptAfter(10)
public void shouldEchoMessageViaServiceUsingDirectOffer() {
    final ExpandableArrayBuffer msgBuffer = new ExpandableArrayBuffer();
    final String msg = "Hello World!";
    msgBuffer.putStringWithoutLengthAscii(0, msg);
    final MutableInteger messageCount = new MutableInteger();
    final EgressListener listener = (clusterSessionId, timestamp, buffer, offset, length, header) -> {
        assertEquals(msg, buffer.getStringWithoutLengthAscii(offset, length));
        messageCount.value += 1;
    };
    container = launchEchoService();
    aeronCluster = connectToCluster(listener);
    offerMessage(msgBuffer, msg);
    awaitResponse(messageCount);
    ClusterTests.failOnClusterError();
}
Also used : ClusterTests(io.aeron.test.cluster.ClusterTests) AeronCluster(io.aeron.cluster.client.AeronCluster) Tests(io.aeron.test.Tests) BeforeEach(org.junit.jupiter.api.BeforeEach) StubClusteredService(io.aeron.test.cluster.StubClusteredService) ClusteredServiceContainer(io.aeron.cluster.service.ClusteredServiceContainer) CLUSTER_MEMBERS(io.aeron.cluster.ClusterTestConstants.CLUSTER_MEMBERS) ClusteredService(io.aeron.cluster.service.ClusteredService) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) BufferClaim(io.aeron.logbuffer.BufferClaim) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) ArchiveThreadingMode(io.aeron.archive.ArchiveThreadingMode) MutableInteger(org.agrona.collections.MutableInteger) CloseHelper(org.agrona.CloseHelper) MediaDriver(io.aeron.driver.MediaDriver) InterruptingTestCallback(io.aeron.test.InterruptingTestCallback) Archive(io.aeron.archive.Archive) ExpandableArrayBuffer(org.agrona.ExpandableArrayBuffer) Test(org.junit.jupiter.api.Test) EgressListener(io.aeron.cluster.client.EgressListener) InterruptAfter(io.aeron.test.InterruptAfter) AfterEach(org.junit.jupiter.api.AfterEach) Header(io.aeron.logbuffer.Header) ClientSession(io.aeron.cluster.service.ClientSession) ThreadingMode(io.aeron.driver.ThreadingMode) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) INGRESS_ENDPOINTS(io.aeron.cluster.ClusterTestConstants.INGRESS_ENDPOINTS) DirectBuffer(org.agrona.DirectBuffer) MutableInteger(org.agrona.collections.MutableInteger) ExpandableArrayBuffer(org.agrona.ExpandableArrayBuffer) EgressListener(io.aeron.cluster.client.EgressListener) Test(org.junit.jupiter.api.Test) InterruptAfter(io.aeron.test.InterruptAfter)

Example 50 with Header

use of io.aeron.logbuffer.Header in project aeron by real-logic.

the class ClusterNodeTest method shouldEchoMessageViaServiceUsingTryClaim.

@Test
@InterruptAfter(10)
public void shouldEchoMessageViaServiceUsingTryClaim() {
    final ExpandableArrayBuffer msgBuffer = new ExpandableArrayBuffer();
    final String msg = "Hello World!";
    msgBuffer.putStringWithoutLengthAscii(0, msg);
    final MutableInteger messageCount = new MutableInteger();
    final EgressListener listener = (clusterSessionId, timestamp, buffer, offset, length, header) -> {
        assertEquals(msg, buffer.getStringWithoutLengthAscii(offset, length));
        messageCount.value += 1;
    };
    container = launchEchoService();
    aeronCluster = connectToCluster(listener);
    final BufferClaim bufferClaim = new BufferClaim();
    long publicationResult;
    do {
        publicationResult = aeronCluster.tryClaim(msg.length(), bufferClaim);
        if (publicationResult > 0) {
            final int offset = bufferClaim.offset() + AeronCluster.SESSION_HEADER_LENGTH;
            bufferClaim.buffer().putBytes(offset, msgBuffer, 0, msg.length());
            bufferClaim.commit();
        } else {
            Tests.yield();
        }
    } while (publicationResult < 0);
    offerMessage(msgBuffer, msg);
    awaitResponse(messageCount);
    ClusterTests.failOnClusterError();
}
Also used : ClusterTests(io.aeron.test.cluster.ClusterTests) AeronCluster(io.aeron.cluster.client.AeronCluster) Tests(io.aeron.test.Tests) BeforeEach(org.junit.jupiter.api.BeforeEach) StubClusteredService(io.aeron.test.cluster.StubClusteredService) ClusteredServiceContainer(io.aeron.cluster.service.ClusteredServiceContainer) CLUSTER_MEMBERS(io.aeron.cluster.ClusterTestConstants.CLUSTER_MEMBERS) ClusteredService(io.aeron.cluster.service.ClusteredService) ExtendWith(org.junit.jupiter.api.extension.ExtendWith) BufferClaim(io.aeron.logbuffer.BufferClaim) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) ArchiveThreadingMode(io.aeron.archive.ArchiveThreadingMode) MutableInteger(org.agrona.collections.MutableInteger) CloseHelper(org.agrona.CloseHelper) MediaDriver(io.aeron.driver.MediaDriver) InterruptingTestCallback(io.aeron.test.InterruptingTestCallback) Archive(io.aeron.archive.Archive) ExpandableArrayBuffer(org.agrona.ExpandableArrayBuffer) Test(org.junit.jupiter.api.Test) EgressListener(io.aeron.cluster.client.EgressListener) InterruptAfter(io.aeron.test.InterruptAfter) AfterEach(org.junit.jupiter.api.AfterEach) Header(io.aeron.logbuffer.Header) ClientSession(io.aeron.cluster.service.ClientSession) ThreadingMode(io.aeron.driver.ThreadingMode) Assertions.assertTrue(org.junit.jupiter.api.Assertions.assertTrue) INGRESS_ENDPOINTS(io.aeron.cluster.ClusterTestConstants.INGRESS_ENDPOINTS) DirectBuffer(org.agrona.DirectBuffer) MutableInteger(org.agrona.collections.MutableInteger) ExpandableArrayBuffer(org.agrona.ExpandableArrayBuffer) EgressListener(io.aeron.cluster.client.EgressListener) BufferClaim(io.aeron.logbuffer.BufferClaim) Test(org.junit.jupiter.api.Test) InterruptAfter(io.aeron.test.InterruptAfter)

Aggregations

Header (io.aeron.logbuffer.Header)63 Test (org.junit.jupiter.api.Test)44 DirectBuffer (org.agrona.DirectBuffer)33 ClientSession (io.aeron.cluster.service.ClientSession)21 StubClusteredService (io.aeron.test.cluster.StubClusteredService)20 ExpandableArrayBuffer (org.agrona.ExpandableArrayBuffer)20 ClusteredService (io.aeron.cluster.service.ClusteredService)18 ClusteredServiceContainer (io.aeron.cluster.service.ClusteredServiceContainer)18 MediaDriver (io.aeron.driver.MediaDriver)18 CloseHelper (org.agrona.CloseHelper)17 Subscription (io.aeron.Subscription)16 Archive (io.aeron.archive.Archive)16 ArchiveThreadingMode (io.aeron.archive.ArchiveThreadingMode)16 AeronCluster (io.aeron.cluster.client.AeronCluster)16 ThreadingMode (io.aeron.driver.ThreadingMode)16 ExtendWith (org.junit.jupiter.api.extension.ExtendWith)16 UnsafeBuffer (org.agrona.concurrent.UnsafeBuffer)15 EgressListener (io.aeron.cluster.client.EgressListener)14 BeforeEach (org.junit.jupiter.api.BeforeEach)14 CLUSTER_MEMBERS (io.aeron.cluster.ClusterTestConstants.CLUSTER_MEMBERS)12