From 4549d429e8caf5b69b3dacf919d1f8c67c1566f8 Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Fri, 4 Feb 2022 14:05:11 -0800 Subject: [PATCH 1/8] YARN-11072. fix: display logo when changing APPLICATION_WEB_PROXY_BASE --- .../java/org/apache/hadoop/yarn/webapp/view/HeaderBlock.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/HeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/HeaderBlock.java index 3a0f35a2f34c9..f1435ff63b5ea 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/HeaderBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/main/java/org/apache/hadoop/yarn/webapp/view/HeaderBlock.java @@ -33,7 +33,7 @@ public class HeaderBlock extends HtmlBlock { div("#user"). __(loggedIn).__(). div("#logo"). - img("/static/hadoop-st.png").__(). + img(root_url("static/hadoop-st.png")).__(). h1($(TITLE)).__(); } } From e216f301b24b3ad8739a3a97f49a109a59ac20ac Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Fri, 4 Feb 2022 22:02:52 -0800 Subject: [PATCH 2/8] test: add test for HeaderBlock --- .../hadoop-yarn/hadoop-yarn-common/pom.xml | 5 ++ .../yarn/webapp/view/TestHeaderBlock.java | 48 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml index efebb0853d707..0ab6ada67402b 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml @@ -205,6 +205,11 @@ javax.ws.rs javax.ws.rs-api + + com.github.stefanbirkner + system-lambda + 1.2.1 + diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java new file mode 100644 index 0000000000000..d72c04c9c137f --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java @@ -0,0 +1,48 @@ +/** +* 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.yarn.webapp.view; + +import com.google.inject.Injector; + +import java.io.PrintWriter; + +import org.apache.hadoop.yarn.webapp.WebAppException; +import org.apache.hadoop.yarn.webapp.test.WebAppTests; + +import org.junit.Test; + +import static org.mockito.Mockito.*; +import static com.github.stefanbirkner.systemlambda.SystemLambda.*; + +public class TestHeaderBlock { + private String envkey = "APPLICATION_WEB_PROXY_BASE"; + private String envvalue = "/hadoop"; + + public void checkImgPath() { + Injector injector = WebAppTests.testBlock(HeaderBlock.class); + PrintWriter out = injector.getInstance(PrintWriter.class); + String expectation = " src=\""+envvalue+"/static/hadoop-st.png\""; + verify(out).print(expectation); + } + + @Test + public void testImgPath() throws Exception { + withEnvironmentVariable(envkey, envvalue).execute(() -> checkImgPath()); + } +} From de297770751875804ffebf76093f2034a5d757bf Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Fri, 4 Feb 2022 22:28:21 -0800 Subject: [PATCH 3/8] fix: remove dependency for setting env variable --- .../hadoop-yarn/hadoop-yarn-common/pom.xml | 5 -- .../yarn/webapp/view/TestHeaderBlock.java | 49 +++++++++++++++---- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml index 0ab6ada67402b..efebb0853d707 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/pom.xml @@ -205,11 +205,6 @@ javax.ws.rs javax.ws.rs-api - - com.github.stefanbirkner - system-lambda - 1.2.1 - diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java index d72c04c9c137f..6c1230239c48f 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java @@ -21,6 +21,9 @@ import com.google.inject.Injector; import java.io.PrintWriter; +import java.lang.reflect.Field; +import java.util.Collections; +import java.util.Map; import org.apache.hadoop.yarn.webapp.WebAppException; import org.apache.hadoop.yarn.webapp.test.WebAppTests; @@ -28,21 +31,47 @@ import org.junit.Test; import static org.mockito.Mockito.*; -import static com.github.stefanbirkner.systemlambda.SystemLambda.*; -public class TestHeaderBlock { - private String envkey = "APPLICATION_WEB_PROXY_BASE"; - private String envvalue = "/hadoop"; + public class TestHeaderBlock { + private String envkey = "APPLICATION_WEB_PROXY_BASE"; + private String envvalue = "/hadoop"; - public void checkImgPath() { - Injector injector = WebAppTests.testBlock(HeaderBlock.class); - PrintWriter out = injector.getInstance(PrintWriter.class); - String expectation = " src=\""+envvalue+"/static/hadoop-st.png\""; - verify(out).print(expectation); + public void setEnv(Map newenv) throws Exception { + try { + Class processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); + + Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment"); + theEnvironmentField.setAccessible(true); + Map env = (Map) theEnvironmentField.get(null); + env.putAll(newenv); + + Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment"); + theCaseInsensitiveEnvironmentField.setAccessible(true); + Map cienv = (Map) theCaseInsensitiveEnvironmentField.get(null); + cienv.putAll(newenv); + } catch (NoSuchFieldException e) { + Class[] classes = Collections.class.getDeclaredClasses(); + Map env = System.getenv(); + + for(Class cl : classes) { + if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { + Field field = cl.getDeclaredField("m"); + field.setAccessible(true); + Object obj = field.get(env); + Map map = (Map) obj; + map.clear(); + map.putAll(newenv); + } + } + } } @Test public void testImgPath() throws Exception { - withEnvironmentVariable(envkey, envvalue).execute(() -> checkImgPath()); + setEnv(Collections.singletonMap(envkey, envvalue)); + Injector injector = WebAppTests.testBlock(HeaderBlock.class); + PrintWriter out = injector.getInstance(PrintWriter.class); + String expectation = " src=\""+envvalue+"/static/hadoop-st.png\""; + verify(out).print(expectation); } } From 33ef44e3b2b15c6b3e3f2f3bdd8b8b2b424f5d30 Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Fri, 4 Feb 2022 23:50:08 -0800 Subject: [PATCH 4/8] style: fix formatting --- .../hadoop/yarn/webapp/view/TestHeaderBlock.java | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java index 6c1230239c48f..d214b328cfad6 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java @@ -29,22 +29,19 @@ import org.apache.hadoop.yarn.webapp.test.WebAppTests; import org.junit.Test; - import static org.mockito.Mockito.*; - public class TestHeaderBlock { - private String envkey = "APPLICATION_WEB_PROXY_BASE"; - private String envvalue = "/hadoop"; +public class TestHeaderBlock { + private String envkey = "APPLICATION_WEB_PROXY_BASE"; + private String envvalue = "/hadoop"; - public void setEnv(Map newenv) throws Exception { + public void setEnv(Map newenv) throws Exception { try { Class processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); - Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment"); theEnvironmentField.setAccessible(true); Map env = (Map) theEnvironmentField.get(null); env.putAll(newenv); - Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment"); theCaseInsensitiveEnvironmentField.setAccessible(true); Map cienv = (Map) theCaseInsensitiveEnvironmentField.get(null); @@ -52,7 +49,6 @@ public void setEnv(Map newenv) throws Exception { } catch (NoSuchFieldException e) { Class[] classes = Collections.class.getDeclaredClasses(); Map env = System.getenv(); - for(Class cl : classes) { if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { Field field = cl.getDeclaredField("m"); @@ -66,8 +62,7 @@ public void setEnv(Map newenv) throws Exception { } } - @Test - public void testImgPath() throws Exception { + @Test public void testImgPath() throws Exception { setEnv(Collections.singletonMap(envkey, envvalue)); Injector injector = WebAppTests.testBlock(HeaderBlock.class); PrintWriter out = injector.getInstance(PrintWriter.class); From af69d74e27a61334399fe35c581ce8e0dfbf9710 Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Fri, 4 Feb 2022 23:53:21 -0800 Subject: [PATCH 5/8] refactor: remove unused import --- .../java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java index d214b328cfad6..3e8a457c96f36 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java @@ -25,7 +25,6 @@ import java.util.Collections; import java.util.Map; -import org.apache.hadoop.yarn.webapp.WebAppException; import org.apache.hadoop.yarn.webapp.test.WebAppTests; import org.junit.Test; From d18d0d15e1632c5fb260c0d0c302b651e43b0f69 Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Sat, 5 Feb 2022 10:01:51 -0800 Subject: [PATCH 6/8] test: test default img path and proxy base img path --- .../yarn/webapp/view/TestHeaderBlock.java | 48 +++++++++++++------ 1 file changed, 33 insertions(+), 15 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java index 3e8a457c96f36..b346644d04f4e 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java @@ -24,6 +24,7 @@ import java.lang.reflect.Field; import java.util.Collections; import java.util.Map; +import java.util.HashMap; import org.apache.hadoop.yarn.webapp.test.WebAppTests; @@ -31,20 +32,27 @@ import static org.mockito.Mockito.*; public class TestHeaderBlock { - private String envkey = "APPLICATION_WEB_PROXY_BASE"; - private String envvalue = "/hadoop"; - + @SuppressWarnings("unchecked") public void setEnv(Map newenv) throws Exception { try { Class processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); - Field theEnvironmentField = processEnvironmentClass.getDeclaredField("theEnvironment"); + String fieldname = "theEnvironment"; + Field theEnvironmentField = processEnvironmentClass.getDeclaredField(fieldname); + // reset environment accessibility theEnvironmentField.setAccessible(true); - Map env = (Map) theEnvironmentField.get(null); - env.putAll(newenv); - Field theCaseInsensitiveEnvironmentField = processEnvironmentClass.getDeclaredField("theCaseInsensitiveEnvironment"); - theCaseInsensitiveEnvironmentField.setAccessible(true); - Map cienv = (Map) theCaseInsensitiveEnvironmentField.get(null); - cienv.putAll(newenv); + if(theEnvironmentField.getType().equals(Map.class)) { + Map env = (Map) theEnvironmentField.get(null); + env.putAll(newenv); + } + fieldname = "theCaseInsensitiveEnvironment"; + Field theCaseInsensitiveEnvField = processEnvironmentClass.getDeclaredField(fieldname); + // reset environment accessibility + theCaseInsensitiveEnvField.setAccessible(true); + if(theCaseInsensitiveEnvField.getType().equals(Map.class)) { + Map cienv = (Map) theCaseInsensitiveEnvField.get(null); + cienv.putAll(newenv); + } + } catch (NoSuchFieldException e) { Class[] classes = Collections.class.getDeclaredClasses(); Map env = System.getenv(); @@ -52,16 +60,26 @@ public void setEnv(Map newenv) throws Exception { if("java.util.Collections$UnmodifiableMap".equals(cl.getName())) { Field field = cl.getDeclaredField("m"); field.setAccessible(true); - Object obj = field.get(env); - Map map = (Map) obj; - map.clear(); - map.putAll(newenv); + if(field.getType().equals(Map.class)) { + Map map = (Map) field.get(env); + map.clear(); + map.putAll(newenv); + } } } } } - @Test public void testImgPath() throws Exception { + @Test public void testDefaultImgPath() throws Exception { + Injector injector = WebAppTests.testBlock(HeaderBlock.class); + PrintWriter out = injector.getInstance(PrintWriter.class); + String expectation = " src=\"/static/hadoop-st.png\""; + verify(out).print(expectation); + } + + @Test public void testProxyBaseImgPath() throws Exception { + String envkey = "APPLICATION_WEB_PROXY_BASE"; + String envvalue = "/hadoop"; setEnv(Collections.singletonMap(envkey, envvalue)); Injector injector = WebAppTests.testBlock(HeaderBlock.class); PrintWriter out = injector.getInstance(PrintWriter.class); From 57e7fa00fa5968eb109ff95f266dc93bd9547a7d Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Sat, 5 Feb 2022 12:12:35 -0800 Subject: [PATCH 7/8] refactor: remove unused import --- .../java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java index b346644d04f4e..551161d0d3220 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java @@ -24,7 +24,6 @@ import java.lang.reflect.Field; import java.util.Collections; import java.util.Map; -import java.util.HashMap; import org.apache.hadoop.yarn.webapp.test.WebAppTests; From 5094c7a8e0de4b0f78c16c9b5a61ddf445d9faf2 Mon Sep 17 00:00:00 2001 From: bensonlin321 Date: Sat, 25 Jun 2022 01:09:52 -0700 Subject: [PATCH 8/8] chore: remove redundant comments --- .../org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java index 551161d0d3220..0faf60c43b5b0 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-common/src/test/java/org/apache/hadoop/yarn/webapp/view/TestHeaderBlock.java @@ -37,7 +37,7 @@ public void setEnv(Map newenv) throws Exception { Class processEnvironmentClass = Class.forName("java.lang.ProcessEnvironment"); String fieldname = "theEnvironment"; Field theEnvironmentField = processEnvironmentClass.getDeclaredField(fieldname); - // reset environment accessibility + theEnvironmentField.setAccessible(true); if(theEnvironmentField.getType().equals(Map.class)) { Map env = (Map) theEnvironmentField.get(null); @@ -45,7 +45,7 @@ public void setEnv(Map newenv) throws Exception { } fieldname = "theCaseInsensitiveEnvironment"; Field theCaseInsensitiveEnvField = processEnvironmentClass.getDeclaredField(fieldname); - // reset environment accessibility + theCaseInsensitiveEnvField.setAccessible(true); if(theCaseInsensitiveEnvField.getType().equals(Map.class)) { Map cienv = (Map) theCaseInsensitiveEnvField.get(null);