/**
   * Test the guarantee creation (startGuarantee), refresh (refreshGuarantee) and stop
   * (stopGuarantee)
   */
  @Test
  public void testLifeCycle() {
    log.warn("=============================================================");
    log.warn("Test Life Cycle");
    log.warn("=============================================================");
    AA88ClientAPI api = TestAPIBase.getClientApi(AA88ClientAPI.class);

    // Use a type that encapsulates all the tests
    AA88LifeCycleServicesTestHelper testHelp =
        new AA88LifeCycleServicesTestHelper(api, STORAGE_SERVICES);
    AA88Guarantee guarantee =
        testHelp.testLifeCycle(
            TEST_FILELIST_FOLDER_PATH,
            FileName.of("test2.txt"),
            Arrays.asList(
                AA88MethodToBeTested.START,
                AA88MethodToBeTested.REFRESH,
                AA88MethodToBeTested.STOP));
    // store the tested guarantee oid just to remove it at the end
    _testedGuaranteesOids.add(guarantee.getOid());
  }
  //	@Test
  public void testRefresh() {
    log.warn("=============================================================");
    log.warn("Test Refresh");
    log.warn("=============================================================");

    AA88ClientAPI api = TestAPIBase.getClientApi(AA88ClientAPI.class);

    // Use a type that encapsulates all the tests
    final AA88LifeCycleServicesTestHelper testHelp =
        new AA88LifeCycleServicesTestHelper(api, STORAGE_SERVICES);

    // [1] - Create guarantees
    File testFileListsContainerFolder = new File(TEST_FILELIST_FOLDER_PATH.asAbsoluteString());
    File[] testFileLists = testFileListsContainerFolder.listFiles();

    Observable.from(testFileLists)
        .map(
            new Func1<File, AA88Guarantee>() {
              @Override
              public AA88Guarantee call(final File fileList) {
                log.warn("\n\n\n");
                log.warn(
                    "CREATE & DO A FIRST REFRESH for MOCK guarantee using fileList at {}",
                    Paths.forPaths()
                        .join(TEST_FILELIST_FOLDER_PATH, fileList.getName())
                        .asAbsoluteString());

                AA88Guarantee guarantee =
                    testHelp.testLifeCycle(
                        TEST_FILELIST_FOLDER_PATH,
                        FileName.of(fileList.getName()),
                        Arrays.asList(AA88MethodToBeTested.START, AA88MethodToBeTested.REFRESH));
                log.warn(
                    "MOCK guarantee with oid={} CREATED & REFRESHED FOR THE FIRST TIME for fileList at {}",
                    guarantee.getOid(),
                    Paths.forPaths()
                        .join(TEST_FILELIST_FOLDER_PATH, fileList.getName())
                        .asAbsoluteString());
                log.warn("\n\n\n");
                return guarantee;
              }
            })
        .subscribe(
            new Observer<AA88Guarantee>() {
              @Override
              public void onNext(final AA88Guarantee guarantee) {
                _testedGuaranteesOids.add(guarantee.getOid());
              }

              @Override
              public void onCompleted() {
                log.warn("\n\n\n\n\n\n");
                log.warn(
                    ":::::::: {} test guarantees with oids={} created__________________________",
                    _testedGuaranteesOids.size(),
                    _testedGuaranteesOids);
              }

              @Override
              public void onError(final Throwable th) {
                // BEWARE!!! RxJava will catch Exception and most Error.
                //			 Exceptions cannot be propagated out of RxJava
                //			 ... so even if Throwables.propagate(th) is used, the exception is NEVER thrown
                // outside RxJava
                //		 	 the only option is to use Exceptions.throwIfFatal(th)
                //			 (see https://github.com/ReactiveX/RxJava/issues/969)
                // Exceptions.throwIfFatal(th);
                th.printStackTrace(System.out);
              }
            });

    // [2] - With the created guarantees, call refresh guarantee
    if (CollectionUtils.hasData(_testedGuaranteesOids)) {
      log.warn(
          ":::::::: With the created guarantees --> Refesh all Actives Guarantees _____________________________________________________________________");

      // Call refresh all active guarantees and wait a moment to the scheduler to start
      api.guaranteesAPI()
          .getForLifeCycle()
          .refreshAllActiveGuarantees(AA88SourceSystemID.forId("PLATEA-Internet"));
      Threads.safeSleep(TimeLapse.createFor("5s"));

      // Check the process
      final Collection<BeingRefreshedGuarantee> refreshPendingGuarantees =
          FluentIterable.from(_testedGuaranteesOids)
              .transform(
                  new Function<AA88GuaranteeOID, BeingRefreshedGuarantee>() {
                    @Override
                    public BeingRefreshedGuarantee apply(final AA88GuaranteeOID oid) {
                      return new BeingRefreshedGuarantee(oid);
                    }
                  })
              .toList();
      long startTS = System.currentTimeMillis();
      long elapsedMilis = 0;
      boolean anyRefreshPendingGuarantee = false;
      do {
        for (BeingRefreshedGuarantee b : refreshPendingGuarantees) {
          if (b.isRefreshed()) continue;

          // Check that there's NO minor version in requested status
          AA88Guarantee mockGuarantee = api.guaranteesAPI().getForCRUD().load(b.getOid());
          if (mockGuarantee.existsMinorVersionInRequestedStatus()) {
            log.warn(
                "...the guarantee with oid={} unitId={} is still being refreshed (the notary is working)...give a moment to the notary to do it's work...",
                mockGuarantee.getOid(),
                mockGuarantee.getGuaranteedUnitId());
          } else {
            log.warn(
                "The guarantee with oid={} unitId={} has been refreshed!... stop guaranteeing it",
                mockGuarantee.getOid(),
                mockGuarantee.getGuaranteedUnitId());
            b.setRefreshed(true);
          }
        }
        anyRefreshPendingGuarantee = _anyRefreshPendingGuarantee(refreshPendingGuarantees);
        if (anyRefreshPendingGuarantee) {
          elapsedMilis = System.currentTimeMillis() - startTS;
          Threads.safeSleep(TimeLapse.createFor("5s"));
        }
        Assert.assertTrue(
            elapsedMilis
                < AA88LifeCycleServicesTestHelper.MAX_REFRESH_TIME_PER_GUARANTEE
                    * _testedGuaranteesOids.size());
      } while (anyRefreshPendingGuarantee);

      // Stop guaranteeing
      for (AA88GuaranteeOID oid : _testedGuaranteesOids) {
        log.warn("Stop guaranteein guarantee with oid={}", oid);
        api.guaranteesAPI().getForLifeCycle().stopGuaranteeingNow(oid);
      }

      // Check that all guarantees has been stoped
      for (AA88GuaranteeOID oid : _testedGuaranteesOids) {
        AA88Guarantee mockGuarantee = api.guaranteesAPI().getForCRUD().load(oid);
        Assert.assertTrue(!mockGuarantee.isActive());
      }
    } else {
      log.warn("Could NOT create any mock guarantee!!!");
    }
  }