public void testSetInputValue_IncorrectType_Workflow() throws Exception {
    JavaActor actor = BadWorkflowProcessingBean.getConfiguredActor();
    actor.initialize();
    actor.setInputValue("workflow", "hello");

    Exception exception = null;
    try {
      actor.step();
    } catch (InputTypeException inputTypeException) {
      exception = inputTypeException;
    }
    assertEquals(
        "org.restflow.exceptions.InputTypeException: "
            + "Data of incorrect type received on input 'workflow' "
            + "of actor BadWorkflowProcessingActor",
        exception.toString());
    assertNotNull(exception.getCause());
    assertEquals(
        "java.lang.IllegalArgumentException: "
            + "Cannot invoke org.restflow.actors.TestJavaActor$BadWorkflowProcessingBean.setWorkflow on "
            + "bean class 'class org.restflow.actors.TestJavaActor$BadWorkflowProcessingBean' "
            + "- argument type mismatch - had objects of type \"java.lang.String\" "
            + "but expected signature \"org.restflow.actors.Workflow\"",
        exception.getCause().toString());
  }
  public void testConfigure_ExceptionConstructingBean() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");

    assertNull(actor.getWrappedBean());
    assertNull(actor.getWrappedBeanClass());

    actor.setBeanClassName("org.restflow.actors.TestJavaActor$MultiplyBean");
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();

    MultiplyBean.throwExceptionInConstructor = true;

    Exception exception = null;
    try {
      actor.configure();
    } catch (WorkflowRuntimeException e) {
      exception = e;
    }

    assertEquals(
        "org.restflow.exceptions.WorkflowRuntimeException: "
            + "Error instantiating instance of bean class "
            + "class org.restflow.actors.TestJavaActor$MultiplyBean "
            + "for actor MultiplyActor",
        exception.toString());
    assertNotNull(exception.getCause());
    assertEquals("java.lang.Exception: Exception in constructor", exception.getCause().toString());

    assertNull(actor.getWrappedBean());
  }
  public void testConfigure_NoBeanSet_NoClassNameSet() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();

    assertNull(actor.getWrappedBean());
    assertNull(actor.getWrappedBeanClass());

    Exception exception = null;
    try {
      actor.configure();
    } catch (ActorDeclarationException e) {
      exception = e;
    }

    assertEquals(
        "org.restflow.exceptions.ActorDeclarationException: "
            + "No bean class provided for actor MultiplyActor",
        exception.toString());
    assertNull(exception.getCause());
    assertNull(actor.getWrappedBean());
    assertNull(actor.getWrappedBeanClass());
  }
 public void testSetInputs() throws Exception {
   JavaActor actor = new JavaActor();
   actor.setName("MultiplyActor");
   actor.setWrappedBean(new MultiplyBean());
   Yaml yaml = new Yaml();
   actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
 }
 public void testStep_Success() throws Exception {
   JavaActor actor = MultiplyBean.getConfiguredActor();
   actor.initialize();
   actor.setInputValue("originalValue", 1);
   actor.step();
   assertEquals(2, actor.getOutputValue("multipliedValue"));
 }
  public void testStep_SetInputValue_NullValue_NotNullable() throws Exception {
    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    Yaml yaml = new Yaml();
    actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    Exception exception = null;
    try {
      actor.setInputValue("originalValue", null);
    } catch (NullInputException e) {
      exception = e;
    }
    assertNotNull(exception);
    assertEquals(
        "org.restflow.exceptions.NullInputException: "
            + "Null data received on non-nullable input 'originalValue' "
            + "of actor 'MultiplyActor'",
        exception.toString());
  }
  @SuppressWarnings("unused")
  public void setUp() throws Exception {

    super.setUp();

    _context = new WorkflowContextBuilder().build();

    _actor =
        new JavaActorBuilder()
            .name("TestActor")
            .context(_context)
            .bean(
                new Object() {
                  public boolean throwExceptionOnStep = false;
                  public boolean actorStepped = false;

                  public void step() throws RestFlowException {
                    actorStepped = true;
                    if (throwExceptionOnStep) {
                      throw new RestFlowException("Error stepping actor");
                    }
                  }
                })
            .build();

    _actor.elaborate();
    _actor.configure();
    _actor.initialize();
  }
  public void testWrapup_SetStatusException() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    bean.statusSet = false;
    bean.actorStatus = null;
    assertFalse(bean.wrappedUp);

    MultiplyBean.throwExceptionInStatusSetter = true;

    Exception exception = null;
    try {
      actor.wrapup();
    } catch (RestFlowException e) {
      exception = e;
    }
    assertNotNull(exception);
    assertEquals(
        "org.restflow.exceptions.WorkflowRuntimeException: "
            + "Exception in setStatus() method of actor MultiplyActor",
        exception.toString());
    assertNotNull(exception.getCause());
    assertEquals(
        "java.lang.Exception: Exception in status setter", exception.getCause().toString());
  }
 public static JavaActor getConfiguredActor() throws Exception {
   JavaActor actor = new JavaActor();
   actor.setName("MultiplyActor");
   actor.setWrappedBean(new MultiplyBean());
   Yaml yaml = new Yaml();
   actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
   actor.setOutputs((Map<String, Object>) yaml.load("multipliedValue:" + EOL));
   actor.setSettings((Map<String, Object>) yaml.load("factor: 2" + EOL));
   actor.setApplicationContext(new WorkflowContextBuilder().build());
   actor.afterPropertiesSet();
   actor.elaborate();
   actor.configure();
   return actor;
 }
  public void testConfigure_CustomWrapupMissing() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    actor.setWrapupMethod("customWrapupMissing");
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();

    Exception exception = null;
    try {
      actor.configure();
    } catch (ActorDeclarationException e) {
      exception = e;
    }
    assertNotNull(exception);
    assertEquals(
        "org.restflow.exceptions.ActorDeclarationException: "
            + "Error finding declared method customWrapupMissing "
            + "on bean class org.restflow.actors.TestJavaActor$MultiplyBean "
            + "for actor MultiplyActor",
        exception.toString());
    Throwable cause = exception.getCause();
    assertNotNull(cause);
    assertEquals(
        "java.lang.NoSuchMethodException: "
            + "org.restflow.actors.TestJavaActor$MultiplyBean.customWrapupMissing()",
        cause.toString());
  }
  public void testRun_NoException() throws Exception {

    Map<String, Object> variables = new HashMap<String, Object>();
    ActorRunner runner = new SynchronousActorRunner(_actor, variables);
    assertEquals(false, _actor.getFieldValue("actorStepped"));

    runner.run();
    assertEquals(true, _actor.getFieldValue("actorStepped"));
    assertSame(_actor, runner.getActor());
    assertSame(variables, runner.getVariables());

    Exception exception = runner.getException();
    assertNull(exception);
  }
 public void testStep_StepException() throws Exception {
   JavaActor actor = MultiplyBean.getConfiguredActor();
   MultiplyBean.throwExceptionInStep = true;
   actor.initialize();
   actor.setInputValue("originalValue", 1);
   Exception exception = null;
   try {
     actor.step();
   } catch (RestFlowException ex) {
     exception = ex;
   }
   assertEquals("Exception in step() method of actor 'MultiplyActor'", exception.getMessage());
   assertNotNull(exception.getCause());
   assertEquals("Exception in step", exception.getCause().getMessage());
 }
  public void testRun_WithException() throws Exception {

    _actor.setFieldValue("throwExceptionOnStep", true);
    Map<String, Object> variables = new HashMap<String, Object>();
    ActorRunner runner = new SynchronousActorRunner(_actor, variables);
    assertEquals(false, _actor.getFieldValue("actorStepped"));

    runner.run();
    assertEquals(true, _actor.getFieldValue("actorStepped"));
    assertSame(_actor, runner.getActor());
    assertSame(variables, runner.getVariables());

    Exception exception = runner.getException();
    assertNotNull(exception);
    assertEquals("Exception in step() method of actor 'TestActor'", exception.getMessage());
  }
  public void testConfigure_NoDefaultMethodsOnBean() throws Exception {

    JavaActor actor = new JavaActor();
    EmptyBean bean = new EmptyBean();
    actor.setWrappedBean(bean);
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();
    actor.step();
    actor.wrapup();
  }
  public void testConfigure_BeanClassNameSet() throws Exception {

    JavaActor actor = new JavaActor();

    actor.setBeanClassName("org.restflow.actors.TestJavaActor$MultiplyBean");
    assertNull(actor.getWrappedBean());
    assertNull(actor.getWrappedBeanClass());

    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    assertEquals(MultiplyBean.class, actor.getWrappedBeanClass());

    Object bean = actor.getWrappedBean();
    assertSame(MultiplyBean.class, bean.getClass());
  }
 public static JavaActor getConfiguredActor() throws Exception {
   JavaActor actor = new JavaActor();
   actor.setName("BadWorkflowProcessingActor");
   actor.setWrappedBean(new BadWorkflowProcessingBean());
   Yaml yaml = new Yaml();
   actor.setInputs((Map<String, Object>) yaml.load("workflow:" + EOL));
   actor.setApplicationContext(new WorkflowContextBuilder().build());
   actor.afterPropertiesSet();
   actor.elaborate();
   actor.configure();
   return actor;
 }
  public void testSetInputValue_SetterException() throws Exception {
    JavaActor actor = MultiplyBean.getConfiguredActor();
    MultiplyBean.throwExceptionInSetter = true;
    actor.initialize();

    actor.setInputValue("originalValue", 1);
    Exception exception = null;
    try {
      actor.step();
    } catch (WorkflowRuntimeException ex) {
      exception = ex;
    }
    assertEquals(
        "org.restflow.exceptions.WorkflowRuntimeException: "
            + "Exception calling setter for input 'originalValue' on actor MultiplyActor",
        exception.toString());
    assertNotNull(exception.getCause());
    assertEquals("java.lang.Exception: Exception in setter", exception.getCause().toString());
  }
  public void testWrapup() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    assertFalse(bean.wrappedUp);
    actor.wrapup();
    assertTrue(bean.wrappedUp);
  }
  public void testSetInputValue_IncorrectType() throws Exception {
    JavaActor actor = MultiplyBean.getConfiguredActor();
    actor.initialize();
    actor.setInputValue("originalValue", "hello");

    Exception exception = null;
    try {
      actor.step();
    } catch (InputTypeException ex) {
      exception = ex;
    }
    assertEquals(
        "org.restflow.exceptions.InputTypeException: "
            + "Data of incorrect type received on input 'originalValue' of actor MultiplyActor",
        exception.toString());
    assertNotNull(exception.getCause());
    assertMatchesRegexp(
        ".* - had objects of type \"java.lang.String\" "
            + "but expected signature \"java.lang.Integer\"",
        exception.getCause().toString());
  }
  public void testConfigure_CustomInitialize() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    actor.setInitializeMethod("customInitialize");
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();

    actor.configure();
    assertFalse(bean.initialized);

    actor.initialize();
    assertTrue(bean.initialized);
    assertTrue(bean.customInitialization);
  }
  public void testInitialize_CustomSetStatus() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    actor.setStatusSetter("customSetStatus");
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();

    actor.configure();
    assertNull(bean.actorStatus);
    assertFalse(bean.statusSet);

    actor.initialize();
    assertNotNull(bean.actorStatus);
    assertTrue(bean.statusSet);
    assertTrue(bean.customSetStatus);
  }
  public void testConfigure_ExceptionPrivateBeanConstructor() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");

    assertNull(actor.getWrappedBean());
    assertNull(actor.getWrappedBeanClass());

    actor.setBeanClassName("org.restflow.actors.TestJavaActor$BeanWithPrivateConstructor");
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();

    Exception exception = null;
    try {
      actor.configure();
    } catch (WorkflowRuntimeException e) {
      exception = e;
    }

    assertEquals(
        "org.restflow.exceptions.WorkflowRuntimeException: "
            + "Error instantiating instance of bean class "
            + "class org.restflow.actors.TestJavaActor$BeanWithPrivateConstructor "
            + "for actor MultiplyActor",
        exception.toString());
    assertNotNull(exception.getCause());
    assertEquals(
        "java.lang.IllegalAccessException: "
            + "Class org.restflow.actors.JavaActor can not access a member of class "
            + "org.restflow.actors.TestJavaActor$BeanWithPrivateConstructor "
            + "with modifiers \"private\"",
        exception.getCause().toString());

    assertNull(actor.getWrappedBean());
  }
  public void testConfigure_BothBeanAndClassNameSet() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    actor.setWrappedBean(new MultiplyBean());
    actor.setBeanClassName("org.restflow.actors.TestJavaActor$MultiplyBean");
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();

    Exception exception = null;
    try {
      actor.configure();
    } catch (ActorDeclarationException e) {
      exception = e;
    }
    assertNotNull(exception);
    assertEquals(
        "org.restflow.exceptions.ActorDeclarationException: "
            + "Actor MultiplyActor declared both a bean instance and a bean class.",
        exception.toString());
  }
 public void testStep_SetInputValue_NonNullValue() throws Exception {
   JavaActor actor = new JavaActor();
   actor.setName("MultiplyActor");
   MultiplyBean bean = new MultiplyBean();
   actor.setWrappedBean(bean);
   Yaml yaml = new Yaml();
   actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
   actor.setApplicationContext(_context);
   actor.afterPropertiesSet();
   actor.elaborate();
   actor.configure();
   actor.initialize();
   actor.setInputValue("originalValue", 72);
   actor.step();
   assertEquals(new Integer(72), bean.getOriginalValue());
 }
  public void testStep_SetAndUpdateStateVariablesWithNulls() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);

    Yaml yaml = new Yaml();
    actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
    actor.setOutputs((Map<String, Object>) yaml.load("multipliedValue:" + EOL));
    actor.setSettings((Map<String, Object>) yaml.load("factor: 3" + EOL));
    actor.setState((Map<String, Object>) yaml.load("accumulator: 0" + EOL + "count: 0" + EOL));
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    actor.setInputValue("originalValue", 4);
    assertEquals(0, bean.getAccumulator());
    assertEquals((Integer) 0, bean.getCount());
    MultiplyBean.setCountToNullInStep = true;
    actor.step();
    assertEquals(12, actor.getOutputValue("multipliedValue"));
    assertNull(bean.getCount());
    assertEquals(12, bean.getAccumulator());

    actor.setInputValue("originalValue", 6);
    bean.setCount(17);
    actor.step();
    assertEquals(18, actor.getOutputValue("multipliedValue"));
    assertNull(bean.getCount());
    assertEquals(30, bean.getAccumulator());
  }
  public void testClone_UncloneableBean() throws Exception {
    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    UncloneableMultiplyBean bean = new UncloneableMultiplyBean();
    actor.setWrappedBean(bean);
    Yaml yaml = new Yaml();
    actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
    actor.setOutputs((Map<String, Object>) yaml.load("multipliedValue:" + EOL));
    actor.setSettings((Map<String, Object>) yaml.load("factor: 4" + EOL));
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    JavaActor clone = (JavaActor) actor.clone();
    assertNotSame(bean, clone.getWrappedBean());

    clone.setInputValue("originalValue", 5);
    clone.step();
    assertEquals(20, clone.getOutputValue("multipliedValue"));
  }
  public void testStep_SetStatusException() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    Yaml yaml = new Yaml();
    actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    actor.setInputValue("originalValue", 4);
    assertEquals(0, bean.getAccumulator());
    assertEquals((Integer) 0, bean.getCount());
    bean.statusSet = false;
    bean.actorStatus = null;
    MultiplyBean.throwExceptionInStatusSetter = true;

    Exception exception = null;
    try {
      actor.step();
    } catch (RestFlowException e) {
      exception = e;
    }
    assertNotNull(exception);
    assertEquals(
        "org.restflow.exceptions.WorkflowRuntimeException: "
            + "Exception in setStatus() method of actor MultiplyActor",
        exception.toString());
    assertNotNull(exception.getCause());
    assertEquals(
        "java.lang.Exception: Exception in status setter", exception.getCause().toString());
  }
  public void testStep_SetStatus() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);
    Yaml yaml = new Yaml();
    actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    actor.setInputValue("originalValue", 4);
    assertEquals(0, bean.getAccumulator());
    assertEquals((Integer) 0, bean.getCount());
    bean.statusSet = false;
    bean.actorStatus = null;
    actor.step();
    assertNotNull(bean.actorStatus);
    assertTrue(bean.statusSet);
  }
  public void testSetInputValue_NewValueForSetting() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);

    Yaml yaml = new Yaml();
    actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
    actor.setOutputs((Map<String, Object>) yaml.load("multipliedValue:" + EOL));
    actor.setSettings((Map<String, Object>) yaml.load("factor: 3" + EOL));
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();
    actor.initialize();

    Exception exception = null;
    try {
      actor.setInputValue("factor", 4);
    } catch (Exception e) {
      exception = e;
    }
    assertNotNull(exception);
    assertEquals(
        "org.restflow.exceptions.RestFlowException: "
            + "Attempt to reassign value of setting 'factor' on actor MultiplyActor",
        exception.toString());
  }
  public void testInitialize_getUpdatedStateVariables() throws Exception {

    JavaActor actor = new JavaActor();
    actor.setName("MultiplyActor");
    MultiplyBean bean = new MultiplyBean();
    actor.setWrappedBean(bean);

    Yaml yaml = new Yaml();
    actor.setInputs((Map<String, Object>) yaml.load("originalValue:" + EOL));
    actor.setOutputs((Map<String, Object>) yaml.load("multipliedValue:" + EOL));
    actor.setSettings((Map<String, Object>) yaml.load("factor: 3" + EOL));
    actor.setState((Map<String, Object>) yaml.load("accumulator: -1" + EOL + "count: 5" + EOL));
    actor.setApplicationContext(_context);
    actor.afterPropertiesSet();
    actor.elaborate();
    actor.configure();

    MultiplyBean.clearAccumulatorInInitialize = true;

    actor.initialize();
    assertEquals(0, bean.getAccumulator());
    assertEquals(new Integer(5), bean.getCount());
  }