1 # 2 # Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved. 3 # DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 # 5 # This code is free software; you can redistribute it and/or modify it 6 # under the terms of the GNU General Public License version 2 only, as 7 # published by the Free Software Foundation. Oracle designates this 8 # particular file as subject to the "Classpath" exception as provided 9 # by Oracle in the LICENSE file that accompanied this code. 10 # 11 # This code is distributed in the hope that it will be useful, but WITHOUT 12 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 13 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14 # version 2 for more details (a copy is included in the LICENSE file that 15 # accompanied this code). 16 # 17 # You should have received a copy of the GNU General Public License version 18 # 2 along with this work; if not, write to the Free Software Foundation, 19 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 20 # 21 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 22 # or visit www.oracle.com if you need additional information or have any 23 # questions. 24 # 25 26 # 27 # Makefile to run various jdk tests 28 # 29 30 .DEFAULT : all 31 32 # Empty these to get rid of some default rules 33 .SUFFIXES: 34 .SUFFIXES: .java 35 CO= 36 GET= 37 38 # Utilities used 39 AWK = awk 40 CAT = cat 41 CD = cd 42 CHMOD = chmod 43 CP = cp 44 CUT = cut 45 DIRNAME = dirname 46 ECHO = echo 47 EGREP = egrep 48 EXPAND = expand 49 FIND = find 50 MKDIR = mkdir 51 PWD = pwd 52 SED = sed 53 SORT = sort 54 TEE = tee 55 UNAME = uname 56 UNIQ = uniq 57 WC = wc 58 ZIP = zip 59 60 # Get OS name from uname (Cygwin inexplicably adds _NT-5.1) 61 UNAME_S := $(shell $(UNAME) -s | $(CUT) -f1 -d_) 62 63 # Commands to run on paths to make mixed paths for java on windows 64 ifeq ($(UNAME_S), CYGWIN) 65 # Location of developer shared files 66 SLASH_JAVA = J: 67 GETMIXEDPATH = cygpath -m 68 else 69 # Location of developer shared files 70 SLASH_JAVA = /java 71 72 GETMIXEDPATH=$(ECHO) 73 endif 74 75 # Root of this test area (important to use full paths in some places) 76 TEST_ROOT := $(shell $(PWD)) 77 78 # Root of all test results 79 ifdef ALT_OUTPUTDIR 80 ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD)) 81 else 82 ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD)) 83 endif 84 85 ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR) 86 ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR) 87 88 # Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test) 89 ifndef PRODUCT_HOME 90 # Try to use j2sdk-image if it exists 91 ABS_JDK_IMAGE = $(ABS_PLATFORM_BUILD_ROOT)/images/j2sdk-image 92 PRODUCT_HOME := \ 93 $(shell \ 94 if [ -d $(ABS_JDK_IMAGE) ] ; then \ 95 $(ECHO) "$(ABS_JDK_IMAGE)"; \ 96 else \ 97 $(ECHO) "$(ABS_PLATFORM_BUILD_ROOT)"; \ 98 fi) 99 PRODUCT_HOME := $(PRODUCT_HOME) 100 endif 101 102 # Expect JPRT to set JPRT_PRODUCT_ARGS (e.g. -server etc.) 103 # Should be passed into 'java' only. 104 # Could include: -d64 -server -client OR any java option 105 ifdef JPRT_PRODUCT_ARGS 106 JAVA_ARGS = $(JPRT_PRODUCT_ARGS) 107 endif 108 109 # Expect JPRT to set JPRT_PRODUCT_VM_ARGS (e.g. -Xcomp etc.) 110 # Should be passed into anything running the vm (java, javac, javadoc, ...). 111 ifdef JPRT_PRODUCT_VM_ARGS 112 JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS) 113 endif 114 115 # jtreg -nativepath <dir> 116 # 117 # Local make tests will be TEST_IMAGE_DIR and JPRT with jprt.use.reg.test.bundle=true 118 # should be JPRT_TESTNATIVE_PATH 119 ifndef TESTNATIVE_DIR 120 ifdef TEST_IMAGE_DIR 121 TESTNATIVE_DIR = $(TEST_IMAGE_DIR) 122 else 123 TESTNATIVE_DIR = $(JPRT_TESTNATIVE_PATH) 124 endif 125 endif 126 127 # Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results) 128 ifdef JPRT_ARCHIVE_BUNDLE 129 ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE) 130 else 131 ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip 132 endif 133 134 # How to create the test bundle (pass or fail, we want to create this) 135 # Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed. 136 ZIP_UP_RESULTS = ( $(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)` \ 137 && $(CD) $(ABS_TEST_OUTPUT_DIR) \ 138 && $(CHMOD) -R a+r . \ 139 && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . ) 140 141 # important results files 142 SUMMARY_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport/text/summary.txt") 143 STATS_TXT_NAME = Stats.txt 144 STATS_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/$(STATS_TXT_NAME)") 145 RUNLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/runlist.txt") 146 PASSLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/passlist.txt") 147 FAILLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/faillist.txt") 148 EXITCODE = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/exitcode.txt") 149 150 TESTEXIT = \ 151 if [ ! -s $(EXITCODE) ] ; then \ 152 $(ECHO) "ERROR: EXITCODE file not filled in."; \ 153 $(ECHO) "1" > $(EXITCODE); \ 154 fi ; \ 155 testExitCode=`$(CAT) $(EXITCODE)`; \ 156 $(ECHO) "EXIT CODE: $${testExitCode}"; \ 157 exit $${testExitCode} 158 159 BUNDLE_UP_AND_EXIT = \ 160 ( \ 161 jtregExitCode=$$? && \ 162 _summary="$(SUMMARY_TXT)"; \ 163 $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \ 164 $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \ 165 if [ -r "$${_summary}" ] ; then \ 166 $(ECHO) "Summary: $(UNIQUE_DIR)" > $(STATS_TXT); \ 167 $(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \ 168 $(EGREP) ' Passed\.' $(RUNLIST) \ 169 | $(EGREP) -v ' Error\.' \ 170 | $(EGREP) -v ' Failed\.' > $(PASSLIST); \ 171 ( $(EGREP) ' Failed\.' $(RUNLIST); \ 172 $(EGREP) ' Error\.' $(RUNLIST); \ 173 $(EGREP) -v ' Passed\.' $(RUNLIST) ) \ 174 | $(SORT) | $(UNIQ) > $(FAILLIST); \ 175 if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \ 176 $(EXPAND) $(FAILLIST) \ 177 | $(CUT) -d' ' -f1 \ 178 | $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \ 179 if [ $${jtregExitCode} = 0 ] ; then \ 180 jtregExitCode=1; \ 181 fi; \ 182 fi; \ 183 runc="`$(CAT) $(RUNLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ 184 passc="`$(CAT) $(PASSLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ 185 failc="`$(CAT) $(FAILLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \ 186 exclc="FIXME CODETOOLS-7900176"; \ 187 $(ECHO) "TEST STATS: name=$(UNIQUE_DIR) run=$${runc} pass=$${passc} fail=$${failc}" \ 188 >> $(STATS_TXT); \ 189 else \ 190 $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \ 191 fi; \ 192 if [ -f $(STATS_TXT) ] ; then \ 193 $(CAT) $(STATS_TXT); \ 194 fi; \ 195 $(ZIP_UP_RESULTS) ; \ 196 $(TESTEXIT) \ 197 ) 198 199 ################################################################ 200 201 # Default make rule (runs default jdk tests) 202 all: jdk_default 203 @$(ECHO) "Testing completed successfully" 204 205 # Prep for output 206 # Change execute permissions on shared library files. 207 # Files in repositories should never have execute permissions, but 208 # there are some tests that have pre-built shared libraries, and these 209 # windows dll files must have execute permission. Adding execute 210 # permission may happen automatically on windows when using certain 211 # versions of mercurial but it cannot be guaranteed. And blindly 212 # adding execute permission might be seen as a mercurial 'change', so 213 # we avoid adding execute permission to repository files. But testing 214 # from a plain source tree needs the chmod a+rx. Applying the chmod to 215 # all shared libraries not just dll files. And with CYGWIN and sshd 216 # service, you may need CYGWIN=ntsec for this to work. 217 prep: 218 @$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR) 219 @$(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)` 220 @if [ ! -d $(TEST_ROOT)/../.hg ] ; then \ 221 $(FIND) $(TEST_ROOT) \( -name \*.dll -o -name \*.DLL -o -name \*.so \) \ 222 -exec $(CHMOD) a+rx {} \; ; \ 223 fi 224 225 # Cleanup 226 clean: 227 @$(RM) -r $(ABS_TEST_OUTPUT_DIR) 228 @$(RM) $(ARCHIVE_BUNDLE) 229 230 ################################################################ 231 232 # jtreg tests 233 234 # Expect JT_HOME to be set for jtreg tests. (home for jtreg) 235 ifndef JT_HOME 236 JT_HOME = $(SLASH_JAVA)/re/jtreg/4.1/promoted/latest/binaries/jtreg 237 ifdef JPRT_JTREG_HOME 238 JT_HOME = $(JPRT_JTREG_HOME) 239 endif 240 endif 241 242 # Problematic tests to be excluded 243 PROBLEM_LISTS=$(call MixedDirs,$(wildcard ProblemList.txt closed/ProblemList.txt)) 244 245 # Create exclude list for this platform and arch 246 ifdef NO_EXCLUDES 247 JTREG_EXCLUSIONS = 248 else 249 JTREG_EXCLUSIONS = $(PROBLEM_LISTS:%=-exclude:%) 250 endif 251 252 # convert list of directories to dos paths 253 define MixedDirs 254 $(foreach i,$1,$(shell $(GETMIXEDPATH) "${i}")) 255 endef 256 257 define SummaryInfo 258 $(ECHO) "########################################################" 259 $(CAT) $(?:%=$(ABS_TEST_OUTPUT_DIR)/%/$(STATS_TXT_NAME)) 260 $(ECHO) "########################################################" 261 endef 262 263 # ------------------------------------------------------------------ 264 265 jdk_% core_% svc_%: 266 $(ECHO) "Running tests: $@" 267 for each in $@; do \ 268 $(MAKE) -j 1 TEST_SELECTION=":$$each" UNIQUE_DIR=$$each jtreg_tests; \ 269 done 270 271 # ------------------------------------------------------------------ 272 273 # When called from JPRT the TESTDIRS variable is set to the jtreg tests to run 274 ifdef TESTDIRS 275 TEST_SELECTION = $(TESTDIRS) 276 endif 277 278 ifdef CONCURRENCY 279 EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY) 280 endif 281 282 # Default JTREG to run 283 JTREG = $(JT_HOME)/bin/jtreg 284 # run in agentvm mode 285 JTREG_BASIC_OPTIONS += -agentvm 286 # Only run automatic tests 287 JTREG_BASIC_OPTIONS += -a 288 # Always turn on assertions 289 JTREG_ASSERT_OPTION = -ea -esa 290 JTREG_BASIC_OPTIONS += $(JTREG_ASSERT_OPTION) 291 # Report details on all failed or error tests, times too 292 JTREG_BASIC_OPTIONS += -v:fail,error,time 293 # Retain all files for failing tests 294 JTREG_BASIC_OPTIONS += -retain:fail,error 295 # Ignore tests are not run and completely silent about it 296 JTREG_IGNORE_OPTION = -ignore:quiet 297 JTREG_BASIC_OPTIONS += $(JTREG_IGNORE_OPTION) 298 # Multiple by 4 the timeout numbers 299 JTREG_TIMEOUT_OPTION = -timeoutFactor:4 300 JTREG_BASIC_OPTIONS += $(JTREG_TIMEOUT_OPTION) 301 # Set the max memory for jtreg control vm 302 JTREG_MEMORY_OPTION = -J-Xmx512m 303 JTREG_BASIC_OPTIONS += $(JTREG_MEMORY_OPTION) 304 # Add any extra options 305 JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS) 306 # Set other vm and test options 307 JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_VM_ARGS:%=-vmoption:%) 308 # Set the GC options for test vms 309 #JTREG_GC_OPTION = -vmoption:-XX:+UseSerialGC 310 #JTREG_TEST_OPTIONS += $(JTREG_GC_OPTION) 311 # Set the max memory for jtreg target test vms 312 JTREG_TESTVM_MEMORY_OPTION = -vmoption:-Xmx512m 313 JTREG_TEST_OPTIONS += $(JTREG_TESTVM_MEMORY_OPTION) 314 315 # Make sure jtreg exists 316 $(JTREG): $(JT_HOME) 317 318 # Run jtreg 319 jtreg_tests: prep $(PRODUCT_HOME) $(JTREG) 320 ( \ 321 ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)"); \ 322 export JT_HOME; \ 323 $(shell $(GETMIXEDPATH) "$(JTREG)") \ 324 $(JTREG_BASIC_OPTIONS) \ 325 -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport") \ 326 -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTwork") \ 327 -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)") \ 328 -nativepath:$(shell $(GETMIXEDPATH) "$(TESTNATIVE_DIR)/jdk/jtreg/native") \ 329 $(JTREG_EXCLUSIONS) \ 330 $(JTREG_TEST_OPTIONS) \ 331 $(TEST_SELECTION) \ 332 ) ; \ 333 $(BUNDLE_UP_AND_EXIT) \ 334 ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT) 335 336 PHONY_LIST += jtreg_tests 337 338 ################################################################ 339 340 # Phony targets (e.g. these are not filenames) 341 .PHONY: all clean prep $(PHONY_LIST) 342 343 ################################################################