/*
* 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 java.nio.charset.Charset;
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.igfs.mapreduce.records.IgfsStringDelimiterRecordResolver;
import org.apache.ignite.internal.util.typedef.F;
/**
* String delimiter split resolver self-test.
*/
public class IgfsStringDelimiterRecordResolverSelfTest extends IgfsAbstractRecordResolverSelfTest {
/** Charset used in tests. */
private static final Charset UTF8 = Charset.forName("UTF-8");
/**
* Test split resolver.
*
* @throws Exception If failed.
*/
public void testResolver() throws Exception {
String delim = "aaaaaaaa";
byte[] delimBytes = delim.getBytes(UTF8);
byte[] data = array(F.t(wrap(1), 8), F.t(delimBytes, 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);
}
/**
* 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,
String... 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, String... delims)
throws Exception {
write(data);
IgfsStringDelimiterRecordResolver 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 IgfsStringDelimiterRecordResolver resolver(String... delims) {
return new IgfsStringDelimiterRecordResolver(UTF8, delims);
}
}