/* * 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.Arrays; import java.util.List; import java.util.Map; import org.araqne.logdb.FunctionRegistry; import org.araqne.logdb.QueryParseException; import org.araqne.logdb.impl.FunctionRegistryImpl; import org.junit.Test; public class QueryTokenizerTest { private FunctionRegistry functionRegistry = new FunctionRegistryImpl(); @Test public void testParseSubQuery() { String q = "table iis | join ip [ table users | fields user_id, ip ]"; List<String> commands = QueryTokenizer.parseCommands(q); assertEquals(2, commands.size()); } @Test public void testParseNonSubQuery() { String q = "table iis | search == \"*|[*\""; List<String> commands = QueryTokenizer.parseCommands(q); assertEquals(2, commands.size()); } @Test public void testParseCommands() { String q = "table limit=1000000 local\\arko-guro | search sip contain \"10.1.\" | stats count by sip"; List<String> commands = QueryTokenizer.parseCommands(q); assertEquals(3, commands.size()); } @Test @SuppressWarnings("unchecked") public void testOptions() { String query = "textfile offset=1 limit=10 sample.log"; ParseResult r = QueryTokenizer.parseOptions(null, query, "textfile".length(), Arrays.asList("offset", "limit"), functionRegistry); Map<String, String> options = (Map<String, String>) r.value; assertEquals("1", options.get("offset")); assertEquals("10", options.get("limit")); } @Test @SuppressWarnings("unchecked") public void testOptions2() { String query = "search offset=1 limit=10 1 == 1"; ParseResult r = QueryTokenizer.parseOptions(null, query, "search".length(), Arrays.asList("offset", "limit"), functionRegistry); Map<String, String> options = (Map<String, String>) r.value; assertEquals("1", options.get("offset")); assertEquals("10", options.get("limit")); } @Test @SuppressWarnings("unchecked") public void testOptions3() { String query = "search offset=1 limit=10 in(field,\"?&key=value\")"; ParseResult r = QueryTokenizer.parseOptions(null, query, "search".length(), Arrays.asList("offset", "limit"), functionRegistry); Map<String, String> options = (Map<String, String>) r.value; assertEquals("1", options.get("offset")); assertEquals("10", options.get("limit")); } @Test @SuppressWarnings("unchecked") public void testOptions4() { String query = "search in(field,\"?&key=value\")"; ParseResult r = QueryTokenizer.parseOptions(null, query, "search".length(), Arrays.asList("offset", "limit"), functionRegistry); Map<String, String> options = (Map<String, String>) r.value; assertEquals(0, options.size()); } @Test @SuppressWarnings("unchecked") public void testOptions5() { String query = "search offset=1 limit=10"; ParseResult r = QueryTokenizer.parseOptions(null, query, "search".length(), Arrays.asList("offset", "limit"), functionRegistry); Map<String, String> options = (Map<String, String>) r.value; assertEquals("1", options.get("offset")); assertEquals("10", options.get("limit")); } @SuppressWarnings("unchecked") @Test public void testOptions7() { String query = "textfile parser=\"<key = value>\" foo.txt"; ParseResult r = QueryTokenizer.parseOptions(null, query, "textfile".length(), Arrays.asList("parser"), functionRegistry); Map<String, String> options = (Map<String, String>) r.value; assertEquals("<key = value>", options.get("parser")); } @Test public void testError90000() { String query = "search offset = 1 limit=10 "; try { QueryTokenizer.parseOptions(null, query, "search".length(), Arrays.asList("offset", "limit"), functionRegistry); fail(); } catch (QueryParseException e) { if (e.isDebugMode()) { System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("90000", e.getType()); assertEquals(13, e.getStartOffset()); assertEquals(13, e.getEndOffset()); } } @Test public void testError90001() { String query = "textfile limit=100 \"parser\"=\"<key = value>\" foo.txt"; try { QueryTokenizer.parseOptions(null, query, "textfile".length(), Arrays.asList("parser", "limit"), functionRegistry); fail(); } catch (QueryParseException e) { if (e.isDebugMode()) { System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("90001", e.getType()); assertEquals(19, e.getStartOffset()); assertEquals(26, e.getEndOffset()); } } @Test public void testError90002() { String query = "textfile limit=100 parser=\"<key = value> foo.txt"; try { QueryTokenizer.parseOptions(null, query, "textfile".length(), Arrays.asList("parser", "limit"), functionRegistry); fail(); } catch (QueryParseException e) { if (e.isDebugMode()) { System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("90002", e.getType()); assertEquals(26, e.getStartOffset()); assertEquals(47, e.getEndOffset()); } } @Test public void testCsvParse() { int p = QueryTokenizer.findKeyword("sum(min(1, 2))", ","); assertEquals(-1, p); p = QueryTokenizer.findKeyword("sum(min(1, 2)), 1", ","); assertEquals(14, p); } @Test public void testQuote() { String s = "table limit=1 iis | rex field=line \"(?<d>\\\\d+-\\\\d+-\\\\d+)\" | eval d2 = date(d, \"yyyy-MM-dd HH:mm:ss\") | fields d, d2"; List<String> commands = QueryTokenizer.parseCommands(s); System.out.println(commands.get(1)); } @Test public void testError90003() { String query = "table iis | |"; try { QueryTokenizer.parseCommands(query); fail(); } catch (QueryParseException e) { if (e.isDebugMode()) { System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("90003", e.getType()); assertEquals(15, e.getStartOffset()); assertEquals(15, e.getEndOffset()); } query = "table test | "; try { QueryTokenizer.parseCommands(query); fail(); } catch (QueryParseException e) { if (e.isDebugMode()) { System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("90003", e.getType()); assertEquals(15, e.getStartOffset()); assertEquals(15, e.getEndOffset()); } } @Test public void testError90004() { String query = ""; try { QueryTokenizer.nextString(query); fail(); } catch (QueryParseException e) { if (e.isDebugMode()) { System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("90004", e.getType()); assertEquals(0, e.getStartOffset()); assertEquals(0, e.getEndOffset()); } } @Test public void testError90005() { String query = "\"table test"; try { QueryTokenizer.nextString(query); fail(); } catch (QueryParseException e) { if (e.isDebugMode()) { System.out.println("query " + query); System.out.println(e.getMessage()); } assertEquals("90005", e.getType()); assertEquals(query, e.getParams().get("value")); } } @Test public void testEscape() { List<String> queries = new ArrayList<String>(); queries.add("search contains(query_string,\"rex field=line \\\\\\\"(GET|POST)\\\")\")"); queries.add("search contains(query_string,\"search contains(query_string,\\\"rex field=line \\\\\\\\\\\\\\\"(GET|POST)\\\\\\\")\\\"\")"); queries.add("json \"{\"test\": \"\\\\\\\\\\\\\\\\\\\\\"\\\\\"\\\\\\\\\\\\\"\\\\\\\\\"}\""); for (String query : queries) { List<String> result = QueryTokenizer.parseCommands(query); assertEquals(result.size() > 0, true); assertEquals(query, result.get(0)); } } }