/* * Licensed to Elasticsearch under one or more contributor * license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright * ownership. Elasticsearch 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.elasticsearch.index.mapper; import java.net.InetAddress; import org.apache.lucene.document.InetAddressPoint; import org.apache.lucene.index.IndexOptions; import org.apache.lucene.search.MatchNoDocsQuery; import org.apache.lucene.util.BytesRef; import org.elasticsearch.common.network.InetAddresses; public class IpFieldTypeTests extends FieldTypeTestCase { @Override protected MappedFieldType createDefaultFieldType() { return new IpFieldMapper.IpFieldType(); } public void testValueFormat() throws Exception { MappedFieldType ft = createDefaultFieldType(); String ip = "2001:db8::2:1"; BytesRef asBytes = new BytesRef(InetAddressPoint.encode(InetAddress.getByName(ip))); assertEquals(ip, ft.docValueFormat(null, null).format(asBytes)); ip = "192.168.1.7"; asBytes = new BytesRef(InetAddressPoint.encode(InetAddress.getByName(ip))); assertEquals(ip, ft.docValueFormat(null, null).format(asBytes)); } public void testValueForSearch() throws Exception { MappedFieldType ft = createDefaultFieldType(); String ip = "2001:db8::2:1"; BytesRef asBytes = new BytesRef(InetAddressPoint.encode(InetAddresses.forString(ip))); assertEquals(ip, ft.valueForDisplay(asBytes)); ip = "192.168.1.7"; asBytes = new BytesRef(InetAddressPoint.encode(InetAddresses.forString(ip))); assertEquals(ip, ft.valueForDisplay(asBytes)); } public void testTermQuery() { MappedFieldType ft = createDefaultFieldType(); ft.setName("field"); String ip = "2001:db8::2:1"; assertEquals(InetAddressPoint.newExactQuery("field", InetAddresses.forString(ip)), ft.termQuery(ip, null)); ip = "192.168.1.7"; assertEquals(InetAddressPoint.newExactQuery("field", InetAddresses.forString(ip)), ft.termQuery(ip, null)); ip = "2001:db8::2:1"; String prefix = ip + "/64"; assertEquals(InetAddressPoint.newPrefixQuery("field", InetAddresses.forString(ip), 64), ft.termQuery(prefix, null)); ip = "192.168.1.7"; prefix = ip + "/16"; assertEquals(InetAddressPoint.newPrefixQuery("field", InetAddresses.forString(ip), 16), ft.termQuery(prefix, null)); ft.setIndexOptions(IndexOptions.NONE); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> ft.termQuery("::1", null)); assertEquals("Cannot search on field [field] since it is not indexed.", e.getMessage()); } public void testRangeQuery() { MappedFieldType ft = createDefaultFieldType(); ft.setName("field"); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("::"), InetAddressPoint.MAX_VALUE), ft.rangeQuery(null, null, randomBoolean(), randomBoolean(), null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("::"), InetAddresses.forString("192.168.2.0")), ft.rangeQuery(null, "192.168.2.0", randomBoolean(), true, null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("::"), InetAddresses.forString("192.168.1.255")), ft.rangeQuery(null, "192.168.2.0", randomBoolean(), false, null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("2001:db8::"), InetAddressPoint.MAX_VALUE), ft.rangeQuery("2001:db8::", null, true, randomBoolean(), null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("2001:db8::1"), InetAddressPoint.MAX_VALUE), ft.rangeQuery("2001:db8::", null, false, randomBoolean(), null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("2001:db8::"), InetAddresses.forString("2001:db8::ffff")), ft.rangeQuery("2001:db8::", "2001:db8::ffff", true, true, null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("2001:db8::1"), InetAddresses.forString("2001:db8::fffe")), ft.rangeQuery("2001:db8::", "2001:db8::ffff", false, false, null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("2001:db8::2"), InetAddresses.forString("2001:db8::")), // same lo/hi values but inclusive=false so this won't match anything ft.rangeQuery("2001:db8::1", "2001:db8::1", false, false, null)); // Upper bound is the min IP and is not inclusive assertEquals(new MatchNoDocsQuery(), ft.rangeQuery("::", "::", true, false, null)); // Lower bound is the max IP and is not inclusive assertEquals(new MatchNoDocsQuery(), ft.rangeQuery("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", false, true, null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("::"), InetAddresses.forString("::fffe:ffff:ffff")), // same lo/hi values but inclusive=false so this won't match anything ft.rangeQuery("::", "0.0.0.0", true, false, null)); assertEquals( InetAddressPoint.newRangeQuery("field", InetAddresses.forString("::1:0:0:0"), InetAddressPoint.MAX_VALUE), // same lo/hi values but inclusive=false so this won't match anything ft.rangeQuery("255.255.255.255", "ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff", false, true, null)); assertEquals( // lower bound is ipv4, upper bound is ipv6 InetAddressPoint.newRangeQuery("field", InetAddresses.forString("192.168.1.7"), InetAddresses.forString("2001:db8::")), ft.rangeQuery("::ffff:c0a8:107", "2001:db8::", true, true, null)); ft.setIndexOptions(IndexOptions.NONE); IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () -> ft.rangeQuery("::1", "2001::", true, true, null)); assertEquals("Cannot search on field [field] since it is not indexed.", e.getMessage()); } }