/* * Copyright 2013 Future Systems * * Licensed 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.araqne.logdb.query.parser; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import java.util.ArrayList; import java.util.List; import java.util.regex.Pattern; import org.araqne.logdb.QueryCommand; import org.araqne.logdb.QueryCommandPipe; import org.araqne.logdb.QueryParseException; import org.araqne.logdb.QueryParserService; import org.araqne.logdb.Row; import org.araqne.logdb.impl.FunctionRegistryImpl; import org.araqne.logdb.query.command.Rex; import org.araqne.logdb.query.engine.QueryParserServiceImpl; import org.junit.Before; import org.junit.Test; public class RexParserTest { private QueryParserService queryParserService; @Before public void setup() { QueryParserServiceImpl p = new QueryParserServiceImpl(); p.setFunctionRegistry(new FunctionRegistryImpl()); queryParserService = p; } @Test public void testRexItself() { Pattern p = Pattern.compile("From: (.*) To: (.*)"); String[] names = new String[] { "from", "to" }; DummyOutput out = new DummyOutput(); Rex rex = new Rex("raw", "", p, names); rex.setOutput(new QueryCommandPipe(out)); Row m = new Row(); m.put("raw", "From: Susan To: Bob"); rex.onPush(m); assertEquals(1, out.list.size()); Row m2 = out.list.get(0); assertEquals("From: Susan To: Bob", (String) m2.get("raw")); assertEquals("Susan", (String) m2.get("from")); assertEquals("Bob", (String) m2.get("to")); } private static class DummyOutput extends QueryCommand { private List<Row> list = new ArrayList<Row>(); @Override public String getName() { return "output"; } @Override public void onPush(Row m) { list.add(m); } @Override public boolean isReducer() { return false; } } @Test public void testRexCommandParse() { RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, "rex field=_raw \"From: (?<from>.*) To: (?<to>.*)\""); assertEquals("_raw", rex.getInputField()); assertEquals("from", rex.getOutputNames()[0]); assertEquals("to", rex.getOutputNames()[1]); assertEquals("From: (.*) To: (.*)", rex.getPattern().toString()); } @Test public void testRexQueryGeneration() { String QUERY = "rex field=_raw \"From: (?<from>.*) To: (?<to>.*)\""; RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, QUERY); String query = rex.toString(); assertEquals(QUERY, query); } @Test public void testRexCommandParse2() { String s = "Close[00:00:20. SF. FIN] NAT[313] R[16]"; Row map = new Row(); map.put("note", s); RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, "rex field=note \"N(A|B)T\\[(?<nat>.*?)\\] R\\[(?<r>.*?)\\]\""); DummyOutput out = new DummyOutput(); rex.setOutput(new QueryCommandPipe(out)); rex.onPush(map); Row map2 = out.list.get(0); assertEquals("313", map2.get("nat")); assertEquals("16", map2.get("r")); } @Test public void testEscape() { String s = "rex field=line \"(?<d>\\d+-\\d+-\\d+)\""; RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, s); assertEquals("(\\d+-\\d+-\\d+)", rex.getPattern().toString()); } @Test public void testEscapeQueryGeneration() { String s = "rex field=line \"(?<d>\\d+-\\d+-\\d+)\" "; RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, s); String query = rex.toString(); assertEquals(s, query); } // for araqne/issue#280 @Test public void testNestedCapture() { String s = "rex field=line \"(?<payload>cpu_usage=\\\"(?<cpu_usage>.*)\\\" mem_usage=\\\"(?<mem_usage>.*)\\\")\""; RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, s); DummyOutput out = new DummyOutput(); rex.setOutput(new QueryCommandPipe(out)); Row map = new Row(); map.put("line", "sample cpu_usage=\"3 %\" mem_usage=\"60 %\""); rex.onPush(map); Row map2 = out.list.get(0); assertEquals("3 %", map2.get("cpu_usage")); assertEquals("60 %", map2.get("mem_usage")); assertEquals("cpu_usage=\"3 %\" mem_usage=\"60 %\"", map2.get("payload")); s = "rex field=line \"((?<key>\\w+,\\w+))\""; parser = new RexParser(); parser.setQueryParserService(queryParserService); rex = (Rex) parser.parse(null, s); out = new DummyOutput(); rex.setOutput(new QueryCommandPipe(out)); map = new Row(); map.put("line", "sample (aaa,bbb)"); rex.onPush(map); map2 = out.list.get(0); assertEquals("aaa,bbb", map2.get("key")); s = "rex field=line \"\\((?<key>\\w+,\\w+)\\)\""; parser = new RexParser(); parser.setQueryParserService(queryParserService); rex = (Rex) parser.parse(null, s); out = new DummyOutput(); rex.setOutput(new QueryCommandPipe(out)); map = new Row(); map.put("line", "sample (aaa,bbb)"); rex.onPush(map); map2 = out.list.get(0); assertEquals("aaa,bbb", map2.get("key")); } // for araqne/issue#127 @Test public void testIgnoreInnerKeyValueOptionPattern() { String s = "rex field=line \"cpu_usage=\\\"(?<cpu_usage>.*)\\\" mem_usage=\\\"(?<mem_usage>.*)\\\"\""; RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, s); // Note that escape-quote sequence is preserved, it is intended result // for query convenience. assertEquals("cpu_usage=\\\"(.*)\\\" mem_usage=\\\"(.*)\\\"", rex.getPattern().toString()); DummyOutput out = new DummyOutput(); rex.setOutput(new QueryCommandPipe(out)); Row map = new Row(); map.put("line", "sample cpu_usage=\"3 %\" mem_usage=\"60 %\""); rex.onPush(map); Row map2 = out.list.get(0); assertEquals("3 %", map2.get("cpu_usage")); assertEquals("60 %", map2.get("mem_usage")); } @Test public void testInvalidOptionBug() { String s = "rex field=line \"\\d+\\s+(?<xtime>\\d+-\\d+-\\d+\\w+\\d+:\\d+:\\d+\\.\\d+)[-\\w\\d].+RT_FLOW\\s+-\\s+(?<xstatus>\\w+)\\s+[-@=\\[\\w\\d\\\"\\.\\s].+\\s+" + "source-address=\\\"(?<s_info>[\\.\\d]+)\\\"\\s+source-port=\\\"(?<s_port>\\d+)\\\"\\s+destination-address=\\\"(?<d_info>[\\.\\d]+)\\\"\\s+" + "destination-port=\\\"(?<d_port>\\d+)\\\"\\s+(?<ext5>[-=\\w\\\"].+?)(\\s+nat-source-address=\\\"(?<xext1_ip>[\\.\\d]+)\\\"\\s+nat-source-port=\\\"(?<xext1_port>[\\d]+)\\\"\\s+" + "nat-destination-address=\\\"(?<xext2_ip>[\\.\\d]+)\\\"\\s+nat-destination-port=\\\"(?<xext2_port>[\\d]+)\\\"\\s+(?<xnote1>[-=\\w\\s\\\"].+)\\s+|\\s+)protocol-id=\\\"(?<protocol>\\d+)\\\"+(\\s+|[-\\s\\w=\\d\\\"].+)" + "policy-name=\\\"(?<ext4>\\d+)\\\"+\\s+(?<xnote2>[-=\\w\\s\\\"].+?)\\s++(?<xnote3>[-=\\w\\s\\\"].+?)\\s+(session-id-32=\\\"(?<user_id>\\d+)\\\"\\s|\\s*)(?<xnote4>[-=\\w\\s\\\"].+)\\]\" "; RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); Rex rex = (Rex) parser.parse(null, s); assertEquals("line", rex.getInputField()); } @Test public void testError20900(){ RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); String query = "rex field= \"From: (?<from>.*) To: (?<to>.*)\""; try { parser.parse(null, query); fail(); } catch (QueryParseException e) { if(e.isDebugMode()){ System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("20900", e.getType()); assertEquals(10, e.getStartOffset()); assertEquals(10, e.getEndOffset()); } } @Test public void testError20901(){ RexParser parser = new RexParser(); parser.setQueryParserService(queryParserService); String query = "rex field=line \"From: (?<from>.*) To: (?<to>.*)"; try { parser.parse(null, query); fail(); } catch (QueryParseException e) { if(e.isDebugMode()){ System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("20901", e.getType()); assertEquals(15, e.getStartOffset()); assertEquals(46, e.getEndOffset()); } query = "rex field=line From: (?<from>.*) To: (?<to>.*)\""; try { parser.parse(null, query); fail(); } catch (QueryParseException e) { if(e.isDebugMode()){ System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("20901", e.getType()); assertEquals(15, e.getStartOffset()); assertEquals(46, e.getEndOffset()); } } }