duke@435: # duke@435: # Copyright 2006 Sun Microsystems, Inc. All Rights Reserved. duke@435: # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. duke@435: # duke@435: # This code is free software; you can redistribute it and/or modify it duke@435: # under the terms of the GNU General Public License version 2 only, as duke@435: # published by the Free Software Foundation. duke@435: # duke@435: # This code is distributed in the hope that it will be useful, but WITHOUT duke@435: # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or duke@435: # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License duke@435: # version 2 for more details (a copy is included in the LICENSE file that duke@435: # accompanied this code). duke@435: # duke@435: # You should have received a copy of the GNU General Public License version duke@435: # 2 along with this work; if not, write to the Free Software Foundation, duke@435: # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. duke@435: # duke@435: # Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara, duke@435: # CA 95054 USA or visit www.sun.com if you need additional information or duke@435: # have any questions. duke@435: # duke@435: # duke@435: duke@435: # duke@435: # Makefile to run jtreg duke@435: # duke@435: duke@435: OSNAME = $(shell uname -s) duke@435: ifeq ($(OSNAME), SunOS) duke@435: PLATFORM = solaris duke@435: JCT_PLATFORM = solaris duke@435: ARCH = $(shell uname -p) duke@435: ifeq ($(ARCH), i386) duke@435: ARCH=i586 duke@435: endif duke@435: endif duke@435: ifeq ($(OSNAME), Linux) duke@435: PLATFORM = linux duke@435: JCT_PLATFORM = linux duke@435: ARCH = $(shell uname -m) duke@435: ifeq ($(ARCH), i386) duke@435: ARCH=i586 duke@435: endif duke@435: endif duke@435: ifeq ($(OSNAME), Windows_NT) duke@435: PLATFORM = windows duke@435: JCT_PLATFORM = win32 duke@435: ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),ia64) duke@435: ARCH=ia64 duke@435: else duke@435: ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),AMD64) duke@435: ARCH=x64 duke@435: else duke@435: ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),EM64T) duke@435: ARCH=x64 duke@435: else duke@435: ARCH=i586 duke@435: endif duke@435: endif duke@435: endif duke@435: endif duke@435: duke@435: # Default bundle of all test results (passed or not) duke@435: JPRT_ARCHIVE_BUNDLE=$(TEST_ROOT)/JPRT_ARCHIVE_BUNDLE.zip duke@435: duke@435: # Default home for JTREG duke@435: ifeq ($(PLATFORM), windows) duke@435: JT_HOME = J:/svc/jct-tools3.2.2_01 duke@435: else duke@435: JT_HOME = /java/svc/jct-tools3.2.2_01 duke@435: endif duke@435: duke@435: # Default JTREG to run duke@435: JTREG = $(JT_HOME)/$(JCT_PLATFORM)/bin/jtreg duke@435: duke@435: # Root of this test area duke@435: TEST_ROOT := $(shell pwd) duke@435: duke@435: # Default JDK to test duke@435: JAVA_HOME = $(TEST_ROOT)/../build/$(PLATFORM)-$(ARCH) duke@435: duke@435: # The test directories to run duke@435: DEFAULT_TESTDIRS = serviceability duke@435: TESTDIRS = $(DEFAULT_TESTDIRS) duke@435: duke@435: # Files that hold total passed and failed counts (passed==0 is bad) duke@435: JTREG_TOTALS_DIR = $(TEST_ROOT)/JTREG_TOTALS_$(PLATFORM)_$(ARCH) duke@435: JTREG_FAILED = $(JTREG_TOTALS_DIR)/failed_count duke@435: JTREG_PASSED = $(JTREG_TOTALS_DIR)/passed_count duke@435: duke@435: # Root of all test results duke@435: JTREG_ALL_OUTPUT_DIRNAME = JTREG_OUTPUT_$(PLATFORM)_$(ARCH) duke@435: JTREG_ALL_OUTPUT_DIR = $(TEST_ROOT)/$(JTREG_ALL_OUTPUT_DIRNAME) duke@435: duke@435: # Test results for one test directory duke@435: JTREG_TEST_OUTPUT_DIR = $(JTREG_ALL_OUTPUT_DIR)/$@ duke@435: JTREG_TEST_REPORT_DIR = $(JTREG_TEST_OUTPUT_DIR)/JTreport duke@435: JTREG_TEST_WORK_DIR = $(JTREG_TEST_OUTPUT_DIR)/JTwork duke@435: JTREG_TEST_SUMMARY = $(JTREG_TEST_REPORT_DIR)/summary.txt duke@435: duke@435: # Temp files used by this Makefile duke@435: JTREG_TEST_TEMP_DIR = $(JTREG_ALL_OUTPUT_DIR)/$@/temp duke@435: JTREG_TEMP_PASSED = $(JTREG_TEST_TEMP_DIR)/passed duke@435: JTREG_TEMP_FAILED = $(JTREG_TEST_TEMP_DIR)/failed duke@435: JTREG_TEMP_OUTPUT = $(JTREG_TEST_TEMP_DIR)/output duke@435: JTREG_TEMP_RESULTS = $(JTREG_TEST_TEMP_DIR)/results duke@435: duke@435: # JTREG options (different for 2.1.6 and 3.2.2_01) duke@435: JTREG_COMMON_OPTIONS = -r:$(JTREG_TEST_REPORT_DIR) \ duke@435: -w:$(JTREG_TEST_WORK_DIR) \ duke@435: -testjdk:$(JAVA_HOME) \ duke@435: -automatic \ duke@435: -verbose:all duke@435: JTREG_216_OPTIONS = $(JTREG_COMMON_OPTIONS) $@ $(JAVA_ARGS) duke@435: JTREG_322_OPTIONS = $(JTREG_COMMON_OPTIONS) $(JAVA_ARGS:%=-vmoption:%) $@ duke@435: duke@435: # Default make rule duke@435: all: clean check tests duke@435: duke@435: # Chaeck to make sure these directories exist duke@435: check: $(JT_HOME) $(JAVA_HOME) $(JTREG) duke@435: duke@435: # Prime the test run duke@435: primecounts: FRC duke@435: @rm -f -r $(JTREG_TOTALS_DIR) duke@435: @mkdir -p $(JTREG_TOTALS_DIR) duke@435: @echo "0" > $(JTREG_FAILED) duke@435: @echo "0" > $(JTREG_PASSED) duke@435: duke@435: # Run the tests and determine the 'make' command exit status duke@435: # Ultimately we determine the make exit code based on the passed/failed count duke@435: tests: primecounts $(TESTDIRS) duke@435: @echo "JTREG TOTAL: passed=`cat $(JTREG_PASSED)` failed=`cat $(JTREG_FAILED)`" duke@435: zip -q -r $(JPRT_ARCHIVE_BUNDLE) $(JTREG_ALL_OUTPUT_DIRNAME) duke@435: @if [ `cat $(JTREG_FAILED)` -ne 0 -o \ duke@435: `cat $(JTREG_PASSED)` -le 0 ] ; then \ duke@435: echo "JTREG FAILED"; \ duke@435: exit 1; \ duke@435: else \ duke@435: echo "JTREG PASSED"; \ duke@435: exit 0; \ duke@435: fi duke@435: duke@435: # Just make sure these directires exist duke@435: $(JT_HOME) $(JAVA_HOME): FRC duke@435: @if [ ! -d $@ ] ; then \ duke@435: echo "ERROR: Directory $@ does not exist"; \ duke@435: exit 1; \ duke@435: fi duke@435: duke@435: # Make sure this file exists duke@435: $(JTREG): FRC duke@435: @if [ ! -f $@ ] ; then \ duke@435: echo "ERROR: File $@ does not exist"; \ duke@435: exit 1; \ duke@435: fi duke@435: duke@435: # Process each test directory one by one, this rule always completes. duke@435: # Note that the use of 'tee' tosses the jtreg process exit status, this duke@435: # is as expected because even if jtreg fails, we need to save the duke@435: # output. So we update the JTREG_PASSED and JTREG_FAILED count files. duke@435: # Note that missing the 'results:' line in the last few lines of output duke@435: # will indicate a failure (or a bump by one of the JTREG_FAILED file. duke@435: # Note that passed: 0 or no passed: indication means a failure. duke@435: # Note that any indication of the word 'failed' indicates failure. duke@435: # Ultimately if the contents of JTREG_FAILED is not 0, we have failed duke@435: # tests, and if the contents of JTREG_PASSED is 0, we consider that a duke@435: # failure. duke@435: $(TESTDIRS): FRC duke@435: @if [ ! -d $@ ] ; then \ duke@435: echo "ERROR: Directory $@ does not exist"; \ duke@435: exit 1; \ duke@435: fi duke@435: @echo "---------------------------------------------------" duke@435: @rm -f -r $(JTREG_TEST_OUTPUT_DIR) duke@435: @mkdir -p $(JTREG_TEST_OUTPUT_DIR) duke@435: @mkdir -p $(JTREG_TEST_WORK_DIR) duke@435: @mkdir -p $(JTREG_TEST_WORK_DIR)/scratch duke@435: @mkdir -p $(JTREG_TEST_REPORT_DIR) duke@435: @mkdir -p $(JTREG_TEST_TEMP_DIR) duke@435: @echo "Testing $@" duke@435: @echo "Using JAVA_HOME=$(JAVA_HOME)" duke@435: @echo "Using JAVA_ARGS=$(JAVA_ARGS)" duke@435: @if [ "`$(JTREG) -help 2>&1 | fgrep -- -vmoption`" != "" ] ; then \ duke@435: echo "Assume we are using jtreg 3.2.2_01 or newer"; \ duke@435: echo "$(JTREG) $(JTREG_322_OPTIONS)"; \ duke@435: $(JTREG) $(JTREG_322_OPTIONS) 2>&1 | tee $(JTREG_TEMP_OUTPUT) ; \ duke@435: else \ duke@435: echo "Assume we are using jtreg 2.1.6"; \ duke@435: echo "$(JTREG) $(JTREG_216_OPTIONS)"; \ duke@435: $(JTREG) $(JTREG_216_OPTIONS) 2>&1 | tee $(JTREG_TEMP_OUTPUT) ; \ duke@435: fi duke@435: @echo "---------------------------------------------------" duke@435: @echo "Extracting passed and failed counts from jtreg output" duke@435: @tail -10 $(JTREG_TEMP_OUTPUT) | fgrep -i 'results:' | \ duke@435: tail -1 | tee $(JTREG_TEMP_RESULTS) duke@435: @sed -e 's@.*\ passed:\ \([1-9][0-9]*\).*@\1@' $(JTREG_TEMP_RESULTS) \ duke@435: > $(JTREG_TEMP_PASSED) duke@435: @if [ "`cat $(JTREG_TEMP_PASSED)`" = "" ] ; then \ duke@435: echo "ERROR: No passed indication in results"; \ duke@435: expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \ duke@435: elif [ `cat $(JTREG_TEMP_PASSED)` -le 0 ] ; then \ duke@435: echo "ERROR: Passed count appears to be 0"; \ duke@435: expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \ duke@435: elif [ "`fgrep -i failed $(JTREG_TEMP_RESULTS)`" = "" ] ; then \ duke@435: echo "No indication anything failed"; \ duke@435: expr `cat $(JTREG_PASSED)` '+' `cat $(JTREG_TEMP_PASSED)` \ duke@435: > $(JTREG_PASSED); \ duke@435: else \ duke@435: sed -e 's@.*\ failed:\ \([1-9][0-9]*\).*@\1@' $(JTREG_TEMP_FAILED) \ duke@435: > $(JTREG_TEMP_FAILED); \ duke@435: if [ "`cat $(JTREG_TEMP_FAILED)`" = "" ] ; then \ duke@435: echo "ERROR: Failed pattern but no failed count in results"; \ duke@435: expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \ duke@435: elif [ `cat $(JTREG_TEMP_FAILED)` -le 0 ] ; then \ duke@435: echo "ERROR: Failed count is 0, did something failed or not?"; \ duke@435: expr `cat $(JTREG_FAILED)` '+' 1 > $(JTREG_FAILED); \ duke@435: else \ duke@435: expr `cat $(JTREG_FAILED)` '+' `cat $(JTREG_TEMP_FAILED)` \ duke@435: > $(JTREG_FAILED); \ duke@435: fi; \ duke@435: fi duke@435: @echo "---------------------------------------------------" duke@435: @echo "Summary: " duke@435: @if [ -f $(JTREG_TEST_SUMMARY) ] ; then \ duke@435: cat $(JTREG_TEST_SUMMARY) ; \ duke@435: else \ duke@435: echo "ERROR: Missing $(JTREG_TEST_SUMMARY)"; \ duke@435: fi duke@435: @echo "---------------------------------------------------" duke@435: duke@435: # Cleanup duke@435: clean: duke@435: rm -f -r $(JTREG_ALL_OUTPUT_DIR) duke@435: rm -f $(JPRT_ARCHIVE_BUNDLE) duke@435: duke@435: FRC: duke@435: