@Test
public void testVerifyAndCreateRemoteDirsFailure()
    throws Exception {

  this.conf.set(YarnConfiguration.NM_LOG_DIRS, localLogDir.getAbsolutePath());
  this.conf.set(YarnConfiguration.NM_REMOTE_APP_LOG_DIR,
      this.remoteRootLogDir.getAbsolutePath());
  LogAggregationFileControllerFactory factory
      = new LogAggregationFileControllerFactory(conf);
  LogAggregationFileController logAggregationFileFormat = factory
      .getFileControllerForWrite();
  LogAggregationFileController spyLogAggregationFileFormat =
      spy(logAggregationFileFormat);
  YarnRuntimeException e = new YarnRuntimeException("KABOOM!");
  doThrow(e).doNothing().when(spyLogAggregationFileFormat)
      .verifyAndCreateRemoteLogDir();
  LogAggregationService logAggregationService = spy(
      new LogAggregationService(dispatcher, this.context, this.delSrvc,
          super.dirsHandler) {
      @Override
      public LogAggregationFileController getLogAggregationFileController(
          Configuration conf) {
        return spyLogAggregationFileFormat;
      }
    });
  logAggregationService.init(this.conf);
  logAggregationService.start();
  // Now try to start an application
  ApplicationId appId =
      BuilderUtils.newApplicationId(System.currentTimeMillis(),
        (int) (Math.random() * 1000));
  LogAggregationContext contextWithAMAndFailed =
      Records.newRecord(LogAggregationContext.class);
  contextWithAMAndFailed.setLogAggregationPolicyClassName(
      AMOrFailedContainerLogAggregationPolicy.class.getName());
  logAggregationService.handle(new LogHandlerAppStartedEvent(appId,
      this.user, null, this.acls, contextWithAMAndFailed));
  dispatcher.await();
  
  // Verify that it failed
  ApplicationEvent[] expectedEvents = new ApplicationEvent[] {
      new ApplicationEvent(appId, 
          ApplicationEventType.APPLICATION_LOG_HANDLING_FAILED)
  };
  checkEvents(appEventHandler, expectedEvents, false,
      "getType", "getApplicationID", "getDiagnostic");
  Mockito.reset(logAggregationService);
  
  // Now try to start another one
  ApplicationId appId2 =
      BuilderUtils.newApplicationId(System.currentTimeMillis(),
        (int) (Math.random() * 1000));
  File appLogDir =
      new File(localLogDir, appId2.toString());
  appLogDir.mkdir();
  logAggregationService.handle(new LogHandlerAppStartedEvent(appId2,
      this.user, null, this.acls, contextWithAMAndFailed));
  dispatcher.await();
  
  // Verify that it worked
  expectedEvents = new ApplicationEvent[] {
      new ApplicationEvent(appId, // original failure
          ApplicationEventType.APPLICATION_LOG_HANDLING_FAILED), 
      new ApplicationEvent(appId2, // success
          ApplicationEventType.APPLICATION_LOG_HANDLING_INITED)
  };
  checkEvents(appEventHandler, expectedEvents, false,
      "getType", "getApplicationID", "getDiagnostic");
  
  logAggregationService.stop();
}