/** * Copyright (c) 2010 Yahoo! Inc. All rights reserved. * 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. See accompanying LICENSE file. */ package org.apache.oozie.coord; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.oozie.client.OozieClient; import org.apache.oozie.service.ELService; import org.apache.oozie.service.Services; import org.apache.oozie.test.XTestCase; import org.apache.oozie.util.DateUtils; import org.apache.oozie.util.ELEvaluator; public class TestCoordELFunctions extends XTestCase { ELEvaluator eval = null; SyncCoordAction appInst = null; SyncCoordDataset ds = null; private Services services; @Override protected void setUp() throws Exception { super.setUp(); services = new Services(); services.init(); } @Override protected void tearDown() throws Exception { services.destroy(); super.tearDown(); } /* * public void testSetup() throws Exception { services = new Services(); * services.init(); } */ public void testURIVars() throws Exception { init("coord-job-submit-freq"); String expr = "${YEAR}"; try { assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); fail("should throw exception beacuse coord-job-submit-freq doesn't resolve YEAR/MONTH/DAY"); } catch (Exception ex) { } init("coord-job-submit-nofuncs"); assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); expr = "${MONTH}"; assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); expr = "${DAY}"; assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); expr = "${HOUR}"; assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); expr = "${MINUTE}"; assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); } public void testDay() throws Exception { init("coord-job-submit-freq"); String expr = "${coord:days(1)}"; assertEquals("1", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.DAY, (TimeUnit) eval.getVariable("timeunit")); expr = "${coord:days(256)}"; assertEquals("256", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.DAY, (TimeUnit) eval.getVariable("timeunit")); } public void testMonth() throws Exception { init("coord-job-submit-freq"); String expr = "${coord:months(1)}"; assertEquals("1", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MONTH, (TimeUnit) eval.getVariable("timeunit")); expr = "${coord:months(1) + 7}"; assertEquals("8", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MONTH, (TimeUnit) eval.getVariable("timeunit")); expr = "${coord:months(256)}"; assertEquals("256", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MONTH, (TimeUnit) eval.getVariable("timeunit")); expr = "${coord:months(coord:months(7))}"; assertEquals("7", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MONTH, (TimeUnit) eval.getVariable("timeunit")); } public void testHours() throws Exception { init("coord-job-submit-freq"); String expr = "${coord:hours(1)}"; assertEquals("60", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MINUTE, (TimeUnit) eval.getVariable("timeunit")); expr = "${coord:hours(coord:hours(1))}"; assertEquals("3600", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MINUTE, (TimeUnit) eval.getVariable("timeunit")); } public void testEndOfDays() throws Exception { init("coord-job-submit-freq"); String expr = "${coord:endOfDays(1)}"; expr = "${coord:endOfDays(3)}"; assertEquals("3", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.DAY, (TimeUnit) eval.getVariable("timeunit")); assertEquals(TimeUnit.END_OF_DAY, (TimeUnit) eval.getVariable("endOfDuration")); } public void testEndOfMonths() throws Exception { init("coord-job-submit-freq"); String expr = "${coord:endOfMonths(1)}"; expr = "${coord:endOfMonths(3)}"; assertEquals("3", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MONTH, (TimeUnit) eval.getVariable("timeunit")); assertEquals(TimeUnit.END_OF_MONTH, (TimeUnit) eval.getVariable("endOfDuration")); } public void testMinutes() throws Exception { init("coord-job-submit-freq"); String expr = "${coord:minutes(1)}"; expr = "${coord:minutes(1)}"; assertEquals("1", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MINUTE, (TimeUnit) eval.getVariable("timeunit")); expr = "${coord:minutes(coord:minutes(1))}"; assertEquals("1", CoordELFunctions.evalAndWrap(eval, expr)); assertEquals(TimeUnit.MINUTE, (TimeUnit) eval.getVariable("timeunit")); } public void testTzOffsetPh1() throws Exception { init("coord-job-submit-instances"); String expr = "${coord:current(-coord:tzOffset())}"; assertEquals("${coord:current(-3)}", CoordELFunctions.evalAndWrap(eval, expr)); } public void testDataNamesPh1() throws Exception { init("coord-job-submit-data"); String expr = "${coord:dataIn('ABC')}"; eval.setVariable("oozie.dataname.ABC", "data-in"); assertEquals("${coord:dataIn('ABC')}", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:dataIn('ABCD')}"; try { assertEquals("${coord:dataIn('ABCD')}", CoordELFunctions.evalAndWrap(eval, expr)); fail("should throw exception beacuse Data in is not defiend"); } catch (Exception ex) { } expr = "${coord:dataOut('EFG')}"; eval.setVariable("oozie.dataname.EFG", "data-out"); assertEquals("${coord:dataOut('EFG')}", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:dataOut('EFGH')}"; try { assertEquals("${coord:dataOut('EFGH')}", CoordELFunctions.evalAndWrap(eval, expr)); fail("should throw exception beacuse Data in is not defiend"); } catch (Exception ex) { } } public void testHoursInDay() throws Exception { init("coord-action-create"); String expr = "${coord:hoursInDay(1)}"; String res = CoordELFunctions.evalAndWrap(eval, expr); assertEquals("24", res); expr = "${coord:hoursInDay(coord:hoursInDay(1))}"; res = CoordELFunctions.evalAndWrap(eval, expr); SyncCoordAction appInst = new SyncCoordAction(); SyncCoordDataset ds = new SyncCoordDataset(); ; ds.setFrequency(1); ds.setTimeUnit(TimeUnit.DAY); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-02T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setName("test1"); ds.setType("SYNC"); appInst.setActualTime(DateUtils.parseDateUTC("2009-09-10T23:59Z")); appInst.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-01-01T08:00Z")); appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:hoursInDay(0)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:hoursInDay(0)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:hoursInDay(-2)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-08T08:00Z")); appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("UTC")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:hoursInDay(0)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); ds.setTimeZone(DateUtils.getTimeZone("Europe/London")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:hoursInDay(0)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-08T08:00Z")); appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:hoursInDay(0)}"; assertEquals("23", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:hoursInDay(1)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); appInst.setNominalTime(DateUtils.parseDateUTC("2009-11-01T08:00Z")); appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:hoursInDay(0)}"; assertEquals("25", CoordELFunctions.evalAndWrap(eval, expr)); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-08T08:00Z")); appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setEndOfDuration(TimeUnit.END_OF_DAY); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:hoursInDay(0)}"; assertEquals("23", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:hoursInDay(1)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:hoursInDay(-1)}"; assertEquals("24", CoordELFunctions.evalAndWrap(eval, expr)); } public void testDaysInMonth() throws Exception { init("coord-action-create"); String expr = "${coord:daysInMonth(1)}"; assertEquals("30", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(coord:daysInMonth(1))}"; assertEquals("31", CoordELFunctions.evalAndWrap(eval, expr)); SyncCoordAction appInst = new SyncCoordAction(); SyncCoordDataset ds = new SyncCoordDataset(); ; ds.setFrequency(1); ds.setTimeUnit(TimeUnit.MONTH); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-02T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setName("test1"); ds.setType("SYNC"); appInst.setActualTime(DateUtils.parseDateUTC("2009-09-10T23:59Z")); appInst.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T00:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T11:00Z")); appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:daysInMonth(0)}"; assertEquals("28", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(-1)}"; assertEquals("31", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(2)}"; assertEquals("30", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(-3)}"; assertEquals("30", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(3)}"; assertEquals("31", CoordELFunctions.evalAndWrap(eval, expr)); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T11:00Z")); // Feb appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:daysInMonth(0)}"; assertEquals("28", CoordELFunctions.evalAndWrap(eval, expr)); // Jan // 31 // End of Month ds.setFrequency(1); ds.setTimeUnit(TimeUnit.MONTH); ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-02T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setName("test1"); ds.setType("SYNC"); appInst.setActualTime(DateUtils.parseDateUTC("2009-09-10T23:59Z")); appInst.setTimeZone(DateUtils.getTimeZone("UTC")); // Case 1 ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T00:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T11:00Z")); appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:daysInMonth(0)}"; assertEquals("28", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(-1)}"; assertEquals("31", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(2)}"; assertEquals("30", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(-3)}"; assertEquals("30", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:daysInMonth(3)}"; assertEquals("31", CoordELFunctions.evalAndWrap(eval, expr)); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T11:00Z")); // Feb appInst.setActualTime(DateUtils.parseDateUTC("2010-10-01T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:daysInMonth(0)}"; assertEquals("28", CoordELFunctions.evalAndWrap(eval, expr)); // Jan // 31 } public void testTZOffset() throws Exception { init("coord-action-create"); String expr = "${coord:tzOffset()}"; // eval.setVariable("resolve_tzOffset", "true"); assertEquals("0", CoordELFunctions.evalAndWrap(eval, expr)); appInst.setTimeZone(DateUtils.getTimeZone("America/New_York")); CoordELFunctions.configureEvaluator(eval, ds, appInst); assertEquals("-180", CoordELFunctions.evalAndWrap(eval, expr)); } public void testDateOffset() throws Exception { init("coord-job-submit-data"); String expr = "${coord:dateOffset(\"2009-09-08T23:59Z\", 2, \"DAY\")}"; init("coord-action-start"); expr = "${coord:dateOffset(\"2009-09-08T23:59Z\", 2, \"DAY\")}"; assertEquals("2009-09-10T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:dateOffset(\"2009-09-08T23:59Z\", -1, \"DAY\")}"; assertEquals("2009-09-07T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); } public void testCurrent() throws Exception { init("coord-action-create"); String expr = "${coord:current(-1)}"; assertEquals("2009-09-08T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); appInst.setNominalTime(DateUtils.parseDateUTC("2009-05-30T00:45Z")); ds.setFrequency(1); ds.setTimeUnit(TimeUnit.DAY); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-02T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); expr = "${coord:current(0)} ${coord:current(1)} ${coord:current(-1)} ${coord:current(-3)}"; assertEquals("2009-05-29T23:00Z 2009-05-30T23:00Z 2009-05-28T23:00Z 2009-05-26T23:00Z", CoordELFunctions .evalAndWrap(eval, expr)); appInst.setNominalTime(DateUtils.parseDateUTC("2009-05-30T00:45Z")); ds.setFrequency(30); ds.setTimeUnit(TimeUnit.MINUTE); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-08T00:00Z")); expr = "${coord:current(0)} ${coord:current(1)} ${coord:current(-1)} ${coord:current(-3)}"; assertEquals("2009-05-30T00:30Z 2009-05-30T01:00Z 2009-05-30T00:00Z 2009-05-29T23:00Z", eval.evaluate(expr, String.class)); SyncCoordAction appInst = new SyncCoordAction(); SyncCoordDataset ds = new SyncCoordDataset(); ; ds.setFrequency(1); ds.setTimeUnit(TimeUnit.DAY); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-02T00:00Z")); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setName("test1"); ds.setType("SYNC"); appInst.setActualTime(DateUtils.parseDateUTC("2009-09-10T23:59Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-05-30T00:00Z ")); appInst.setTimeZone(DateUtils.getTimeZone("UTC")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-05-30T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-05-31T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(-1)}"; assertEquals("2009-05-29T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(-3)}"; assertEquals("2009-05-27T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); ds.setFrequency(7); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-08T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-05-28T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-06-04T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(-1)}"; assertEquals("2009-05-21T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(-3)}"; assertEquals("2009-05-07T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Spring DST transition appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-08T10:45Z")); ds.setFrequency(1); ds.setTimeUnit(TimeUnit.DAY); ds.setInitInstance(DateUtils.parseDateUTC("2009-03-06T10:00Z")); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); expr = "${coord:current(-2)} ${coord:current(-1)} ${coord:current(0)} ${coord:current(1)} ${coord:current(2)}"; assertEquals("2009-03-06T10:00Z 2009-03-07T10:00Z 2009-03-08T09:00Z 2009-03-09T09:00Z 2009-03-10T09:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Winter DST Transition appInst.setNominalTime(DateUtils.parseDateUTC("2009-11-01T08:00Z")); ds.setFrequency(1); ds.setTimeUnit(TimeUnit.DAY); ds.setInitInstance(DateUtils.parseDateUTC("2009-10-30T08:00Z")); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); expr = "${coord:current(-2)} ${coord:current(-1)} ${coord:current(0)} ${coord:current(1)} ${coord:current(2)}"; // System.out.println("AAAAA " + CoordELFunctions.evalAndWrap(eval, // expr)); assertEquals("2009-10-30T08:00Z 2009-10-31T08:00Z 2009-11-01T08:00Z 2009-11-02T09:00Z 2009-11-03T09:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // EndofDay testing ds.setFrequency(1); ds.setTimeUnit(TimeUnit.DAY); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-02T09:00Z")); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setName("test1"); ds.setType("SYNC"); appInst.setNominalTime(DateUtils.parseDateUTC("2009-05-30T12:00Z ")); ds.setEndOfDuration(TimeUnit.END_OF_DAY); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-05-30T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-05-31T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // From Specification // Case 1 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-01-01T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("", CoordELFunctions.evalAndWrap(eval, expr)); // Case 2 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-01-01T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; // assertEquals("2009-01-02T08:00Z", CoordELFunctions.evalAndWrap(eval, // expr)); assertEquals("", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; // assertEquals("2009-01-03T08:00Z", CoordELFunctions.evalAndWrap(eval, // expr)); assertEquals("", CoordELFunctions.evalAndWrap(eval, expr)); // Case 3 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T07:01Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-01-01T08:01Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-01-01T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-01-02T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 4 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T7:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-01-01T18:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-01-01T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-01-02T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 5 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-03-07T07:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-07T09:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-03-07T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-08T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 6 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-03-08T07:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-08T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-03-08T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-09T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 7 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-03-09T07:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-10T08:01Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-03-10T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-11T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 8 ds.setEndOfDuration(TimeUnit.END_OF_DAY); ds.setFrequency(2); // Changed ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-03-09T07:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-10T07:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-03-10T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-12T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Test with EOM ds.setTimeUnit(TimeUnit.MONTH); // Case 1 ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setFrequency(1); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T00:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T00:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-02-01T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-01T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 2 ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-02-01T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-01T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 3 ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setTimeZone(DateUtils.getTimeZone("UTC")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-31T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-02-01T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-01T00:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 4 ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-01-01T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-02-01T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-02-01T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-03-01T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 5 ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-02-02T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-02T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-03-01T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-04-01T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 6 ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-02-01T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-01T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-03-01T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-04-01T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); // Case 7 ds.setEndOfDuration(TimeUnit.END_OF_MONTH); ds.setFrequency(3); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setInitInstance(DateUtils.parseDateUTC("2009-02-01T08:00Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-03-01T08:00Z")); CoordELFunctions.configureEvaluator(eval, ds, appInst); expr = "${coord:current(0)}"; assertEquals("2009-03-01T08:00Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:current(1)}"; assertEquals("2009-06-01T07:00Z", CoordELFunctions.evalAndWrap(eval, expr)); } public void testLatest() throws Exception { init("coord-action-start"); String expr = "${coord:latest(0)}"; Configuration conf = new Configuration(); injectKerberosInfo(conf); // TODO:Set hadoop properties eval.setVariable(CoordELFunctions.CONFIGURATION, conf); String testDir = getTestCaseDir(); // ds.setUriTemplate("file:///tmp/coord/${YEAR}/${MONTH}/${DAY}"); ds.setUriTemplate("file://" + testDir + "/${YEAR}/${MONTH}/${DAY}"); createDir(testDir + "/2009/09/10"); // TODO: Create the directories assertEquals("2009-09-10T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); createDir(testDir + "/2009/09/09"); expr = "${coord:latest(-1)}"; assertEquals("2009-09-09T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); createDir(testDir + "/2009/09/08"); expr = "${coord:latest(-2)}"; assertEquals("2009-09-08T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:latest(-100)}"; assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); expr = "${coord:latest(1)}"; try { assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); fail("Should throw exception, because latest for +ve instance is not valid"); } catch (Exception ex) { } // Add test cases with EOM and EOD option } public void testPh1Future() throws Exception { init("coord-job-submit-instances"); String expr = "${coord:future(1, 10)}"; assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); } public void testFormatTime() throws Exception { String expr1 = "${coord:formatTime(\"2009-09-08T23:59Z\", \"yyyy\")}"; String expr2 = "${coord:formatTime(\"2009-09-08T23:59Z\", \"yyyyMMdd_HHmmss\")}"; init("coord-action-create"); assertEquals("2009", CoordELFunctions.evalAndWrap(eval, expr1)); assertEquals("20090908_235900", CoordELFunctions.evalAndWrap(eval, expr2)); init("coord-action-create-inst"); assertEquals("2009", CoordELFunctions.evalAndWrap(eval, expr1)); assertEquals("20090908_235900", CoordELFunctions.evalAndWrap(eval, expr2)); init("coord-action-start"); assertEquals("2009", CoordELFunctions.evalAndWrap(eval, expr1)); assertEquals("20090908_235900", CoordELFunctions.evalAndWrap(eval, expr2)); String utcDate = "2009-09-08T23:59Z"; String expr3 = "${coord:formatTime(date, \"yyyy\")}"; String expr3_eval = "${coord:formatTime('" + utcDate + "' , " + "yyyy)}"; init("coord-job-submit-instances"); eval.setVariable("date", utcDate); assertEquals(expr3_eval, CoordELFunctions.evalAndWrap(eval, expr3)); init("coord-job-submit-data"); eval.setVariable("date", utcDate); assertEquals(expr3_eval, CoordELFunctions.evalAndWrap(eval, expr3)); } public void testFuture() throws Exception { init("coord-job-submit-instances"); String expr = "${coord:future(1, 20)}"; init("coord-action-start"); Configuration conf = new Configuration(); injectKerberosInfo(conf); // TODO:Set hadoop properties eval.setVariable(CoordELFunctions.CONFIGURATION, conf); String testDir = getTestCaseDir(); ds.setUriTemplate("file://" + testDir + "/${YEAR}/${MONTH}/${DAY}"); createDir(testDir + "/2009/09/10"); createDir(testDir + "/2009/09/11"); assertEquals("2009-09-11T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); try { expr = "${coord:future(-1, 3)}"; CoordELFunctions.evalAndWrap(eval, expr); fail("Should fail for negative instance value"); } catch (Exception ex) { } expr = "${coord:future(4, 20)}"; String res = "${coord:future(4, 20)}"; assertEquals(res, CoordELFunctions.evalAndWrap(eval, expr)); } public void testNominalTime() throws Exception { init("coord-job-submit-data"); String expr = "${coord:nominalTime()}"; init("coord-action-start"); expr = "${coord:nominalTime()}"; assertEquals("2009-09-09T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); } public void testActualTime() throws Exception { init("coord-job-submit-data"); String expr = "${coord:actualTime()}"; init("coord-action-start"); expr = "${coord:actualTime()}"; assertEquals("2009-09-10T23:59Z", CoordELFunctions.evalAndWrap(eval, expr)); } public void testDataIn() throws Exception { init("coord-action-start"); eval.setVariable(".datain.ABC", "file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31"); eval.setVariable(".datain.ABC.unresolved", Boolean.FALSE); String expr = "${coord:dataIn('ABC')}"; assertEquals("file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31", CoordELFunctions.evalAndWrap( eval, expr)); eval.setVariable(".datain.ABC", "file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31"); eval.setVariable(".datain.ABC.unresolved", Boolean.TRUE); assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr)); } public void testDataOut() throws Exception { init("coord-action-start"); eval.setVariable(".dataout.ABC", "file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31"); String expr = "${coord:dataOut('ABC')}"; assertEquals("file:///tmp/coord/US/2009/1/30,file:///tmp/coord/US/2009/1/31", CoordELFunctions.evalAndWrap( eval, expr)); } public void testActionId() throws Exception { init("coord-action-start"); String expr = "${coord:actionId()}"; assertEquals("00000-oozie-C@1", CoordELFunctions.evalAndWrap(eval, expr)); } public void testName() throws Exception { init("coord-action-start"); String expr = "${coord:name()}"; assertEquals("mycoordinator-app", CoordELFunctions.evalAndWrap(eval, expr)); } public void testUser() throws Exception { init("coord-job-submit-freq"); String expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-job-submit-instances"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-job-submit-data"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-sla-submit"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-action-create"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-action-create-inst"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-sla-create"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-action-start"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); init("coord-action-create-inst"); expr = "${coord:user()}"; assertEquals("test_user", CoordELFunctions.evalAndWrap(eval, expr)); } /* * public void testDetach() throws Exception { Services.get().destroy(); } */ private void init(String tag) throws Exception { eval = Services.get().get(ELService.class).createEvaluator(tag); eval.setVariable(OozieClient.USER_NAME, "test_user"); eval.setVariable(OozieClient.GROUP_NAME, "test_group"); appInst = new SyncCoordAction(); ds = new SyncCoordDataset(); ds.setFrequency(1); ds.setInitInstance(DateUtils.parseDateUTC("2009-09-01T23:59Z")); ds.setTimeUnit(TimeUnit.DAY); ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); ds.setName("test"); ds.setUriTemplate("hdfs://localhost:9000/user/" + getTestUser() + "/US/${YEAR}/${MONTH}/${DAY}"); ds.setType("SYNC"); ds.setDoneFlag(""); appInst.setActualTime(DateUtils.parseDateUTC("2009-09-10T23:59Z")); appInst.setNominalTime(DateUtils.parseDateUTC("2009-09-09T23:59Z")); appInst.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles")); appInst.setActionId("00000-oozie-C@1"); appInst.setName("mycoordinator-app"); CoordELFunctions.configureEvaluator(eval, ds, appInst); } private void createDir(String dir) { Process pr; try { pr = Runtime.getRuntime().exec("mkdir -p " + dir + "/_SUCCESS"); pr.waitFor(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } }