/*
* 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.nifi.processors.enrich;
import org.apache.nifi.util.MockFlowFile;
import org.apache.nifi.util.TestRunner;
import org.apache.nifi.util.TestRunners;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import javax.naming.Context;
import javax.naming.directory.Attributes;
import javax.naming.directory.BasicAttribute;
import javax.naming.directory.BasicAttributes;
import javax.naming.directory.DirContext;
import static org.junit.Assert.assertTrue;
public class TestQueryDNS {
private QueryDNS queryDNS;
private TestRunner queryDNSTestRunner;
@Before
public void setupTest() throws Exception {
this.queryDNS = new QueryDNS();
this.queryDNSTestRunner = TestRunners.newTestRunner(queryDNS);
Hashtable env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, FakeDNSInitialDirContextFactory.class.getName());
this.queryDNS.initializeContext(env);
final DirContext mockContext = FakeDNSInitialDirContextFactory.getLatestMockContext();
// Capture JNDI's getAttibutes method containing the (String) queryValue and (String[]) queryType
Mockito.when( mockContext.getAttributes(Mockito.anyString(), Mockito.any(String[].class)))
.thenAnswer(new Answer() {
public Object answer(InvocationOnMock invocation) throws Throwable {
// Craft a false DNS response
// Note the DNS response will not make use of any of the mocked
// query contents (all input is discarded and replies synthetically
// generated
return craftResponse(invocation);
}
});
}
@Test
public void testVanillaQueryWithoutSplit() {
queryDNSTestRunner.setProperty(QueryDNS.DNS_QUERY_TYPE, "PTR");
queryDNSTestRunner.setProperty(QueryDNS.DNS_RETRIES, "1");
queryDNSTestRunner.setProperty(QueryDNS.DNS_TIMEOUT, "1000 ms");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_INPUT, "${ip_address:getDelimitedField(4, '.'):trim()}" +
".${ip_address:getDelimitedField(3, '.'):trim()}" +
".${ip_address:getDelimitedField(2, '.'):trim()}" +
".${ip_address:getDelimitedField(1, '.'):trim()}" +
".in-addr.arpa");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER, QueryDNS.NONE.getValue());
final Map<String, String> attributeMap = new HashMap<>();
attributeMap.put("ip_address", "123.123.123.123");
queryDNSTestRunner.enqueue(new byte[0], attributeMap);
queryDNSTestRunner.enqueue("teste teste teste chocolate".getBytes());
queryDNSTestRunner.run(1,true, false);
List<MockFlowFile> results = queryDNSTestRunner.getFlowFilesForRelationship(QueryDNS.REL_FOUND);
assertTrue(results.size() == 1);
String result = results.get(0).getAttribute("enrich.dns.record0.group0");
assertTrue(result.contains("apache.nifi.org"));
}
@Test
public void testValidDataWithSplit() {
queryDNSTestRunner.setProperty(QueryDNS.DNS_QUERY_TYPE, "TXT");
queryDNSTestRunner.setProperty(QueryDNS.DNS_RETRIES, "1");
queryDNSTestRunner.setProperty(QueryDNS.DNS_TIMEOUT, "1000 ms");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_INPUT, "${ip_address:getDelimitedField(4, '.'):trim()}" +
".${ip_address:getDelimitedField(3, '.'):trim()}" +
".${ip_address:getDelimitedField(2, '.'):trim()}" +
".${ip_address:getDelimitedField(1, '.'):trim()}" +
".origin.asn.nifi.apache.org");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER, QueryDNS.SPLIT.getValue());
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER_INPUT, "\\|");
final Map<String, String> attributeMap = new HashMap<>();
attributeMap.put("ip_address", "123.123.123.123");
queryDNSTestRunner.enqueue(new byte[0], attributeMap);
queryDNSTestRunner.enqueue("teste teste teste chocolate".getBytes());
queryDNSTestRunner.run(1,true, false);
List<MockFlowFile> results = queryDNSTestRunner.getFlowFilesForRelationship(QueryDNS.REL_FOUND);
assertTrue(results.size() == 1);
results.get(0).assertAttributeEquals("enrich.dns.record0.group5", " Apache NiFi");
}
@Test
public void testValidDataWithRegex() {
queryDNSTestRunner.setProperty(QueryDNS.DNS_QUERY_TYPE, "TXT");
queryDNSTestRunner.setProperty(QueryDNS.DNS_RETRIES, "1");
queryDNSTestRunner.setProperty(QueryDNS.DNS_TIMEOUT, "1000 ms");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_INPUT, "${ip_address:getDelimitedField(4, '.'):trim()}" +
".${ip_address:getDelimitedField(3, '.'):trim()}" +
".${ip_address:getDelimitedField(2, '.'):trim()}" +
".${ip_address:getDelimitedField(1, '.'):trim()}" +
".origin.asn.nifi.apache.org");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER, QueryDNS.REGEX.getValue());
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER_INPUT, "\\.*(\\sApache\\sNiFi)$");
final Map<String, String> attributeMap = new HashMap<>();
attributeMap.put("ip_address", "123.123.123.123");
queryDNSTestRunner.enqueue(new byte[0], attributeMap);
queryDNSTestRunner.enqueue("teste teste teste chocolate".getBytes());
queryDNSTestRunner.run(1, true, false);
List<MockFlowFile> results = queryDNSTestRunner.getFlowFilesForRelationship(QueryDNS.REL_FOUND);
assertTrue(results.size() == 1);
results.get(0).assertAttributeEquals("enrich.dns.record0.group0", " Apache NiFi");
}
@Test
public void testInvalidData() {
queryDNSTestRunner.removeProperty(QueryDNS.QUERY_PARSER_INPUT);
queryDNSTestRunner.setProperty(QueryDNS.DNS_QUERY_TYPE, "AAAA");
queryDNSTestRunner.setProperty(QueryDNS.DNS_RETRIES, "1");
queryDNSTestRunner.setProperty(QueryDNS.DNS_TIMEOUT, "1000 ms");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_INPUT, "nifi.apache.org");
final Map<String, String> attributeMap = new HashMap<>();
attributeMap.put("ip_address", "123.123.123.123");
queryDNSTestRunner.enqueue(new byte[0], attributeMap);
queryDNSTestRunner.enqueue("teste teste teste chocolate".getBytes());
queryDNSTestRunner.run(1, true, false);
List<MockFlowFile> results = queryDNSTestRunner.getFlowFilesForRelationship(QueryDNS.REL_NOT_FOUND);
assertTrue(results.size() == 1);
}
@Test
public void testCustomValidator() {
queryDNSTestRunner.setProperty(QueryDNS.DNS_QUERY_TYPE, "AAAA");
queryDNSTestRunner.setProperty(QueryDNS.DNS_RETRIES, "1");
queryDNSTestRunner.setProperty(QueryDNS.DNS_TIMEOUT, "1000 ms");
queryDNSTestRunner.setProperty(QueryDNS.QUERY_INPUT, "nifi.apache.org");
// Note the absence of a QUERY_PARSER_INPUT value
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER, QueryDNS.REGEX.getValue());
queryDNSTestRunner.assertNotValid();
// Note the presence of a QUERY_PARSER_INPUT value
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER, QueryDNS.REGEX.getValue());
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER_INPUT, "\\|");
queryDNSTestRunner.assertValid();
// Note the presence of a QUERY_PARSER_INPUT value while NONE is set
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER, QueryDNS.NONE.getValue());
queryDNSTestRunner.setProperty(QueryDNS.QUERY_PARSER_INPUT, "\\|");
queryDNSTestRunner.assertNotValid();
}
// Dummy pseudo-DNS responder
private Attributes craftResponse(InvocationOnMock invocation) {
Object[] arguments = invocation.getArguments();
String[] queryType = (String[]) arguments[1];
// Create attribute
Attributes attrs = new BasicAttributes(true);
BasicAttribute attr;
switch (queryType[0]) {
case "AAAA":
attr = new BasicAttribute("AAAA");
attrs.put(attr);
break;
case "TXT":
attr = new BasicAttribute("TXT", "666 | 123.123.123.123/32 | Apache-NIFI | AU | nifi.org | Apache NiFi");
attrs.put(attr);
break;
case "PTR":
attr = new BasicAttribute("PTR");
attr.add(0, "eg-apache.nifi.org.");
attr.add(1, "apache.nifi.org.");
attrs.put(attr);
break;
}
return attrs;
}
}