/**
   * Test that a work instance can report a failure
   *
   * @throws Throwable throwable exception
   */
  @Test
  public void testFailure() throws Throwable {
    Context context = new InitialContext();

    WorkConnectionFactory wcf =
        (WorkConnectionFactory) context.lookup("java:/eis/WorkConnectionFactory");

    assertNotNull(wcf);

    WorkConnection wc = wcf.getConnection();
    DistributedWorkManager dwm = null;
    try {
      assertNotNull(wc.getWorkManager());
      assertTrue(wc.getWorkManager() instanceof javax.resource.spi.work.DistributableWorkManager);

      dwm = (DistributedWorkManager) wc.getWorkManager();
      verifyConfig(dwm);
      dwm.getStatistics().clear();
      dwm.getDistributedStatistics().clear();

      wc.doWork(new MyDistributableFailureWork());

      fail("Expected WorkException");
    } catch (WorkException we) {
      assertTrue(we instanceof WorkCompletedException);

      WorkException wce = (WorkException) we;

      assertNotNull(wce.getCause());

      assertTrue(wce.getCause() instanceof RuntimeException);

      RuntimeException re = (RuntimeException) wce.getCause();

      assertEquals("FAILURE", re.getMessage());
    } finally {
      assertNotNull(dwm);
      assertNotNull(dwm.getDistributedStatistics());
      assertEquals(1, dwm.getDistributedStatistics().getWorkFailed());

      wc.close();
    }
  }
  /**
   * Test that a work instance can be executed
   *
   * @throws Throwable throwable exception
   */
  @Test
  public void testExecuted() throws Throwable {
    Context context = new InitialContext();

    WorkConnectionFactory wcf =
        (WorkConnectionFactory) context.lookup("java:/eis/WorkConnectionFactory");

    assertNotNull(wcf);

    WorkConnection wc = wcf.getConnection();
    try {
      assertNotNull(wc.getWorkManager());
      assertTrue(wc.getWorkManager() instanceof javax.resource.spi.work.DistributableWorkManager);

      DistributedWorkManager dwm = (DistributedWorkManager) wc.getWorkManager();
      verifyConfig(dwm);
      dwm.getStatistics().clear();
      dwm.getDistributedStatistics().clear();

      wc.doWork(new MyWork());
      wc.doWork(new MyDistributableWork());

      assertNotNull(dwm.getStatistics());
      assertNotNull(dwm.getDistributedStatistics());

      log.infof("Statistics: %s", dwm.getStatistics());
      log.infof("DistributedStatistics: %s", dwm.getDistributedStatistics());

      assertEquals(1, dwm.getStatistics().getWorkSuccessful());
      assertEquals(2, dwm.getDistributedStatistics().getWorkSuccessful());

      dwm.getStatistics().clear();
      assertEquals(0, dwm.getStatistics().getWorkSuccessful());

      dwm.getDistributedStatistics().clear();
      assertEquals(0, dwm.getDistributedStatistics().getWorkSuccessful());
    } finally {
      wc.close();
    }
  }
 /**
  * Test that the used distributed work managers are configured
  *
  * @param dwm the Distributed Work Manager
  * @throws Throwable throwable exception
  */
 public void verifyConfig(DistributedWorkManager dwm) throws Throwable {
   assertNotNull(dwm);
   assertNotNull(dwm.getPolicy());
   assertNotNull(dwm.getSelector());
   assertNotNull(dwm.getTransport());
 }