blob: 557ab90d0be291b6a870191a21a5b88a0fbed59f [file] [log] [blame]
/*
* 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.lucene.search;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Arrays;
import org.apache.lucene.document.InetAddressPoint;
import org.apache.lucene.document.InetAddressRange;
import org.apache.lucene.util.FutureArrays;
import org.apache.lucene.util.LuceneTestCase.SuppressCodecs;
/**
* Random testing for {@link InetAddressRange}
*/
@SuppressCodecs({"Direct"})
public class TestInetAddressRangeQueries extends BaseRangeFieldQueryTestCase {
private static final String FIELD_NAME = "ipRangeField";
@Override
protected Range nextRange(int dimensions) throws Exception {
InetAddress min = nextInetaddress();
byte[] bMin = InetAddressPoint.encode(min);
InetAddress max = nextInetaddress();
byte[] bMax = InetAddressPoint.encode(max);
if (FutureArrays.compareUnsigned(bMin, 0, bMin.length, bMax, 0, bMin.length) > 0) {
return new IpRange(max, min);
}
return new IpRange(min, max);
}
/** return random IPv4 or IPv6 address */
private InetAddress nextInetaddress() throws UnknownHostException {
byte[] b = random().nextBoolean() ? new byte[4] : new byte[16];
switch (random().nextInt(5)) {
case 0:
return InetAddress.getByAddress(b);
case 1:
Arrays.fill(b, (byte) 0xff);
return InetAddress.getByAddress(b);
case 2:
Arrays.fill(b, (byte) 42);
return InetAddress.getByAddress(b);
default:
random().nextBytes(b);
return InetAddress.getByAddress(b);
}
}
@Override
public void testRandomTiny() throws Exception {
super.testRandomTiny();
}
@Override
public void testMultiValued() throws Exception {
super.testRandomMedium();
}
@Override
public void testRandomMedium() throws Exception {
super.testMultiValued();
}
@Nightly
@Override
public void testRandomBig() throws Exception {
super.testRandomBig();
}
/** return random range */
@Override
protected InetAddressRange newRangeField(Range r) {
return new InetAddressRange(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random intersects query */
@Override
protected Query newIntersectsQuery(Range r) {
return InetAddressRange.newIntersectsQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random contains query */
@Override
protected Query newContainsQuery(Range r) {
return InetAddressRange.newContainsQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random within query */
@Override
protected Query newWithinQuery(Range r) {
return InetAddressRange.newWithinQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** return random crosses query */
@Override
protected Query newCrossesQuery(Range r) {
return InetAddressRange.newCrossesQuery(FIELD_NAME, ((IpRange)r).minAddress, ((IpRange)r).maxAddress);
}
/** encapsulated IpRange for test validation */
private class IpRange extends Range {
InetAddress minAddress;
InetAddress maxAddress;
byte[] min;
byte[] max;
IpRange(InetAddress min, InetAddress max) {
this.minAddress = min;
this.maxAddress = max;
this.min = InetAddressPoint.encode(min);
this.max = InetAddressPoint.encode(max);
}
@Override
protected int numDimensions() {
return 1;
}
@Override
protected InetAddress getMin(int dim) {
return minAddress;
}
@Override
protected void setMin(int dim, Object val) {
InetAddress v = (InetAddress)val;
byte[] e = InetAddressPoint.encode(v);
if (FutureArrays.compareUnsigned(min, 0, e.length, e, 0, e.length) < 0) {
max = e;
maxAddress = v;
} else {
min = e;
minAddress = v;
}
}
@Override
protected InetAddress getMax(int dim) {
return maxAddress;
}
@Override
protected void setMax(int dim, Object val) {
InetAddress v = (InetAddress)val;
byte[] e = InetAddressPoint.encode(v);
if (FutureArrays.compareUnsigned(max, 0, e.length, e, 0, e.length) > 0) {
min = e;
minAddress = v;
} else {
max = e;
maxAddress = v;
}
}
@Override
protected boolean isEqual(Range o) {
IpRange other = (IpRange)o;
return Arrays.equals(min, other.min) && Arrays.equals(max, other.max);
}
@Override
protected boolean isDisjoint(Range o) {
IpRange other = (IpRange)o;
return FutureArrays.compareUnsigned(min, 0, min.length, other.max, 0, min.length) > 0 ||
FutureArrays.compareUnsigned(max, 0, max.length, other.min, 0, max.length) < 0;
}
@Override
protected boolean isWithin(Range o) {
IpRange other = (IpRange)o;
return FutureArrays.compareUnsigned(min, 0, min.length, other.min, 0, min.length) >= 0 &&
FutureArrays.compareUnsigned(max, 0, max.length, other.max, 0, max.length) <= 0;
}
@Override
protected boolean contains(Range o) {
IpRange other = (IpRange)o;
return FutureArrays.compareUnsigned(min, 0, min.length, other.min, 0, min.length) <= 0 &&
FutureArrays.compareUnsigned(max, 0, max.length, other.max, 0, max.length) >= 0;
}
@Override
public String toString() {
StringBuilder b = new StringBuilder();
b.append("Box(");
b.append(minAddress.getHostAddress());
b.append(" TO ");
b.append(maxAddress.getHostAddress());
b.append(")");
return b.toString();
}
}
}