blob: ce8d5cea5359effcd48780454f8d61ff3f60d5ea [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.metron.stellar.dsl.functions;
import org.apache.metron.stellar.common.StellarProcessor;
import org.apache.metron.stellar.dsl.Context;
import org.apache.metron.stellar.dsl.DefaultVariableResolver;
import org.apache.metron.stellar.dsl.ParseException;
import org.apache.metron.stellar.dsl.StellarFunctions;
import org.junit.Before;
import org.junit.Test;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Calendar;
import java.util.HashMap;
import java.util.Map;
import java.util.TimeZone;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/**
* Tests the DateFunctions class.
*/
public class DateFunctionsTest {
private Map<String, Object> variables = new HashMap<>();
private Calendar calendar;
/**
* Runs a Stellar expression.
* @param expr The expression to run.
*/
private Object run(String expr) {
StellarProcessor processor = new StellarProcessor();
assertTrue(processor.validate(expr));
return processor.parse(expr, new DefaultVariableResolver( x -> variables.get(x), x -> variables.containsKey(x)), StellarFunctions.FUNCTION_RESOLVER(), Context.EMPTY_CONTEXT());
}
/**
* Thu Aug 25 2016 09:27:10 EST
*/
private long AUG2016 = 1472131630748L;
@Before
public void setup() {
variables.put("test_datetime", AUG2016);
calendar = Calendar.getInstance();
}
@Test
public void testDayOfWeek() {
Object result = run("DAY_OF_WEEK(test_datetime)");
assertEquals(Calendar.THURSDAY, result);
}
/**
* If no argument, then return the current day of week.
*/
@Test
public void testDayOfWeekNow() {
Object result = run("DAY_OF_WEEK()");
assertEquals(calendar.get(Calendar.DAY_OF_WEEK), result);
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testDayOfWeekNull() {
Object result = run("DAY_OF_WEEK(nada)");
}
@Test
public void testWeekOfMonth() {
Object result = run("WEEK_OF_MONTH(test_datetime)");
assertEquals(4, result);
}
/**
* If no argument, then return the current week of month.
*/
@Test
public void testWeekOfMonthNow() {
Object result = run("WEEK_OF_MONTH()");
assertEquals(calendar.get(Calendar.WEEK_OF_MONTH), result);
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testWeekOfMonthNull() {
Object result = run("WEEK_OF_MONTH(nada)");
}
@Test
public void testMonth() {
Object result = run("MONTH(test_datetime)");
assertEquals(Calendar.AUGUST, result);
}
/**
* If no argument, then return the current month.
*/
@Test
public void testMonthNow() {
Object result = run("MONTH()");
assertEquals(calendar.get(Calendar.MONTH), result);
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testMonthNull() {
Object result = run("MONTH(nada)");
}
@Test
public void testYear() {
Object result = run("YEAR(test_datetime)");
assertEquals(2016, result);
}
/**
* If no argument, then return the current year.
*/
@Test
public void testYearNow() {
Object result = run("YEAR()");
assertEquals(calendar.get(Calendar.YEAR), result);
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testYearNull() {
Object result = run("YEAR(nada)");
}
@Test
public void testDayOfMonth() {
Object result = run("DAY_OF_MONTH(test_datetime)");
assertEquals(25, result);
}
/**
* If no argument, then return the current day of month.
*/
@Test
public void testDayOfMonthNow() {
Object result = run("DAY_OF_MONTH()");
assertEquals(calendar.get(Calendar.DAY_OF_MONTH), result);
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testDayOfMonthNull() {
Object result = run("DAY_OF_MONTH(nada)");
}
@Test
public void testWeekOfYear() {
Object result = run("WEEK_OF_YEAR(test_datetime)");
calendar.setTimeInMillis(AUG2016);
assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), result);
}
/**
* If no argument, then return the current week of year.
*/
@Test
public void testWeekOfYearNow() {
Object result = run("WEEK_OF_YEAR()");
assertEquals(calendar.get(Calendar.WEEK_OF_YEAR), result);
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testWeekOfYearNull() {
Object result = run("WEEK_OF_YEAR(nada)");
}
@Test
public void testDayOfYear() {
Object result = run("DAY_OF_YEAR(test_datetime)");
assertEquals(238, result);
}
/**
* If no argument, then return the current day of year.
*/
@Test
public void testDayOfYearNow() {
Object result = run("DAY_OF_YEAR()");
assertEquals(calendar.get(Calendar.DAY_OF_YEAR), result);
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testDayOfYearNull() {
Object result = run("DAY_OF_YEAR(nada)");
}
@Test
public void testDateFormat() {
Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzz', test_datetime, 'EST')");
assertEquals("Thu Aug 25 2016 08:27:10 EST", result);
}
/**
* Test that the String returned is formatted as specified.
* LocalDate.parse will throw if it is not.
* @throws Exception
*/
@Test
public void testDateFormatDefault() throws Exception {
Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzzz')");
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("EEE MMM dd yyyy hh:mm:ss zzzz");
LocalDate.parse(result.toString(), formatter);
}
@Test
public void testDateFormatNow() {
Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzz', 'GMT')");
assertTrue(result.toString().endsWith("GMT"));
}
@Test
public void testDateFormatDefaultTimezone() {
Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzzz', test_datetime)");
boolean inDaylightSavings = ZoneId.of( TimeZone.getDefault().getID() )
.getRules().isDaylightSavings(Instant.ofEpochMilli(AUG2016) );
assertTrue(result.toString().endsWith(TimeZone.getDefault().getDisplayName(inDaylightSavings, 1)));
}
/**
* If refer to variable that does not exist, expect ParseException.
*/
@Test(expected = ParseException.class)
public void testDateFormatNull() {
Object result = run("DATE_FORMAT('EEE MMM dd yyyy hh:mm:ss zzz', nada, 'EST')");
}
@Test(expected = ParseException.class)
public void testDateFormatInvalid() {
Object result = run("DATE_FORMAT('INVALID DATE FORMAT', test_datetime, 'EST')");
}
}