@Test
public void testCancelWithLocalizedResource() throws YarnException {

  // Configure policy to be 100% headroom based
  getPolicyInfo().setHeadroomAlpha(1.0f);
  initializePolicy();
  List<ResourceRequest> resourceRequests = new ArrayList<>();
  // Initialize the headroom map
  prepPolicyWithHeadroom(true);
  // Cancel at ANY level only
  resourceRequests.add(FederationPoliciesTestUtil.createResourceRequest(0L,
      "subcluster0-rack0-host0", 1024, 1, 1, 1, null, false));
  resourceRequests.add(FederationPoliciesTestUtil.createResourceRequest(0L,
      "subcluster0-rack0", 1024, 1, 1, 1, null, false));
  resourceRequests.add(FederationPoliciesTestUtil.createResourceRequest(0L,
      ResourceRequest.ANY, 1024, 1, 1, 0, null, false));
  Map<SubClusterId, List<ResourceRequest>> response =
      ((FederationAMRMProxyPolicy) getPolicy()).splitResourceRequests(
          resourceRequests, new HashSet<SubClusterId>());
  checkExpectedAllocation(response, "subcluster0", 3, 1);
  checkExpectedAllocation(response, "subcluster1", 1, 0);
  checkExpectedAllocation(response, "subcluster2", 1, 0);
  checkExpectedAllocation(response, "subcluster3", -1, -1);
  checkExpectedAllocation(response, "subcluster4", -1, -1);
  checkExpectedAllocation(response, "subcluster5", -1, -1);
  resourceRequests.clear();
  // Cancel at node level only
  resourceRequests.add(FederationPoliciesTestUtil.createResourceRequest(0L,
      "subcluster0-rack0-host0", 1024, 1, 1, 0, null, false));
  resourceRequests.add(FederationPoliciesTestUtil.createResourceRequest(0L,
      "subcluster0-rack0", 1024, 1, 1, 0, null, false));
  resourceRequests.add(FederationPoliciesTestUtil.createResourceRequest(0L,
      ResourceRequest.ANY, 1024, 1, 1, 100, null, false));
  response = ((FederationAMRMProxyPolicy) getPolicy())
      .splitResourceRequests(resourceRequests, new HashSet<SubClusterId>());
  /*
   * Since node request is a cancel, it should not be considered associated
   * with localized requests. Based on headroom, we expect 75 containers to
   * got to subcluster0 (60) and subcluster2 (15) according to the advertised
   * headroom (40 and 10), no containers for sublcuster1 as it advertise zero
   * headroom, and 25 to subcluster5 which has unknown headroom, and so it
   * gets 1/4th of the load
   */
  checkExpectedAllocation(response, "subcluster0", 3, 60);
  checkExpectedAllocation(response, "subcluster1", 1, -1);
  checkExpectedAllocation(response, "subcluster2", 1, 15);
  checkExpectedAllocation(response, "subcluster5", 1, 25);
  checkTotalContainerAllocation(response, 100);
}