Modified: 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/TestAMWebApp.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/TestAMWebApp.java?rev=1400227&r1=1400226&r2=1400227&view=diff ============================================================================== --- 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/TestAMWebApp.java (original) +++ 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/TestAMWebApp.java Fri Oct 19 18:59:06 2012 @@ -1,220 +1,220 @@ -///** -//* 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.mapreduce.v2.app2.webapp.AMParams.APP_ID; -//import static org.junit.Assert.assertEquals; -// -//import java.util.HashMap; -//import java.util.Map; -//import java.util.Map.Entry; -// -//import org.apache.hadoop.mapreduce.v2.api.records.JobId; -//import org.apache.hadoop.mapreduce.v2.api.records.TaskId; -//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.app2.job.TaskAttempt; -//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.WebApps; -//import org.apache.hadoop.yarn.webapp.test.WebAppTests; -//import org.junit.Test; -// -//import com.google.inject.Injector; -// -//public class TestAMWebApp { -// -// 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, 1, 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; -// } -// } -// -// @Test public void testAppControllerIndex() { -// TestAppContext ctx = new TestAppContext(); -// Injector injector = WebAppTests.createMockInjector(AppContext.class, ctx); -// AppController controller = injector.getInstance(AppController.class); -// controller.index(); -// assertEquals(ctx.appID.toString(), controller.get(APP_ID,"")); -// } -// -// @Test public void testAppView() { -// WebAppTests.testPage(AppView.class, AppContext.class, new TestAppContext()); -// } -// -// -// -// @Test public void testJobView() { -// AppContext appContext = new TestAppContext(); -// Map<String, String> params = getJobParams(appContext); -// WebAppTests.testPage(JobPage.class, AppContext.class, appContext, params); -// } -// -// @Test public void testTasksView() { -// AppContext appContext = new TestAppContext(); -// Map<String, String> params = getTaskParams(appContext); -// WebAppTests.testPage(TasksPage.class, AppContext.class, appContext, params); -// } -// -// @Test public void testTaskView() { -// AppContext appContext = new TestAppContext(); -// Map<String, String> params = getTaskParams(appContext); -// WebAppTests.testPage(TaskPage.class, AppContext.class, appContext, params); -// } -// -// public static Map<String, String> getJobParams(AppContext appContext) { -// JobId jobId = appContext.getAllJobs().entrySet().iterator().next().getKey(); -// Map<String, String> params = new HashMap<String, String>(); -// params.put(AMParams.JOB_ID, MRApps.toString(jobId)); -// return params; -// } -// -// public static Map<String, String> getTaskParams(AppContext appContext) { -// JobId jobId = appContext.getAllJobs().entrySet().iterator().next().getKey(); -// Entry<TaskId, Task> e = appContext.getJob(jobId).getTasks().entrySet().iterator().next(); -// e.getValue().getType(); -// Map<String, String> params = new HashMap<String, String>(); -// params.put(AMParams.JOB_ID, MRApps.toString(jobId)); -// params.put(AMParams.TASK_ID, MRApps.toString(e.getKey())); -// params.put(AMParams.TASK_TYPE, MRApps.taskSymbol(e.getValue().getType())); -// return params; -// } -// -// @Test public void testConfView() { -// WebAppTests.testPage(JobConfPage.class, AppContext.class, -// new TestAppContext()); -// } -// -// @Test public void testCountersView() { -// AppContext appContext = new TestAppContext(); -// Map<String, String> params = getJobParams(appContext); -// WebAppTests.testPage(CountersPage.class, AppContext.class, -// appContext, params); -// } -// -// @Test public void testSingleCounterView() { -// AppContext appContext = new TestAppContext(); -// Map<String, String> params = getJobParams(appContext); -// params.put(AMParams.COUNTER_GROUP, -// "org.apache.hadoop.mapreduce.FileSystemCounter"); -// params.put(AMParams.COUNTER_NAME, "HDFS_WRITE_OPS"); -// WebAppTests.testPage(SingleCounterPage.class, AppContext.class, -// appContext, params); -// } -// -// @Test public void testTaskCountersView() { -// AppContext appContext = new TestAppContext(); -// Map<String, String> params = getTaskParams(appContext); -// WebAppTests.testPage(CountersPage.class, AppContext.class, -// appContext, params); -// } -// -// @Test public void testSingleTaskCounterView() { -// AppContext appContext = new TestAppContext(0, 1, 1, 2); -// Map<String, String> params = getTaskParams(appContext); -// params.put(AMParams.COUNTER_GROUP, -// "org.apache.hadoop.mapreduce.FileSystemCounter"); -// params.put(AMParams.COUNTER_NAME, "HDFS_WRITE_OPS"); -// -// // remove counters from one task attempt -// // to test handling of missing counters -// TaskId taskID = MRApps.toTaskID(params.get(AMParams.TASK_ID)); -// Job job = appContext.getJob(taskID.getJobId()); -// Task task = job.getTask(taskID); -// TaskAttempt attempt = task.getAttempts().values().iterator().next(); -// attempt.getReport().setCounters(null); -// -// WebAppTests.testPage(SingleCounterPage.class, AppContext.class, -// appContext, params); -// } -// -// public static void main(String[] args) { -// WebApps.$for("yarn", AppContext.class, new TestAppContext(0, 8, 88, 4)). -// at(58888).inDevMode().start(new AMWebApp()).joinThread(); -// } -//} +/** +* 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.mapreduce.v2.app2.webapp.AMParams.APP_ID; +import static org.junit.Assert.assertEquals; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; + +import org.apache.hadoop.mapreduce.v2.api.records.JobId; +import org.apache.hadoop.mapreduce.v2.api.records.TaskId; +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.app2.job.TaskAttempt; +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.WebApps; +import org.apache.hadoop.yarn.webapp.test.WebAppTests; +import org.junit.Test; + +import com.google.inject.Injector; + +public class TestAMWebApp { + + 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, 1, 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; + } + } + + @Test public void testAppControllerIndex() { + TestAppContext ctx = new TestAppContext(); + Injector injector = WebAppTests.createMockInjector(AppContext.class, ctx); + AppController controller = injector.getInstance(AppController.class); + controller.index(); + assertEquals(ctx.appID.toString(), controller.get(APP_ID,"")); + } + + @Test public void testAppView() { + WebAppTests.testPage(AppView.class, AppContext.class, new TestAppContext()); + } + + + + @Test public void testJobView() { + AppContext appContext = new TestAppContext(); + Map<String, String> params = getJobParams(appContext); + WebAppTests.testPage(JobPage.class, AppContext.class, appContext, params); + } + + @Test public void testTasksView() { + AppContext appContext = new TestAppContext(); + Map<String, String> params = getTaskParams(appContext); + WebAppTests.testPage(TasksPage.class, AppContext.class, appContext, params); + } + + @Test public void testTaskView() { + AppContext appContext = new TestAppContext(); + Map<String, String> params = getTaskParams(appContext); + WebAppTests.testPage(TaskPage.class, AppContext.class, appContext, params); + } + + public static Map<String, String> getJobParams(AppContext appContext) { + JobId jobId = appContext.getAllJobs().entrySet().iterator().next().getKey(); + Map<String, String> params = new HashMap<String, String>(); + params.put(AMParams.JOB_ID, MRApps.toString(jobId)); + return params; + } + + public static Map<String, String> getTaskParams(AppContext appContext) { + JobId jobId = appContext.getAllJobs().entrySet().iterator().next().getKey(); + Entry<TaskId, Task> e = appContext.getJob(jobId).getTasks().entrySet().iterator().next(); + e.getValue().getType(); + Map<String, String> params = new HashMap<String, String>(); + params.put(AMParams.JOB_ID, MRApps.toString(jobId)); + params.put(AMParams.TASK_ID, MRApps.toString(e.getKey())); + params.put(AMParams.TASK_TYPE, MRApps.taskSymbol(e.getValue().getType())); + return params; + } + + @Test public void testConfView() { + WebAppTests.testPage(JobConfPage.class, AppContext.class, + new TestAppContext()); + } + + @Test public void testCountersView() { + AppContext appContext = new TestAppContext(); + Map<String, String> params = getJobParams(appContext); + WebAppTests.testPage(CountersPage.class, AppContext.class, + appContext, params); + } + + @Test public void testSingleCounterView() { + AppContext appContext = new TestAppContext(); + Map<String, String> params = getJobParams(appContext); + params.put(AMParams.COUNTER_GROUP, + "org.apache.hadoop.mapreduce.FileSystemCounter"); + params.put(AMParams.COUNTER_NAME, "HDFS_WRITE_OPS"); + WebAppTests.testPage(SingleCounterPage.class, AppContext.class, + appContext, params); + } + + @Test public void testTaskCountersView() { + AppContext appContext = new TestAppContext(); + Map<String, String> params = getTaskParams(appContext); + WebAppTests.testPage(CountersPage.class, AppContext.class, + appContext, params); + } + + @Test public void testSingleTaskCounterView() { + AppContext appContext = new TestAppContext(0, 1, 1, 2); + Map<String, String> params = getTaskParams(appContext); + params.put(AMParams.COUNTER_GROUP, + "org.apache.hadoop.mapreduce.FileSystemCounter"); + params.put(AMParams.COUNTER_NAME, "HDFS_WRITE_OPS"); + + // remove counters from one task attempt + // to test handling of missing counters + TaskId taskID = MRApps.toTaskID(params.get(AMParams.TASK_ID)); + Job job = appContext.getJob(taskID.getJobId()); + Task task = job.getTask(taskID); + TaskAttempt attempt = task.getAttempts().values().iterator().next(); + attempt.getReport().setCounters(null); + + WebAppTests.testPage(SingleCounterPage.class, AppContext.class, + appContext, params); + } + + public static void main(String[] args) { + WebApps.$for("yarn", AppContext.class, new TestAppContext(0, 8, 88, 4)). + at(58888).inDevMode().start(new AMWebApp()).joinThread(); + } +}
Modified: 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/TestAMWebServices.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/TestAMWebServices.java?rev=1400227&r1=1400226&r2=1400227&view=diff ============================================================================== --- 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/TestAMWebServices.java (original) +++ 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/TestAMWebServices.java Fri Oct 19 18:59:06 2012 @@ -1,365 +1,365 @@ -///** -// * 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.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.app2.AppContext; -//import org.apache.hadoop.mapreduce.v2.app2.MockJobs; -//import org.apache.hadoop.mapreduce.v2.app2.job.Job; -//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.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 MapReduce Application master info web services api's. Also test -// * non-existent urls. -// * -// * /ws/v1/mapreduce -// * /ws/v1/mapreduce/info -// */ -//public class TestAMWebServices 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, 1, 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 TestAMWebServices() { -// 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 testAM() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce") -// .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()); -// verifyAMInfo(json.getJSONObject("info"), appContext); -// } -// -// @Test -// public void testAMSlash() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce/") -// .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()); -// verifyAMInfo(json.getJSONObject("info"), appContext); -// } -// -// @Test -// public void testAMDefault() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce/") -// .get(ClientResponse.class); -// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); -// JSONObject json = response.getEntity(JSONObject.class); -// assertEquals("incorrect number of elements", 1, json.length()); -// verifyAMInfo(json.getJSONObject("info"), appContext); -// } -// -// @Test -// public void testAMXML() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce") -// .accept(MediaType.APPLICATION_XML).get(ClientResponse.class); -// assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType()); -// String xml = response.getEntity(String.class); -// verifyAMInfoXML(xml, appContext); -// } -// -// @Test -// public void testInfo() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce") -// .path("info").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()); -// verifyAMInfo(json.getJSONObject("info"), appContext); -// } -// -// @Test -// public void testInfoSlash() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce") -// .path("info/").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()); -// verifyAMInfo(json.getJSONObject("info"), appContext); -// } -// -// @Test -// public void testInfoDefault() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce") -// .path("info/").get(ClientResponse.class); -// assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); -// JSONObject json = response.getEntity(JSONObject.class); -// assertEquals("incorrect number of elements", 1, json.length()); -// verifyAMInfo(json.getJSONObject("info"), appContext); -// } -// -// @Test -// public void testInfoXML() throws JSONException, Exception { -// WebResource r = resource(); -// ClientResponse response = r.path("ws").path("v1").path("mapreduce") -// .path("info/").accept(MediaType.APPLICATION_XML) -// .get(ClientResponse.class); -// assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType()); -// String xml = response.getEntity(String.class); -// verifyAMInfoXML(xml, appContext); -// } -// -// @Test -// public void testInvalidUri() throws JSONException, Exception { -// WebResource r = resource(); -// String responseStr = ""; -// try { -// responseStr = r.path("ws").path("v1").path("mapreduce").path("bogus") -// .accept(MediaType.APPLICATION_JSON).get(String.class); -// fail("should have thrown exception on invalid uri"); -// } catch (UniformInterfaceException ue) { -// ClientResponse response = ue.getResponse(); -// assertEquals(Status.NOT_FOUND, response.getClientResponseStatus()); -// WebServicesTestUtils.checkStringMatch( -// "error string exists and shouldn't", "", responseStr); -// } -// } -// -// @Test -// public void testInvalidUri2() throws JSONException, Exception { -// WebResource r = resource(); -// String responseStr = ""; -// try { -// responseStr = r.path("ws").path("v1").path("invalid") -// .accept(MediaType.APPLICATION_JSON).get(String.class); -// fail("should have thrown exception on invalid uri"); -// } catch (UniformInterfaceException ue) { -// ClientResponse response = ue.getResponse(); -// assertEquals(Status.NOT_FOUND, response.getClientResponseStatus()); -// WebServicesTestUtils.checkStringMatch( -// "error string exists and shouldn't", "", responseStr); -// } -// } -// -// @Test -// public void testInvalidAccept() throws JSONException, Exception { -// WebResource r = resource(); -// String responseStr = ""; -// try { -// responseStr = r.path("ws").path("v1").path("mapreduce") -// .accept(MediaType.TEXT_PLAIN).get(String.class); -// fail("should have thrown exception on invalid uri"); -// } catch (UniformInterfaceException ue) { -// ClientResponse response = ue.getResponse(); -// assertEquals(Status.INTERNAL_SERVER_ERROR, -// response.getClientResponseStatus()); -// WebServicesTestUtils.checkStringMatch( -// "error string exists and shouldn't", "", responseStr); -// } -// } -// -// public void verifyAMInfo(JSONObject info, TestAppContext ctx) -// throws JSONException { -// assertEquals("incorrect number of elements", 5, info.length()); -// -// verifyAMInfoGeneric(ctx, info.getString("appId"), info.getString("user"), -// info.getString("name"), info.getLong("startedOn"), -// info.getLong("elapsedTime")); -// } -// -// public void verifyAMInfoXML(String xml, TestAppContext ctx) -// throws JSONException, Exception { -// 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("info"); -// assertEquals("incorrect number of elements", 1, nodes.getLength()); -// -// for (int i = 0; i < nodes.getLength(); i++) { -// Element element = (Element) nodes.item(i); -// verifyAMInfoGeneric(ctx, -// WebServicesTestUtils.getXmlString(element, "appId"), -// WebServicesTestUtils.getXmlString(element, "user"), -// WebServicesTestUtils.getXmlString(element, "name"), -// WebServicesTestUtils.getXmlLong(element, "startedOn"), -// WebServicesTestUtils.getXmlLong(element, "elapsedTime")); -// } -// } -// -// public void verifyAMInfoGeneric(TestAppContext ctx, String id, String user, -// String name, long startedOn, long elapsedTime) { -// -// WebServicesTestUtils.checkStringMatch("id", ctx.getApplicationID() -// .toString(), id); -// WebServicesTestUtils.checkStringMatch("user", ctx.getUser().toString(), -// user); -// WebServicesTestUtils.checkStringMatch("name", ctx.getApplicationName(), -// name); -// -// assertEquals("startedOn incorrect", ctx.getStartTime(), startedOn); -// assertTrue("elapsedTime not greater then 0", (elapsedTime > 0)); -// -// } -//} +/** + * 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.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.app2.AppContext; +import org.apache.hadoop.mapreduce.v2.app2.MockJobs; +import org.apache.hadoop.mapreduce.v2.app2.job.Job; +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.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 MapReduce Application master info web services api's. Also test + * non-existent urls. + * + * /ws/v1/mapreduce + * /ws/v1/mapreduce/info + */ +public class TestAMWebServices 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, 1, 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 TestAMWebServices() { + 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 testAM() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce") + .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()); + verifyAMInfo(json.getJSONObject("info"), appContext); + } + + @Test + public void testAMSlash() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce/") + .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()); + verifyAMInfo(json.getJSONObject("info"), appContext); + } + + @Test + public void testAMDefault() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce/") + .get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + JSONObject json = response.getEntity(JSONObject.class); + assertEquals("incorrect number of elements", 1, json.length()); + verifyAMInfo(json.getJSONObject("info"), appContext); + } + + @Test + public void testAMXML() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce") + .accept(MediaType.APPLICATION_XML).get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType()); + String xml = response.getEntity(String.class); + verifyAMInfoXML(xml, appContext); + } + + @Test + public void testInfo() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce") + .path("info").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()); + verifyAMInfo(json.getJSONObject("info"), appContext); + } + + @Test + public void testInfoSlash() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce") + .path("info/").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()); + verifyAMInfo(json.getJSONObject("info"), appContext); + } + + @Test + public void testInfoDefault() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce") + .path("info/").get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + JSONObject json = response.getEntity(JSONObject.class); + assertEquals("incorrect number of elements", 1, json.length()); + verifyAMInfo(json.getJSONObject("info"), appContext); + } + + @Test + public void testInfoXML() throws JSONException, Exception { + WebResource r = resource(); + ClientResponse response = r.path("ws").path("v1").path("mapreduce") + .path("info/").accept(MediaType.APPLICATION_XML) + .get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_XML_TYPE, response.getType()); + String xml = response.getEntity(String.class); + verifyAMInfoXML(xml, appContext); + } + + @Test + public void testInvalidUri() throws JSONException, Exception { + WebResource r = resource(); + String responseStr = ""; + try { + responseStr = r.path("ws").path("v1").path("mapreduce").path("bogus") + .accept(MediaType.APPLICATION_JSON).get(String.class); + fail("should have thrown exception on invalid uri"); + } catch (UniformInterfaceException ue) { + ClientResponse response = ue.getResponse(); + assertEquals(Status.NOT_FOUND, response.getClientResponseStatus()); + WebServicesTestUtils.checkStringMatch( + "error string exists and shouldn't", "", responseStr); + } + } + + @Test + public void testInvalidUri2() throws JSONException, Exception { + WebResource r = resource(); + String responseStr = ""; + try { + responseStr = r.path("ws").path("v1").path("invalid") + .accept(MediaType.APPLICATION_JSON).get(String.class); + fail("should have thrown exception on invalid uri"); + } catch (UniformInterfaceException ue) { + ClientResponse response = ue.getResponse(); + assertEquals(Status.NOT_FOUND, response.getClientResponseStatus()); + WebServicesTestUtils.checkStringMatch( + "error string exists and shouldn't", "", responseStr); + } + } + + @Test + public void testInvalidAccept() throws JSONException, Exception { + WebResource r = resource(); + String responseStr = ""; + try { + responseStr = r.path("ws").path("v1").path("mapreduce") + .accept(MediaType.TEXT_PLAIN).get(String.class); + fail("should have thrown exception on invalid uri"); + } catch (UniformInterfaceException ue) { + ClientResponse response = ue.getResponse(); + assertEquals(Status.INTERNAL_SERVER_ERROR, + response.getClientResponseStatus()); + WebServicesTestUtils.checkStringMatch( + "error string exists and shouldn't", "", responseStr); + } + } + + public void verifyAMInfo(JSONObject info, TestAppContext ctx) + throws JSONException { + assertEquals("incorrect number of elements", 5, info.length()); + + verifyAMInfoGeneric(ctx, info.getString("appId"), info.getString("user"), + info.getString("name"), info.getLong("startedOn"), + info.getLong("elapsedTime")); + } + + public void verifyAMInfoXML(String xml, TestAppContext ctx) + throws JSONException, Exception { + 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("info"); + assertEquals("incorrect number of elements", 1, nodes.getLength()); + + for (int i = 0; i < nodes.getLength(); i++) { + Element element = (Element) nodes.item(i); + verifyAMInfoGeneric(ctx, + WebServicesTestUtils.getXmlString(element, "appId"), + WebServicesTestUtils.getXmlString(element, "user"), + WebServicesTestUtils.getXmlString(element, "name"), + WebServicesTestUtils.getXmlLong(element, "startedOn"), + WebServicesTestUtils.getXmlLong(element, "elapsedTime")); + } + } + + public void verifyAMInfoGeneric(TestAppContext ctx, String id, String user, + String name, long startedOn, long elapsedTime) { + + WebServicesTestUtils.checkStringMatch("id", ctx.getApplicationID() + .toString(), id); + WebServicesTestUtils.checkStringMatch("user", ctx.getUser().toString(), + user); + WebServicesTestUtils.checkStringMatch("name", ctx.getApplicationName(), + name); + + assertEquals("startedOn incorrect", ctx.getStartTime(), startedOn); + assertTrue("elapsedTime not greater then 0", (elapsedTime > 0)); + + } +}