@Test (timeout=5000)
public void testQueue() throws IOException {

  File f = null;
  try {
    f = writeFile();
    QueueManager manager = new QueueManager(f.getCanonicalPath(), true);
    manager.setSchedulerInfo("first", "queueInfo");
    manager.setSchedulerInfo("second", "queueInfoqueueInfo");
    Queue root = manager.getRoot();
    assertThat(root.getChildren().size()).isEqualTo(2);
    Iterator<Queue> iterator = root.getChildren().iterator();
    Queue firstSubQueue = iterator.next();
    assertEquals("first", firstSubQueue.getName());
    assertEquals(
        firstSubQueue.getAcls().get("mapred.queue.first.acl-submit-job")
            .toString(),
        "Users [user1, user2] and members of the groups [group1, group2] are allowed");
    Queue secondSubQueue = iterator.next();
    assertEquals("second", secondSubQueue.getName());
    assertThat(secondSubQueue.getProperties().getProperty("key"))
        .isEqualTo("value");
    assertThat(secondSubQueue.getProperties().getProperty("key1"))
        .isEqualTo("value1");
    // test status
    assertThat(firstSubQueue.getState().getStateName())
        .isEqualTo("running");
    assertThat(secondSubQueue.getState().getStateName())
        .isEqualTo("stopped");
    Set<String> template = new HashSet<String>();
    template.add("first");
    template.add("second");
    assertEquals(manager.getLeafQueueNames(), template);
    // test user access
    UserGroupInformation mockUGI = mock(UserGroupInformation.class);
    when(mockUGI.getShortUserName()).thenReturn("user1");
    String[] groups = { "group1" };
    when(mockUGI.getGroupNames()).thenReturn(groups);
    assertTrue(manager.hasAccess("first", QueueACL.SUBMIT_JOB, mockUGI));
    assertFalse(manager.hasAccess("second", QueueACL.SUBMIT_JOB, mockUGI));
    assertFalse(manager.hasAccess("first", QueueACL.ADMINISTER_JOBS, mockUGI));
    when(mockUGI.getShortUserName()).thenReturn("user3");
    assertTrue(manager.hasAccess("first", QueueACL.ADMINISTER_JOBS, mockUGI));
    QueueAclsInfo[] qai = manager.getQueueAcls(mockUGI);
    assertThat(qai.length).isEqualTo(1);
    // test refresh queue
    manager.refreshQueues(getConfiguration(), null);
    iterator = root.getChildren().iterator();
    Queue firstSubQueue1 = iterator.next();
    Queue secondSubQueue1 = iterator.next();
    // tets equal method
    assertThat(firstSubQueue).isEqualTo(firstSubQueue1);
    assertThat(firstSubQueue1.getState().getStateName())
        .isEqualTo("running");
    assertThat(secondSubQueue1.getState().getStateName())
        .isEqualTo("stopped");
    assertThat(firstSubQueue1.getSchedulingInfo())
        .isEqualTo("queueInfo");
    assertThat(secondSubQueue1.getSchedulingInfo())
        .isEqualTo("queueInfoqueueInfo");
    // test JobQueueInfo
    assertThat(firstSubQueue.getJobQueueInfo().getQueueName())
        .isEqualTo("first");
    assertThat(firstSubQueue.getJobQueueInfo().getState().toString())
        .isEqualTo("running");
    assertThat(firstSubQueue.getJobQueueInfo().getSchedulingInfo())
        .isEqualTo("queueInfo");
    assertThat(secondSubQueue.getJobQueueInfo().getChildren().size())
        .isEqualTo(0);
    // test
    assertThat(manager.getSchedulerInfo("first")).isEqualTo("queueInfo");
    Set<String> queueJobQueueInfos = new HashSet<String>();
    for(JobQueueInfo jobInfo : manager.getJobQueueInfos()){
  	  queueJobQueueInfos.add(jobInfo.getQueueName());
    }
    Set<String> rootJobQueueInfos = new HashSet<String>();
    for(Queue queue : root.getChildren()){
  	  rootJobQueueInfos.add(queue.getJobQueueInfo().getQueueName());
    }
    assertEquals(queueJobQueueInfos, rootJobQueueInfos);
    // test getJobQueueInfoMapping
    assertThat(manager.getJobQueueInfoMapping().get("first").getQueueName())
        .isEqualTo("first");
    // test dumpConfiguration
    Writer writer = new StringWriter();
    Configuration conf = getConfiguration();
    conf.unset(DeprecatedQueueConfigurationParser.MAPRED_QUEUE_NAMES_KEY);
    QueueManager.dumpConfiguration(writer, f.getAbsolutePath(), conf);
    String result = writer.toString();
    assertTrue(result
        .indexOf("\"name\":\"first\",\"state\":\"running\",\"acl_submit_job\":\"user1,user2 group1,group2\",\"acl_administer_jobs\":\"user3,user4 group3,group4\",\"properties\":[],\"children\":[]") > 0);
    writer = new StringWriter();
    QueueManager.dumpConfiguration(writer, conf);
    result = writer.toString();
    assertTrue(result.contains("{\"queues\":[{\"name\":\"default\",\"state\":\"running\",\"acl_submit_job\":\"*\",\"acl_administer_jobs\":\"*\",\"properties\":[],\"children\":[]},{\"name\":\"q1\",\"state\":\"running\",\"acl_submit_job\":\" \",\"acl_administer_jobs\":\" \",\"properties\":[],\"children\":[{\"name\":\"q1:q2\",\"state\":\"running\",\"acl_submit_job\":\" \",\"acl_administer_jobs\":\" \",\"properties\":["));
    assertTrue(result.contains("{\"key\":\"capacity\",\"value\":\"20\"}"));
    assertTrue(result.contains("{\"key\":\"user-limit\",\"value\":\"30\"}"));
    assertTrue(result.contains("],\"children\":[]}]}]}"));
    // test constructor QueueAclsInfo
    QueueAclsInfo qi = new QueueAclsInfo();
    assertNull(qi.getQueueName());
  } finally {
    if (f != null) {
      f.delete();
    }
  }
}