/**
* Copyright 2007-2015, Kaazing Corporation. All rights reserved.
*
* 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 org.kaazing.k3po.driver.internal.functions.agrona;
import static org.hamcrest.Matchers.instanceOf;
import static org.junit.Assert.assertThat;
import static org.kaazing.k3po.lang.internal.el.ExpressionFactoryUtils.newExpressionFactory;
import javax.el.ELContext;
import javax.el.ELResolver;
import javax.el.ExpressionFactory;
import javax.el.ValueExpression;
import org.junit.Before;
import org.junit.Test;
import org.kaazing.k3po.driver.internal.netty.channel.agrona.BroadcastTransmitterChannelWriter;
import org.kaazing.k3po.driver.internal.netty.channel.agrona.ChannelReader;
import org.kaazing.k3po.driver.internal.netty.channel.agrona.ChannelWriter;
import org.kaazing.k3po.driver.internal.netty.channel.agrona.CopyBroadcastReceiverChannelReader;
import org.kaazing.k3po.driver.internal.netty.channel.agrona.RingBufferChannelReader;
import org.kaazing.k3po.driver.internal.netty.channel.agrona.RingBufferChannelWriter;
import org.kaazing.k3po.lang.internal.el.ExpressionContext;
import org.agrona.concurrent.UnsafeBuffer;
import org.agrona.concurrent.broadcast.BroadcastBufferDescriptor;
import org.agrona.concurrent.ringbuffer.RingBufferDescriptor;
public class FunctionsTest {
private static final int BUFFER_CAPACITY = 1024;
private static final int BROADCAST_BUFFER_TOTAL_LENGTH = BUFFER_CAPACITY + BroadcastBufferDescriptor.TRAILER_LENGTH;
private static final int RING_BUFFER_TOTAL_LENGTH = BUFFER_CAPACITY + RingBufferDescriptor.TRAILER_LENGTH;
private ExpressionFactory factory;
private ELContext environment;
@Before
public void setUp() throws Exception {
factory = newExpressionFactory();
environment = new ExpressionContext();
// TODO: Remove when JUEL sync bug is fixed https://github.com/k3po/k3po/issues/147
synchronized (environment) {
ELResolver resolver = environment.getELResolver();
UnsafeBuffer bufferWithRingTrailer = new UnsafeBuffer(new byte[RING_BUFFER_TOTAL_LENGTH]);
resolver.setValue(environment, null, "bufferWithRingTrailer", bufferWithRingTrailer);
UnsafeBuffer bufferWithBroadcastTrailer = new UnsafeBuffer(new byte[BROADCAST_BUFFER_TOTAL_LENGTH]);
resolver.setValue(environment, null, "bufferWithBroadcastTrailer", bufferWithBroadcastTrailer);
}
}
@Test
public void shouldCreateOneToOneChannelReader() throws Exception {
String expressionText = "${agrona:oneToOneReader(bufferWithRingTrailer)}";
ValueExpression expression = factory.createValueExpression(environment, expressionText, ChannelReader.class);
ChannelReader reader = (ChannelReader) expression.getValue(environment);
assertThat(reader, instanceOf(RingBufferChannelReader.class));
}
@Test
public void shouldCreateOneToOneChannelWriter() throws Exception {
String expressionText = "${agrona:oneToOneWriter(bufferWithRingTrailer)}";
ValueExpression expression = factory.createValueExpression(environment, expressionText, ChannelWriter.class);
ChannelWriter writer = (ChannelWriter) expression.getValue(environment);
assertThat(writer, instanceOf(RingBufferChannelWriter.class));
}
@Test
public void shouldCreateManyToOneChannelReader() throws Exception {
String expressionText = "${agrona:manyToOneReader(bufferWithRingTrailer)}";
ValueExpression expression = factory.createValueExpression(environment, expressionText, ChannelReader.class);
ChannelReader reader = (ChannelReader) expression.getValue(environment);
assertThat(reader, instanceOf(RingBufferChannelReader.class));
}
@Test
public void shouldCreateManyToOneChannelWriter() throws Exception {
String expressionText = "${agrona:manyToOneWriter(bufferWithRingTrailer)}";
ValueExpression expression = factory.createValueExpression(environment, expressionText, ChannelWriter.class);
ChannelWriter writer = (ChannelWriter) expression.getValue(environment);
assertThat(writer, instanceOf(RingBufferChannelWriter.class));
}
@Test
public void shouldCreateBroadcastReceiverChannelReader() throws Exception {
String expressionText = "${agrona:broadcastReceiver(bufferWithBroadcastTrailer)}";
ValueExpression expression = factory.createValueExpression(environment, expressionText, ChannelReader.class);
ChannelReader reader = (ChannelReader) expression.getValue(environment);
assertThat(reader, instanceOf(CopyBroadcastReceiverChannelReader.class));
}
@Test
public void shouldCreateBroadcastTransmitterChannelWriter() throws Exception {
String expressionText = "${agrona:broadcastTransmitter(bufferWithBroadcastTrailer)}";
ValueExpression expression = factory.createValueExpression(environment, expressionText, ChannelWriter.class);
ChannelWriter writer = (ChannelWriter) expression.getValue(environment);
assertThat(writer, instanceOf(BroadcastTransmitterChannelWriter.class));
}
}