/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.ignite.internal.processors.igfs.split;
import org.apache.ignite.igfs.IgfsInputStream;
import org.apache.ignite.igfs.mapreduce.IgfsFileRange;
import org.apache.ignite.igfs.mapreduce.records.IgfsByteDelimiterRecordResolver;
import org.apache.ignite.internal.util.typedef.F;
/**
* Byte delimiter split resolver self test.
*/
public class IgfsByteDelimiterRecordResolverSelfTest extends IgfsAbstractRecordResolverSelfTest {
/**
* Test split resolution when there are no delimiters in the file.
*
* @throws Exception If failed.
*/
public void testNoDelimiters() throws Exception {
byte[] delim = wrap(2);
byte[] data = array(F.t(wrap(1), 8));
assertSplit(0, 4, 0, 8, data, delim);
assertSplit(0, 8, 0, 8, data, delim);
assertSplitNull(2, 2, data, delim);
assertSplitNull(2, 6, data, delim);
}
/**
* Test split resolution when there is one delimiter at the head.
*
* @throws Exception If failed.
*/
public void testHeadDelimiter() throws Exception {
byte[] delim = array(F.t(wrap(2), 8));
byte[] data = array(F.t(delim, 1), F.t(wrap(1), 8));
assertSplit(0, 4, 0, 8, data, delim);
assertSplit(0, 8, 0, 8, data, delim);
assertSplit(0, 12, 0, 16, data, delim);
assertSplit(0, 16, 0, 16, data, delim);
assertSplitNull(2, 2, data, delim);
assertSplitNull(2, 6, data, delim);
assertSplit(2, 10, 8, 8, data, delim);
assertSplit(2, 14, 8, 8, data, delim);
assertSplit(8, 4, 8, 8, data, delim);
assertSplit(8, 8, 8, 8, data, delim);
assertSplitNull(10, 2, data, delim);
assertSplitNull(10, 6, data, delim);
}
/**
* Test split when there is one delimiter at the end.
*
* @throws Exception If failed.
*/
public void testEndDelimiter() throws Exception {
byte[] delim = array(F.t(wrap(2), 8));
byte[] data = array(F.t(wrap(1), 8), F.t(delim, 1));
assertSplit(0, 4, 0, 16, data, delim);
assertSplit(0, 8, 0, 16, data, delim);
assertSplit(0, 12, 0, 16, data, delim);
assertSplit(0, 16, 0, 16, data, delim);
assertSplitNull(2, 2, data, delim);
assertSplitNull(2, 6, data, delim);
assertSplitNull(2, 10, data, delim);
assertSplitNull(2, 14, data, delim);
assertSplitNull(8, 4, data, delim);
assertSplitNull(8, 8, data, delim);
assertSplitNull(10, 2, data, delim);
assertSplitNull(10, 6, data, delim);
}
/**
* Test split when there is one delimiter in the middle.
*
* @throws Exception If failed.
*/
public void testMiddleDelimiter() throws Exception {
byte[] delim = array(F.t(wrap(2), 8));
byte[] data = array(F.t(wrap(1), 8), F.t(delim, 1), F.t(wrap(1), 8));
assertSplit(0, 4, 0, 16, data, delim);
assertSplit(0, 8, 0, 16, data, delim);
assertSplit(0, 12, 0, 16, data, delim);
assertSplit(0, 16, 0, 16, data, delim);
assertSplit(0, 20, 0, 24, data, delim);
assertSplit(0, 24, 0, 24, data, delim);
assertSplitNull(2, 2, data, delim);
assertSplitNull(2, 6, data, delim);
assertSplitNull(2, 10, data, delim);
assertSplitNull(2, 14, data, delim);
assertSplit(2, 18, 16, 8, data, delim);
assertSplit(2, 22, 16, 8, data, delim);
assertSplitNull(8, 4, data, delim);
assertSplitNull(8, 8, data, delim);
assertSplit(8, 12, 16, 8, data, delim);
assertSplit(8, 16, 16, 8, data, delim);
assertSplitNull(10, 2, data, delim);
assertSplitNull(10, 6, data, delim);
assertSplit(10, 10, 16, 8, data, delim);
assertSplit(10, 14, 16, 8, data, delim);
assertSplit(16, 4, 16, 8, data, delim);
assertSplit(16, 8, 16, 8, data, delim);
assertSplitNull(18, 2, data, delim);
assertSplitNull(18, 6, data, delim);
}
/**
* Test split when there are two head delimiters.
*
* @throws Exception If failed.
*/
public void testTwoHeadDelimiters() throws Exception {
byte[] delim = array(F.t(wrap(2), 8));
byte[] data = array(F.t(delim, 2), F.t(wrap(1), 8));
assertSplit(0, 4, 0, 8, data, delim);
assertSplit(0, 8, 0, 8, data, delim);
assertSplit(0, 12, 0, 16, data, delim);
assertSplit(0, 16, 0, 16, data, delim);
assertSplit(0, 20, 0, 24, data, delim);
assertSplit(0, 24, 0, 24, data, delim);
assertSplitNull(2, 2, data, delim);
assertSplitNull(2, 6, data, delim);
assertSplit(2, 10, 8, 8, data, delim);
assertSplit(2, 14, 8, 8, data, delim);
assertSplit(2, 18, 8, 16, data, delim);
assertSplit(2, 22, 8, 16, data, delim);
assertSplit(8, 4, 8, 8, data, delim);
assertSplit(8, 8, 8, 8, data, delim);
assertSplit(8, 12, 8, 16, data, delim);
assertSplit(8, 16, 8, 16, data, delim);
assertSplitNull(10, 2, data, delim);
assertSplitNull(10, 6, data, delim);
assertSplit(10, 10, 16, 8, data, delim);
assertSplit(10, 14, 16, 8, data, delim);
assertSplit(16, 4, 16, 8, data, delim);
assertSplit(16, 8, 16, 8, data, delim);
assertSplitNull(18, 2, data, delim);
assertSplitNull(18, 6, data, delim);
}
/**
* Test split when there are two tail delimiters.
*
* @throws Exception If failed.
*/
public void testTwoTailDelimiters() throws Exception {
byte[] delim = array(F.t(wrap(2), 8));
byte[] data = array(F.t(wrap(1), 8), F.t(delim, 2));
assertSplit(0, 4, 0, 16, data, delim);
assertSplit(0, 8, 0, 16, data, delim);
assertSplit(0, 12, 0, 16, data, delim);
assertSplit(0, 16, 0, 16, data, delim);
assertSplit(0, 20, 0, 24, data, delim);
assertSplit(0, 24, 0, 24, data, delim);
assertSplitNull(2, 2, data, delim);
assertSplitNull(2, 6, data, delim);
assertSplitNull(2, 10, data, delim);
assertSplitNull(2, 14, data, delim);
assertSplit(2, 18, 16, 8, data, delim);
assertSplit(2, 22, 16, 8, data, delim);
assertSplitNull(8, 4, data, delim);
assertSplitNull(8, 8, data, delim);
assertSplit(8, 12, 16, 8, data, delim);
assertSplit(8, 16, 16, 8, data, delim);
assertSplitNull(10, 2, data, delim);
assertSplitNull(10, 6, data, delim);
assertSplit(10, 10, 16, 8, data, delim);
assertSplit(10, 14, 16, 8, data, delim);
assertSplit(16, 4, 16, 8, data, delim);
assertSplit(16, 8, 16, 8, data, delim);
assertSplitNull(18, 2, data, delim);
assertSplitNull(18, 6, data, delim);
}
/**
* Test split when there is one head delimiter, one tail delimiter and some data between them.
*
* @throws Exception If failed.
*/
public void testHeadAndTailDelimiters() throws Exception {
byte[] delim = array(F.t(wrap(2), 8));
byte[] data = array(F.t(delim, 1), F.t(wrap(1), 8), F.t(delim, 1));
assertSplit(0, 4, 0, 8, data, delim);
assertSplit(0, 8, 0, 8, data, delim);
assertSplit(0, 12, 0, 24, data, delim);
assertSplit(0, 16, 0, 24, data, delim);
assertSplit(0, 20, 0, 24, data, delim);
assertSplit(0, 24, 0, 24, data, delim);
assertSplitNull(2, 2, data, delim);
assertSplitNull(2, 6, data, delim);
assertSplit(2, 10, 8, 16, data, delim);
assertSplit(2, 14, 8, 16, data, delim);
assertSplit(2, 18, 8, 16, data, delim);
assertSplit(2, 22, 8, 16, data, delim);
assertSplit(8, 4, 8, 16, data, delim);
assertSplit(8, 8, 8, 16, data, delim);
assertSplit(8, 12, 8, 16, data, delim);
assertSplit(8, 16, 8, 16, data, delim);
assertSplitNull(10, 2, data, delim);
assertSplitNull(10, 6, data, delim);
assertSplitNull(10, 10, data, delim);
assertSplitNull(10, 14, data, delim);
assertSplitNull(16, 4, data, delim);
assertSplitNull(16, 8, data, delim);
assertSplitNull(18, 2, data, delim);
assertSplitNull(18, 6, data, delim);
}
/**
* Test special case when delimiter starts with the same bytes as the last previos data byte.
*
* @throws Exception If failed.
*/
public void testDelimiterStartsWithTheSameBytesAsLastPreviousDataByte() throws Exception {
byte[] delim = array(F.t(wrap(1, 1, 2), 1));
byte[] data = array(F.t(wrap(1), 1), F.t(delim, 1), F.t(wrap(1), 1));
assertSplit(0, 1, 0, 4, data, delim);
assertSplit(0, 2, 0, 4, data, delim);
assertSplit(0, 4, 0, 4, data, delim);
assertSplit(0, 5, 0, 5, data, delim);
assertSplit(1, 4, 4, 1, data, delim);
}
/**
* Check split resolution.
*
* @param suggestedStart Suggested start.
* @param suggestedLen Suggested length.
* @param expStart Expected start.
* @param expLen Expected length.
* @param data File data.
* @param delims Delimiters.
* @throws Exception If failed.
*/
public void assertSplit(long suggestedStart, long suggestedLen, long expStart, long expLen, byte[] data,
byte[]... delims) throws Exception {
write(data);
IgfsByteDelimiterRecordResolver rslvr = resolver(delims);
IgfsFileRange split;
try (IgfsInputStream is = read()) {
split = rslvr.resolveRecords(igfs, is, split(suggestedStart, suggestedLen));
}
assert split != null : "Split is null.";
assert split.start() == expStart : "Incorrect start [expected=" + expStart + ", actual=" + split.start() + ']';
assert split.length() == expLen : "Incorrect length [expected=" + expLen + ", actual=" + split.length() + ']';
}
/**
* Check the split resolution resulted in {@code null}.
*
* @param suggestedStart Suggested start.
* @param suggestedLen Suggested length.
* @param data File data.
* @param delims Delimiters.
* @throws Exception If failed.
*/
public void assertSplitNull(long suggestedStart, long suggestedLen, byte[] data, byte[]... delims)
throws Exception {
write(data);
IgfsByteDelimiterRecordResolver rslvr = resolver(delims);
IgfsFileRange split;
try (IgfsInputStream is = read()) {
split = rslvr.resolveRecords(igfs, is, split(suggestedStart, suggestedLen));
}
assert split == null : "Split is not null.";
}
/**
* Create resolver.
*
* @param delims Delimiters.
* @return Resolver.
*/
private IgfsByteDelimiterRecordResolver resolver(byte[]... delims) {
return new IgfsByteDelimiterRecordResolver(delims);
}
}