/**
* 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.Capture;
import org.easymock.EasyMock;
import org.easymock.IAnswer;
import org.easymock.IExpectationSetters;
import org.junit.Before;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.List;
import io.confluent.kafkarest.ConsumerManager;
import io.confluent.kafkarest.ConsumerState;
import io.confluent.kafkarest.Context;
import io.confluent.kafkarest.KafkaRestApplication;
import io.confluent.kafkarest.KafkaRestConfig;
import io.confluent.kafkarest.MetadataObserver;
import io.confluent.kafkarest.entities.ConsumerInstanceConfig;
import io.confluent.kafkarest.entities.ConsumerRecord;
import io.confluent.kafkarest.entities.CreateConsumerInstanceResponse;
import io.confluent.kafkarest.entities.TopicPartitionOffset;
import io.confluent.kafkarest.resources.ConsumersResource;
import io.confluent.rest.EmbeddedServerTestHarness;
import io.confluent.rest.RestConfigException;
import io.confluent.rest.exceptions.RestNotFoundException;
public class AbstractConsumerResourceTest
extends EmbeddedServerTestHarness<KafkaRestConfig, KafkaRestApplication> {
protected MetadataObserver mdObserver;
protected ConsumerManager consumerManager;
protected Context ctx;
protected static final String groupName = "testgroup";
protected static final String topicName = "testtopic";
protected static final String secondTopicName = "testtopic2";
protected static final String instanceId = "uniqueid";
protected static final String instancePath
= "/consumers/" + groupName + "/instances/" + instanceId;
protected static final String not_found_message = "not found";
public AbstractConsumerResourceTest() throws RestConfigException {
mdObserver = EasyMock.createMock(MetadataObserver.class);
consumerManager = EasyMock.createMock(ConsumerManager.class);
ctx = new Context(config, mdObserver, null, consumerManager, null);
addResource(new ConsumersResource(ctx));
}
@Before
@Override
public void setUp() throws Exception {
super.setUp();
EasyMock.reset(mdObserver, consumerManager);
}
protected void expectCreateGroup(ConsumerInstanceConfig config) {
EasyMock.expect(consumerManager.createConsumer(
EasyMock.eq(groupName), EasyMock.eq(config)))
.andReturn(instanceId);
}
protected <KafkaK, KafkaV, ClientK, ClientV> void expectReadTopic(
String topicName, Class<? extends ConsumerState<KafkaK, KafkaV, ClientK, ClientV>> stateClass,
final List<? extends ConsumerRecord<ClientK, ClientV>> readResult,
final Exception readException) {
expectReadTopic(topicName, stateClass, Long.MAX_VALUE, readResult, readException);
}
protected <KafkaK, KafkaV, ClientK, ClientV> void expectReadTopic(
String topicName, Class<? extends ConsumerState<KafkaK, KafkaV, ClientK, ClientV>> stateClass,
long maxBytes, final List<? extends ConsumerRecord<ClientK, ClientV>> readResult,
final Exception readException) {
final Capture<ConsumerManager.ReadCallback>
readCallback =
new Capture<ConsumerManager.ReadCallback>();
consumerManager
.readTopic(EasyMock.eq(groupName), EasyMock.eq(instanceId), EasyMock.eq(topicName),
EasyMock.eq(stateClass), EasyMock.eq(maxBytes), EasyMock.capture(readCallback));
EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
readCallback.getValue().onCompletion(readResult, readException);
return null;
}
});
}
protected void expectCommit(final List<TopicPartitionOffset> commitResult,
final Exception commitException) {
final Capture<ConsumerManager.CommitCallback>
commitCallback =
new Capture<ConsumerManager.CommitCallback>();
consumerManager.commitOffsets(EasyMock.eq(groupName), EasyMock.eq(instanceId),
EasyMock.capture(commitCallback));
EasyMock.expectLastCall().andAnswer(new IAnswer<Object>() {
@Override
public Object answer() throws Throwable {
commitCallback.getValue().onCompletion(commitResult, commitException);
return null;
}
});
}
protected String instanceBasePath(CreateConsumerInstanceResponse createResponse) {
try {
return new URI(createResponse.getBaseUri()).getPath();
} catch (URISyntaxException e) {
throw new RuntimeException(
"Invalid URI in CreateConsumerInstanceResponse: \"" + createResponse.getBaseUri() + "\"");
}
}
protected void expectDeleteGroup(boolean invalid) {
consumerManager.deleteConsumer(groupName, instanceId);
IExpectationSetters expectation = EasyMock.expectLastCall();
if (invalid) {
expectation.andThrow(new RestNotFoundException(not_found_message, 1000));
}
}
}