/** * Copyright 2015 Confluent Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. **/ package io.confluent.kafkarest.unit; import org.easymock.EasyMock; import org.junit.Test; import java.util.Arrays; import java.util.List; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.core.GenericType; import javax.ws.rs.core.Response; import io.confluent.kafkarest.BinaryConsumerState; import io.confluent.kafkarest.TestUtils; import io.confluent.kafkarest.Versions; import io.confluent.kafkarest.entities.BinaryConsumerRecord; import io.confluent.kafkarest.entities.ConsumerInstanceConfig; import io.confluent.kafkarest.entities.ConsumerRecord; import io.confluent.kafkarest.entities.CreateConsumerInstanceResponse; import io.confluent.kafkarest.entities.EmbeddedFormat; import io.confluent.kafkarest.entities.TopicPartitionOffset; import io.confluent.rest.RestConfigException; import static io.confluent.kafkarest.TestUtils.assertOKResponse; import static org.junit.Assert.assertEquals; public class ConsumerResourceBinaryTest extends AbstractConsumerResourceTest { public ConsumerResourceBinaryTest() throws RestConfigException { super(); } @Test public void testReadCommit() { List<? extends ConsumerRecord<byte[], byte[]>> expectedReadLimit = Arrays.asList( new BinaryConsumerRecord(topicName, "key1".getBytes(), "value1".getBytes(), 0, 10) ); List<? extends ConsumerRecord<byte[], byte[]>> expectedReadNoLimit = Arrays.asList( new BinaryConsumerRecord(topicName, "key2".getBytes(), "value2".getBytes(), 1, 15), new BinaryConsumerRecord(topicName, "key3".getBytes(), "value3".getBytes(), 2, 20) ); List<TopicPartitionOffset> expectedOffsets = Arrays.asList( new TopicPartitionOffset(topicName, 0, 10, 10), new TopicPartitionOffset(topicName, 1, 15, 15), new TopicPartitionOffset(topicName, 2, 20, 20) ); for (TestUtils.RequestMediaType mediatype : TestUtils.V1_ACCEPT_MEDIATYPES_BINARY) { for (String requestMediatype : TestUtils.V1_REQUEST_ENTITY_TYPES) { expectCreateGroup(new ConsumerInstanceConfig(EmbeddedFormat.BINARY)); expectReadTopic(topicName, BinaryConsumerState.class, 10, expectedReadLimit, null); expectReadTopic(topicName, BinaryConsumerState.class, expectedReadNoLimit, null); expectCommit(expectedOffsets, null); EasyMock.replay(consumerManager); Response response = request("/consumers/" + groupName, mediatype.header) .post(Entity.entity(null, requestMediatype)); assertOKResponse(response, mediatype.expected); final CreateConsumerInstanceResponse createResponse = TestUtils.tryReadEntityOrLog(response,CreateConsumerInstanceResponse.class); // Read with size limit String readUrl = instanceBasePath(createResponse) + "/topics/" + topicName; Invocation.Builder builder = getJerseyTest().target(readUrl) .queryParam("max_bytes", 10).request(); if (mediatype.header != null) { builder.accept(mediatype.header); } Response readLimitResponse = builder.get(); // Most specific default is different when retrieving embedded data String expectedMediatype = mediatype.header != null ? mediatype.expected : Versions.KAFKA_V1_JSON_BINARY; assertOKResponse(readLimitResponse, expectedMediatype); final List<BinaryConsumerRecord> readLimitResponseRecords = TestUtils.tryReadEntityOrLog(readLimitResponse,new GenericType<List<BinaryConsumerRecord>>() { }); assertEquals(expectedReadLimit, readLimitResponseRecords); // Read without size limit Response readResponse = request(readUrl, mediatype.header).get(); assertOKResponse(readResponse, expectedMediatype); final List<BinaryConsumerRecord> readResponseRecords = TestUtils.tryReadEntityOrLog(readResponse,new GenericType<List<BinaryConsumerRecord>>() { }); assertEquals(expectedReadNoLimit, readResponseRecords); String commitUrl = instanceBasePath(createResponse) + "/offsets/"; Response commitResponse = request(commitUrl, mediatype.header) .post(Entity.entity(null, requestMediatype)); assertOKResponse(response, mediatype.expected); final List<TopicPartitionOffset> committedOffsets = TestUtils.tryReadEntityOrLog(commitResponse,new GenericType<List<TopicPartitionOffset>>() { }); assertEquals(expectedOffsets, committedOffsets); EasyMock.verify(consumerManager); EasyMock.reset(consumerManager); } } } }