@Override
 protected void tearDown() throws Exception {
   super.tearDown();
   fEventProvider.dispose();
   fSyntheticEventProvider.dispose();
 }
  @SuppressWarnings("unchecked")
  public void testCancelRequests() {

    final int BLOCK_SIZE = 100;
    final int NB_EVENTS = 1000;
    final int NUMBER_EVENTS_BEFORE_CANCEL_REQ1 = 10;
    final int NUMBER_EVENTS_BEFORE_CANCEL_REQ2 = 800;

    final Vector<TmfEvent> requestedEventsReq1 = new Vector<TmfEvent>();
    final Vector<TmfEvent> requestedEventsReq2 = new Vector<TmfEvent>();

    // Get the TmfSyntheticEventStub provider
    ITmfDataProvider<TmfEvent>[] eventProviders =
        (ITmfDataProvider<TmfEvent>[])
            TmfProviderManager.getProviders(TmfEvent.class, TmfEventProviderStub.class);
    ITmfDataProvider<TmfEvent> provider = eventProviders[0];

    TmfTimeRange range = new TmfTimeRange(TmfTimestamp.BigBang, TmfTimestamp.BigCrunch);

    // Create first request
    final TmfEventRequest<TmfEvent> request1 =
        new TmfEventRequest<TmfEvent>(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) {
          @Override
          public void handleData(TmfEvent event) {
            super.handleData(event);
            requestedEventsReq1.add(event);

            // cancel sub request
            if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ1) {
              cancel();
            }
          }
        };

    // Synchronize requests
    ((TmfEventProviderStub) provider).startSynch(new TmfStartSynchSignal(0));

    // Additionally, notify provider for up-coming requests
    provider.notifyPendingRequest(true);

    // Call sendRequest, which will create a coalescing request, but it doesn't send request1 yet
    provider.sendRequest(request1);

    // Check if request1 is not running yet.
    assertFalse("isRunning", request1.isRunning());

    // Create second request
    final TmfEventRequest<TmfEvent> request2 =
        new TmfEventRequest<TmfEvent>(TmfEvent.class, range, NB_EVENTS, BLOCK_SIZE) {
          @Override
          public void handleData(TmfEvent event) {
            super.handleData(event);
            requestedEventsReq2.add(event);

            // cancel sub request which will cancel also main request
            if (getNbRead() == NUMBER_EVENTS_BEFORE_CANCEL_REQ2) {
              cancel();
            }
          }
        };

    // Call sendRequest, which will create a coalescing request, but it doesn't send request2 yet
    provider.sendRequest(request2);

    // Check if request1/2 is not running yet.
    assertFalse("isRunning", request1.isRunning());
    assertFalse("isRunning", request2.isRunning());

    // Send end synch signal, however requests won't be sent
    ((TmfEventProviderStub) provider).endSynch(new TmfEndSynchSignal(0));

    // Check if request1/2 is not running yet.
    assertFalse("isRunning", request1.isRunning());
    assertFalse("isRunning", request2.isRunning());

    // Finally, trigger sending of requests
    provider.notifyPendingRequest(false);

    try {

      // Wait till requests start
      request1.waitForStart();
      request2.waitForStart();

      // Check if request1/2 are running.
      assertTrue("isRunning", request1.isRunning());
      assertTrue("isRunning", request2.isRunning());

      request1.waitForCompletion();

      // Check if request2 is still running
      assertTrue("isRunning", request2.isRunning());

      // Verify result (request1)
      assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ1, requestedEventsReq1.size());
      assertTrue("isCompleted", request1.isCompleted());
      assertTrue("isCancelled", request1.isCancelled());

      request2.waitForCompletion();

      // Verify result (request2)
      assertEquals("nbEvents", NUMBER_EVENTS_BEFORE_CANCEL_REQ2, requestedEventsReq2.size());
      assertTrue("isCompleted", request2.isCompleted());
      assertTrue("isCancelled", request2.isCancelled());

    } catch (InterruptedException e) {
      fail();
    }
  }