You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by ji...@apache.org on 2017/07/21 18:39:29 UTC
[27/52] [abbrv] hadoop git commit: YARN-6335. Port slider's groovy
unit tests to yarn native services. Contributed by Billie Rinaldi
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java
index 29eb5ca..9f3ebba 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/timelineservice/TestServiceTimelinePublisher.java
@@ -18,18 +18,6 @@
package org.apache.slider.server.appmaster.timelineservice;
-import static org.junit.Assert.assertEquals;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.yarn.api.records.ApplicationId;
import org.apache.hadoop.yarn.api.records.FinalApplicationStatus;
@@ -54,6 +42,18 @@ import org.junit.After;
import org.junit.Before;
import org.junit.Test;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
/**
* Test class for ServiceTimelinePublisher.
*/
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryMarshalling.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryMarshalling.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryMarshalling.java
new file mode 100644
index 0000000..bc3cbbe
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/PathEntryMarshalling.java
@@ -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.
+ */
+
+package org.apache.slider.server.appmaster.web.rest.registry;
+
+import org.apache.hadoop.registry.client.binding.JsonSerDeser;
+
+class PathEntryMarshalling
+ extends JsonSerDeser<PathEntryResource> {
+ public PathEntryMarshalling() {
+ super(PathEntryResource.class);
+ }
+}
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/TestRegistryRestMarshalling.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/TestRegistryRestMarshalling.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/TestRegistryRestMarshalling.java
new file mode 100644
index 0000000..2216479
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/rest/registry/TestRegistryRestMarshalling.java
@@ -0,0 +1,51 @@
+/*
+ * 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.slider.server.appmaster.web.rest.registry;
+
+import org.apache.hadoop.registry.client.types.ServiceRecord;
+import org.apache.hadoop.registry.client.types.yarn.YarnRegistryAttributes;
+import org.junit.Test;
+
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertNotNull;
+
+/**
+ * This test exists because Jersey appears to behave "oddly"
+ * when it comes to marshalling JSON, and some of the REST resources
+ * appear to have trouble.
+ *
+ * This test tries to isolate it
+ */
+public class TestRegistryRestMarshalling {
+
+ @Test
+ public void testDeser() throws Throwable {
+ PathEntryMarshalling pem = new PathEntryMarshalling();
+ PathEntryResource unmarshalled = pem.fromResource(
+ "/org/apache/slider/server/appmaster/web/rest/registry/sample.json");
+
+ ServiceRecord serviceRecord = unmarshalled.service;
+ assertNotNull(serviceRecord);
+ assertNotNull(serviceRecord.get(YarnRegistryAttributes.YARN_ID));
+ assertNotEquals("", serviceRecord.get(YarnRegistryAttributes
+ .YARN_PERSISTENCE));
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestClusterSpecificationBlock.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestClusterSpecificationBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestClusterSpecificationBlock.java
new file mode 100644
index 0000000..e4e344e
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestClusterSpecificationBlock.java
@@ -0,0 +1,78 @@
+/*
+ * 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.slider.server.appmaster.web.view;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
+import org.apache.slider.providers.ProviderService;
+import org.apache.slider.server.appmaster.model.mock.BaseMockAppStateTest;
+import org.apache.slider.server.appmaster.model.mock.MockProviderService;
+import org.apache.slider.server.appmaster.state.ProviderAppState;
+import org.apache.slider.server.appmaster.web.WebAppApi;
+import org.apache.slider.server.appmaster.web.WebAppApiImpl;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * Test cluster specification block.
+ */
+public class TestClusterSpecificationBlock extends BaseMockAppStateTest {
+
+ private ClusterSpecificationBlock clusterSpecBlock;
+
+ @Before
+ public void setup() throws Exception {
+ super.setup();
+ ProviderAppState providerAppState = new ProviderAppState(
+ "undefined",
+ appState);
+ ProviderService providerService = new MockProviderService();
+
+ WebAppApiImpl inst = new WebAppApiImpl(
+ providerAppState,
+ providerService,
+ null,
+ null, null);
+
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ @Override
+ protected void configure() {
+ bind(WebAppApi.class).toInstance(inst);
+ }
+ });
+
+ clusterSpecBlock = injector.getInstance(ClusterSpecificationBlock.class);
+ }
+
+ @Test
+ public void testJsonGeneration() {
+ StringWriter sw = new StringWriter(64);
+ PrintWriter pw = new PrintWriter(sw);
+
+ Hamlet hamlet = new Hamlet(pw, 0, false);
+
+ int level = hamlet.nestLevel();
+ clusterSpecBlock.doRender(hamlet);
+
+ assertEquals(level, hamlet.nestLevel());
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestContainerStatsBlock.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestContainerStatsBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestContainerStatsBlock.java
new file mode 100644
index 0000000..92f8559
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestContainerStatsBlock.java
@@ -0,0 +1,255 @@
+/*
+ * 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.slider.server.appmaster.web.view;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.hadoop.yarn.api.records.Priority;
+import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
+import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.DIV;
+import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TABLE;
+import org.apache.hadoop.yarn.webapp.hamlet.Hamlet.TR;
+import org.apache.hadoop.yarn.webapp.hamlet.HamletImpl.EImp;
+import org.apache.slider.api.ClusterNode;
+import org.apache.slider.providers.ProviderService;
+import org.apache.slider.server.appmaster.model.mock.BaseMockAppStateTest;
+import org.apache.slider.server.appmaster.model.mock.MockContainer;
+import org.apache.slider.server.appmaster.model.mock.MockContainerId;
+import org.apache.slider.server.appmaster.model.mock.MockNodeId;
+import org.apache.slider.server.appmaster.model.mock.MockProviderService;
+import org.apache.slider.server.appmaster.model.mock.MockResource;
+import org.apache.slider.server.appmaster.state.ProviderAppState;
+import org.apache.slider.server.appmaster.state.RoleInstance;
+import org.apache.slider.server.appmaster.web.WebAppApi;
+import org.apache.slider.server.appmaster.web.WebAppApiImpl;
+import org.apache.slider.server.appmaster.web.view.ContainerStatsBlock.ClusterNodeNameComparator;
+import org.apache.slider.server.appmaster.web.view.ContainerStatsBlock.TableAnchorContent;
+import org.apache.slider.server.appmaster.web.view.ContainerStatsBlock.TableContent;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Test container stats block.
+ */
+public class TestContainerStatsBlock extends BaseMockAppStateTest {
+
+ private ContainerStatsBlock statsBlock;
+
+ private Container cont1, cont2;
+
+ @Before
+ public void setup() throws Exception {
+ super.setup();
+ ProviderService providerService = new MockProviderService();
+ ProviderAppState providerAppState = new ProviderAppState(
+ "undefined",
+ appState);
+
+ WebAppApiImpl inst = new WebAppApiImpl(
+ providerAppState,
+ providerService,
+ null,
+ METRICS, null);
+
+ Injector injector = Guice.createInjector(new WebappModule(inst));
+ statsBlock = injector.getInstance(ContainerStatsBlock.class);
+
+ cont1 = new MockContainer();
+
+ cont1.setId(mockContainerId(0));
+ cont1.setNodeId(new MockNodeId());
+ cont1.setPriority(Priority.newInstance(1));
+ cont1.setResource(new MockResource(0, 0));
+
+ cont2 = new MockContainer();
+ cont2.setId(mockContainerId(1));
+ cont2.setNodeId(new MockNodeId());
+ cont2.setPriority(Priority.newInstance(1));
+ cont2.setResource(new MockResource(0, 0));
+ }
+
+ private static class WebappModule extends AbstractModule {
+ private final WebAppApiImpl instance;
+
+ WebappModule(WebAppApiImpl instance) {
+ this.instance = instance;
+ }
+
+ @Override
+ protected void configure() {
+ bind(WebAppApi.class).toInstance(instance);
+ }
+ }
+
+
+ public MockContainerId mockContainerId(int count) {
+ return new MockContainerId(applicationAttemptId, count);
+ }
+
+ @Test
+ public void testGetContainerInstances() {
+ List<RoleInstance> roles = Arrays.asList(
+ new RoleInstance(cont1),
+ new RoleInstance(cont2)
+ );
+ Map<String, RoleInstance> map = statsBlock.getContainerInstances(roles);
+
+ assertEquals(2, map.size());
+
+ assertTrue(map.containsKey("mockcontainer_0"));
+ assertEquals(map.get("mockcontainer_0"), roles.get(0));
+
+ assertTrue(map.containsKey("mockcontainer_1"));
+ assertEquals(map.get("mockcontainer_1"), roles.get(1));
+ }
+
+ @Test
+ public void testGenerateRoleDetailsWithTwoColumns() {
+ StringWriter sw = new StringWriter(64);
+ PrintWriter pw = new PrintWriter(sw);
+
+ Hamlet hamlet = new Hamlet(pw, 0, false);
+
+ // Make a div to put the content into
+ DIV<Hamlet> div = hamlet.div();
+
+ String detailsName = "testing";
+ String selector = "selector";
+ Map<TableContent, String> data = new HashMap<>();
+ data.put(new ContainerStatsBlock.TableContent("Foo"), "bar");
+
+ int levelPrior = hamlet.nestLevel();
+ statsBlock.generateRoleDetails(div, selector, detailsName, data.entrySet());
+
+ // Close out the div we made
+ // DIV<Hamlet>._() will actually invoke the wrong method (creating <p>),
+ // explicit cast to make sure we're closing out the <div>
+ ((EImp) div)._();
+
+ assertEquals(levelPrior, hamlet.nestLevel());
+ }
+
+ @Test
+ public void testGenerateRoleDetailsWithOneColumn() {
+ StringWriter sw = new StringWriter(64);
+ PrintWriter pw = new PrintWriter(sw);
+
+ Hamlet hamlet = new Hamlet(pw, 0, false);
+ DIV<Hamlet> div = hamlet.div();
+
+ String detailsName = "testing";
+ String selector = "selector";
+ Map<TableContent, String> data = new HashMap<>();
+ data.put(new ContainerStatsBlock.TableContent("Bar"), null);
+
+ int levelPrior = hamlet.nestLevel();
+ statsBlock.generateRoleDetails(div, selector, detailsName, data.entrySet());
+
+ // Close out the div we made
+ // DIV<Hamlet>._() will actually invoke the wrong method (creating <p>),
+ // explicit cast to make sure we're closing out the <div>
+ ((EImp) div)._();
+
+ assertEquals(levelPrior, hamlet.nestLevel());
+ }
+
+ @Test
+ public void testGenerateRoleDetailsWithNoData() {
+ StringWriter sw = new StringWriter(64);
+ PrintWriter pw = new PrintWriter(sw);
+
+ Hamlet hamlet = new Hamlet(pw, 0, false);
+ DIV<Hamlet> div = hamlet.div();
+
+ String detailsName = "testing";
+ String selector = "selector";
+ Map<TableContent, String> data = new HashMap<>();
+
+ int levelPrior = hamlet.nestLevel();
+ statsBlock.generateRoleDetails(div, selector, detailsName, data.entrySet());
+
+ // Close out the div we made
+ // DIV<Hamlet>._() will actually invoke the wrong method (creating <p>),
+ // explicit cast to make sure we're closing out the <div>
+ ((EImp) div)._();
+
+ assertEquals(levelPrior, hamlet.nestLevel());
+ }
+
+ @Test
+ public void testClusterNodeNameComparator() {
+ ClusterNode n1 = new ClusterNode(mockContainerId(1)),
+ n2 = new ClusterNode(mockContainerId(2)),
+ n3 = new ClusterNode(mockContainerId(3));
+
+ List<ClusterNode> nodes = new ArrayList<ClusterNode>();
+ nodes.add(n2);
+ nodes.add(n3);
+ nodes.add(n1);
+
+ Collections.sort(nodes, new ClusterNodeNameComparator());
+
+ String prevName = "";
+ for (ClusterNode node : nodes) {
+ assertTrue(prevName.compareTo(node.name) <= 0);
+ prevName = node.name;
+ }
+ }
+
+ @Test
+ public void testTableContent() {
+ StringWriter sw = new StringWriter(64);
+ PrintWriter pw = new PrintWriter(sw);
+ TableContent tc = new TableContent("foo");
+
+ Hamlet hamlet = new Hamlet(pw, 0, false);
+ TR<TABLE<Hamlet>> tr = hamlet.table().tr();
+
+ int prevLevel = hamlet.nestLevel();
+ // printCell should not end the tr
+ tc.printCell(tr);
+ tr._();
+ assertEquals(prevLevel, hamlet.nestLevel());
+ }
+
+ @Test
+ public void testTableAnchorContent() {
+ StringWriter sw = new StringWriter(64);
+ PrintWriter pw = new PrintWriter(sw);
+ TableContent tc = new TableAnchorContent("foo", "http://bar.com");
+
+ Hamlet hamlet = new Hamlet(pw, 0, false);
+ TR<TABLE<Hamlet>> tr = hamlet.table().tr();
+
+ int prevLevel = hamlet.nestLevel();
+ // printCell should not end the tr
+ tc.printCell(tr);
+ tr._();
+ assertEquals(prevLevel, hamlet.nestLevel());
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestIndexBlock.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestIndexBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestIndexBlock.java
new file mode 100644
index 0000000..96eb3d7
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/appmaster/web/view/TestIndexBlock.java
@@ -0,0 +1,175 @@
+/*
+ * 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.slider.server.appmaster.web.view;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import org.apache.hadoop.yarn.api.records.Container;
+import org.apache.hadoop.yarn.api.records.Priority;
+import org.apache.hadoop.yarn.webapp.hamlet.Hamlet;
+import org.apache.slider.providers.ProviderService;
+import org.apache.slider.server.appmaster.model.appstate.BaseMockAppStateAATest;
+import org.apache.slider.server.appmaster.model.mock.MockContainer;
+import org.apache.slider.server.appmaster.model.mock.MockContainerId;
+import org.apache.slider.server.appmaster.model.mock.MockNodeId;
+import org.apache.slider.server.appmaster.model.mock.MockProviderService;
+import org.apache.slider.server.appmaster.model.mock.MockResource;
+import org.apache.slider.server.appmaster.state.ContainerOutcome;
+import org.apache.slider.server.appmaster.state.OutstandingRequest;
+import org.apache.slider.server.appmaster.state.ProviderAppState;
+import org.apache.slider.server.appmaster.state.RoleStatus;
+import org.apache.slider.server.appmaster.web.WebAppApi;
+import org.apache.slider.server.appmaster.web.WebAppApiImpl;
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+/**
+ * Test index block.
+ */
+public class TestIndexBlock extends BaseMockAppStateAATest {
+ private static final Logger LOG =
+ LoggerFactory.getLogger(TestIndexBlock.class);
+
+ private IndexBlock indexBlock;
+
+ private Container cont1, cont2;
+
+ @Before
+ public void setup() throws Exception {
+ super.setup();
+ assertNotNull(appState);
+ ProviderService providerService = new MockProviderService();
+ ProviderAppState providerAppState = new ProviderAppState(
+ "undefined",
+ appState);
+
+ WebAppApiImpl inst = new WebAppApiImpl(
+ providerAppState,
+ providerService,
+ null,
+ METRICS, null);
+
+ Injector injector = Guice.createInjector(new AbstractModule() {
+ @Override
+ protected void configure() {
+ bind(WebAppApi.class).toInstance(inst);
+ }
+ });
+
+ indexBlock = injector.getInstance(IndexBlock.class);
+
+ cont1 = new MockContainer();
+ cont1.setId(new MockContainerId(applicationAttemptId, 0));
+ cont1.setNodeId(new MockNodeId());
+ cont1.setPriority(Priority.newInstance(1));
+ cont1.setResource(new MockResource(0, 0));
+
+ cont2 = new MockContainer();
+ cont2.setId(new MockContainerId(applicationAttemptId, 1));
+ cont2.setNodeId(new MockNodeId());
+ cont2.setPriority(Priority.newInstance(1));
+ cont2.setResource(new MockResource(0, 0));
+ }
+
+ @Test
+ public void testIndex() {
+ RoleStatus role0 = getRole0Status();
+ RoleStatus role1 = getRole1Status();
+ RoleStatus role2 = getRole2Status();
+
+ int role0Desired = 8;
+
+ role0.setDesired(role0Desired);
+ int role0Actual = 5;
+ int role0Requested = role0Desired - role0Actual;
+ for (int i = 0; i < role0Actual; i++) {
+ appState.incRunningContainers(role0);
+ }
+ assertEquals(role0.getRunning(), role0Actual);
+ for (int i = 0; i < role0Requested; i++) {
+ appState.incRequestedContainers(role0);
+ }
+ assertEquals(role0.getRequested(), role0Requested);
+
+ int role0Failures = 2;
+
+ appState.incFailedContainers(role0, ContainerOutcome.Failed);
+ appState.incFailedContainers(role0, ContainerOutcome.Failed);
+
+ RoleStatus aaRole = getAaRole();
+ // all aa roles fields are in the
+ int aaroleDesired = 200;
+ aaRole.setDesired(aaroleDesired);
+ int aaroleActual = 90;
+ int aaroleActive = 1;
+ int aaroleRequested = aaroleDesired - aaroleActual;
+ int aarolePending = aaroleRequested - 1;
+ int aaroleFailures = 0;
+ for (int i = 0; i < aaroleActual; i++) {
+ appState.incRunningContainers(aaRole);
+ }
+ assertEquals(aaRole.getRunning(), aaroleActual);
+ aaRole.setOutstandingAArequest(new OutstandingRequest(2, ""));
+ // add a requested
+ appState.incRequestedContainers(aaRole);
+ aaRole.getComponentMetrics().pendingAAContainers.set(aarolePending);
+ assertEquals(aaRole.getAAPending(), aarolePending);
+
+ assertEquals(aaRole.getActualAndRequested(), aaroleActual + 1);
+ StringWriter sw = new StringWriter(64);
+ PrintWriter pw = new PrintWriter(sw);
+
+ Hamlet hamlet = new Hamlet(pw, 0, false);
+
+ indexBlock.doIndex(hamlet, "accumulo");
+
+ String body = sw.toString();
+ LOG.info(body);
+ // verify role data came out
+ assertTrue(body.contains("role0"));
+ assertContains(role0Desired, body);
+ assertContains(role0Actual, body);
+ assertContains(role0Requested, body);
+ assertContains(role0Failures, body);
+
+ assertTrue(body.contains("role1"));
+ assertTrue(body.contains("role2"));
+
+ assertContains(aaroleDesired, body);
+ assertContains(aaroleActual, body);
+// assertContains(aaroleRequested, body)
+ assertContains(aaroleFailures, body);
+ assertTrue(body.contains(indexBlock.buildAADetails(true, aarolePending)));
+
+ // verify that the sorting took place
+ assertTrue(body.indexOf("role0") < body.indexOf("role1"));
+ assertTrue(body.indexOf("role1") < body.indexOf("role2"));
+
+ assertFalse(body.contains(IndexBlock.ALL_CONTAINERS_ALLOCATED));
+ // role
+ }
+
+ void assertContains(int ex, String html) {
+ assertStringContains(Integer.toString(ex), html);
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/management/TestGauges.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/management/TestGauges.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/management/TestGauges.java
new file mode 100644
index 0000000..da8366f
--- /dev/null
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/management/TestGauges.java
@@ -0,0 +1,55 @@
+/*
+ * 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.slider.server.management;
+
+import org.apache.slider.server.appmaster.management.LongGauge;
+import org.apache.slider.utils.SliderTestBase;
+import org.junit.Test;
+
+/**
+ * Test gauges.
+ */
+public class TestGauges extends SliderTestBase {
+
+ @Test
+ public void testLongGaugeOperations() throws Throwable {
+ LongGauge gauge = new LongGauge();
+ assertEquals(0, gauge.get());
+ gauge.inc();
+ assertEquals(1, gauge.get());
+ gauge.inc();
+ assertEquals(2, gauge.get());
+ gauge.inc();
+ assertEquals(3, gauge.get());
+ assertEquals(gauge.getValue().longValue(), gauge.get());
+ assertEquals(gauge.getCount().longValue(), gauge.get());
+
+ gauge.dec();
+ assertEquals(2, gauge.get());
+ assertEquals(1, gauge.decToFloor(1));
+ assertEquals(1, gauge.get());
+ assertEquals(0, gauge.decToFloor(1));
+ assertEquals(0, gauge.decToFloor(1));
+ assertEquals(0, gauge.decToFloor(0));
+
+ gauge.set(4);
+ assertEquals(0, gauge.decToFloor(8));
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/servicemonitor/TestPortProbe.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/servicemonitor/TestPortProbe.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/servicemonitor/TestPortProbe.java
index a93ec57..458d1bc 100644
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/servicemonitor/TestPortProbe.java
+++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/server/servicemonitor/TestPortProbe.java
@@ -17,8 +17,8 @@
package org.apache.slider.server.servicemonitor;
-import org.junit.Assert;
import org.apache.hadoop.conf.Configuration;
+import org.junit.Assert;
import org.junit.Test;
public class TestPortProbe extends Assert {
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/test/ContractTestUtils.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/test/ContractTestUtils.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/test/ContractTestUtils.java
deleted file mode 100644
index 7eaaefe..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/test/ContractTestUtils.java
+++ /dev/null
@@ -1,901 +0,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.slider.test;
-
-import org.apache.hadoop.fs.FSDataInputStream;
-import org.apache.hadoop.fs.FSDataOutputStream;
-import org.apache.hadoop.fs.FileStatus;
-import org.apache.hadoop.fs.FileSystem;
-import org.apache.hadoop.fs.Path;
-import org.junit.Assert;
-import org.junit.internal.AssumptionViolatedException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.EOFException;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.Arrays;
-import java.util.Properties;
-import java.util.UUID;
-
-/**
- * Utilities used across test cases to make assertions about filesystems
- * -assertions which fail with useful information.
- * This is lifted from Hadoop common Test; that JAR isn't published, so
- * we have to make do.
- */
-public class ContractTestUtils extends Assert {
-
- private static final Logger LOG =
- LoggerFactory.getLogger(ContractTestUtils.class);
-
- public static final String IO_FILE_BUFFER_SIZE = "io.file.buffer.size";
-
- // For scale testing, we can repeatedly write small chunk data to generate
- // a large file.
- public static final String IO_CHUNK_BUFFER_SIZE = "io.chunk.buffer.size";
- public static final int DEFAULT_IO_CHUNK_BUFFER_SIZE = 128;
- public static final String IO_CHUNK_MODULUS_SIZE = "io.chunk.modulus.size";
- public static final int DEFAULT_IO_CHUNK_MODULUS_SIZE = 128;
-
- /**
- * Assert that a property in the property set matches the expected value
- * @param props property set
- * @param key property name
- * @param expected expected value. If null, the property must not be in the set
- */
- public static void assertPropertyEquals(Properties props,
- String key,
- String expected) {
- String val = props.getProperty(key);
- if (expected == null) {
- assertNull("Non null property " + key + " = " + val, val);
- } else {
- assertEquals("property " + key + " = " + val,
- expected,
- val);
- }
- }
-
- /**
- *
- * Write a file and read it in, validating the result. Optional flags control
- * whether file overwrite operations should be enabled, and whether the
- * file should be deleted afterwards.
- *
- * If there is a mismatch between what was written and what was expected,
- * a small range of bytes either side of the first error are logged to aid
- * diagnosing what problem occurred -whether it was a previous file
- * or a corrupting of the current file. This assumes that two
- * sequential runs to the same path use datasets with different character
- * moduli.
- *
- * @param fs filesystem
- * @param path path to write to
- * @param len length of data
- * @param overwrite should the create option allow overwrites?
- * @param delete should the file be deleted afterwards? -with a verification
- * that it worked. Deletion is not attempted if an assertion has failed
- * earlier -it is not in a <code>finally{}</code> block.
- * @throws IOException IO problems
- */
- public static void writeAndRead(FileSystem fs,
- Path path,
- byte[] src,
- int len,
- int blocksize,
- boolean overwrite,
- boolean delete) throws IOException {
- fs.mkdirs(path.getParent());
-
- writeDataset(fs, path, src, len, blocksize, overwrite);
-
- byte[] dest = readDataset(fs, path, len);
-
- compareByteArrays(src, dest, len);
-
- if (delete) {
- rejectRootOperation(path);
- boolean deleted = fs.delete(path, false);
- assertTrue("Deleted", deleted);
- assertPathDoesNotExist(fs, "Cleanup failed", path);
- }
- }
-
- /**
- * Write a file.
- * Optional flags control
- * whether file overwrite operations should be enabled
- * @param fs filesystem
- * @param path path to write to
- * @param len length of data
- * @param overwrite should the create option allow overwrites?
- * @throws IOException IO problems
- */
- public static void writeDataset(FileSystem fs,
- Path path,
- byte[] src,
- int len,
- int buffersize,
- boolean overwrite) throws IOException {
- assertTrue(
- "Not enough data in source array to write " + len + " bytes",
- src.length >= len);
- FSDataOutputStream out = fs.create(path,
- overwrite,
- fs.getConf()
- .getInt(IO_FILE_BUFFER_SIZE,
- 4096),
- (short) 1,
- buffersize);
- out.write(src, 0, len);
- out.close();
- assertFileHasLength(fs, path, len);
- }
-
- /**
- * Read the file and convert to a byte dataset.
- * This implements readfully internally, so that it will read
- * in the file without ever having to seek()
- * @param fs filesystem
- * @param path path to read from
- * @param len length of data to read
- * @return the bytes
- * @throws IOException IO problems
- */
- public static byte[] readDataset(FileSystem fs, Path path, int len)
- throws IOException {
- FSDataInputStream in = fs.open(path);
- byte[] dest = new byte[len];
- int offset =0;
- int nread = 0;
- try {
- while (nread < len) {
- int nbytes = in.read(dest, offset + nread, len - nread);
- if (nbytes < 0) {
- throw new EOFException("End of file reached before reading fully.");
- }
- nread += nbytes;
- }
- } finally {
- in.close();
- }
- return dest;
- }
-
- /**
- * Read a file, verify its length and contents match the expected array
- * @param fs filesystem
- * @param path path to file
- * @param original original dataset
- * @throws IOException IO Problems
- */
- public static void verifyFileContents(FileSystem fs,
- Path path,
- byte[] original) throws IOException {
- FileStatus stat = fs.getFileStatus(path);
- String statText = stat.toString();
- assertTrue("not a file " + statText, stat.isFile());
- assertEquals("wrong length " + statText, original.length, stat.getLen());
- byte[] bytes = readDataset(fs, path, original.length);
- compareByteArrays(original,bytes,original.length);
- }
-
- /**
- * Verify that the read at a specific offset in a stream
- * matches that expected
- * @param stm stream
- * @param fileContents original file contents
- * @param seekOff seek offset
- * @param toRead number of bytes to read
- * @throws IOException IO problems
- */
- public static void verifyRead(FSDataInputStream stm, byte[] fileContents,
- int seekOff, int toRead) throws IOException {
- byte[] out = new byte[toRead];
- stm.seek(seekOff);
- stm.readFully(out);
- byte[] expected = Arrays.copyOfRange(fileContents, seekOff,
- seekOff + toRead);
- compareByteArrays(expected, out,toRead);
- }
-
- /**
- * Assert that tthe array original[0..len] and received[] are equal.
- * A failure triggers the logging of the bytes near where the first
- * difference surfaces.
- * @param original source data
- * @param received actual
- * @param len length of bytes to compare
- */
- public static void compareByteArrays(byte[] original,
- byte[] received,
- int len) {
- assertEquals("Number of bytes read != number written",
- len, received.length);
- int errors = 0;
- int first_error_byte = -1;
- for (int i = 0; i < len; i++) {
- if (original[i] != received[i]) {
- if (errors == 0) {
- first_error_byte = i;
- }
- errors++;
- }
- }
-
- if (errors > 0) {
- String message = String.format(" %d errors in file of length %d",
- errors, len);
- LOG.warn(message);
- // the range either side of the first error to print
- // this is a purely arbitrary number, to aid user debugging
- final int overlap = 10;
- for (int i = Math.max(0, first_error_byte - overlap);
- i < Math.min(first_error_byte + overlap, len);
- i++) {
- byte actual = received[i];
- byte expected = original[i];
- String letter = toChar(actual);
- String line = String.format("[%04d] %2x %s\n", i, actual, letter);
- if (expected != actual) {
- line = String.format("[%04d] %2x %s -expected %2x %s\n",
- i,
- actual,
- letter,
- expected,
- toChar(expected));
- }
- LOG.warn(line);
- }
- fail(message);
- }
- }
-
- /**
- * Convert a byte to a character for printing. If the
- * byte value is < 32 -and hence unprintable- the byte is
- * returned as a two digit hex value
- * @param b byte
- * @return the printable character string
- */
- public static String toChar(byte b) {
- if (b >= 0x20) {
- return Character.toString((char) b);
- } else {
- return String.format("%02x", b);
- }
- }
-
- /**
- * Convert a buffer to a string, character by character
- * @param buffer input bytes
- * @return a string conversion
- */
- public static String toChar(byte[] buffer) {
- StringBuilder builder = new StringBuilder(buffer.length);
- for (byte b : buffer) {
- builder.append(toChar(b));
- }
- return builder.toString();
- }
-
- public static byte[] toAsciiByteArray(String s) {
- char[] chars = s.toCharArray();
- int len = chars.length;
- byte[] buffer = new byte[len];
- for (int i = 0; i < len; i++) {
- buffer[i] = (byte) (chars[i] & 0xff);
- }
- return buffer;
- }
-
- /**
- * Cleanup at the end of a test run
- * @param action action triggering the operation (for use in logging)
- * @param fileSystem filesystem to work with. May be null
- * @param cleanupPath path to delete as a string
- */
- public static void cleanup(String action,
- FileSystem fileSystem,
- String cleanupPath) {
- if (fileSystem == null) {
- return;
- }
- Path path = new Path(cleanupPath).makeQualified(fileSystem.getUri(),
- fileSystem.getWorkingDirectory());
- cleanup(action, fileSystem, path);
- }
-
- /**
- * Cleanup at the end of a test run
- * @param action action triggering the operation (for use in logging)
- * @param fileSystem filesystem to work with. May be null
- * @param path path to delete
- */
- public static void cleanup(String action, FileSystem fileSystem, Path path) {
- noteAction(action);
- try {
- rm(fileSystem, path, true, false);
- } catch (Exception e) {
- LOG.error("Error deleting in "+ action + " - " + path + ": " + e, e);
- }
- }
-
- /**
- * Delete a directory. There's a safety check for operations against the
- * root directory -these are intercepted and rejected with an IOException
- * unless the allowRootDelete flag is true
- * @param fileSystem filesystem to work with. May be null
- * @param path path to delete
- * @param recursive flag to enable recursive delete
- * @param allowRootDelete can the root directory be deleted?
- * @throws IOException on any problem.
- */
- public static boolean rm(FileSystem fileSystem,
- Path path,
- boolean recursive,
- boolean allowRootDelete) throws
- IOException {
- if (fileSystem != null) {
- rejectRootOperation(path, allowRootDelete);
- if (fileSystem.exists(path)) {
- return fileSystem.delete(path, recursive);
- }
- }
- return false;
-
- }
-
- /**
- * Block any operation on the root path. This is a safety check
- * @param path path in the filesystem
- * @param allowRootOperation can the root directory be manipulated?
- * @throws IOException if the operation was rejected
- */
- public static void rejectRootOperation(Path path,
- boolean allowRootOperation) throws IOException {
- if (path.isRoot() && !allowRootOperation) {
- throw new IOException("Root directory operation rejected: " + path);
- }
- }
-
- /**
- * Block any operation on the root path. This is a safety check
- * @param path path in the filesystem
- * @throws IOException if the operation was rejected
- */
- public static void rejectRootOperation(Path path) throws IOException {
- rejectRootOperation(path, false);
- }
-
-
- public static void noteAction(String action) {
- if (LOG.isDebugEnabled()) {
- LOG.debug("============== "+ action +" =============");
- }
- }
-
- /**
- * downgrade a failure to a message and a warning, then an
- * exception for the Junit test runner to mark as failed
- * @param message text message
- * @param failure what failed
- * @throws AssumptionViolatedException always
- */
- public static void downgrade(String message, Throwable failure) {
- LOG.warn("Downgrading test " + message, failure);
- AssumptionViolatedException ave =
- new AssumptionViolatedException(failure, null);
- throw ave;
- }
-
- /**
- * report an overridden test as unsupported
- * @param message message to use in the text
- * @throws AssumptionViolatedException always
- */
- public static void unsupported(String message) {
- skip(message);
- }
-
- /**
- * report a test has been skipped for some reason
- * @param message message to use in the text
- * @throws AssumptionViolatedException always
- */
- public static void skip(String message) {
- LOG.info("Skipping: {}", message);
- throw new AssumptionViolatedException(message);
- }
-
- /**
- * Fail with an exception that was received
- * @param text text to use in the exception
- * @param thrown a (possibly null) throwable to init the cause with
- * @throws AssertionError with the text and throwable -always
- */
- public static void fail(String text, Throwable thrown) {
- AssertionError e = new AssertionError(text);
- e.initCause(thrown);
- throw e;
- }
-
- /**
- * Make an assertion about the length of a file
- * @param fs filesystem
- * @param path path of the file
- * @param expected expected length
- * @throws IOException on File IO problems
- */
- public static void assertFileHasLength(FileSystem fs, Path path,
- int expected) throws IOException {
- FileStatus status = fs.getFileStatus(path);
- assertEquals(
- "Wrong file length of file " + path + " status: " + status,
- expected,
- status.getLen());
- }
-
- /**
- * Assert that a path refers to a directory
- * @param fs filesystem
- * @param path path of the directory
- * @throws IOException on File IO problems
- */
- public static void assertIsDirectory(FileSystem fs,
- Path path) throws IOException {
- FileStatus fileStatus = fs.getFileStatus(path);
- assertIsDirectory(fileStatus);
- }
-
- /**
- * Assert that a path refers to a directory
- * @param fileStatus stats to check
- */
- public static void assertIsDirectory(FileStatus fileStatus) {
- assertTrue("Should be a directory -but isn't: " + fileStatus,
- fileStatus.isDirectory());
- }
-
- /**
- * Write the text to a file, returning the converted byte array
- * for use in validating the round trip
- * @param fs filesystem
- * @param path path of file
- * @param text text to write
- * @param overwrite should the operation overwrite any existing file?
- * @return the read bytes
- * @throws IOException on IO problems
- */
- public static byte[] writeTextFile(FileSystem fs,
- Path path,
- String text,
- boolean overwrite) throws IOException {
- byte[] bytes = new byte[0];
- if (text != null) {
- bytes = toAsciiByteArray(text);
- }
- createFile(fs, path, overwrite, bytes);
- return bytes;
- }
-
- /**
- * Create a file
- * @param fs filesystem
- * @param path path to write
- * @param overwrite overwrite flag
- * @param data source dataset. Can be null
- * @throws IOException on any problem
- */
- public static void createFile(FileSystem fs,
- Path path,
- boolean overwrite,
- byte[] data) throws IOException {
- FSDataOutputStream stream = fs.create(path, overwrite);
- if (data != null && data.length > 0) {
- stream.write(data);
- }
- stream.close();
- }
-
- /**
- * Touch a file
- * @param fs filesystem
- * @param path path
- * @throws IOException IO problems
- */
- public static void touch(FileSystem fs,
- Path path) throws IOException {
- createFile(fs, path, true, null);
- }
-
- /**
- * Delete a file/dir and assert that delete() returned true
- * <i>and</i> that the path no longer exists. This variant rejects
- * all operations on root directories
- * @param fs filesystem
- * @param file path to delete
- * @param recursive flag to enable recursive delete
- * @throws IOException IO problems
- */
- public static void assertDeleted(FileSystem fs,
- Path file,
- boolean recursive) throws IOException {
- assertDeleted(fs, file, recursive, false);
- }
-
- /**
- * Delete a file/dir and assert that delete() returned true
- * <i>and</i> that the path no longer exists. This variant rejects
- * all operations on root directories
- * @param fs filesystem
- * @param file path to delete
- * @param recursive flag to enable recursive delete
- * @param allowRootOperations can the root dir be deleted?
- * @throws IOException IO problems
- */
- public static void assertDeleted(FileSystem fs,
- Path file,
- boolean recursive,
- boolean allowRootOperations) throws IOException {
- rejectRootOperation(file, allowRootOperations);
- assertPathExists(fs, "about to be deleted file", file);
- boolean deleted = fs.delete(file, recursive);
- String dir = ls(fs, file.getParent());
- assertTrue("Delete failed on " + file + ": " + dir, deleted);
- assertPathDoesNotExist(fs, "Deleted file", file);
- }
-
- /**
- * Read in "length" bytes, convert to an ascii string
- * @param fs filesystem
- * @param path path to read
- * @param length #of bytes to read.
- * @return the bytes read and converted to a string
- * @throws IOException IO problems
- */
- public static String readBytesToString(FileSystem fs,
- Path path,
- int length) throws IOException {
- FSDataInputStream in = fs.open(path);
- try {
- byte[] buf = new byte[length];
- in.readFully(0, buf);
- return toChar(buf);
- } finally {
- in.close();
- }
- }
-
- /**
- * Take an array of filestats and convert to a string (prefixed w/ a [01] counter
- * @param stats array of stats
- * @param separator separator after every entry
- * @return a stringified set
- */
- public static String fileStatsToString(FileStatus[] stats, String separator) {
- StringBuilder buf = new StringBuilder(stats.length * 128);
- for (int i = 0; i < stats.length; i++) {
- buf.append(String.format("[%02d] %s", i, stats[i])).append(separator);
- }
- return buf.toString();
- }
-
- /**
- * List a directory
- * @param fileSystem FS
- * @param path path
- * @return a directory listing or failure message
- * @throws IOException
- */
- public static String ls(FileSystem fileSystem, Path path) throws IOException {
- if (path == null) {
- //surfaces when someone calls getParent() on something at the top of the path
- return "/";
- }
- FileStatus[] stats;
- String pathtext = "ls " + path;
- try {
- stats = fileSystem.listStatus(path);
- } catch (FileNotFoundException e) {
- return pathtext + " -file not found";
- } catch (IOException e) {
- return pathtext + " -failed: " + e;
- }
- return dumpStats(pathtext, stats);
- }
-
- public static String dumpStats(String pathname, FileStatus[] stats) {
- return pathname + fileStatsToString(stats, "\n");
- }
-
- /**
- * Assert that a file exists and whose {@link FileStatus} entry
- * declares that this is a file and not a symlink or directory.
- * @param fileSystem filesystem to resolve path against
- * @param filename name of the file
- * @throws IOException IO problems during file operations
- */
- public static void assertIsFile(FileSystem fileSystem, Path filename) throws
- IOException {
- assertPathExists(fileSystem, "Expected file", filename);
- FileStatus status = fileSystem.getFileStatus(filename);
- assertIsFile(filename, status);
- }
-
- /**
- * Assert that a file exists and whose {@link FileStatus} entry
- * declares that this is a file and not a symlink or directory.
- * @param filename name of the file
- * @param status file status
- */
- public static void assertIsFile(Path filename, FileStatus status) {
- String fileInfo = filename + " " + status;
- assertFalse("File claims to be a directory " + fileInfo,
- status.isDirectory());
- assertFalse("File claims to be a symlink " + fileInfo,
- status.isSymlink());
- }
-
- /**
- * Create a dataset for use in the tests; all data is in the range
- * base to (base+modulo-1) inclusive
- * @param len length of data
- * @param base base of the data
- * @param modulo the modulo
- * @return the newly generated dataset
- */
- public static byte[] dataset(int len, int base, int modulo) {
- byte[] dataset = new byte[len];
- for (int i = 0; i < len; i++) {
- dataset[i] = (byte) (base + (i % modulo));
- }
- return dataset;
- }
-
- /**
- * Assert that a path exists -but make no assertions as to the
- * type of that entry
- *
- * @param fileSystem filesystem to examine
- * @param message message to include in the assertion failure message
- * @param path path in the filesystem
- * @throws FileNotFoundException raised if the path is missing
- * @throws IOException IO problems
- */
- public static void assertPathExists(FileSystem fileSystem, String message,
- Path path) throws IOException {
- if (!fileSystem.exists(path)) {
- //failure, report it
- String listing = ls(fileSystem, path.getParent());
- throw new FileNotFoundException(message + ": not found " + path
- + " in \"" + path.getParent() + "\" :\n" + listing);
- }
- }
-
- /**
- * Assert that a path does not exist
- *
- * @param fileSystem filesystem to examine
- * @param message message to include in the assertion failure message
- * @param path path in the filesystem
- * @throws IOException IO problems
- */
- public static void assertPathDoesNotExist(FileSystem fileSystem,
- String message,
- Path path) throws IOException {
- try {
- FileStatus status = fileSystem.getFileStatus(path);
- fail(message + ": unexpectedly found " + path + " as " + status);
- } catch (FileNotFoundException expected) {
- //this is expected
-
- }
- }
-
- /**
- * Assert that a FileSystem.listStatus on a dir finds the subdir/child entry
- * @param fs filesystem
- * @param dir directory to scan
- * @param subdir full path to look for
- * @throws IOException IO probles
- */
- public static void assertListStatusFinds(FileSystem fs,
- Path dir,
- Path subdir) throws IOException {
- FileStatus[] stats = fs.listStatus(dir);
- boolean found = false;
- StringBuilder builder = new StringBuilder();
- for (FileStatus stat : stats) {
- builder.append(stat.toString()).append('\n');
- if (stat.getPath().equals(subdir)) {
- found = true;
- }
- }
- assertTrue("Path " + subdir
- + " not found in directory " + dir + ":" + builder,
- found);
- }
-
- /**
- * Test for the host being an OSX machine
- * @return true if the JVM thinks that is running on OSX
- */
- public static boolean isOSX() {
- return System.getProperty("os.name").contains("OS X");
- }
-
- /**
- * compare content of file operations using a double byte array
- * @param concat concatenated files
- * @param bytes bytes
- */
- public static void validateFileContent(byte[] concat, byte[][] bytes) {
- int idx = 0;
- boolean mismatch = false;
-
- for (byte[] bb : bytes) {
- for (byte b : bb) {
- if (b != concat[idx++]) {
- mismatch = true;
- break;
- }
- }
- if (mismatch)
- break;
- }
- assertFalse("File content of file is not as expected at offset " + idx,
- mismatch);
- }
-
- /**
- * Receives test data from the given input file and checks the size of the
- * data as well as the pattern inside the received data.
- *
- * @param fs FileSystem
- * @param path Input file to be checked
- * @param expectedSize the expected size of the data to be read from the
- * input file in bytes
- * @param bufferLen Pattern length
- * @param modulus Pattern modulus
- * @throws IOException
- * thrown if an error occurs while reading the data
- */
- public static void verifyReceivedData(FileSystem fs, Path path,
- final long expectedSize,
- final int bufferLen,
- final int modulus) throws IOException {
- final byte[] testBuffer = new byte[bufferLen];
-
- long totalBytesRead = 0;
- int nextExpectedNumber = 0;
- final InputStream inputStream = fs.open(path);
- try {
- while (true) {
- final int bytesRead = inputStream.read(testBuffer);
- if (bytesRead < 0) {
- break;
- }
-
- totalBytesRead += bytesRead;
-
- for (int i = 0; i < bytesRead; ++i) {
- if (testBuffer[i] != nextExpectedNumber) {
- throw new IOException("Read number " + testBuffer[i]
- + " but expected " + nextExpectedNumber);
- }
-
- ++nextExpectedNumber;
-
- if (nextExpectedNumber == modulus) {
- nextExpectedNumber = 0;
- }
- }
- }
-
- if (totalBytesRead != expectedSize) {
- throw new IOException("Expected to read " + expectedSize +
- " bytes but only received " + totalBytesRead);
- }
- } finally {
- inputStream.close();
- }
- }
-
- /**
- * Generates test data of the given size according to some specific pattern
- * and writes it to the provided output file.
- *
- * @param fs FileSystem
- * @param path Test file to be generated
- * @param size The size of the test data to be generated in bytes
- * @param bufferLen Pattern length
- * @param modulus Pattern modulus
- * @throws IOException
- * thrown if an error occurs while writing the data
- */
- public static long generateTestFile(FileSystem fs, Path path,
- final long size,
- final int bufferLen,
- final int modulus) throws IOException {
- final byte[] testBuffer = new byte[bufferLen];
- for (int i = 0; i < testBuffer.length; ++i) {
- testBuffer[i] = (byte) (i % modulus);
- }
-
- final OutputStream outputStream = fs.create(path, false);
- long bytesWritten = 0;
- try {
- while (bytesWritten < size) {
- final long diff = size - bytesWritten;
- if (diff < testBuffer.length) {
- outputStream.write(testBuffer, 0, (int) diff);
- bytesWritten += diff;
- } else {
- outputStream.write(testBuffer);
- bytesWritten += testBuffer.length;
- }
- }
-
- return bytesWritten;
- } finally {
- outputStream.close();
- }
- }
-
- /**
- * Creates and reads a file with the given size. The test file is generated
- * according to a specific pattern so it can be easily verified even if it's
- * a multi-GB one.
- * During the read phase the incoming data stream is also checked against
- * this pattern.
- *
- * @param fs FileSystem
- * @param parent Test file parent dir path
- * @throws IOException
- * thrown if an I/O error occurs while writing or reading the test file
- */
- public static void createAndVerifyFile(FileSystem fs, Path parent, final long fileSize)
- throws IOException {
- int testBufferSize = fs.getConf()
- .getInt(IO_CHUNK_BUFFER_SIZE, DEFAULT_IO_CHUNK_BUFFER_SIZE);
- int modulus = fs.getConf()
- .getInt(IO_CHUNK_MODULUS_SIZE, DEFAULT_IO_CHUNK_MODULUS_SIZE);
-
- final String objectName = UUID.randomUUID().toString();
- final Path objectPath = new Path(parent, objectName);
-
- // Write test file in a specific pattern
- assertEquals(fileSize,
- generateTestFile(fs, objectPath, fileSize, testBufferSize, modulus));
- assertPathExists(fs, "not created successful", objectPath);
-
- // Now read the same file back and verify its content
- try {
- verifyReceivedData(fs, objectPath, fileSize, testBufferSize, modulus);
- } finally {
- // Delete test file
- fs.delete(objectPath, false);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/hadoop/blob/751ce72b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/tools/TestUtility.java
----------------------------------------------------------------------
diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/tools/TestUtility.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/tools/TestUtility.java
deleted file mode 100644
index 78ce3e7..0000000
--- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-applications/hadoop-yarn-slider/hadoop-yarn-slider-core/src/test/java/org/apache/slider/tools/TestUtility.java
+++ /dev/null
@@ -1,181 +0,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.slider.tools;
-
-import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
-import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
-import org.apache.commons.compress.utils.IOUtils;
-import org.junit.Assert;
-import org.junit.rules.TemporaryFolder;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-
-/**
- * Various utility methods
- * Byte comparison methods are from
- * <code>org.apache.hadoop.fs.contract.ContractTestUtils</code>
- */
-public class TestUtility {
- protected static final Logger log =
- LoggerFactory.getLogger(TestUtility.class);
-
- public static void addDir(File dirObj, ZipArchiveOutputStream zipFile, String prefix) throws IOException {
- for (File file : dirObj.listFiles()) {
- if (file.isDirectory()) {
- addDir(file, zipFile, prefix + file.getName() + File.separator);
- } else {
- log.info("Adding to zip - " + prefix + file.getName());
- zipFile.putArchiveEntry(new ZipArchiveEntry(prefix + file.getName()));
- IOUtils.copy(new FileInputStream(file), zipFile);
- zipFile.closeArchiveEntry();
- }
- }
- }
-
- public static void zipDir(String zipFile, String dir) throws IOException {
- File dirObj = new File(dir);
- ZipArchiveOutputStream out = new ZipArchiveOutputStream(new FileOutputStream(zipFile));
- log.info("Creating : {}", zipFile);
- try {
- addDir(dirObj, out, "");
- } finally {
- out.close();
- }
- }
-
- public static String createAppPackage(
- TemporaryFolder folder, String subDir, String pkgName, String srcPath) throws IOException {
- String zipFileName;
- File pkgPath = folder.newFolder(subDir);
- File zipFile = new File(pkgPath, pkgName).getAbsoluteFile();
- zipFileName = zipFile.getAbsolutePath();
- TestUtility.zipDir(zipFileName, srcPath);
- log.info("Created temporary zip file at {}", zipFileName);
- return zipFileName;
- }
-
-
- /**
- * Assert that tthe array original[0..len] and received[] are equal.
- * A failure triggers the logging of the bytes near where the first
- * difference surfaces.
- * @param original source data
- * @param received actual
- * @param len length of bytes to compare
- */
- public static void compareByteArrays(byte[] original,
- byte[] received,
- int len) {
- Assert.assertEquals("Number of bytes read != number written",
- len, received.length);
- int errors = 0;
- int first_error_byte = -1;
- for (int i = 0; i < len; i++) {
- if (original[i] != received[i]) {
- if (errors == 0) {
- first_error_byte = i;
- }
- errors++;
- }
- }
-
- if (errors > 0) {
- String message = String.format(" %d errors in file of length %d",
- errors, len);
- log.warn(message);
- // the range either side of the first error to print
- // this is a purely arbitrary number, to aid user debugging
- final int overlap = 10;
- for (int i = Math.max(0, first_error_byte - overlap);
- i < Math.min(first_error_byte + overlap, len);
- i++) {
- byte actual = received[i];
- byte expected = original[i];
- String letter = toChar(actual);
- String line = String.format("[%04d] %2x %s\n", i, actual, letter);
- if (expected != actual) {
- line = String.format("[%04d] %2x %s -expected %2x %s\n",
- i,
- actual,
- letter,
- expected,
- toChar(expected));
- }
- log.warn(line);
- }
- Assert.fail(message);
- }
- }
- /**
- * Convert a byte to a character for printing. If the
- * byte value is < 32 -and hence unprintable- the byte is
- * returned as a two digit hex value
- * @param b byte
- * @return the printable character string
- */
- public static String toChar(byte b) {
- if (b >= 0x20) {
- return Character.toString((char) b);
- } else {
- return String.format("%02x", b);
- }
- }
-
- /**
- * Convert a buffer to a string, character by character
- * @param buffer input bytes
- * @return a string conversion
- */
- public static String toChar(byte[] buffer) {
- StringBuilder builder = new StringBuilder(buffer.length);
- for (byte b : buffer) {
- builder.append(toChar(b));
- }
- return builder.toString();
- }
-
- public static byte[] toAsciiByteArray(String s) {
- char[] chars = s.toCharArray();
- int len = chars.length;
- byte[] buffer = new byte[len];
- for (int i = 0; i < len; i++) {
- buffer[i] = (byte) (chars[i] & 0xff);
- }
- return buffer;
- }
-
- /**
- * Create a dataset for use in the tests; all data is in the range
- * base to (base+modulo-1) inclusive
- * @param len length of data
- * @param base base of the data
- * @param modulo the modulo
- * @return the newly generated dataset
- */
- public static byte[] dataset(int len, int base, int modulo) {
- byte[] dataset = new byte[len];
- for (int i = 0; i < len; i++) {
- dataset[i] = (byte) (base + (i % modulo));
- }
- return dataset;
- }
-}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org