public void testLatest() throws Exception {
    init("coord-action-start");
    String expr = "${coord:latest(0)}";
    Configuration conf = new Configuration();

    // TODO:Set hadoop properties
    eval.setVariable(CoordELFunctions.CONFIGURATION, conf);
    getTestCaseDir();
    ds.setUriTemplate(getTestCaseFileUri("${YEAR}/${MONTH}/${DAY}"));
    createTestCaseSubDir("2009/09/10/_SUCCESS".split("/"));
    // TODO: Create the directories
    assertEquals("2009-09-10T23:59Z", CoordELFunctions.evalAndWrap(eval, expr));
    createTestCaseSubDir("2009/09/09/_SUCCESS".split("/"));
    expr = "${coord:latest(-1)}";
    assertEquals("2009-09-09T23:59Z", CoordELFunctions.evalAndWrap(eval, expr));
    createTestCaseSubDir("2009/09/08/_SUCCESS".split("/"));
    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 testAbsoluteRange() throws Exception {
   init("coord-action-create");
   ds = new SyncCoordDataset();
   ds.setFrequency(7);
   ds.setInitInstance(DateUtils.parseDateOozieTZ("2009-08-20T01:00Z"));
   ds.setTimeUnit(TimeUnit.DAY);
   ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles"));
   ds.setName("test");
   ds.setUriTemplate("hdfs:///tmp/workflows/${YEAR}/${MONTH}/${DAY};region=us");
   ds.setType("SYNC");
   ds.setDoneFlag("");
   appInst.setNominalTime(DateUtils.parseDateOozieTZ("2009-08-20T01:00Z"));
   CoordELFunctions.configureEvaluator(eval, ds, appInst);
   String expr = "${coord:absoluteRange(\"2009-08-20T01:00Z\",\"0\")}";
   assertEquals(CoordELFunctions.evalAndWrap(eval, expr), "2009-08-20T01:00Z");
   expr = "${coord:absoluteRange(\"2009-08-20T01:00Z\",\"1\")}";
   assertEquals(CoordELFunctions.evalAndWrap(eval, expr), "2009-08-27T01:00Z#2009-08-20T01:00Z");
   try {
     expr = "${coord:absoluteRange(\"2009-08-20T01:00Z\",\"-1\")}";
     CoordELFunctions.evalAndWrap(eval, expr);
     fail("start-instance is greater than the end-instance and there was no exception");
   } catch (Exception e) {
     assertTrue(
         e.getCause()
             .getMessage()
             .contains("start-instance should be equal or earlier than the end-instance"));
   }
 }
  public void testFuture() throws Exception {
    init("coord-job-submit-instances");
    String expr = "${coord:future(1, 20)}";

    init("coord-action-start");
    Configuration conf = new Configuration();

    // TODO:Set hadoop properties
    eval.setVariable(CoordELFunctions.CONFIGURATION, conf);
    getTestCaseDir();
    ds.setUriTemplate(getTestCaseFileUri("/${YEAR}/${MONTH}/${DAY}"));
    createTestCaseSubDir("2009/09/10/_SUCCESS".split("/"));
    createTestCaseSubDir("2009/09/11/_SUCCESS".split("/"));
    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 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 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 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 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));

    expr = "${coord:dateOffset(\"2009-09-08T23:59Z\", 1, \"YEAR\")}";
    assertEquals("2010-09-08T23: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 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 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 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("UTC"));
    ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2012-06-13T00:00Z")); // Summer
    CoordELFunctions.configureEvaluator(eval, ds, appInst);
    // PDT is UTC - 7
    assertEquals("-420", CoordELFunctions.evalAndWrap(eval, expr));

    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2012-12-13T00:00Z")); // Winter
    CoordELFunctions.configureEvaluator(eval, ds, appInst);
    // PST is UTC - 8
    assertEquals("-480", 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 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"));
  }
Beispiel #14
0
 /**
  * Resolve an attribute value.
  *
  * @param attrName : Attribute name.
  * @param elem : XML Element where attribute is defiend
  * @param eval : ELEvaluator used to resolve
  * @return Resolved attribute value
  * @throws CoordinatorJobException thrown if failed to resolve an attribute value
  */
 private String resolveAttribute(String attrName, Element elem, ELEvaluator eval)
     throws CoordinatorJobException {
   Attribute attr = elem.getAttribute(attrName);
   String val = null;
   if (attr != null) {
     try {
       val = CoordELFunctions.evalAndWrap(eval, attr.getValue().trim());
     } catch (Exception e) {
       throw new CoordinatorJobException(ErrorCode.E1004, e.getMessage(), e);
     }
     attr.setValue(val);
   }
   return val;
 }
  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) {
    }
  }
 private void init(String tag, String uriTemplate) 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.parseDateOozieTZ("2009-09-01T23:59Z"));
   ds.setTimeUnit(TimeUnit.DAY);
   ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles"));
   ds.setName("test");
   ds.setUriTemplate(uriTemplate);
   ds.setType("SYNC");
   ds.setDoneFlag("");
   appInst.setActualTime(DateUtils.parseDateOozieTZ("2009-09-10T23:59Z"));
   appInst.setNominalTime(DateUtils.parseDateOozieTZ("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);
 }
  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));
  }
Beispiel #18
0
  /**
   * Resolve the content of a tag.
   *
   * @param tagName : Tag name of job XML i.e. <timeout> 10 </timeout>
   * @param elem : Element where the tag exists.
   * @param eval : EL evealuator
   * @return Resolved tag content.
   * @throws CoordinatorJobException thrown if failed to resolve tag content
   */
  @SuppressWarnings("unchecked")
  private String resolveTagContents(String tagName, Element elem, ELEvaluator eval)
      throws CoordinatorJobException {
    String ret = "";
    if (elem != null) {
      for (Element tagElem : (List<Element>) elem.getChildren(tagName, elem.getNamespace())) {
        if (tagElem != null) {
          String updated;
          try {
            updated = CoordELFunctions.evalAndWrap(eval, tagElem.getText().trim());

          } catch (Exception e) {
            throw new CoordinatorJobException(ErrorCode.E1004, e.getMessage(), e);
          }
          tagElem.removeContent();
          tagElem.addContent(updated);
          ret += updated;
        }
      }
    }
    return ret;
  }
 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 testPh1Future() throws Exception {
   init("coord-job-submit-instances");
   String expr = "${coord:future(1, 10)}";
   assertEquals(expr, CoordELFunctions.evalAndWrap(eval, expr));
 }
  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.parseDateOozieTZ("2009-01-02T00:00Z"));
    ds.setTimeZone(DateUtils.getTimeZone("UTC"));
    ds.setName("test1");
    ds.setType("SYNC");

    appInst.setActualTime(DateUtils.parseDateOozieTZ("2009-09-10T23:59Z"));
    appInst.setTimeZone(DateUtils.getTimeZone("UTC"));

    ds.setInitInstance(DateUtils.parseDateOozieTZ("2009-01-01T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2009-01-01T08:00Z"));
    appInst.setActualTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-03-08T08:00Z"));
    appInst.setActualTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-03-08T08:00Z"));
    appInst.setActualTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-11-01T08:00Z"));
    appInst.setActualTime(DateUtils.parseDateOozieTZ("2010-10-01T00:00Z"));
    CoordELFunctions.configureEvaluator(eval, ds, appInst);
    expr = "${coord:hoursInDay(0)}";
    assertEquals("25", CoordELFunctions.evalAndWrap(eval, expr));

    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2009-03-08T08:00Z"));
    appInst.setActualTime(DateUtils.parseDateOozieTZ("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 testConf() throws Exception {
   init("coord-job-submit-freq");
   eval.setVariable("my.test.variable", "test");
   String expr = "${coord:conf('my.test.variable')}";
   assertEquals("test", 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 testActionId() throws Exception {
   init("coord-action-start");
   String expr = "${coord:actionId()}";
   assertEquals("00000-oozie-C@1", 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.parseDateOozieTZ("2009-01-02T00:00Z"));
    ds.setTimeZone(DateUtils.getTimeZone("UTC"));
    ds.setName("test1");
    ds.setType("SYNC");

    appInst.setActualTime(DateUtils.parseDateOozieTZ("2009-09-10T23:59Z"));
    appInst.setTimeZone(DateUtils.getTimeZone("UTC"));

    ds.setInitInstance(DateUtils.parseDateOozieTZ("2009-01-01T00:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2009-02-01T11:00Z"));
    appInst.setActualTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-02-01T11:00Z")); // Feb
    appInst.setActualTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-02T00:00Z"));
    ds.setTimeZone(DateUtils.getTimeZone("UTC"));
    ds.setName("test1");
    ds.setType("SYNC");

    appInst.setActualTime(DateUtils.parseDateOozieTZ("2009-09-10T23:59Z"));
    appInst.setTimeZone(DateUtils.getTimeZone("UTC"));
    // Case 1
    ds.setInitInstance(DateUtils.parseDateOozieTZ("2009-01-01T00:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2009-02-01T11:00Z"));
    appInst.setActualTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-02-01T11:00Z")); // Feb
    appInst.setActualTime(DateUtils.parseDateOozieTZ("2010-10-01T00:00Z"));
    CoordELFunctions.configureEvaluator(eval, ds, appInst);
    expr = "${coord:daysInMonth(0)}";
    assertEquals("28", CoordELFunctions.evalAndWrap(eval, expr)); // Jan
    // 31
  }
  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.parseDateOozieTZ("2009-05-30T00:45Z"));
    ds.setFrequency(1);
    ds.setTimeUnit(TimeUnit.DAY);
    ds.setInitInstance(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-05-30T00:45Z"));
    ds.setFrequency(30);
    ds.setTimeUnit(TimeUnit.MINUTE);
    ds.setInitInstance(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-02T00:00Z"));
    ds.setTimeZone(DateUtils.getTimeZone("UTC"));
    ds.setName("test1");
    ds.setType("SYNC");

    appInst.setActualTime(DateUtils.parseDateOozieTZ("2009-09-10T23:59Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("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.parseDateOozieTZ("2009-03-08T10:45Z"));
    ds.setFrequency(1);
    ds.setTimeUnit(TimeUnit.DAY);
    ds.setInitInstance(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-11-01T08:00Z"));

    ds.setFrequency(1);
    ds.setTimeUnit(TimeUnit.DAY);
    ds.setInitInstance(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-02T09:00Z"));
    ds.setTimeZone(DateUtils.getTimeZone("UTC"));
    ds.setName("test1");
    ds.setType("SYNC");
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-01T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-01T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-01T07:01Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-01T7:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-03-07T07:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-03-08T07:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-03-09T07:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-03-09T07:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-01T00:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-01T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-31T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-01-01T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-02-02T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-02-01T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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.parseDateOozieTZ("2009-02-01T08:00Z"));
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("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 testOffset() throws Exception {
    init("coord-action-create");
    String expr = "${coord:offset(-1440, \"MINUTE\")}";
    assertEquals("2009-09-08T23:59Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(-24, \"HOUR\")}";
    assertEquals("2009-09-08T23:59Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(-1, \"DAY\")}";
    assertEquals("2009-09-08T23:59Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(1, \"MONTH\")}";
    assertEquals("2009-10-09T23:59Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(1, \"YEAR\")}";
    assertEquals("2010-09-09T23:59Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(-10, \"DAY\")}";
    assertEquals("", CoordELFunctions.evalAndWrap(eval, expr));

    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2015-01-02T00:45Z"));
    ds.setFrequency(1);
    ds.setTimeUnit(TimeUnit.YEAR);
    ds.setInitInstance(DateUtils.parseDateOozieTZ("2010-01-02T00:01Z"));
    ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles"));
    // Year
    expr =
        "${coord:offset(0, \"YEAR\")} ${coord:offset(1, \"YEAR\")} ${coord:offset(-1, \"YEAR\")}"
            + " ${coord:offset(-3, \"YEAR\")}";
    assertEquals(
        "2015-01-02T00:01Z 2016-01-02T00:01Z 2014-01-02T00:01Z 2012-01-02T00:01Z",
        eval.evaluate(expr, String.class));
    // Month
    expr =
        "${coord:offset(0, \"MONTH\")} ${coord:offset(12, \"MONTH\")} ${coord:offset(-12, \"MONTH\")}"
            + " ${coord:offset(-36, \"MONTH\")}";
    assertEquals(
        "2015-01-02T00:01Z 2016-01-02T00:01Z 2014-01-02T00:01Z 2012-01-02T00:01Z",
        eval.evaluate(expr, String.class));
    // Day
    // its -1096 instead of -1095 because of DST (extra 1 day)
    expr =
        "${coord:offset(0, \"DAY\")} ${coord:offset(365, \"DAY\")} ${coord:offset(-365, \"DAY\")}"
            + " ${coord:offset(-1096, \"DAY\")}";
    assertEquals(
        "2015-01-02T00:01Z 2016-01-02T00:01Z 2014-01-02T00:01Z 2012-01-02T00:01Z",
        eval.evaluate(expr, String.class));
    // Hour
    // its -26304 instead of -26280 because of DST (extra 24 hours)
    expr =
        "${coord:offset(0, \"HOUR\")} ${coord:offset(8760, \"HOUR\")} ${coord:offset(-8760, \"HOUR\")}"
            + " ${coord:offset(-26304, \"HOUR\")}";

    assertEquals(
        "2015-01-02T00:01Z 2016-01-02T00:01Z 2014-01-02T00:01Z 2012-01-02T00:01Z",
        eval.evaluate(expr, String.class));
    // Minute
    // its -1578240 instead of -1576800 because of DST (extra 1440 minutes)
    expr =
        "${coord:offset(0, \"MINUTE\")} ${coord:offset(525600, \"MINUTE\")} ${coord:offset(-525600, \"MINUTE\")}"
            + " ${coord:offset(-1578240, \"MINUTE\")}";
    assertEquals(
        "2015-01-02T00:01Z 2016-01-02T00:01Z 2014-01-02T00:01Z 2012-01-02T00:01Z",
        eval.evaluate(expr, String.class));

    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2015-01-02T00:45Z"));
    ds.setFrequency(1);
    ds.setTimeUnit(TimeUnit.MINUTE);
    ds.setInitInstance(DateUtils.parseDateOozieTZ("2010-01-02T00:01Z"));
    ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles"));
    // Minute
    expr =
        "${coord:offset(0, \"MINUTE\")} ${coord:offset(1, \"MINUTE\")} ${coord:offset(-1, \"MINUTE\")}"
            + " ${coord:offset(-3, \"MINUTE\")}";
    assertEquals(
        "2015-01-02T00:45Z 2015-01-02T00:46Z 2015-01-02T00:44Z 2015-01-02T00:42Z",
        eval.evaluate(expr, String.class));
    // Hour
    expr =
        "${coord:offset(0, \"HOUR\")} ${coord:offset(1, \"HOUR\")} ${coord:offset(-1, \"HOUR\")}"
            + " ${coord:offset(-3, \"HOUR\")}";
    assertEquals(
        "2015-01-02T00:45Z 2015-01-02T01:45Z 2015-01-01T23:45Z 2015-01-01T21:45Z",
        eval.evaluate(expr, String.class));
    // Day
    expr =
        "${coord:offset(0, \"DAY\")} ${coord:offset(1, \"DAY\")} ${coord:offset(-1, \"DAY\")}"
            + " ${coord:offset(-3, \"DAY\")}";
    assertEquals(
        "2015-01-02T00:45Z 2015-01-03T00:45Z 2015-01-01T00:45Z 2014-12-30T00:45Z",
        eval.evaluate(expr, String.class));
    // Month
    expr =
        "${coord:offset(0, \"MONTH\")} ${coord:offset(1, \"MONTH\")} ${coord:offset(-1, \"MONTH\")}"
            + " ${coord:offset(-3, \"MONTH\")}";
    assertEquals(
        "2015-01-02T00:45Z 2015-02-02T00:45Z 2014-12-02T00:45Z 2014-10-01T23:45Z",
        eval.evaluate(expr, String.class));
    // Year
    expr =
        "${coord:offset(0, \"YEAR\")} ${coord:offset(1, \"YEAR\")} ${coord:offset(-1, \"YEAR\")}"
            + " ${coord:offset(-3, \"YEAR\")}";
    assertEquals(
        "2015-01-02T00:45Z 2016-01-02T00:45Z 2014-01-02T00:45Z 2012-01-02T00:45Z",
        eval.evaluate(expr, String.class));

    // Test rewinding when the given offset isn't a multiple of the
    // frequency
    appInst.setNominalTime(DateUtils.parseDateOozieTZ("2015-01-02T00:45Z"));
    ds.setFrequency(4);
    ds.setTimeUnit(TimeUnit.HOUR);
    ds.setInitInstance(DateUtils.parseDateOozieTZ("2010-01-02T00:01Z"));
    ds.setTimeZone(DateUtils.getTimeZone("America/Los_Angeles"));
    expr = "${coord:offset(5, \"MINUTE\")}";
    assertEquals("2015-01-02T00:01Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(1, \"HOUR\")}";
    assertEquals("2015-01-02T00:01Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(7, \"HOUR\")}";
    assertEquals("2015-01-02T04:01Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(-2, \"HOUR\")}";
    assertEquals("2015-01-01T20:01Z", CoordELFunctions.evalAndWrap(eval, expr));
    expr = "${coord:offset(-43825, \"HOUR\")}";
    assertEquals("", CoordELFunctions.evalAndWrap(eval, expr));

    // "blah" is not a valid TimeUnit
    expr = "${coord:offset(1, \"blah\")}";
    try {
      CoordELFunctions.evalAndWrap(eval, expr);
      fail("eval of " + expr + " should have thrown an exception");
    } catch (Exception e) {
      assertTrue(e.getMessage().contains("Unable to evaluate"));
    }

    // 4.5 is not a valid integer
    expr = "${coord:offset(4.5, \"blah\")}";
    try {
      CoordELFunctions.evalAndWrap(eval, expr);
      fail("eval of " + expr + " should have thrown an exception");
    } catch (Exception e) {
      assertTrue(e.getMessage().contains("Unable to evaluate"));
    }
  }
 public void testTzOffsetPh1() throws Exception {
   init("coord-job-submit-instances");
   String expr = "${coord:current(-coord:tzOffset())}";
   assertEquals("${coord:current(-3)}", CoordELFunctions.evalAndWrap(eval, expr));
 }