@Test(timeout = 30000)
public void testValidateResourceRequest() throws IOException {

  ResourceScheduler mockScheduler = mock(ResourceScheduler.class);
  QueueInfo queueInfo = mock(QueueInfo.class);
  when(queueInfo.getQueueName()).thenReturn("queue");
  Resource maxResource =
          Resources.createResource(
                  YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
                  YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES);
  when(rmContext.getScheduler()).thenReturn(mockScheduler);
  when(mockScheduler.getQueueInfo(Mockito.anyString(), Mockito.anyBoolean(),
      Mockito.anyBoolean())).thenReturn(queueInfo);
  // zero memory
  try {
    Resource resource =
            Resources.createResource(0,
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
  } catch (InvalidResourceRequestException e) {
    fail("Zero memory should be accepted");
  }
  // zero vcores
  try {
    Resource resource =
            Resources.createResource(
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_MB, 0);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
  } catch (InvalidResourceRequestException e) {
    fail("Zero vcores should be accepted");
  }
  // max memory
  try {
    Resource resource =
            Resources.createResource(
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB,
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
  } catch (InvalidResourceRequestException e) {
    fail("Max memory should be accepted");
  }
  // max vcores
  try {
    Resource resource =
            Resources.createResource(
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_MB,
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
  } catch (InvalidResourceRequestException e) {
    fail("Max vcores should not be accepted");
  }
  // negative memory
  try {
    Resource resource =
            Resources.createResource(-1,
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
    fail("Negative memory should not be accepted");
  } catch (InvalidResourceRequestException e) {
    assertEquals(LESS_THAN_ZERO, e.getInvalidResourceType());
  }
  // negative vcores
  try {
    Resource resource =
            Resources.createResource(
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_MB, -1);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
    fail("Negative vcores should not be accepted");
  } catch (InvalidResourceRequestException e) {
    assertEquals(LESS_THAN_ZERO, e.getInvalidResourceType());
  }
  // more than max memory
  try {
    Resource resource =
            Resources.createResource(
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_MB + 1,
                    YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_VCORES);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
    fail("More than max memory should not be accepted");
  } catch (InvalidResourceRequestException e) {
    assertEquals(GREATER_THEN_MAX_ALLOCATION, e.getInvalidResourceType());
  }
  // more than max vcores
  try {
    Resource resource = Resources.createResource(
            YarnConfiguration.DEFAULT_RM_SCHEDULER_MINIMUM_ALLOCATION_MB,
            YarnConfiguration.DEFAULT_RM_SCHEDULER_MAXIMUM_ALLOCATION_VCORES + 1);
    ResourceRequest resReq =
            BuilderUtils.newResourceRequest(mock(Priority.class),
                    ResourceRequest.ANY, resource, 1);
    normalizeAndvalidateRequest(resReq, null,
            mockScheduler, rmContext, maxResource);
    fail("More than max vcores should not be accepted");
  } catch (InvalidResourceRequestException e) {
    assertEquals(GREATER_THEN_MAX_ALLOCATION, e.getInvalidResourceType());
  }
}