@Test (timeout = 5000)
public void testRunCommandWithCpuAndMemoryResources() {

  assumeWindows();
  int containerCores = 1;
  Configuration conf = new Configuration();
  conf.set(YarnConfiguration.NM_WINDOWS_CONTAINER_CPU_LIMIT_ENABLED, "true");
  conf.set(YarnConfiguration.NM_WINDOWS_CONTAINER_MEMORY_LIMIT_ENABLED, "true");
  String[] command =
      containerExecutor.getRunCommand("echo", "group1", null, null, conf,
        Resource.newInstance(1024, 1));
  int nodeVCores = NodeManagerHardwareUtils.getVCores(conf);
  Assert.assertEquals(YarnConfiguration.DEFAULT_NM_VCORES, nodeVCores);
  int cpuRate = Math.min(10000, (containerCores * 10000) / nodeVCores);
  // Assert the cpu and memory limits are set correctly in the command
  String[] expected =
      {Shell.WINUTILS, "task", "create", "-m", "1024", "-c",
          String.valueOf(cpuRate), "group1", "cmd /c " + "echo" };
  Assert.assertEquals(Arrays.toString(expected), Arrays.toString(command));
  conf.setBoolean(YarnConfiguration.NM_ENABLE_HARDWARE_CAPABILITY_DETECTION,
      true);
  int nodeCPUs = NodeManagerHardwareUtils.getNodeCPUs(conf);
  float yarnCPUs = NodeManagerHardwareUtils.getContainersCPUs(conf);
  nodeVCores = NodeManagerHardwareUtils.getVCores(conf);
  Assert.assertEquals(nodeCPUs, (int) yarnCPUs);
  Assert.assertEquals(nodeCPUs, nodeVCores);
  command =
      containerExecutor.getRunCommand("echo", "group1", null, null, conf,
        Resource.newInstance(1024, 1));
  cpuRate = Math.min(10000, (containerCores * 10000) / nodeVCores);
  expected[6] = String.valueOf(cpuRate);
  Assert.assertEquals(Arrays.toString(expected), Arrays.toString(command));
  int yarnCpuLimit = 80;
  conf.setInt(YarnConfiguration.NM_RESOURCE_PERCENTAGE_PHYSICAL_CPU_LIMIT,
      yarnCpuLimit);
  yarnCPUs = NodeManagerHardwareUtils.getContainersCPUs(conf);
  nodeVCores = NodeManagerHardwareUtils.getVCores(conf);
  Assert.assertEquals(nodeCPUs * 0.8, yarnCPUs, 0.01);
  if (nodeCPUs == 1) {
    Assert.assertEquals(1, nodeVCores);
  } else {
    Assert.assertEquals((int) (nodeCPUs * 0.8), nodeVCores);
  }
  command =
      containerExecutor.getRunCommand("echo", "group1", null, null, conf,
        Resource.newInstance(1024, 1));
  // we should get 100 * (1/nodeVcores) of 80% of CPU
  int containerPerc = (yarnCpuLimit * containerCores) / nodeVCores;
  cpuRate = Math.min(10000, 100 * containerPerc);
  expected[6] = String.valueOf(cpuRate);
  Assert.assertEquals(Arrays.toString(expected), Arrays.toString(command));
}