hotspot/test/runtime/ErrorHandling/SecondaryErrorTest.java
author dholmes
Thu, 12 Mar 2015 19:34:50 -0400
changeset 29573 2d800e5d575f
parent 28944 0fce29a072f1
child 29678 dd2f3932c21e
permissions -rw-r--r--
8074552: SafeFetch32 and SafeFetchN do not work in error handling Reviewed-by: dholmes, goetz Contributed-by: Thomas Stufe <thomas.stuefe@gmail.com>
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
28944
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     1
import java.io.BufferedReader;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     2
import java.io.File;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     3
import java.io.FileInputStream;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     4
import java.io.InputStreamReader;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     5
import java.util.regex.Pattern;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     6
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     7
import com.oracle.java.testlibrary.OutputAnalyzer;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     8
import com.oracle.java.testlibrary.Platform;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
     9
import com.oracle.java.testlibrary.ProcessTools;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    10
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    11
/*
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    12
 * @test
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    13
 * @bug 8065896
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    14
 * @summary Synchronous signals during error reporting may terminate or hang VM process
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    15
 * @library /testlibrary
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    16
 * @author Thomas Stuefe (SAP)
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    17
 */
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    18
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    19
public class SecondaryErrorTest {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    20
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    21
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    22
  public static void main(String[] args) throws Exception {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    23
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    24
    // Do not execute for windows, nor for non-debug builds
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    25
    if (Platform.isWindows()) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    26
      return;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    27
    }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    28
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    29
    if (!Platform.isDebugBuild()) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    30
      return;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    31
    }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    32
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    33
    ProcessBuilder pb = ProcessTools.createJavaProcessBuilder(
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    34
        "-XX:+UnlockDiagnosticVMOptions",
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    35
        "-Xmx100M",
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    36
        "-XX:ErrorHandlerTest=15",
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    37
        "-XX:TestCrashInErrorHandler=14",
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    38
        "-version");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    39
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    40
    OutputAnalyzer output_detail = new OutputAnalyzer(pb.start());
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    41
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    42
    // we should have crashed with a SIGFPE
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    43
    output_detail.shouldMatch("# A fatal error has been detected by the Java Runtime Environment:.*");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    44
    output_detail.shouldMatch("# +SIGFPE.*");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    45
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    46
    // extract hs-err file
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    47
    String hs_err_file = output_detail.firstMatch("# *(\\S*hs_err_pid\\d+\\.log)", 1);
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    48
    if (hs_err_file == null) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    49
      throw new RuntimeException("Did not find hs-err file in output.\n");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    50
    }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    51
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    52
    // scan hs-err file: File should contain the "[error occurred during error reporting..]"
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    53
    // markers which show that the secondary error handling kicked in and handled the
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    54
    // error successfully. As an added test, we check that the last line contains "END.",
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    55
    // which is an end marker written in the last step and proves that hs-err file was
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    56
    // completely written.
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    57
    File f = new File(hs_err_file);
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    58
    if (!f.exists()) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    59
      throw new RuntimeException("hs-err file missing at "
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    60
          + f.getAbsolutePath() + ".\n");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    61
    }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    62
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    63
    System.out.println("Found hs_err file. Scanning...");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    64
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    65
    FileInputStream fis = new FileInputStream(f);
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    66
    BufferedReader br = new BufferedReader(new InputStreamReader(fis));
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    67
    String line = null;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    68
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    69
    Pattern [] pattern = new Pattern[] {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    70
        Pattern.compile("Will crash now \\(TestCrashInErrorHandler=14\\)..."),
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    71
        Pattern.compile("\\[error occurred during error reporting \\(test secondary crash 1\\).*\\]"),
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    72
        Pattern.compile("Will crash now \\(TestCrashInErrorHandler=14\\)..."),
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    73
        Pattern.compile("\\[error occurred during error reporting \\(test secondary crash 2\\).*\\]"),
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    74
    };
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    75
    int currentPattern = 0;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    76
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    77
    String lastLine = null;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    78
    while ((line = br.readLine()) != null) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    79
      if (currentPattern < pattern.length) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    80
        if (pattern[currentPattern].matcher(line).matches()) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    81
          System.out.println("Found: " + line + ".");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    82
          currentPattern ++;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    83
        }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    84
      }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    85
      lastLine = line;
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    86
    }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    87
    br.close();
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    88
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    89
    if (currentPattern < pattern.length) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    90
      throw new RuntimeException("hs-err file incomplete (first missing pattern: " +  currentPattern + ")");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    91
    }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    92
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    93
    if (!lastLine.equals("END.")) {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    94
      throw new RuntimeException("hs-err file incomplete (missing END marker.)");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    95
    } else {
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    96
      System.out.println("End marker found.");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    97
    }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    98
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
    99
    System.out.println("OK.");
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
   100
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
   101
  }
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
   102
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
   103
}
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
   104
0fce29a072f1 8072575: Add missing test for 8065895
dholmes
parents:
diff changeset
   105