/* * Copyright 2014-2017 Real Logic Ltd. * * 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.aeron.driver.buffer; import io.aeron.driver.Configuration; import io.aeron.driver.media.UdpChannel; import io.aeron.logbuffer.LogBufferDescriptor; import org.agrona.IoUtil; import org.agrona.concurrent.UnsafeBuffer; import org.agrona.concurrent.errors.DistinctErrorLog; import org.junit.*; import java.io.*; import static io.aeron.logbuffer.LogBufferDescriptor.PARTITION_COUNT; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.mock; public class RawLogFactoryTest { private static final String CHANNEL = "aeron:udp?endpoint=localhost:4321"; private static final int SESSION_ID = 100; private static final int STREAM_ID = 101; private static final int CREATION_ID = 102; private static final File DATA_DIR = new File(IoUtil.tmpDirName(), "dataDirName"); private static final int TERM_BUFFER_LENGTH = Configuration.TERM_BUFFER_LENGTH_DEFAULT; private static final int TERM_BUFFER_MAX_LENGTH = Configuration.TERM_BUFFER_LENGTH_MAX_DEFAULT; private static final boolean PRE_ZERO_LOG = false; private RawLogFactory rawLogFactory; private UdpChannel udpChannel = UdpChannel.parse(CHANNEL); @Before public void createDataDir() { IoUtil.ensureDirectoryExists(DATA_DIR, "data"); rawLogFactory = new RawLogFactory( DATA_DIR.getAbsolutePath(), TERM_BUFFER_MAX_LENGTH, PRE_ZERO_LOG, mock(DistinctErrorLog.class)); } @After public void cleanupFiles() throws IOException { IoUtil.delete(DATA_DIR, false); } @Test public void shouldCreateCorrectLengthAndZeroedFilesForPublication() throws Exception { final String canonicalForm = udpChannel.canonicalForm(); final RawLog rawLog = rawLogFactory.newNetworkPublication( canonicalForm, SESSION_ID, STREAM_ID, CREATION_ID, TERM_BUFFER_LENGTH); assertThat(rawLog.termLength(), is(TERM_BUFFER_LENGTH)); final UnsafeBuffer[] termBuffers = rawLog.termBuffers(); assertThat(termBuffers.length, is(PARTITION_COUNT)); for (final UnsafeBuffer termBuffer : termBuffers) { assertThat(termBuffer.capacity(), is(TERM_BUFFER_LENGTH)); assertThat(termBuffer.getByte(0), is((byte)0)); assertThat(termBuffer.getByte(TERM_BUFFER_LENGTH - 1), is((byte)0)); } final UnsafeBuffer metaData = rawLog.metaData(); assertThat(metaData.capacity(), is(LogBufferDescriptor.LOG_META_DATA_LENGTH)); assertThat(metaData.getByte(0), is((byte)0)); assertThat(metaData.getByte(LogBufferDescriptor.LOG_META_DATA_LENGTH - 1), is((byte)0)); rawLog.close(); } @Test public void shouldCreateCorrectLengthAndZeroedFilesForImage() throws Exception { final String canonicalForm = udpChannel.canonicalForm(); final int imageTermBufferMaxLength = TERM_BUFFER_LENGTH / 2; final RawLog rawLog = rawLogFactory.newNetworkedImage( canonicalForm, SESSION_ID, STREAM_ID, CREATION_ID, imageTermBufferMaxLength); assertThat(rawLog.termLength(), is(imageTermBufferMaxLength)); final UnsafeBuffer[] termBuffers = rawLog.termBuffers(); assertThat(termBuffers.length, is(PARTITION_COUNT)); for (final UnsafeBuffer termBuffer : termBuffers) { assertThat(termBuffer.capacity(), is(imageTermBufferMaxLength)); assertThat(termBuffer.getByte(0), is((byte)0)); assertThat(termBuffer.getByte(imageTermBufferMaxLength - 1), is((byte)0)); } final UnsafeBuffer metaData = rawLog.metaData(); assertThat(metaData.capacity(), is(LogBufferDescriptor.LOG_META_DATA_LENGTH)); assertThat(metaData.getByte(0), is((byte)0)); assertThat(metaData.getByte(LogBufferDescriptor.LOG_META_DATA_LENGTH - 1), is((byte)0)); rawLog.close(); } @Test(expected = IllegalArgumentException.class) public void shouldExceptionIfRequestedTermBufferLengthGreaterThanMax() { final String canonicalForm = udpChannel.canonicalForm(); final int imageTermBufferMaxLength = TERM_BUFFER_MAX_LENGTH * 2; rawLogFactory.newNetworkedImage(canonicalForm, SESSION_ID, STREAM_ID, CREATION_ID, imageTermBufferMaxLength); } }