ソースを参照

HADOOP-12472. Make GenericTestUtils.assertExceptionContains robust. Contributed by Steve Loughran.

(cherry picked from commit a01a209fbed33b2ecaf9e736631e64abefae01aa)
Jing Zhao 9 年 前
コミット
00f7d729c6

+ 6 - 0
hadoop-common-project/hadoop-common/CHANGES.txt

@@ -30,6 +30,9 @@ Release 2.7.6 - UNRELEASED
     HADOOP-15279. Increase maven heap size recommendations.
     (Allen Wittenauer via aajisaka)
 
+    HADOOP-12472. Make GenericTestUtils.assertExceptionContains robust.
+    (Steve Loughran via jing9)
+
   OPTIMIZATIONS
 
   BUG FIXES
@@ -132,6 +135,9 @@ Release 2.7.4 - 2017-08-04
 
     HADOOP-14440. Add metrics for connections dropped. (Eric Badger via kihwal)
 
+    HADOOP-12472. Make GenericTestUtils.assertExceptionContains robust.
+    (Steve Loughran via jing9)
+
   OPTIMIZATIONS
 
     HADOOP-14138. Remove S3A ref from META-INF service discovery, rely on

+ 25 - 5
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/GenericTestUtils.java

@@ -141,12 +141,32 @@ public abstract class GenericTestUtils {
         Joiner.on(",").join(expectedSet),
         Joiner.on(",").join(found));
   }
-  
+
+  protected static String E_NULL_THROWABLE = "Null Throwable";
+  protected static String E_NULL_THROWABLE_STRING =
+      "Null Throwable.toString() value";
+  protected static String E_UNEXPECTED_EXCEPTION =
+      "but got unexpected exception";
+
+  /**
+   * Assert that an exception's <code>toString()</code> value
+   * contained the expected text.
+   * @param string expected string
+   * @param t thrown exception
+   * @throws AssertionError if the expected string is not found
+   */
   public static void assertExceptionContains(String string, Throwable t) {
-    String msg = t.getMessage();
-    Assert.assertTrue(
-        "Expected to find '" + string + "' but got unexpected exception:"
-        + StringUtils.stringifyException(t), msg.contains(string));
+    Assert.assertNotNull(E_NULL_THROWABLE, t);
+    String msg = t.toString();
+    if (msg == null) {
+      throw new AssertionError(E_NULL_THROWABLE_STRING, t);
+    }
+    if (!msg.contains(string)) {
+      throw new AssertionError("Expected to find '" + string + "' "
+          + E_UNEXPECTED_EXCEPTION + ":"
+          + StringUtils.stringifyException(t),
+          t);
+    }
   }  
 
   public static void waitFor(Supplier<Boolean> check,

+ 78 - 0
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/test/TestGenericTestUtils.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.hadoop.test;
+
+import org.junit.Test;
+
+public class TestGenericTestUtils extends GenericTestUtils {
+
+  @Test
+  public void testAssertExceptionContainsNullEx() throws Throwable {
+    try {
+      assertExceptionContains("", null);
+    } catch (AssertionError e) {
+      if (!e.toString().contains(E_NULL_THROWABLE)) {
+        throw e;
+      }
+    }
+  }
+
+  @Test
+  public void testAssertExceptionContainsNullString() throws Throwable {
+    try {
+      assertExceptionContains("", new BrokenException());
+    } catch (AssertionError e) {
+      if (!e.toString().contains(E_NULL_THROWABLE_STRING)) {
+        throw e;
+      }
+    }
+  }
+
+  @Test
+  public void testAssertExceptionContainsWrongText() throws Throwable {
+    try {
+      assertExceptionContains("Expected", new Exception("(actual)"));
+    } catch (AssertionError e) {
+      String s = e.toString();
+      if (!s.contains(E_UNEXPECTED_EXCEPTION)
+          || !s.contains("(actual)") ) {
+        throw e;
+      }
+      if (e.getCause() == null) {
+        throw new AssertionError("No nested cause in assertion", e);
+      }
+    }
+  }
+
+  @Test
+  public void testAssertExceptionContainsWorking() throws Throwable {
+    assertExceptionContains("Expected", new Exception("Expected"));
+  }
+
+  private static class BrokenException extends Exception {
+    public BrokenException() {
+    }
+
+    @Override
+    public String toString() {
+      return null;
+    }
+  }
+
+}