hadoop-mapreduce-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From ss...@apache.org
Subject svn commit: r1376283 [21/22] - in /hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client: ./ hadoop-mapreduce-client-app2/ hadoop-mapreduce-client-app2/src/ hadoop-mapreduce-client-app2/src/main/ hadoop-mapreduce-client-app2/s...
Date Wed, 22 Aug 2012 22:11:48 GMT
Added: hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobs.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobs.java?rev=1376283&view=auto
==============================================================================
--- hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobs.java (added)
+++ hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesJobs.java Wed Aug 22 22:11:39 2012
@@ -0,0 +1,984 @@
+///**
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing, software
+// * distributed under the License is distributed on an "AS IS" BASIS,
+// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// * See the License for the specific language governing permissions and
+// * limitations under the License.
+// */
+//
+//package org.apache.hadoop.mapreduce.v2.app2.webapp;
+//
+//import static org.apache.hadoop.yarn.util.StringHelper.ujoin;
+//import static org.junit.Assert.assertEquals;
+//import static org.junit.Assert.assertNotNull;
+//import static org.junit.Assert.assertTrue;
+//import static org.junit.Assert.fail;
+//
+//import java.io.StringReader;
+//import java.util.List;
+//import java.util.Map;
+//
+//import javax.ws.rs.core.MediaType;
+//import javax.xml.parsers.DocumentBuilder;
+//import javax.xml.parsers.DocumentBuilderFactory;
+//
+//import org.apache.hadoop.conf.Configuration;
+//import org.apache.hadoop.mapreduce.JobACL;
+//import org.apache.hadoop.mapreduce.v2.api.records.AMInfo;
+//import org.apache.hadoop.mapreduce.v2.api.records.JobId;
+//import org.apache.hadoop.mapreduce.v2.api.records.JobReport;
+//import org.apache.hadoop.mapreduce.v2.app2.AppContext;
+//import org.apache.hadoop.mapreduce.v2.app2.MockJobs;
+//import org.apache.hadoop.mapreduce.v2.app2.job.Job;
+//import org.apache.hadoop.mapreduce.v2.util.MRApps;
+//import org.apache.hadoop.security.authorize.AccessControlList;
+//import org.apache.hadoop.yarn.Clock;
+//import org.apache.hadoop.yarn.ClusterInfo;
+//import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
+//import org.apache.hadoop.yarn.api.records.ApplicationId;
+//import org.apache.hadoop.yarn.event.EventHandler;
+//import org.apache.hadoop.yarn.util.BuilderUtils;
+//import org.apache.hadoop.yarn.util.Times;
+//import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
+//import org.apache.hadoop.yarn.webapp.WebServicesTestUtils;
+//import org.codehaus.jettison.json.JSONArray;
+//import org.codehaus.jettison.json.JSONException;
+//import org.codehaus.jettison.json.JSONObject;
+//import org.junit.Before;
+//import org.junit.Test;
+//import org.w3c.dom.Document;
+//import org.w3c.dom.Element;
+//import org.w3c.dom.NodeList;
+//import org.xml.sax.InputSource;
+//
+//import com.google.inject.Guice;
+//import com.google.inject.Injector;
+//import com.google.inject.servlet.GuiceServletContextListener;
+//import com.google.inject.servlet.ServletModule;
+//import com.sun.jersey.api.client.ClientResponse;
+//import com.sun.jersey.api.client.UniformInterfaceException;
+//import com.sun.jersey.api.client.WebResource;
+//import com.sun.jersey.api.client.ClientResponse.Status;
+//import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
+//import com.sun.jersey.test.framework.JerseyTest;
+//import com.sun.jersey.test.framework.WebAppDescriptor;
+//
+///**
+// * Test the app master web service Rest API for getting jobs, a specific job,
+// * and job counters.
+// *
+// * /ws/v1/mapreduce/jobs
+// * /ws/v1/mapreduce/jobs/{jobid}
+// * /ws/v1/mapreduce/jobs/{jobid}/counters
+// * /ws/v1/mapreduce/jobs/{jobid}/jobattempts
+// */
+//public class TestAMWebServicesJobs extends JerseyTest {
+//
+//  private static Configuration conf = new Configuration();
+//  private static TestAppContext appContext;
+//
+//  static class TestAppContext implements AppContext {
+//    final ApplicationAttemptId appAttemptID;
+//    final ApplicationId appID;
+//    final String user = MockJobs.newUserName();
+//    final Map<JobId, Job> jobs;
+//    final long startTime = System.currentTimeMillis();
+//
+//    TestAppContext(int appid, int numJobs, int numTasks, int numAttempts) {
+//      appID = MockJobs.newAppID(appid);
+//      appAttemptID = MockJobs.newAppAttemptID(appID, 0);
+//      jobs = MockJobs.newJobs(appID, numJobs, numTasks, numAttempts);
+//    }
+//
+//    TestAppContext() {
+//      this(0, 1, 2, 1);
+//    }
+//
+//    @Override
+//    public ApplicationAttemptId getApplicationAttemptId() {
+//      return appAttemptID;
+//    }
+//
+//    @Override
+//    public ApplicationId getApplicationID() {
+//      return appID;
+//    }
+//
+//    @Override
+//    public CharSequence getUser() {
+//      return user;
+//    }
+//
+//    @Override
+//    public Job getJob(JobId jobID) {
+//      return jobs.get(jobID);
+//    }
+//
+//    @Override
+//    public Map<JobId, Job> getAllJobs() {
+//      return jobs; // OK
+//    }
+//
+//    @SuppressWarnings("rawtypes")
+//    @Override
+//    public EventHandler getEventHandler() {
+//      return null;
+//    }
+//
+//    @Override
+//    public Clock getClock() {
+//      return null;
+//    }
+//
+//    @Override
+//    public String getApplicationName() {
+//      return "TestApp";
+//    }
+//
+//    @Override
+//    public long getStartTime() {
+//      return startTime;
+//    }
+//
+//    @Override
+//    public ClusterInfo getClusterInfo() {
+//      return null;
+//    }
+//  }
+//
+//  private Injector injector = Guice.createInjector(new ServletModule() {
+//    @Override
+//    protected void configureServlets() {
+//
+//      appContext = new TestAppContext();
+//      bind(JAXBContextResolver.class);
+//      bind(AMWebServices.class);
+//      bind(GenericExceptionHandler.class);
+//      bind(AppContext.class).toInstance(appContext);
+//      bind(Configuration.class).toInstance(conf);
+//
+//      serve("/*").with(GuiceContainer.class);
+//    }
+//  });
+//
+//  public class GuiceServletConfig extends GuiceServletContextListener {
+//
+//    @Override
+//    protected Injector getInjector() {
+//      return injector;
+//    }
+//  }
+//
+//  @Before
+//  @Override
+//  public void setUp() throws Exception {
+//    super.setUp();
+//
+//  }
+//
+//  public TestAMWebServicesJobs() {
+//    super(new WebAppDescriptor.Builder(
+//        "org.apache.hadoop.mapreduce.v2.app2.webapp")
+//        .contextListenerClass(GuiceServletConfig.class)
+//        .filterClass(com.google.inject.servlet.GuiceFilter.class)
+//        .contextPath("jersey-guice-filter").servletPath("/").build());
+//  }
+//
+//  @Test
+//  public void testJobs() throws JSONException, Exception {
+//    WebResource r = resource();
+//    ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//        .path("jobs").accept(MediaType.APPLICATION_JSON)
+//        .get(ClientResponse.class);
+//    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//    JSONObject json = response.getEntity(JSONObject.class);
+//    assertEquals("incorrect number of elements", 1, json.length());
+//    JSONObject jobs = json.getJSONObject("jobs");
+//    JSONArray arr = jobs.getJSONArray("job");
+//    JSONObject info = arr.getJSONObject(0);
+//    Job job = appContext.getJob(MRApps.toJobID(info.getString("id")));
+//    verifyAMJob(info, job);
+//
+//  }
+//
+//  @Test
+//  public void testJobsSlash() throws JSONException, Exception {
+//    WebResource r = resource();
+//    ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//        .path("jobs/").accept(MediaType.APPLICATION_JSON)
+//        .get(ClientResponse.class);
+//    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//    JSONObject json = response.getEntity(JSONObject.class);
+//    assertEquals("incorrect number of elements", 1, json.length());
+//    JSONObject jobs = json.getJSONObject("jobs");
+//    JSONArray arr = jobs.getJSONArray("job");
+//    JSONObject info = arr.getJSONObject(0);
+//    Job job = appContext.getJob(MRApps.toJobID(info.getString("id")));
+//    verifyAMJob(info, job);
+//
+//  }
+//
+//  @Test
+//  public void testJobsDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//    ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//        .path("jobs").get(ClientResponse.class);
+//    assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//    JSONObject json = response.getEntity(JSONObject.class);
+//    assertEquals("incorrect number of elements", 1, json.length());
+//    JSONObject jobs = json.getJSONObject("jobs");
+//    JSONArray arr = jobs.getJSONArray("job");
+//    JSONObject info = arr.getJSONObject(0);
+//    Job job = appContext.getJob(MRApps.toJobID(info.getString("id")));
+//    verifyAMJob(info, job);
+//
+//  }
+//
+//  @Test
+//  public void testJobsXML() throws Exception {
+//    WebResource r = resource();
+//    ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//        .path("jobs").accept(MediaType.APPLICATION_XML)
+//        .get(ClientResponse.class);
+//    assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//    String xml = response.getEntity(String.class);
+//    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//    DocumentBuilder db = dbf.newDocumentBuilder();
+//    InputSource is = new InputSource();
+//    is.setCharacterStream(new StringReader(xml));
+//    Document dom = db.parse(is);
+//    NodeList jobs = dom.getElementsByTagName("jobs");
+//    assertEquals("incorrect number of elements", 1, jobs.getLength());
+//    NodeList job = dom.getElementsByTagName("job");
+//    assertEquals("incorrect number of elements", 1, job.getLength());
+//    verifyAMJobXML(job, appContext);
+//
+//  }
+//
+//  @Test
+//  public void testJobId() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).accept(MediaType.APPLICATION_JSON)
+//          .get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("job");
+//      verifyAMJob(info, jobsMap.get(id));
+//    }
+//
+//  }
+//
+//  @Test
+//  public void testJobIdSlash() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId + "/").accept(MediaType.APPLICATION_JSON)
+//          .get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("job");
+//      verifyAMJob(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testJobIdDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("job");
+//      verifyAMJob(info, jobsMap.get(id));
+//    }
+//
+//  }
+//
+//  @Test
+//  public void testJobIdNonExist() throws JSONException, Exception {
+//    WebResource r = resource();
+//
+//    try {
+//      r.path("ws").path("v1").path("mapreduce").path("jobs")
+//          .path("job_0_1234").get(JSONObject.class);
+//      fail("should have thrown exception on invalid uri");
+//    } catch (UniformInterfaceException ue) {
+//      ClientResponse response = ue.getResponse();
+//      assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject msg = response.getEntity(JSONObject.class);
+//      JSONObject exception = msg.getJSONObject("RemoteException");
+//      assertEquals("incorrect number of elements", 3, exception.length());
+//      String message = exception.getString("message");
+//      String type = exception.getString("exception");
+//      String classname = exception.getString("javaClassName");
+//      WebServicesTestUtils.checkStringMatch("exception message",
+//          "java.lang.Exception: job, job_0_1234, is not found", message);
+//      WebServicesTestUtils.checkStringMatch("exception type",
+//          "NotFoundException", type);
+//      WebServicesTestUtils.checkStringMatch("exception classname",
+//          "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//    }
+//  }
+//
+//  @Test
+//  public void testJobIdInvalid() throws JSONException, Exception {
+//    WebResource r = resource();
+//
+//    try {
+//      r.path("ws").path("v1").path("mapreduce").path("jobs").path("job_foo")
+//          .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+//      fail("should have thrown exception on invalid uri");
+//    } catch (UniformInterfaceException ue) {
+//      ClientResponse response = ue.getResponse();
+//      assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject msg = response.getEntity(JSONObject.class);
+//      JSONObject exception = msg.getJSONObject("RemoteException");
+//      assertEquals("incorrect number of elements", 3, exception.length());
+//      String message = exception.getString("message");
+//      String type = exception.getString("exception");
+//      String classname = exception.getString("javaClassName");
+//      verifyJobIdInvalid(message, type, classname);
+//    }
+//  }
+//
+//  // verify the exception output default is JSON
+//  @Test
+//  public void testJobIdInvalidDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//
+//    try {
+//      r.path("ws").path("v1").path("mapreduce").path("jobs").path("job_foo")
+//          .get(JSONObject.class);
+//      fail("should have thrown exception on invalid uri");
+//    } catch (UniformInterfaceException ue) {
+//      ClientResponse response = ue.getResponse();
+//      assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject msg = response.getEntity(JSONObject.class);
+//      JSONObject exception = msg.getJSONObject("RemoteException");
+//      assertEquals("incorrect number of elements", 3, exception.length());
+//      String message = exception.getString("message");
+//      String type = exception.getString("exception");
+//      String classname = exception.getString("javaClassName");
+//      verifyJobIdInvalid(message, type, classname);
+//    }
+//  }
+//
+//  // test that the exception output works in XML
+//  @Test
+//  public void testJobIdInvalidXML() throws JSONException, Exception {
+//    WebResource r = resource();
+//
+//    try {
+//      r.path("ws").path("v1").path("mapreduce").path("jobs").path("job_foo")
+//          .accept(MediaType.APPLICATION_XML).get(JSONObject.class);
+//      fail("should have thrown exception on invalid uri");
+//    } catch (UniformInterfaceException ue) {
+//      ClientResponse response = ue.getResponse();
+//      assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//      assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//      String msg = response.getEntity(String.class);
+//      System.out.println(msg);
+//      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//      DocumentBuilder db = dbf.newDocumentBuilder();
+//      InputSource is = new InputSource();
+//      is.setCharacterStream(new StringReader(msg));
+//      Document dom = db.parse(is);
+//      NodeList nodes = dom.getElementsByTagName("RemoteException");
+//      Element element = (Element) nodes.item(0);
+//      String message = WebServicesTestUtils.getXmlString(element, "message");
+//      String type = WebServicesTestUtils.getXmlString(element, "exception");
+//      String classname = WebServicesTestUtils.getXmlString(element,
+//          "javaClassName");
+//      verifyJobIdInvalid(message, type, classname);
+//    }
+//  }
+//
+//  private void verifyJobIdInvalid(String message, String type, String classname) {
+//    WebServicesTestUtils.checkStringMatch("exception message",
+//        "java.lang.Exception: JobId string : job_foo is not properly formed",
+//        message);
+//    WebServicesTestUtils.checkStringMatch("exception type",
+//        "NotFoundException", type);
+//    WebServicesTestUtils.checkStringMatch("exception classname",
+//        "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//  }
+//
+//  @Test
+//  public void testJobIdInvalidBogus() throws JSONException, Exception {
+//    WebResource r = resource();
+//
+//    try {
+//      r.path("ws").path("v1").path("mapreduce").path("jobs").path("bogusfoo")
+//          .get(JSONObject.class);
+//      fail("should have thrown exception on invalid uri");
+//    } catch (UniformInterfaceException ue) {
+//      ClientResponse response = ue.getResponse();
+//      assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject msg = response.getEntity(JSONObject.class);
+//      JSONObject exception = msg.getJSONObject("RemoteException");
+//      assertEquals("incorrect number of elements", 3, exception.length());
+//      String message = exception.getString("message");
+//      String type = exception.getString("exception");
+//      String classname = exception.getString("javaClassName");
+//      WebServicesTestUtils
+//          .checkStringMatch(
+//              "exception message",
+//              "java.lang.Exception: JobId string : bogusfoo is not properly formed",
+//              message);
+//      WebServicesTestUtils.checkStringMatch("exception type",
+//          "NotFoundException", type);
+//      WebServicesTestUtils.checkStringMatch("exception classname",
+//          "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//    }
+//  }
+//
+//  @Test
+//  public void testJobIdXML() throws Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).accept(MediaType.APPLICATION_XML)
+//          .get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//      String xml = response.getEntity(String.class);
+//      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//      DocumentBuilder db = dbf.newDocumentBuilder();
+//      InputSource is = new InputSource();
+//      is.setCharacterStream(new StringReader(xml));
+//      Document dom = db.parse(is);
+//      NodeList job = dom.getElementsByTagName("job");
+//      verifyAMJobXML(job, appContext);
+//    }
+//
+//  }
+//
+//  public void verifyAMJob(JSONObject info, Job job) throws JSONException {
+//
+//    assertEquals("incorrect number of elements", 30, info.length());
+//
+//    // everyone access fields
+//    verifyAMJobGeneric(job, info.getString("id"), info.getString("user"),
+//        info.getString("name"), info.getString("state"),
+//        info.getLong("startTime"), info.getLong("finishTime"),
+//        info.getLong("elapsedTime"), info.getInt("mapsTotal"),
+//        info.getInt("mapsCompleted"), info.getInt("reducesTotal"),
+//        info.getInt("reducesCompleted"),
+//        (float) info.getDouble("reduceProgress"),
+//        (float) info.getDouble("mapProgress"));
+//
+//    String diagnostics = "";
+//    if (info.has("diagnostics")) {
+//      diagnostics = info.getString("diagnostics");
+//    }
+//
+//    // restricted access fields - if security and acls set
+//    verifyAMJobGenericSecure(job, info.getInt("mapsPending"),
+//        info.getInt("mapsRunning"), info.getInt("reducesPending"),
+//        info.getInt("reducesRunning"), info.getBoolean("uberized"),
+//        diagnostics, info.getInt("newReduceAttempts"),
+//        info.getInt("runningReduceAttempts"),
+//        info.getInt("failedReduceAttempts"),
+//        info.getInt("killedReduceAttempts"),
+//        info.getInt("successfulReduceAttempts"), info.getInt("newMapAttempts"),
+//        info.getInt("runningMapAttempts"), info.getInt("failedMapAttempts"),
+//        info.getInt("killedMapAttempts"), info.getInt("successfulMapAttempts"));
+//
+//    Map<JobACL, AccessControlList> allacls = job.getJobACLs();
+//    if (allacls != null) {
+//
+//      for (Map.Entry<JobACL, AccessControlList> entry : allacls.entrySet()) {
+//        String expectName = entry.getKey().getAclName();
+//        String expectValue = entry.getValue().getAclString();
+//        Boolean found = false;
+//        // make sure ws includes it
+//        if (info.has("acls")) {
+//          JSONArray arr = info.getJSONArray("acls");
+//
+//          for (int i = 0; i < arr.length(); i++) {
+//            JSONObject aclInfo = arr.getJSONObject(i);
+//            if (expectName.matches(aclInfo.getString("name"))) {
+//              found = true;
+//              WebServicesTestUtils.checkStringMatch("value", expectValue,
+//                  aclInfo.getString("value"));
+//            }
+//          }
+//        } else {
+//          fail("should have acls in the web service info");
+//        }
+//        assertTrue("acl: " + expectName + " not found in webservice output",
+//            found);
+//      }
+//    }
+//
+//  }
+//
+//  public void verifyAMJobXML(NodeList nodes, TestAppContext appContext) {
+//
+//    assertEquals("incorrect number of elements", 1, nodes.getLength());
+//
+//    for (int i = 0; i < nodes.getLength(); i++) {
+//      Element element = (Element) nodes.item(i);
+//
+//      Job job = appContext.getJob(MRApps.toJobID(WebServicesTestUtils
+//          .getXmlString(element, "id")));
+//      assertNotNull("Job not found - output incorrect", job);
+//
+//      verifyAMJobGeneric(job, WebServicesTestUtils.getXmlString(element, "id"),
+//          WebServicesTestUtils.getXmlString(element, "user"),
+//          WebServicesTestUtils.getXmlString(element, "name"),
+//          WebServicesTestUtils.getXmlString(element, "state"),
+//          WebServicesTestUtils.getXmlLong(element, "startTime"),
+//          WebServicesTestUtils.getXmlLong(element, "finishTime"),
+//          WebServicesTestUtils.getXmlLong(element, "elapsedTime"),
+//          WebServicesTestUtils.getXmlInt(element, "mapsTotal"),
+//          WebServicesTestUtils.getXmlInt(element, "mapsCompleted"),
+//          WebServicesTestUtils.getXmlInt(element, "reducesTotal"),
+//          WebServicesTestUtils.getXmlInt(element, "reducesCompleted"),
+//          WebServicesTestUtils.getXmlFloat(element, "reduceProgress"),
+//          WebServicesTestUtils.getXmlFloat(element, "mapProgress"));
+//
+//      // restricted access fields - if security and acls set
+//      verifyAMJobGenericSecure(job,
+//          WebServicesTestUtils.getXmlInt(element, "mapsPending"),
+//          WebServicesTestUtils.getXmlInt(element, "mapsRunning"),
+//          WebServicesTestUtils.getXmlInt(element, "reducesPending"),
+//          WebServicesTestUtils.getXmlInt(element, "reducesRunning"),
+//          WebServicesTestUtils.getXmlBoolean(element, "uberized"),
+//          WebServicesTestUtils.getXmlString(element, "diagnostics"),
+//          WebServicesTestUtils.getXmlInt(element, "newReduceAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "runningReduceAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "failedReduceAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "killedReduceAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "successfulReduceAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "newMapAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "runningMapAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "failedMapAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "killedMapAttempts"),
+//          WebServicesTestUtils.getXmlInt(element, "successfulMapAttempts"));
+//
+//      Map<JobACL, AccessControlList> allacls = job.getJobACLs();
+//      if (allacls != null) {
+//        for (Map.Entry<JobACL, AccessControlList> entry : allacls.entrySet()) {
+//          String expectName = entry.getKey().getAclName();
+//          String expectValue = entry.getValue().getAclString();
+//          Boolean found = false;
+//          // make sure ws includes it
+//          NodeList id = element.getElementsByTagName("acls");
+//          if (id != null) {
+//            for (int j = 0; j < id.getLength(); j++) {
+//              Element aclElem = (Element) id.item(j);
+//              if (aclElem == null) {
+//                fail("should have acls in the web service info");
+//              }
+//              if (expectName.matches(WebServicesTestUtils.getXmlString(aclElem,
+//                  "name"))) {
+//                found = true;
+//                WebServicesTestUtils.checkStringMatch("value", expectValue,
+//                    WebServicesTestUtils.getXmlString(aclElem, "value"));
+//              }
+//            }
+//          } else {
+//            fail("should have acls in the web service info");
+//          }
+//          assertTrue("acl: " + expectName + " not found in webservice output",
+//              found);
+//        }
+//      }
+//    }
+//  }
+//
+//  public void verifyAMJobGeneric(Job job, String id, String user, String name,
+//      String state, long startTime, long finishTime, long elapsedTime,
+//      int mapsTotal, int mapsCompleted, int reducesTotal, int reducesCompleted,
+//      float reduceProgress, float mapProgress) {
+//    JobReport report = job.getReport();
+//
+//    WebServicesTestUtils.checkStringMatch("id", MRApps.toString(job.getID()),
+//        id);
+//    WebServicesTestUtils.checkStringMatch("user", job.getUserName().toString(),
+//        user);
+//    WebServicesTestUtils.checkStringMatch("name", job.getName(), name);
+//    WebServicesTestUtils.checkStringMatch("state", job.getState().toString(),
+//        state);
+//
+//    assertEquals("startTime incorrect", report.getStartTime(), startTime);
+//    assertEquals("finishTime incorrect", report.getFinishTime(), finishTime);
+//    assertEquals("elapsedTime incorrect",
+//        Times.elapsed(report.getStartTime(), report.getFinishTime()),
+//        elapsedTime);
+//    assertEquals("mapsTotal incorrect", job.getTotalMaps(), mapsTotal);
+//    assertEquals("mapsCompleted incorrect", job.getCompletedMaps(),
+//        mapsCompleted);
+//    assertEquals("reducesTotal incorrect", job.getTotalReduces(), reducesTotal);
+//    assertEquals("reducesCompleted incorrect", job.getCompletedReduces(),
+//        reducesCompleted);
+//    assertEquals("mapProgress incorrect", report.getMapProgress() * 100,
+//        mapProgress, 0);
+//    assertEquals("reduceProgress incorrect", report.getReduceProgress() * 100,
+//        reduceProgress, 0);
+//  }
+//
+//  public void verifyAMJobGenericSecure(Job job, int mapsPending,
+//      int mapsRunning, int reducesPending, int reducesRunning,
+//      Boolean uberized, String diagnostics, int newReduceAttempts,
+//      int runningReduceAttempts, int failedReduceAttempts,
+//      int killedReduceAttempts, int successfulReduceAttempts,
+//      int newMapAttempts, int runningMapAttempts, int failedMapAttempts,
+//      int killedMapAttempts, int successfulMapAttempts) {
+//
+//    String diagString = "";
+//    List<String> diagList = job.getDiagnostics();
+//    if (diagList != null && !diagList.isEmpty()) {
+//      StringBuffer b = new StringBuffer();
+//      for (String diag : diagList) {
+//        b.append(diag);
+//      }
+//      diagString = b.toString();
+//    }
+//    WebServicesTestUtils.checkStringMatch("diagnostics", diagString,
+//        diagnostics);
+//
+//    assertEquals("isUber incorrect", job.isUber(), uberized);
+//
+//    // unfortunately the following fields are all calculated in JobInfo
+//    // so not easily accessible without doing all the calculations again.
+//    // For now just make sure they are present.
+//    assertTrue("mapsPending not >= 0", mapsPending >= 0);
+//    assertTrue("mapsRunning not >= 0", mapsRunning >= 0);
+//    assertTrue("reducesPending not >= 0", reducesPending >= 0);
+//    assertTrue("reducesRunning not >= 0", reducesRunning >= 0);
+//
+//    assertTrue("newReduceAttempts not >= 0", newReduceAttempts >= 0);
+//    assertTrue("runningReduceAttempts not >= 0", runningReduceAttempts >= 0);
+//    assertTrue("failedReduceAttempts not >= 0", failedReduceAttempts >= 0);
+//    assertTrue("killedReduceAttempts not >= 0", killedReduceAttempts >= 0);
+//    assertTrue("successfulReduceAttempts not >= 0",
+//        successfulReduceAttempts >= 0);
+//
+//    assertTrue("newMapAttempts not >= 0", newMapAttempts >= 0);
+//    assertTrue("runningMapAttempts not >= 0", runningMapAttempts >= 0);
+//    assertTrue("failedMapAttempts not >= 0", failedMapAttempts >= 0);
+//    assertTrue("killedMapAttempts not >= 0", killedMapAttempts >= 0);
+//    assertTrue("successfulMapAttempts not >= 0", successfulMapAttempts >= 0);
+//
+//  }
+//
+//  @Test
+//  public void testJobCounters() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("counters")
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("jobCounters");
+//      verifyAMJobCounters(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testJobCountersSlash() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("counters/")
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("jobCounters");
+//      verifyAMJobCounters(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testJobCountersDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("counters/").get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("jobCounters");
+//      verifyAMJobCounters(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testJobCountersXML() throws Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("counters")
+//          .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//      String xml = response.getEntity(String.class);
+//      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//      DocumentBuilder db = dbf.newDocumentBuilder();
+//      InputSource is = new InputSource();
+//      is.setCharacterStream(new StringReader(xml));
+//      Document dom = db.parse(is);
+//      NodeList info = dom.getElementsByTagName("jobCounters");
+//      verifyAMJobCountersXML(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  public void verifyAMJobCounters(JSONObject info, Job job)
+//      throws JSONException {
+//
+//    assertEquals("incorrect number of elements", 2, info.length());
+//
+//    WebServicesTestUtils.checkStringMatch("id", MRApps.toString(job.getID()),
+//        info.getString("id"));
+//    // just do simple verification of fields - not data is correct
+//    // in the fields
+//    JSONArray counterGroups = info.getJSONArray("counterGroup");
+//    for (int i = 0; i < counterGroups.length(); i++) {
+//      JSONObject counterGroup = counterGroups.getJSONObject(i);
+//      String name = counterGroup.getString("counterGroupName");
+//      assertTrue("name not set", (name != null && !name.isEmpty()));
+//      JSONArray counters = counterGroup.getJSONArray("counter");
+//      for (int j = 0; j < counters.length(); j++) {
+//        JSONObject counter = counters.getJSONObject(j);
+//        String counterName = counter.getString("name");
+//        assertTrue("counter name not set",
+//            (counterName != null && !counterName.isEmpty()));
+//
+//        long mapValue = counter.getLong("mapCounterValue");
+//        assertTrue("mapCounterValue  >= 0", mapValue >= 0);
+//
+//        long reduceValue = counter.getLong("reduceCounterValue");
+//        assertTrue("reduceCounterValue  >= 0", reduceValue >= 0);
+//
+//        long totalValue = counter.getLong("totalCounterValue");
+//        assertTrue("totalCounterValue  >= 0", totalValue >= 0);
+//
+//      }
+//    }
+//  }
+//
+//  public void verifyAMJobCountersXML(NodeList nodes, Job job) {
+//
+//    for (int i = 0; i < nodes.getLength(); i++) {
+//      Element element = (Element) nodes.item(i);
+//
+//      assertNotNull("Job not found - output incorrect", job);
+//
+//      WebServicesTestUtils.checkStringMatch("id", MRApps.toString(job.getID()),
+//          WebServicesTestUtils.getXmlString(element, "id"));
+//      // just do simple verification of fields - not data is correct
+//      // in the fields
+//      NodeList groups = element.getElementsByTagName("counterGroup");
+//
+//      for (int j = 0; j < groups.getLength(); j++) {
+//        Element counters = (Element) groups.item(j);
+//        assertNotNull("should have counters in the web service info", counters);
+//        String name = WebServicesTestUtils.getXmlString(counters,
+//            "counterGroupName");
+//        assertTrue("name not set", (name != null && !name.isEmpty()));
+//        NodeList counterArr = counters.getElementsByTagName("counter");
+//        for (int z = 0; z < counterArr.getLength(); z++) {
+//          Element counter = (Element) counterArr.item(z);
+//          String counterName = WebServicesTestUtils.getXmlString(counter,
+//              "name");
+//          assertTrue("counter name not set",
+//              (counterName != null && !counterName.isEmpty()));
+//
+//          long mapValue = WebServicesTestUtils.getXmlLong(counter,
+//              "mapCounterValue");
+//          assertTrue("mapCounterValue not >= 0", mapValue >= 0);
+//
+//          long reduceValue = WebServicesTestUtils.getXmlLong(counter,
+//              "reduceCounterValue");
+//          assertTrue("reduceCounterValue  >= 0", reduceValue >= 0);
+//
+//          long totalValue = WebServicesTestUtils.getXmlLong(counter,
+//              "totalCounterValue");
+//          assertTrue("totalCounterValue  >= 0", totalValue >= 0);
+//        }
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testJobAttempts() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1")
+//          .path("mapreduce").path("jobs").path(jobId).path("jobattempts")
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("jobAttempts");
+//      verifyJobAttempts(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testJobAttemptsSlash() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1")
+//          .path("mapreduce").path("jobs").path(jobId).path("jobattempts/")
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("jobAttempts");
+//      verifyJobAttempts(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testJobAttemptsDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1")
+//          .path("mapreduce").path("jobs").path(jobId).path("jobattempts")
+//          .get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject info = json.getJSONObject("jobAttempts");
+//      verifyJobAttempts(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testJobAttemptsXML() throws Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//
+//      ClientResponse response = r.path("ws").path("v1")
+//          .path("mapreduce").path("jobs").path(jobId).path("jobattempts")
+//          .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//      String xml = response.getEntity(String.class);
+//      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//      DocumentBuilder db = dbf.newDocumentBuilder();
+//      InputSource is = new InputSource();
+//      is.setCharacterStream(new StringReader(xml));
+//      Document dom = db.parse(is);
+//      NodeList attempts = dom.getElementsByTagName("jobAttempts");
+//      assertEquals("incorrect number of elements", 1, attempts.getLength());
+//      NodeList info = dom.getElementsByTagName("jobAttempt");
+//      verifyJobAttemptsXML(info, jobsMap.get(id));
+//    }
+//  }
+//
+//  public void verifyJobAttempts(JSONObject info, Job job)
+//      throws JSONException {
+//
+//    JSONArray attempts = info.getJSONArray("jobAttempt");
+//    assertEquals("incorrect number of elements", 2, attempts.length());
+//    for (int i = 0; i < attempts.length(); i++) {
+//      JSONObject attempt = attempts.getJSONObject(i);
+//      verifyJobAttemptsGeneric(job, attempt.getString("nodeHttpAddress"),
+//          attempt.getString("nodeId"), attempt.getInt("id"),
+//          attempt.getLong("startTime"), attempt.getString("containerId"),
+//          attempt.getString("logsLink"));
+//    }
+//  }
+//
+//  public void verifyJobAttemptsXML(NodeList nodes, Job job) {
+//
+//    assertEquals("incorrect number of elements", 2, nodes.getLength());
+//    for (int i = 0; i < nodes.getLength(); i++) {
+//      Element element = (Element) nodes.item(i);
+//      verifyJobAttemptsGeneric(job,
+//          WebServicesTestUtils.getXmlString(element, "nodeHttpAddress"),
+//          WebServicesTestUtils.getXmlString(element, "nodeId"),
+//          WebServicesTestUtils.getXmlInt(element, "id"),
+//          WebServicesTestUtils.getXmlLong(element, "startTime"),
+//          WebServicesTestUtils.getXmlString(element, "containerId"),
+//          WebServicesTestUtils.getXmlString(element, "logsLink"));
+//    }
+//  }
+//
+//  public void verifyJobAttemptsGeneric(Job job, String nodeHttpAddress,
+//      String nodeId, int id, long startTime, String containerId, String logsLink) {
+//    boolean attemptFound = false;
+//    for (AMInfo amInfo : job.getAMInfos()) {
+//      if (amInfo.getAppAttemptId().getAttemptId() == id) {
+//        attemptFound = true;
+//        String nmHost = amInfo.getNodeManagerHost();
+//        int nmHttpPort = amInfo.getNodeManagerHttpPort();
+//        int nmPort = amInfo.getNodeManagerPort();
+//        WebServicesTestUtils.checkStringMatch("nodeHttpAddress", nmHost + ":"
+//            + nmHttpPort, nodeHttpAddress);
+//        WebServicesTestUtils.checkStringMatch("nodeId",
+//            BuilderUtils.newNodeId(nmHost, nmPort).toString(), nodeId);
+//        assertTrue("startime not greater than 0", startTime > 0);
+//        WebServicesTestUtils.checkStringMatch("containerId", amInfo
+//            .getContainerId().toString(), containerId);
+//
+//        String localLogsLink =ujoin("node", "containerlogs", containerId,
+//            job.getUserName());
+//
+//        assertTrue("logsLink", logsLink.contains(localLogsLink));
+//      }
+//    }
+//    assertTrue("attempt: " + id + " was not found", attemptFound);
+//  }
+//
+//}

Added: hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesTasks.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesTasks.java?rev=1376283&view=auto
==============================================================================
--- hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesTasks.java (added)
+++ hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAMWebServicesTasks.java Wed Aug 22 22:11:39 2012
@@ -0,0 +1,830 @@
+///**
+// * Licensed to the Apache Software Foundation (ASF) under one
+// * or more contributor license agreements.  See the NOTICE file
+// * distributed with this work for additional information
+// * regarding copyright ownership.  The ASF licenses this file
+// * to you under the Apache License, Version 2.0 (the
+// * "License"); you may not use this file except in compliance
+// * with the License.  You may obtain a copy of the License at
+// *
+// *     http://www.apache.org/licenses/LICENSE-2.0
+// *
+// * Unless required by applicable law or agreed to in writing, software
+// * distributed under the License is distributed on an "AS IS" BASIS,
+// * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// * See the License for the specific language governing permissions and
+// * limitations under the License.
+// */
+//
+//package org.apache.hadoop.mapreduce.v2.app2.webapp;
+//
+//import static org.junit.Assert.assertEquals;
+//import static org.junit.Assert.assertNotNull;
+//import static org.junit.Assert.assertTrue;
+//import static org.junit.Assert.fail;
+//
+//import java.io.StringReader;
+//import java.util.Map;
+//
+//import javax.ws.rs.core.MediaType;
+//import javax.xml.parsers.DocumentBuilder;
+//import javax.xml.parsers.DocumentBuilderFactory;
+//
+//import org.apache.hadoop.conf.Configuration;
+//import org.apache.hadoop.mapreduce.v2.api.records.JobId;
+//import org.apache.hadoop.mapreduce.v2.api.records.TaskId;
+//import org.apache.hadoop.mapreduce.v2.api.records.TaskReport;
+//import org.apache.hadoop.mapreduce.v2.app2.AppContext;
+//import org.apache.hadoop.mapreduce.v2.app2.MockJobs;
+//import org.apache.hadoop.mapreduce.v2.app2.job.Job;
+//import org.apache.hadoop.mapreduce.v2.app2.job.Task;
+//import org.apache.hadoop.mapreduce.v2.util.MRApps;
+//import org.apache.hadoop.yarn.Clock;
+//import org.apache.hadoop.yarn.ClusterInfo;
+//import org.apache.hadoop.yarn.api.records.ApplicationAttemptId;
+//import org.apache.hadoop.yarn.api.records.ApplicationId;
+//import org.apache.hadoop.yarn.event.EventHandler;
+//import org.apache.hadoop.yarn.webapp.GenericExceptionHandler;
+//import org.apache.hadoop.yarn.webapp.WebServicesTestUtils;
+//import org.codehaus.jettison.json.JSONArray;
+//import org.codehaus.jettison.json.JSONException;
+//import org.codehaus.jettison.json.JSONObject;
+//import org.junit.Before;
+//import org.junit.Test;
+//import org.w3c.dom.Document;
+//import org.w3c.dom.Element;
+//import org.w3c.dom.NodeList;
+//import org.xml.sax.InputSource;
+//
+//import com.google.inject.Guice;
+//import com.google.inject.Injector;
+//import com.google.inject.servlet.GuiceServletContextListener;
+//import com.google.inject.servlet.ServletModule;
+//import com.sun.jersey.api.client.ClientResponse;
+//import com.sun.jersey.api.client.ClientResponse.Status;
+//import com.sun.jersey.api.client.UniformInterfaceException;
+//import com.sun.jersey.api.client.WebResource;
+//import com.sun.jersey.guice.spi.container.servlet.GuiceContainer;
+//import com.sun.jersey.test.framework.JerseyTest;
+//import com.sun.jersey.test.framework.WebAppDescriptor;
+//
+///**
+// * Test the app master web service Rest API for getting tasks, a specific task,
+// * and task counters.
+// *
+// * /ws/v1/mapreduce/jobs/{jobid}/tasks
+// * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}
+// * /ws/v1/mapreduce/jobs/{jobid}/tasks/{taskid}/counters
+// */
+//public class TestAMWebServicesTasks extends JerseyTest {
+//
+//  private static Configuration conf = new Configuration();
+//  private static TestAppContext appContext;
+//
+//  static class TestAppContext implements AppContext {
+//    final ApplicationAttemptId appAttemptID;
+//    final ApplicationId appID;
+//    final String user = MockJobs.newUserName();
+//    final Map<JobId, Job> jobs;
+//    final long startTime = System.currentTimeMillis();
+//
+//    TestAppContext(int appid, int numJobs, int numTasks, int numAttempts) {
+//      appID = MockJobs.newAppID(appid);
+//      appAttemptID = MockJobs.newAppAttemptID(appID, 0);
+//      jobs = MockJobs.newJobs(appID, numJobs, numTasks, numAttempts);
+//    }
+//
+//    TestAppContext() {
+//      this(0, 1, 2, 1);
+//    }
+//
+//    @Override
+//    public ApplicationAttemptId getApplicationAttemptId() {
+//      return appAttemptID;
+//    }
+//
+//    @Override
+//    public ApplicationId getApplicationID() {
+//      return appID;
+//    }
+//
+//    @Override
+//    public CharSequence getUser() {
+//      return user;
+//    }
+//
+//    @Override
+//    public Job getJob(JobId jobID) {
+//      return jobs.get(jobID);
+//    }
+//
+//    @Override
+//    public Map<JobId, Job> getAllJobs() {
+//      return jobs; // OK
+//    }
+//
+//    @SuppressWarnings("rawtypes")
+//    @Override
+//    public EventHandler getEventHandler() {
+//      return null;
+//    }
+//
+//    @Override
+//    public Clock getClock() {
+//      return null;
+//    }
+//
+//    @Override
+//    public String getApplicationName() {
+//      return "TestApp";
+//    }
+//
+//    @Override
+//    public long getStartTime() {
+//      return startTime;
+//    }
+//
+//    @Override
+//    public ClusterInfo getClusterInfo() {
+//      return null;
+//    }
+//  }
+//
+//  private Injector injector = Guice.createInjector(new ServletModule() {
+//    @Override
+//    protected void configureServlets() {
+//
+//      appContext = new TestAppContext();
+//      bind(JAXBContextResolver.class);
+//      bind(AMWebServices.class);
+//      bind(GenericExceptionHandler.class);
+//      bind(AppContext.class).toInstance(appContext);
+//      bind(Configuration.class).toInstance(conf);
+//
+//      serve("/*").with(GuiceContainer.class);
+//    }
+//  });
+//
+//  public class GuiceServletConfig extends GuiceServletContextListener {
+//
+//    @Override
+//    protected Injector getInjector() {
+//      return injector;
+//    }
+//  }
+//
+//  @Before
+//  @Override
+//  public void setUp() throws Exception {
+//    super.setUp();
+//
+//  }
+//
+//  public TestAMWebServicesTasks() {
+//    super(new WebAppDescriptor.Builder(
+//        "org.apache.hadoop.mapreduce.v2.app2.webapp")
+//        .contextListenerClass(GuiceServletConfig.class)
+//        .filterClass(com.google.inject.servlet.GuiceFilter.class)
+//        .contextPath("jersey-guice-filter").servletPath("/").build());
+//  }
+//
+//  @Test
+//  public void testTasks() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("tasks")
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject tasks = json.getJSONObject("tasks");
+//      JSONArray arr = tasks.getJSONArray("task");
+//      assertEquals("incorrect number of elements", 2, arr.length());
+//
+//      verifyAMTask(arr, jobsMap.get(id), null);
+//    }
+//  }
+//
+//  @Test
+//  public void testTasksDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("tasks").get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject tasks = json.getJSONObject("tasks");
+//      JSONArray arr = tasks.getJSONArray("task");
+//      assertEquals("incorrect number of elements", 2, arr.length());
+//
+//      verifyAMTask(arr, jobsMap.get(id), null);
+//    }
+//  }
+//
+//  @Test
+//  public void testTasksSlash() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("tasks/")
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject tasks = json.getJSONObject("tasks");
+//      JSONArray arr = tasks.getJSONArray("task");
+//      assertEquals("incorrect number of elements", 2, arr.length());
+//
+//      verifyAMTask(arr, jobsMap.get(id), null);
+//    }
+//  }
+//
+//  @Test
+//  public void testTasksXML() throws JSONException, Exception {
+//
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("tasks")
+//          .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//      String xml = response.getEntity(String.class);
+//      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//      DocumentBuilder db = dbf.newDocumentBuilder();
+//      InputSource is = new InputSource();
+//      is.setCharacterStream(new StringReader(xml));
+//      Document dom = db.parse(is);
+//      NodeList tasks = dom.getElementsByTagName("tasks");
+//      assertEquals("incorrect number of elements", 1, tasks.getLength());
+//      NodeList task = dom.getElementsByTagName("task");
+//      verifyAMTaskXML(task, jobsMap.get(id));
+//    }
+//  }
+//
+//  @Test
+//  public void testTasksQueryMap() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      String type = "m";
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("tasks").queryParam("type", type)
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject tasks = json.getJSONObject("tasks");
+//      JSONArray arr = tasks.getJSONArray("task");
+//      assertEquals("incorrect number of elements", 1, arr.length());
+//      verifyAMTask(arr, jobsMap.get(id), type);
+//    }
+//  }
+//
+//  @Test
+//  public void testTasksQueryReduce() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      String type = "r";
+//      ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//          .path("jobs").path(jobId).path("tasks").queryParam("type", type)
+//          .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//      assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//      JSONObject json = response.getEntity(JSONObject.class);
+//      assertEquals("incorrect number of elements", 1, json.length());
+//      JSONObject tasks = json.getJSONObject("tasks");
+//      JSONArray arr = tasks.getJSONArray("task");
+//      assertEquals("incorrect number of elements", 1, arr.length());
+//      verifyAMTask(arr, jobsMap.get(id), type);
+//    }
+//  }
+//
+//  @Test
+//  public void testTasksQueryInvalid() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      // tasktype must be exactly either "m" or "r"
+//      String tasktype = "reduce";
+//
+//      try {
+//        r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
+//            .path("tasks").queryParam("type", tasktype)
+//            .accept(MediaType.APPLICATION_JSON).get(JSONObject.class);
+//        fail("should have thrown exception on invalid uri");
+//      } catch (UniformInterfaceException ue) {
+//        ClientResponse response = ue.getResponse();
+//        assertEquals(Status.BAD_REQUEST, response.getClientResponseStatus());
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject msg = response.getEntity(JSONObject.class);
+//        JSONObject exception = msg.getJSONObject("RemoteException");
+//        assertEquals("incorrect number of elements", 3, exception.length());
+//        String message = exception.getString("message");
+//        String type = exception.getString("exception");
+//        String classname = exception.getString("javaClassName");
+//        WebServicesTestUtils.checkStringMatch("exception message",
+//            "java.lang.Exception: tasktype must be either m or r", message);
+//        WebServicesTestUtils.checkStringMatch("exception type",
+//            "BadRequestException", type);
+//        WebServicesTestUtils.checkStringMatch("exception classname",
+//            "org.apache.hadoop.yarn.webapp.BadRequestException", classname);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskId() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid)
+//            .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject json = response.getEntity(JSONObject.class);
+//        assertEquals("incorrect number of elements", 1, json.length());
+//        JSONObject info = json.getJSONObject("task");
+//        verifyAMSingleTask(info, task);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdSlash() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid + "/")
+//            .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject json = response.getEntity(JSONObject.class);
+//        assertEquals("incorrect number of elements", 1, json.length());
+//        JSONObject info = json.getJSONObject("task");
+//        verifyAMSingleTask(info, task);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid)
+//            .get(ClientResponse.class);
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject json = response.getEntity(JSONObject.class);
+//        assertEquals("incorrect number of elements", 1, json.length());
+//        JSONObject info = json.getJSONObject("task");
+//        verifyAMSingleTask(info, task);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdBogus() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      String tid = "bogustaskid";
+//      try {
+//        r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
+//            .path("tasks").path(tid).get(JSONObject.class);
+//        fail("should have thrown exception on invalid uri");
+//      } catch (UniformInterfaceException ue) {
+//        ClientResponse response = ue.getResponse();
+//        assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject msg = response.getEntity(JSONObject.class);
+//        JSONObject exception = msg.getJSONObject("RemoteException");
+//        assertEquals("incorrect number of elements", 3, exception.length());
+//        String message = exception.getString("message");
+//        String type = exception.getString("exception");
+//        String classname = exception.getString("javaClassName");
+//        WebServicesTestUtils.checkStringMatch("exception message",
+//            "java.lang.Exception: TaskId string : "
+//                + "bogustaskid is not properly formed", message);
+//        WebServicesTestUtils.checkStringMatch("exception type",
+//            "NotFoundException", type);
+//        WebServicesTestUtils.checkStringMatch("exception classname",
+//            "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdNonExist() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      String tid = "task_0_0000_m_000000";
+//      try {
+//        r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
+//            .path("tasks").path(tid).get(JSONObject.class);
+//        fail("should have thrown exception on invalid uri");
+//      } catch (UniformInterfaceException ue) {
+//        ClientResponse response = ue.getResponse();
+//        assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject msg = response.getEntity(JSONObject.class);
+//        JSONObject exception = msg.getJSONObject("RemoteException");
+//        assertEquals("incorrect number of elements", 3, exception.length());
+//        String message = exception.getString("message");
+//        String type = exception.getString("exception");
+//        String classname = exception.getString("javaClassName");
+//        WebServicesTestUtils.checkStringMatch("exception message",
+//            "java.lang.Exception: task not found with id task_0_0000_m_000000",
+//            message);
+//        WebServicesTestUtils.checkStringMatch("exception type",
+//            "NotFoundException", type);
+//        WebServicesTestUtils.checkStringMatch("exception classname",
+//            "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdInvalid() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      String tid = "task_0_0000_d_000000";
+//      try {
+//        r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
+//            .path("tasks").path(tid).get(JSONObject.class);
+//        fail("should have thrown exception on invalid uri");
+//      } catch (UniformInterfaceException ue) {
+//        ClientResponse response = ue.getResponse();
+//        assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject msg = response.getEntity(JSONObject.class);
+//        JSONObject exception = msg.getJSONObject("RemoteException");
+//        assertEquals("incorrect number of elements", 3, exception.length());
+//        String message = exception.getString("message");
+//        String type = exception.getString("exception");
+//        String classname = exception.getString("javaClassName");
+//        WebServicesTestUtils.checkStringMatch("exception message",
+//            "java.lang.Exception: Bad TaskType identifier. TaskId string : "
+//                + "task_0_0000_d_000000 is not properly formed.", message);
+//        WebServicesTestUtils.checkStringMatch("exception type",
+//            "NotFoundException", type);
+//        WebServicesTestUtils.checkStringMatch("exception classname",
+//            "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdInvalid2() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      String tid = "task_0_m_000000";
+//      try {
+//        r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
+//            .path("tasks").path(tid).get(JSONObject.class);
+//        fail("should have thrown exception on invalid uri");
+//      } catch (UniformInterfaceException ue) {
+//        ClientResponse response = ue.getResponse();
+//        assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject msg = response.getEntity(JSONObject.class);
+//        JSONObject exception = msg.getJSONObject("RemoteException");
+//        assertEquals("incorrect number of elements", 3, exception.length());
+//        String message = exception.getString("message");
+//        String type = exception.getString("exception");
+//        String classname = exception.getString("javaClassName");
+//        WebServicesTestUtils.checkStringMatch("exception message",
+//            "java.lang.Exception: TaskId string : "
+//                + "task_0_m_000000 is not properly formed", message);
+//        WebServicesTestUtils.checkStringMatch("exception type",
+//            "NotFoundException", type);
+//        WebServicesTestUtils.checkStringMatch("exception classname",
+//            "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdInvalid3() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      String tid = "task_0_0000_m";
+//      try {
+//        r.path("ws").path("v1").path("mapreduce").path("jobs").path(jobId)
+//            .path("tasks").path(tid).get(JSONObject.class);
+//        fail("should have thrown exception on invalid uri");
+//      } catch (UniformInterfaceException ue) {
+//        ClientResponse response = ue.getResponse();
+//        assertEquals(Status.NOT_FOUND, response.getClientResponseStatus());
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject msg = response.getEntity(JSONObject.class);
+//        JSONObject exception = msg.getJSONObject("RemoteException");
+//        assertEquals("incorrect number of elements", 3, exception.length());
+//        String message = exception.getString("message");
+//        String type = exception.getString("exception");
+//        String classname = exception.getString("javaClassName");
+//        WebServicesTestUtils.checkStringMatch("exception message",
+//            "java.lang.Exception: TaskId string : "
+//                + "task_0_0000_m is not properly formed", message);
+//        WebServicesTestUtils.checkStringMatch("exception type",
+//            "NotFoundException", type);
+//        WebServicesTestUtils.checkStringMatch("exception classname",
+//            "org.apache.hadoop.yarn.webapp.NotFoundException", classname);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdXML() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid)
+//            .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+//
+//        assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//        String xml = response.getEntity(String.class);
+//        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//        DocumentBuilder db = dbf.newDocumentBuilder();
+//        InputSource is = new InputSource();
+//        is.setCharacterStream(new StringReader(xml));
+//        Document dom = db.parse(is);
+//        NodeList nodes = dom.getElementsByTagName("task");
+//        for (int i = 0; i < nodes.getLength(); i++) {
+//          Element element = (Element) nodes.item(i);
+//          verifyAMSingleTaskXML(element, task);
+//        }
+//      }
+//    }
+//  }
+//
+//  public void verifyAMSingleTask(JSONObject info, Task task)
+//      throws JSONException {
+//    assertEquals("incorrect number of elements", 8, info.length());
+//
+//    verifyTaskGeneric(task, info.getString("id"), info.getString("state"),
+//        info.getString("type"), info.getString("successfulAttempt"),
+//        info.getLong("startTime"), info.getLong("finishTime"),
+//        info.getLong("elapsedTime"), (float) info.getDouble("progress"));
+//  }
+//
+//  public void verifyAMTask(JSONArray arr, Job job, String type)
+//      throws JSONException {
+//    for (Task task : job.getTasks().values()) {
+//      TaskId id = task.getID();
+//      String tid = MRApps.toString(id);
+//      Boolean found = false;
+//      if (type != null && task.getType() == MRApps.taskType(type)) {
+//
+//        for (int i = 0; i < arr.length(); i++) {
+//          JSONObject info = arr.getJSONObject(i);
+//          if (tid.matches(info.getString("id"))) {
+//            found = true;
+//            verifyAMSingleTask(info, task);
+//          }
+//        }
+//        assertTrue("task with id: " + tid + " not in web service output", found);
+//      }
+//    }
+//  }
+//
+//  public void verifyTaskGeneric(Task task, String id, String state,
+//      String type, String successfulAttempt, long startTime, long finishTime,
+//      long elapsedTime, float progress) {
+//
+//    TaskId taskid = task.getID();
+//    String tid = MRApps.toString(taskid);
+//    TaskReport report = task.getReport();
+//
+//    WebServicesTestUtils.checkStringMatch("id", tid, id);
+//    WebServicesTestUtils.checkStringMatch("type", task.getType().toString(),
+//        type);
+//    WebServicesTestUtils.checkStringMatch("state", report.getTaskState()
+//        .toString(), state);
+//    // not easily checked without duplicating logic, just make sure its here
+//    assertNotNull("successfulAttempt null", successfulAttempt);
+//    assertEquals("startTime wrong", report.getStartTime(), startTime);
+//    assertEquals("finishTime wrong", report.getFinishTime(), finishTime);
+//    assertEquals("elapsedTime wrong", finishTime - startTime, elapsedTime);
+//    assertEquals("progress wrong", report.getProgress() * 100, progress, 1e-3f);
+//  }
+//
+//  public void verifyAMSingleTaskXML(Element element, Task task) {
+//    verifyTaskGeneric(task, WebServicesTestUtils.getXmlString(element, "id"),
+//        WebServicesTestUtils.getXmlString(element, "state"),
+//        WebServicesTestUtils.getXmlString(element, "type"),
+//        WebServicesTestUtils.getXmlString(element, "successfulAttempt"),
+//        WebServicesTestUtils.getXmlLong(element, "startTime"),
+//        WebServicesTestUtils.getXmlLong(element, "finishTime"),
+//        WebServicesTestUtils.getXmlLong(element, "elapsedTime"),
+//        WebServicesTestUtils.getXmlFloat(element, "progress"));
+//  }
+//
+//  public void verifyAMTaskXML(NodeList nodes, Job job) {
+//
+//    assertEquals("incorrect number of elements", 2, nodes.getLength());
+//
+//    for (Task task : job.getTasks().values()) {
+//      TaskId id = task.getID();
+//      String tid = MRApps.toString(id);
+//      Boolean found = false;
+//      for (int i = 0; i < nodes.getLength(); i++) {
+//        Element element = (Element) nodes.item(i);
+//
+//        if (tid.matches(WebServicesTestUtils.getXmlString(element, "id"))) {
+//          found = true;
+//          verifyAMSingleTaskXML(element, task);
+//        }
+//      }
+//      assertTrue("task with id: " + tid + " not in web service output", found);
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdCounters() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid).path("counters")
+//            .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject json = response.getEntity(JSONObject.class);
+//        assertEquals("incorrect number of elements", 1, json.length());
+//        JSONObject info = json.getJSONObject("jobTaskCounters");
+//        verifyAMJobTaskCounters(info, task);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdCountersSlash() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid).path("counters/")
+//            .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class);
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject json = response.getEntity(JSONObject.class);
+//        assertEquals("incorrect number of elements", 1, json.length());
+//        JSONObject info = json.getJSONObject("jobTaskCounters");
+//        verifyAMJobTaskCounters(info, task);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testTaskIdCountersDefault() throws JSONException, Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid).path("counters")
+//            .get(ClientResponse.class);
+//        assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType());
+//        JSONObject json = response.getEntity(JSONObject.class);
+//        assertEquals("incorrect number of elements", 1, json.length());
+//        JSONObject info = json.getJSONObject("jobTaskCounters");
+//        verifyAMJobTaskCounters(info, task);
+//      }
+//    }
+//  }
+//
+//  @Test
+//  public void testJobTaskCountersXML() throws Exception {
+//    WebResource r = resource();
+//    Map<JobId, Job> jobsMap = appContext.getAllJobs();
+//    for (JobId id : jobsMap.keySet()) {
+//      String jobId = MRApps.toString(id);
+//      for (Task task : jobsMap.get(id).getTasks().values()) {
+//
+//        String tid = MRApps.toString(task.getID());
+//        ClientResponse response = r.path("ws").path("v1").path("mapreduce")
+//            .path("jobs").path(jobId).path("tasks").path(tid).path("counters")
+//            .accept(MediaType.APPLICATION_XML).get(ClientResponse.class);
+//        assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType());
+//        String xml = response.getEntity(String.class);
+//        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+//        DocumentBuilder db = dbf.newDocumentBuilder();
+//        InputSource is = new InputSource();
+//        is.setCharacterStream(new StringReader(xml));
+//        Document dom = db.parse(is);
+//        NodeList info = dom.getElementsByTagName("jobTaskCounters");
+//        verifyAMTaskCountersXML(info, task);
+//      }
+//    }
+//  }
+//
+//  public void verifyAMJobTaskCounters(JSONObject info, Task task)
+//      throws JSONException {
+//
+//    assertEquals("incorrect number of elements", 2, info.length());
+//
+//    WebServicesTestUtils.checkStringMatch("id", MRApps.toString(task.getID()),
+//        info.getString("id"));
+//    // just do simple verification of fields - not data is correct
+//    // in the fields
+//    JSONArray counterGroups = info.getJSONArray("taskCounterGroup");
+//    for (int i = 0; i < counterGroups.length(); i++) {
+//      JSONObject counterGroup = counterGroups.getJSONObject(i);
+//      String name = counterGroup.getString("counterGroupName");
+//      assertTrue("name not set", (name != null && !name.isEmpty()));
+//      JSONArray counters = counterGroup.getJSONArray("counter");
+//      for (int j = 0; j < counters.length(); j++) {
+//        JSONObject counter = counters.getJSONObject(j);
+//        String counterName = counter.getString("name");
+//        assertTrue("name not set",
+//            (counterName != null && !counterName.isEmpty()));
+//        long value = counter.getLong("value");
+//        assertTrue("value  >= 0", value >= 0);
+//      }
+//    }
+//  }
+//
+//  public void verifyAMTaskCountersXML(NodeList nodes, Task task) {
+//
+//    for (int i = 0; i < nodes.getLength(); i++) {
+//
+//      Element element = (Element) nodes.item(i);
+//      WebServicesTestUtils.checkStringMatch("id",
+//          MRApps.toString(task.getID()),
+//          WebServicesTestUtils.getXmlString(element, "id"));
+//      // just do simple verification of fields - not data is correct
+//      // in the fields
+//      NodeList groups = element.getElementsByTagName("taskCounterGroup");
+//
+//      for (int j = 0; j < groups.getLength(); j++) {
+//        Element counters = (Element) groups.item(j);
+//        assertNotNull("should have counters in the web service info", counters);
+//        String name = WebServicesTestUtils.getXmlString(counters,
+//            "counterGroupName");
+//        assertTrue("name not set", (name != null && !name.isEmpty()));
+//        NodeList counterArr = counters.getElementsByTagName("counter");
+//        for (int z = 0; z < counterArr.getLength(); z++) {
+//          Element counter = (Element) counterArr.item(z);
+//          String counterName = WebServicesTestUtils.getXmlString(counter,
+//              "name");
+//          assertTrue("counter name not set",
+//              (counterName != null && !counterName.isEmpty()));
+//
+//          long value = WebServicesTestUtils.getXmlLong(counter, "value");
+//          assertTrue("value not >= 0", value >= 0);
+//
+//        }
+//      }
+//    }
+//  }
+//
+//}

Added: hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAppController.java
URL: http://svn.apache.org/viewvc/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAppController.java?rev=1376283&view=auto
==============================================================================
--- hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAppController.java (added)
+++ hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/java/org/apache/hadoop/mapreduce/v2/app2/webapp/TestAppController.java Wed Aug 22 22:11:39 2012
@@ -0,0 +1,71 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.mapreduce.v2.app2.webapp;
+
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.mapreduce.v2.app2.AppContext;
+import org.apache.hadoop.yarn.api.records.ApplicationId;
+import org.apache.hadoop.yarn.util.Records;
+import org.apache.hadoop.yarn.webapp.Controller.RequestContext;
+import org.junit.Before;
+import org.junit.Test;
+
+public class TestAppController {
+
+  private AppController appController;
+  private RequestContext ctx;
+
+  @Before
+  public void setUp() {
+    AppContext context = mock(AppContext.class);
+    when(context.getApplicationID()).thenReturn(
+        Records.newRecord(ApplicationId.class));
+    App app = new App(context);
+    Configuration conf = new Configuration();
+    ctx = mock(RequestContext.class);
+    appController = new AppController(app, conf, ctx);
+  }
+
+  @Test
+  public void testBadRequest() {
+    String message = "test string";
+    appController.badRequest(message);
+    verifyExpectations(message);
+  }
+
+  @Test
+  public void testBadRequestWithNullMessage() {
+    // It should not throw NullPointerException
+    appController.badRequest(null);
+    verifyExpectations(StringUtils.EMPTY);
+  }
+
+  private void verifyExpectations(String message) {
+    verify(ctx).setStatus(400);
+    verify(ctx).set("app.id", "application_0_0000");
+    verify(ctx).set(eq("rm.web"), anyString());
+    verify(ctx).set("title", "Bad request: " + message);
+  }
+}

Added: hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/krb5.conf
URL: http://svn.apache.org/viewvc/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/krb5.conf?rev=1376283&view=auto
==============================================================================
--- hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/krb5.conf (added)
+++ hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/krb5.conf Wed Aug 22 22:11:39 2012
@@ -0,0 +1,28 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+# 
+[libdefaults]
+	default_realm = APACHE.ORG
+	udp_preference_limit = 1
+	extra_addresses = 127.0.0.1
+[realms]
+	APACHE.ORG = {
+		admin_server = localhost:88
+		kdc = localhost:88
+	}
+[domain_realm]
+	localhost = APACHE.ORG

Added: hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/log4j.properties
URL: http://svn.apache.org/viewvc/hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/log4j.properties?rev=1376283&view=auto
==============================================================================
--- hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/log4j.properties (added)
+++ hadoop/common/branches/MR-3902/hadoop-mapreduce-project/hadoop-mapreduce-client/hadoop-mapreduce-client-app2/src/test/resources/log4j.properties Wed Aug 22 22:11:39 2012
@@ -0,0 +1,19 @@
+#   Licensed under the Apache License, Version 2.0 (the "License");
+#   you may not use this file except in compliance with the License.
+#   You may obtain a copy of the License at
+#
+#       http://www.apache.org/licenses/LICENSE-2.0
+#
+#   Unless required by applicable law or agreed to in writing, software
+#   distributed under the License is distributed on an "AS IS" BASIS,
+#   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+#   See the License for the specific language governing permissions and
+#   limitations under the License.
+
+# log4j configuration used during build and unit tests
+
+log4j.rootLogger=info,stdout
+log4j.threshhold=ALL
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{ISO8601} %-5p [%t] %c{2} (%F:%M(%L)) - %m%n



Mime
View raw message