Search in sources :

Example 21 with TestStreamingClient

use of org.zalando.nakadi.webservice.utils.TestStreamingClient in project nakadi by zalando.

the class HilaAT method whenStreamTimeoutReachedPossibleToCommit.

@Test(timeout = 10000)
public void whenStreamTimeoutReachedPossibleToCommit() throws Exception {
    final TestStreamingClient client = TestStreamingClient.create(URL, subscription.getId(), "batch_limit=1&stream_limit=2&stream_timeout=1").start();
    waitFor(() -> assertThat(client.getSessionId(), not(equalTo(SESSION_ID_UNKNOWN))));
    publishEvent(eventType.getName(), "{\"foo\":\"bar\"}");
    waitFor(() -> Assert.assertFalse(client.getBatches().isEmpty()), TimeUnit.SECONDS.toMillis(2), 100);
    final SubscriptionCursor toCommit = client.getBatches().get(0).getCursor();
    // connection is closed, and stream as well
    client.close();
    Thread.sleep(TimeUnit.SECONDS.toMillis(1));
    final int statusCode = commitCursors(subscription.getId(), Collections.singletonList(toCommit), client.getSessionId());
    Assert.assertEquals(SC_NO_CONTENT, statusCode);
}
Also used : SubscriptionCursor(org.zalando.nakadi.view.SubscriptionCursor) TestStreamingClient(org.zalando.nakadi.webservice.utils.TestStreamingClient) Test(org.junit.Test)

Example 22 with TestStreamingClient

use of org.zalando.nakadi.webservice.utils.TestStreamingClient in project nakadi by zalando.

the class HilaAT method whenNoEventsThenBeginOffsetIsUsed.

@Test(timeout = 5000)
public void whenNoEventsThenBeginOffsetIsUsed() throws Exception {
    final TestStreamingClient client = TestStreamingClient.create(subscription.getId()).start();
    waitFor(() -> assertThat(client.getSessionId(), not(equalTo(SESSION_ID_UNKNOWN))));
    when().get("/subscriptions/{sid}/cursors", subscription.getId()).then().body("items[0].offset", equalTo("001-0001--1"));
    final int commitResult = commitCursors(subscription.getId(), ImmutableList.of(new SubscriptionCursor("0", Cursor.BEFORE_OLDEST_OFFSET, eventType.getName(), "abc")), client.getSessionId());
    assertThat(commitResult, equalTo(SC_OK));
}
Also used : SubscriptionCursor(org.zalando.nakadi.view.SubscriptionCursor) TestStreamingClient(org.zalando.nakadi.webservice.utils.TestStreamingClient) Test(org.junit.Test)

Example 23 with TestStreamingClient

use of org.zalando.nakadi.webservice.utils.TestStreamingClient in project nakadi by zalando.

the class HilaAT method whenConnectionIsClosedByClientNakadiRecognizesIt.

@Test(timeout = 10000)
public void whenConnectionIsClosedByClientNakadiRecognizesIt() throws Exception {
    final TestStreamingClient client = TestStreamingClient.create(URL, subscription.getId(), "batch_flush_timeout=1");
    client.start();
    waitFor(() -> assertThat(client.getBatches(), hasSize(1)));
    client.close();
    Thread.sleep(2500);
    final TestStreamingClient anotherClient = TestStreamingClient.create(URL, subscription.getId(), "batch_flush_timeout=1");
    anotherClient.start();
    // if we start to get data for another client it means that Nakadi recognized that first client closed
    // connection (in other case it would not allow second client to connect because of lack of slots)
    waitFor(() -> assertThat(anotherClient.getBatches(), hasSize(1)));
}
Also used : TestStreamingClient(org.zalando.nakadi.webservice.utils.TestStreamingClient) Test(org.junit.Test)

Example 24 with TestStreamingClient

use of org.zalando.nakadi.webservice.utils.TestStreamingClient in project nakadi by zalando.

the class HilaRebalanceAT method checkDirectAssignmentCorrectlyCapturesAndReleasesPartition.

@Test(timeout = 15000)
public void checkDirectAssignmentCorrectlyCapturesAndReleasesPartition() throws IOException, InterruptedException {
    // launch two clients: one using auto-rebalance, second one directly reading from partition 6
    final TestStreamingClient autoClient = new TestStreamingClient(URL, subscription.getId(), "max_uncommitted_events=100");
    autoClient.start();
    final TestStreamingClient directClient = new TestStreamingClient(URL, subscription.getId(), "", Optional.empty(), Optional.of("{\"stream_limit\":1,\"partitions\":[" + "{\"event_type\":\"" + eventType.getName() + "\",\"partition\":\"6\"}]}"));
    directClient.start();
    // wait for rebalance to finish and send 1 event to each partition
    waitFor(() -> assertThat(getNumberOfAssignedStreams(subscription.getId()), is(2)));
    publishBusinessEventWithUserDefinedPartition(eventType.getName(), 8, x -> "blah" + x, x -> String.valueOf(x % 8));
    waitFor(() -> assertThat(autoClient.getBatches(), hasSize(7)));
    checkAllEventsAreFromPartitions(autoClient, ImmutableSet.of("0", "1", "2", "3", "4", "5", "7"));
    waitFor(() -> assertThat(directClient.getBatches(), hasSize(1)));
    checkAllEventsAreFromPartitions(directClient, ImmutableSet.of("6"));
    // commit cursors and wait for stream to be closed (because of reaching stream_limit)
    commitCursors(subscription.getId(), directClient.getBatches().stream().map(StreamBatch::getCursor).collect(Collectors.toList()), directClient.getSessionId());
    waitFor(() -> assertThat(directClient.isRunning(), is(false)));
    // send 1 event to each partition
    publishBusinessEventWithUserDefinedPartition(eventType.getName(), 8, x -> "blah" + x, x -> String.valueOf(x % 8));
    // the client with auto-balancing should now get all 8 new events
    waitFor(() -> assertThat(autoClient.getBatches(), hasSize(7 + 8)));
    checkAllEventsAreFromPartitions(autoClient, ImmutableSet.of("0", "1", "2", "3", "4", "5", "6", "7"));
}
Also used : TestStreamingClient(org.zalando.nakadi.webservice.utils.TestStreamingClient) Test(org.junit.Test)

Example 25 with TestStreamingClient

use of org.zalando.nakadi.webservice.utils.TestStreamingClient in project nakadi by zalando.

the class HilaRebalanceAT method whenRebalanceThenPartitionsAreEquallyDistributedAndCommittedOffsetsAreConsidered.

@Test(timeout = 30000)
public void whenRebalanceThenPartitionsAreEquallyDistributedAndCommittedOffsetsAreConsidered() throws Exception {
    // write 5 events to each partition
    publishBusinessEventWithUserDefinedPartition(eventType.getName(), 40, x -> "blah" + x, x -> String.valueOf(x % 8));
    // create a session
    final TestStreamingClient clientA = TestStreamingClient.create(URL, subscription.getId(), "max_uncommitted_events=100").start();
    waitFor(() -> assertThat(clientA.getBatches(), hasSize(40)));
    // check that we received 5 events for each partitions
    range(0, 8).forEach(partition -> assertThat(clientA.getBatches().stream().filter(batch -> batch.getCursor().getPartition().equals(String.valueOf(partition))).count(), equalTo(5L)));
    // commit what we consumed
    final List<SubscriptionCursor> cursors = range(0, 8).boxed().map(partition -> new SubscriptionCursor(String.valueOf(partition), "4", eventType.getName(), "token")).collect(toList());
    commitCursors(subscription.getId(), cursors, clientA.getSessionId());
    // create second session for the same subscription
    final TestStreamingClient clientB = TestStreamingClient.create(URL, subscription.getId(), "stream_limit=20&max_uncommitted_events=100").start();
    // wait for rebalance process to finish
    waitFor(() -> assertThat(getNumberOfAssignedStreams(subscription.getId()), is(2)));
    // write 5 more events to each partition
    publishBusinessEventWithUserDefinedPartition(eventType.getName(), 40, x -> "blah_" + x, x -> String.valueOf(x % 8));
    // wait till all events arrive
    waitFor(() -> assertThat(clientB.getBatches(), hasSize(20)));
    waitFor(() -> assertThat(clientA.getBatches(), hasSize(60)));
    // check that only half of partitions were streamed to client A after rebalance
    final Set<String> clientAPartitionsAfterRebalance = getUniquePartitionsStreamedToClient(clientA, 40, 60);
    assertThat(clientAPartitionsAfterRebalance, hasSize(4));
    // check that only half of partitions were streamed to client B
    final Set<String> clientBPartitions = getUniquePartitionsStreamedToClient(clientB);
    assertThat(clientBPartitions, hasSize(4));
    // check that different partitions were streamed to different clients
    assertThat(intersection(clientAPartitionsAfterRebalance, clientBPartitions), hasSize(0));
    // commit what we consumed, as clientB has already consumed what was required by stream_limit - it should
    // be closed right after everything is committed
    final List<SubscriptionCursor> lastCursorsA = getLastCursorsForPartitions(clientA, clientAPartitionsAfterRebalance);
    final List<SubscriptionCursor> lastCursorsB = getLastCursorsForPartitions(clientB, clientBPartitions);
    commitCursors(subscription.getId(), lastCursorsA, clientA.getSessionId());
    commitCursors(subscription.getId(), lastCursorsB, clientB.getSessionId());
    waitFor(() -> assertThat(clientB.isRunning(), is(false)));
    // wait for rebalance process to finish
    waitFor(() -> assertThat(getNumberOfAssignedStreams(subscription.getId()), is(1)));
    // write 5 more events to each partition
    publishBusinessEventWithUserDefinedPartition(eventType.getName(), 40, x -> "blah__" + x, x -> String.valueOf(x % 8));
    // check that after second rebalance all events were consumed by first client
    waitFor(() -> assertThat(clientA.getBatches(), hasSize(100)));
}
Also used : NakadiTestUtils.getNumberOfAssignedStreams(org.zalando.nakadi.webservice.utils.NakadiTestUtils.getNumberOfAssignedStreams) RandomSubscriptionBuilder(org.zalando.nakadi.utils.RandomSubscriptionBuilder) BEGIN(org.zalando.nakadi.domain.SubscriptionBase.InitialPosition.BEGIN) IntStream.range(java.util.stream.IntStream.range) CoreMatchers.equalTo(org.hamcrest.CoreMatchers.equalTo) Subscription(org.zalando.nakadi.domain.Subscription) BaseAT(org.zalando.nakadi.webservice.BaseAT) NakadiTestUtils.publishBusinessEventWithUserDefinedPartition(org.zalando.nakadi.webservice.utils.NakadiTestUtils.publishBusinessEventWithUserDefinedPartition) Matchers.hasSize(org.hamcrest.Matchers.hasSize) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) Collectors.toSet(java.util.stream.Collectors.toSet) NakadiTestUtils.createSubscription(org.zalando.nakadi.webservice.utils.NakadiTestUtils.createSubscription) Before(org.junit.Before) EventType(org.zalando.nakadi.domain.EventType) ImmutableSet(com.google.common.collect.ImmutableSet) Set(java.util.Set) TestUtils.waitFor(org.zalando.nakadi.utils.TestUtils.waitFor) Test(org.junit.Test) IOException(java.io.IOException) Collectors(java.util.stream.Collectors) NakadiTestUtils.commitCursors(org.zalando.nakadi.webservice.utils.NakadiTestUtils.commitCursors) HttpStatus(org.springframework.http.HttpStatus) List(java.util.List) Collectors.toList(java.util.stream.Collectors.toList) SubscriptionBase(org.zalando.nakadi.domain.SubscriptionBase) Sets.intersection(com.google.common.collect.Sets.intersection) TestStreamingClient(org.zalando.nakadi.webservice.utils.TestStreamingClient) Optional(java.util.Optional) SubscriptionCursor(org.zalando.nakadi.view.SubscriptionCursor) Matchers.is(org.hamcrest.Matchers.is) NakadiTestUtils.createBusinessEventTypeWithPartitions(org.zalando.nakadi.webservice.utils.NakadiTestUtils.createBusinessEventTypeWithPartitions) SubscriptionCursor(org.zalando.nakadi.view.SubscriptionCursor) TestStreamingClient(org.zalando.nakadi.webservice.utils.TestStreamingClient) Test(org.junit.Test)

Aggregations

TestStreamingClient (org.zalando.nakadi.webservice.utils.TestStreamingClient)30 Test (org.junit.Test)29 SubscriptionCursor (org.zalando.nakadi.view.SubscriptionCursor)11 Subscription (org.zalando.nakadi.domain.Subscription)8 NakadiTestUtils.createSubscription (org.zalando.nakadi.webservice.utils.NakadiTestUtils.createSubscription)8 EventType (org.zalando.nakadi.domain.EventType)6 StringContains (org.hamcrest.core.StringContains)5 SubscriptionBase (org.zalando.nakadi.domain.SubscriptionBase)5 SubscriptionEventTypeStats (org.zalando.nakadi.domain.SubscriptionEventTypeStats)5 IOException (java.io.IOException)4 List (java.util.List)4 Collectors (java.util.stream.Collectors)4 MatcherAssert.assertThat (org.hamcrest.MatcherAssert.assertThat)4 Matchers.hasSize (org.hamcrest.Matchers.hasSize)4 Before (org.junit.Before)4 BEGIN (org.zalando.nakadi.domain.SubscriptionBase.InitialPosition.BEGIN)4 RandomSubscriptionBuilder (org.zalando.nakadi.utils.RandomSubscriptionBuilder)4 TestUtils.waitFor (org.zalando.nakadi.utils.TestUtils.waitFor)4 NakadiTestUtils.commitCursors (org.zalando.nakadi.webservice.utils.NakadiTestUtils.commitCursors)4 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)3