@Test
public void testPriorityUtilizationOrdering() {

  PriorityUtilizationQueueOrderingPolicy policy =
      new PriorityUtilizationQueueOrderingPolicy(true);
  // Case 1, one queue
  policy.setQueues(mockCSQueues(new String[] { "a" }, new int[] { 1 },
      new float[] { 0.1f }, new float[] {0.2f}, ""));
  verifyOrder(policy, "", new String[] { "a" });
  // Case 2, 2 queues, both under utilized, same priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 1 },
      new float[] { 0.2f, 0.1f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "b", "a" });
  // Case 3, 2 queues, both over utilized, same priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 1 },
      new float[] { 1.1f, 1.2f },new float[] {0.2f, 0.3f},  ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  // Case 4, 2 queues, one under and one over, same priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 1 },
      new float[] { 0.1f, 1.2f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  // Case 5, 2 queues, both over utilized, different priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 2 },
      new float[] { 1.1f, 1.2f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "b", "a" });
  // Case 6, 2 queues, both under utilized, different priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 2 },
      new float[] { 0.1f, 0.2f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "b", "a" });
  // Case 7, 2 queues, one under utilized and one over utilized,
  // different priority (1)
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 2 },
      new float[] { 0.1f, 1.2f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  // Case 8, 2 queues, one under utilized and one over utilized,
  // different priority (1)
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 2, 1 },
      new float[] { 0.1f, 1.2f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  // Case 9, 2 queues, one under utilized and one meet, different priority (1)
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 2 },
      new float[] { 0.1f, 1.0f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  // Case 10, 2 queues, one under utilized and one meet, different priority (2)
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 2, 1 },
      new float[] { 0.1f, 1.0f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  // Case 11, 2 queues, one under utilized and one meet, same priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 1 },
      new float[] { 0.1f, 1.0f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  // Case 12, 2 queues, both meet, different priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 2 },
      new float[] { 1.0f, 1.0f }, new float[] {0.2f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "b", "a" });
  // Case 13, 5 queues, different priority
  policy.setQueues(mockCSQueues(new String[] { "a", "b", "c", "d", "e" },
      new int[] { 1, 2, 0, 0, 3 },
      new float[] { 1.2f, 1.0f, 0.2f, 1.1f, 0.2f },
      new float[] { 0.2f, 0.1f, 0.1f, 0.3f, 0.3f }, ""));
  verifyOrder(policy, "", new String[] { "e", "c", "b", "a", "d" });
  // Case 14, 5 queues, different priority,
  // partition default - abs capacity is 0;
  policy.setQueues(mockCSQueues(new String[] { "a", "b", "c", "d", "e" },
      new int[] { 1, 2, 0, 0, 3 },
      new float[] { 1.2f, 1.0f, 0.2f, 1.1f, 0.2f },
      new float[] { 0.2f, 0.1f, 0.1f, 0.3f, 0.3f }, "x"));
  verifyOrder(policy, "", new String[] { "e", "b", "a", "c", "d" });
  // Case 15, 5 queues, different priority, partition x;
  policy.setQueues(mockCSQueues(new String[] { "a", "b", "c", "d", "e" },
      new int[] { 1, 2, 0, 0, 3 },
      new float[] { 1.2f, 1.0f, 0.2f, 1.1f, 0.2f },
      new float[] { 0.2f, 0.1f, 0.1f, 0.3f, 0.3f }, "x"));
  verifyOrder(policy, "x", new String[] { "e", "c", "b", "a", "d" });
  // Case 16, 5 queues, different priority, partition x; and different
  // accessibility
  List<CSQueue> queues = mockCSQueues(new String[] { "a", "b", "c", "d", "e" },
      new int[] { 1, 2, 0, 0, 3 },
      new float[] { 1.2f, 1.0f, 0.2f, 1.1f, 0.2f },
      new float[] { 0.2f, 0.1f, 0.1f, 0.3f, 0.3f }, "x");
  // Only a/d has access to x
  when(queues.get(0).getAccessibleNodeLabels()).thenReturn(
      ImmutableSet.of("x"));
  when(queues.get(3).getAccessibleNodeLabels()).thenReturn(
      ImmutableSet.of("x"));
  policy.setQueues(queues);
  verifyOrder(policy, "x", new String[] { "a", "d", "e", "c", "b" });
  // Case 17, 2 queues, one's abs capacity is 0
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 1 },
      new float[] { 0.1f, 1.2f }, new float[] {0.0f, 0.3f}, ""));
  verifyOrder(policy, "", new String[] { "b", "a" });
  // Case 18, 2 queues, one's abs capacity is 0
  policy.setQueues(mockCSQueues(new String[] { "a", "b" }, new int[] { 1, 1 },
      new float[] { 0.1f, 1.2f }, new float[] {0.3f, 0.0f}, ""));
  verifyOrder(policy, "", new String[] { "a", "b" });
  //Case 19, 5 queues with 2 having abs capacity 0 are prioritized last
  policy.setQueues(mockCSQueues(new String[] { "a", "b", "c", "d", "e" },
      new int[] { 1, 2, 0, 0, 3 },
      new float[] { 1.2f, 1.0f, 0.2f, 1.1f, 0.2f },
      new float[] { 0.0f, 0.0f, 0.1f, 0.3f, 0.3f }, "x"));
  verifyOrder(policy, "x", new String[] { "e", "c", "d", "b", "a" });
}