| /* |
| * Copyright 2015 Google Inc. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); you may not |
| * use this file except in compliance with the License. You may obtain a copy of |
| * the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT |
| * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the |
| * License for the specific language governing permissions and limitations under |
| * the License. |
| */ |
| package com.google.gwt.emultest.java.lang; |
| |
| import com.google.gwt.junit.client.GWTTestCase; |
| |
| /** |
| * Unit tests for the stack trace emulation integration with java.lang.Throwable class. |
| */ |
| public class ThrowableStackTraceEmulTest extends GWTTestCase { |
| |
| @Override |
| public String getModuleName() { |
| return "com.google.gwt.emultest.EmulSuite"; |
| } |
| |
| public void testStackTraceContainsConstructorLineNumber() { |
| final int lineNumber1 = 32; // should be the next line. |
| Throwable throwable = new Throwable("stacktrace"); |
| StackTraceElement[] trace = throwable.getStackTrace(); |
| assertTrue(trace.length > 0); |
| assertTrace(trace, lineNumber1, isObfuscated(trace) ? 7 : 3); |
| |
| final int lineNumber2 = 38; // should be the next line. |
| throwable.fillInStackTrace(); |
| assertTrace(throwable.getStackTrace(), lineNumber2, 2); |
| } |
| |
| private void assertTrace(StackTraceElement[] trace, final int lineNumber, int maxDepthToExamine) { |
| assertNotNull(trace); |
| assertTrue("StackTrace too short: \n" + getTraceAsString(trace), trace.length > 2); |
| StackTraceElement e = getFirstElementMentionsTest(trace, maxDepthToExamine); |
| assertEquals(lineNumber, e.getLineNumber()); |
| } |
| |
| private boolean isObfuscated(StackTraceElement[] trace) { |
| return trace[0].getClassName().equals("Unknown"); |
| } |
| |
| private StackTraceElement getFirstElementMentionsTest(StackTraceElement[] trace, |
| int maxDepthToExamine) { |
| for (int i = 0; i < maxDepthToExamine && i < trace.length; i++) { |
| StackTraceElement e = trace[i]; |
| if (e.getFileName().contains("ThrowableStackTraceEmulTest")) { |
| return e; |
| } |
| } |
| fail("Unable to find trace element: \n" + getTraceAsString(trace)); |
| return null; // shouldn't happen |
| } |
| |
| private String getTraceAsString(StackTraceElement[] trace) { |
| String result = ""; |
| for (StackTraceElement e : trace) { |
| result += e.toString() + "\n"; |
| } |
| return result; |
| } |
| } |