1 #
2 # Copyright (c) 1995, 2016, 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.
8 #
9 # This code is distributed in the hope that it will be useful, but WITHOUT
10 # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 # FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 # version 2 for more details (a copy is included in the LICENSE file that
13 # accompanied this code).
14 #
15 # You should have received a copy of the GNU General Public License version
16 # 2 along with this work; if not, write to the Free Software Foundation,
17 # Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 #
19 # Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 # or visit www.oracle.com if you need additional information or have any
21 # questions.
22 #
23 #
24
25 #
26 # Makefile to run various hotspot tests
27 #
28
29 ALT_MAKE ?= closed
30
31 GETMIXEDPATH=echo
32
33 # Utilities used
34 AWK = awk
35 CAT = cat
36 CD = cd
37 CHMOD = chmod
38 CP = cp
39 CUT = cut
40 DIRNAME = dirname
41 ECHO = echo
42 EGREP = egrep
43 EXPAND = expand
44 FIND = find
45 MKDIR = mkdir
46 PWD = pwd
47 SED = sed
48 SORT = sort
49 TEE = tee
50 UNAME = uname
51 UNIQ = uniq
52 WC = wc
53 ZIP = zip
54
55 define NEWLINE
56
57
58 endef
59
60 # Get OS name from uname (Cygwin inexplicably adds _NT-5.1)
61 UNAME_S := $(shell $(UNAME) -s | $(CUT) -f1 -d_)
62 ifeq ($(UNAME_S), SunOS)
63 PLATFORM = solaris
64 SLASH_JAVA = /java
65 ARCH = $(shell uname -p)
66 ifeq ($(ARCH), i386)
67 ARCH=i586
68 endif
69 NUM_CORES := $(shell LC_MESSAGES=C /usr/sbin/psrinfo -v | grep -c on-line)
70 endif
71 ifeq ($(UNAME_S), Linux)
72 PLATFORM = linux
73 SLASH_JAVA = /java
74 ARCH = $(shell uname -m)
75 ifeq ($(ARCH), i386)
76 ARCH = i586
77 endif
78 NUM_CORES := $(shell cat /proc/cpuinfo | grep -c processor)
79 endif
80 ifeq ($(UNAME_S), Darwin)
81 PLATFORM = bsd
82 SLASH_JAVA = /java
83 ARCH = $(shell uname -m)
84 ifeq ($(ARCH), i386)
85 ARCH = i586
86 endif
87 NUM_CORES := $(shell /usr/sbin/sysctl -n hw.ncpu)
88 endif
89 ifeq ($(findstring BSD,$(UNAME_S)), BSD)
90 PLATFORM = bsd
91 SLASH_JAVA = /java
92 ARCH = $(shell uname -m)
93 ifeq ($(ARCH), i386)
94 ARCH = i586
95 endif
96 endif
97 ifeq ($(PLATFORM),)
98 # detect whether we're running in MKS or cygwin
99 ifeq ($(UNAME_S), Windows_NT) # MKS
100 GETMIXEDPATH=dosname -s
101 endif
102 ifeq ($(findstring CYGWIN,$(UNAME_S)), CYGWIN)
103 GETMIXEDPATH=cygpath -m
104 endif
105 PLATFORM = windows
106 SLASH_JAVA = J:
107 ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),ia64)
108 ARCH = ia64
109 else
110 ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),AMD64)
111 ARCH = x64
112 else
113 ifeq ($(word 1, $(PROCESSOR_IDENTIFIER)),EM64T)
114 ARCH = x64
115 else
116 ARCH = i586
117 endif
118 endif
119 endif
120 EXESUFFIX = .exe
121 ifneq ($(NUMBER_OF_PROCESSORS), )
122 NUM_CORES := $(NUMBER_OF_PROCESSORS)
123 else
124 ifneq ($(HOTSPOT_BUILD_JOBS), )
125 NUM_CORES := $(HOTSPOT_BUILD_JOBS)
126 endif
127 endif
128 endif
129
130 ifdef ALT_SLASH_JAVA
131 SLASH_JAVA = $(ALT_SLASH_JAVA)
132 endif
133
134 # Root of this test area (important to use full paths in some places)
135 TEST_ROOT := $(shell pwd)
136
137 # Root of all test results
138 ifdef TEST_OUTPUT_DIR
139 $(shell $(MKDIR) -p $(TEST_OUTPUT_DIR)/jtreg)
140 ABS_TEST_OUTPUT_DIR := \
141 $(shell $(CD) $(TEST_OUTPUT_DIR)/jtreg && $(PWD))
142 else
143 ifdef ALT_OUTPUTDIR
144 ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD))
145 else
146 ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD))
147 endif
148
149 ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR)
150 ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR)
151 endif
152
153 # Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test)
154 ifndef PRODUCT_HOME
155 # Try to use images/jdk if it exists
156 ABS_JDK_IMAGE = $(ABS_PLATFORM_BUILD_ROOT)/images/jdk
157 PRODUCT_HOME := \
158 $(shell \
159 if [ -d $(ABS_JDK_IMAGE) ] ; then \
160 $(ECHO) "$(ABS_JDK_IMAGE)"; \
161 else \
162 $(ECHO) "$(ABS_PLATFORM_BUILD_ROOT)"; \
163 fi)
164 PRODUCT_HOME := $(PRODUCT_HOME)
165 endif
166
167 # Expect JPRT to set JAVA_ARGS (e.g. -server etc.)
168 JAVA_OPTIONS =
169 ifdef JAVA_ARGS
170 JAVA_OPTIONS = $(JAVA_ARGS)
171 endif
172
173 # jtreg -nativepath <dir>
174 #
175 # Local make tests will be TEST_IMAGE_DIR and JPRT with jprt.use.reg.test.bundle=true
176 # should be JPRT_TESTNATIVE_PATH
177 ifdef TEST_IMAGE_DIR
178 TESTNATIVE_DIR = $(TEST_IMAGE_DIR)
179 else ifdef JPRT_TESTNATIVE_PATH
180 TESTNATIVE_DIR = $(JPRT_TESTNATIVE_PATH)
181 endif
182 ifdef TESTNATIVE_DIR
183 JTREG_NATIVE_PATH = -nativepath:$(shell $(GETMIXEDPATH) "$(TESTNATIVE_DIR)/hotspot/jtreg/native")
184 endif
185
186 # jtreg failure handler config
187 ifeq ($(FAILURE_HANDLER_DIR), )
188 ifneq ($(TESTNATIVE_DIR), )
189 FAILURE_HANDLER_DIR := $(TESTNATIVE_DIR)/failure_handler
190 endif
191 endif
192 ifneq ($(FAILURE_HANDLER_DIR), )
193 FAILURE_HANDLER_DIR_MIXED := $(shell $(GETMIXEDPATH) "$(FAILURE_HANDLER_DIR)")
194 JTREG_FAILURE_HANDLER_OPTIONS := \
195 -timeoutHandlerDir:$(FAILURE_HANDLER_DIR_MIXED)/jtregFailureHandler.jar \
196 -observerDir:$(FAILURE_HANDLER_DIR_MIXED)/jtregFailureHandler.jar \
197 -timeoutHandler:jdk.test.failurehandler.jtreg.GatherProcessInfoTimeoutHandler \
198 -observer:jdk.test.failurehandler.jtreg.GatherDiagnosticInfoObserver \
199 -timeoutHandlerTimeout:0
200 ifeq ($(PLATFORM), windows)
201 JTREG_FAILURE_HANDLER_OPTIONS += -J-Djava.library.path="$(FAILURE_HANDLER_DIR_MIXED)"
202 endif
203 endif
204
205 # Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results)
206 ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip
207 ifdef JPRT_ARCHIVE_BUNDLE
208 ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE)
209 endif
210
211 # How to create the test bundle (pass or fail, we want to create this)
212 # Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed.
213 ZIP_UP_RESULTS = ( $(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)` \
214 && $(CD) $(ABS_TEST_OUTPUT_DIR) \
215 && $(CHMOD) -R a+r . \
216 && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . )
217
218 # important results files
219 SUMMARY_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport/text/summary.txt")
220 STATS_TXT_NAME = Stats.txt
221 STATS_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/$(STATS_TXT_NAME)")
222 RUNLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/runlist.txt")
223 PASSLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/passlist.txt")
224 FAILLIST = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/faillist.txt")
225 EXITCODE = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/exitcode.txt")
226
227 TESTEXIT = \
228 if [ ! -s $(EXITCODE) ] ; then \
229 $(ECHO) "ERROR: EXITCODE file not filled in."; \
230 $(ECHO) "1" > $(EXITCODE); \
231 fi ; \
232 testExitCode=`$(CAT) $(EXITCODE)`; \
233 $(ECHO) "EXIT CODE: $${testExitCode}"; \
234 exit $${testExitCode}
235
236 BUNDLE_UP_AND_EXIT = \
237 ( \
238 jtregExitCode=$$? && \
239 _summary="$(SUMMARY_TXT)"; \
240 if [ $${jtregExitCode} = 1 ] ; then \
241 jtregExitCode=0; \
242 fi; \
243 $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \
244 $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \
245 if [ -r "$${_summary}" ] ; then \
246 $(ECHO) "Summary: $(UNIQUE_DIR)" > $(STATS_TXT); \
247 $(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \
248 $(EGREP) ' Passed\.' $(RUNLIST) \
249 | $(EGREP) -v ' Error\.' \
250 | $(EGREP) -v ' Failed\.' > $(PASSLIST); \
251 ( $(EGREP) ' Failed\.' $(RUNLIST); \
252 $(EGREP) ' Error\.' $(RUNLIST); \
253 $(EGREP) -v ' Passed\.' $(RUNLIST) ) \
254 | $(SORT) | $(UNIQ) > $(FAILLIST); \
255 if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \
256 $(EXPAND) $(FAILLIST) \
257 | $(CUT) -d' ' -f1 \
258 | $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \
259 if [ $${jtregExitCode} = 0 ] ; then \
260 jtregExitCode=1; \
261 fi; \
262 fi; \
263 runc="`$(CAT) $(RUNLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \
264 passc="`$(CAT) $(PASSLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \
265 failc="`$(CAT) $(FAILLIST) | $(WC) -l | $(AWK) '{print $$1;}'`"; \
266 exclc="FIXME CODETOOLS-7900176"; \
267 $(ECHO) "TEST STATS: name=$(UNIQUE_DIR) run=$${runc} pass=$${passc} fail=$${failc}" \
268 >> $(STATS_TXT); \
269 else \
270 $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \
271 fi; \
272 if [ -f $(STATS_TXT) ] ; then \
273 $(CAT) $(STATS_TXT); \
274 fi; \
275 $(ZIP_UP_RESULTS) ; \
276 $(TESTEXIT) \
277 )
278
279 ################################################################
280
281 # Default make rule (runs jtreg_tests)
282 all: hotspot_all
283 @$(ECHO) "Testing completed successfully"
284
285 # Support "hotspot_" prefixed test make targets (too)
286 # The hotspot_% targets are used by the top level Makefile
287 # Unless explicitly defined below, hotspot_<x> is interpreted as a jtreg test group name
288 hotspot_%:
289 $(ECHO) "Running tests: $@"
290 $(MAKE) -j 1 TEST_SELECTION=":$@" UNIQUE_DIR=$@ jtreg_tests;
291
292 hotspot_internal:
293 $(ALT_OUTPUTDIR)/jdk/bin/java -XX:+ExecuteInternalVMTests -XX:+ShowMessageBoxOnError -version
294
295 # Prep for output
296 prep: clean
297 @$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR)
298 @$(MKDIR) -p `dirname $(ARCHIVE_BUNDLE)`
299
300 # Cleanup
301 clean:
302 @$(RM) -r $(ABS_TEST_OUTPUT_DIR)
303 @$(RM) $(ARCHIVE_BUNDLE)
304
305 ################################################################
306
307 # jtreg tests
308
309 # Expect JT_HOME to be set for jtreg tests. (home for jtreg)
310 ifndef JT_HOME
311 JT_HOME = $(SLASH_JAVA)/re/jtreg/4.1/promoted/latest/binaries/jtreg
312 ifdef JPRT_JTREG_HOME
313 JT_HOME = $(JPRT_JTREG_HOME)
314 endif
315 endif
316
317 # Problematic tests to be excluded
318 PROBLEM_LISTS=$(call MixedDirs,$(wildcard ProblemList.txt closed/ProblemList.txt))
319
320 # Create exclude list for this platform and arch
321 ifdef NO_EXCLUDES
322 JTREG_EXCLUSIONS =
323 else
324 JTREG_EXCLUSIONS = $(PROBLEM_LISTS:%=-exclude:%)
325 endif
326
327 # convert list of directories to dos paths
328 define MixedDirs
329 $(foreach i,$1,$(shell $(GETMIXEDPATH) "${i}"))
330 endef
331
332 # When called from JPRT the TESTDIRS variable is set to the jtreg tests to run
333 ifdef TESTDIRS
334 TEST_SELECTION = $(TESTDIRS)
335 endif
336
337 # Concurrency based on min(cores / 2, 12)
338 ifdef NUM_CORES
339 CONCURRENCY := $(shell expr $(NUM_CORES) / 2)
340 ifeq ($(CONCURRENCY), 0)
341 CONCURRENCY := 1
342 else ifeq ($(shell expr $(CONCURRENCY) \> 12), 1)
343 CONCURRENCY := 12
344 endif
345 else
346 CONCURRENCY := 1
347 endif
348 JTREG_BASIC_OPTIONS += -concurrency:$(CONCURRENCY)
349
350 # Make sure MaxRAMFraction is high enough to not cause OOM or swapping since we may end up with a lot of JVM's
351 JTREG_BASIC_OPTIONS += -vmoption:-XX:MaxRAMFraction=$(shell expr $(CONCURRENCY) \* 4)
352
353 ifdef EXTRA_JTREG_OPTIONS
354 JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS)
355 endif
356
357 # Default JTREG to run
358 JTREG = $(JT_HOME)/bin/jtreg
359
360 # Use agent mode
361 JTREG_BASIC_OPTIONS += -agentvm
362 # Only run automatic tests
363 JTREG_BASIC_OPTIONS += -a
364 # Report details on all failed or error tests, times too
365 JTREG_BASIC_OPTIONS += -v:fail,error,time
366 # Retain all files for failing tests
367 JTREG_BASIC_OPTIONS += -retain:fail,error
368 # Ignore tests are not run and completely silent about it
369 JTREG_IGNORE_OPTION = -ignore:quiet
370 JTREG_BASIC_OPTIONS += $(JTREG_IGNORE_OPTION)
371 # Multiply by 4 the timeout factor
372 JTREG_TIMEOUT_OPTION = -timeoutFactor:4
373 JTREG_BASIC_OPTIONS += $(JTREG_TIMEOUT_OPTION)
374 # Set other vm and test options
375 JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_OPTIONS:%=-vmoption:%) $(JAVA_VM_ARGS:%=-vmoption:%)
376
377 # Option to tell jtreg to not run tests marked with "ignore"
378 ifeq ($(PLATFORM), windows)
379 JTREG_KEY_OPTION = -k:!ignore
380 else
381 JTREG_KEY_OPTION = -k:\!ignore
382 endif
383 JTREG_BASIC_OPTIONS += $(JTREG_KEY_OPTION)
384
385 -include $(ALT_MAKE)/Makefile
386
387 # Make sure jtreg exists
388 $(JTREG): $(JT_HOME)
389
390 jtreg_tests: prep $(PRODUCT_HOME) $(JTREG)
391 ( \
392 ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)"); \
393 export JT_HOME; \
394 $(shell $(GETMIXEDPATH) "$(JTREG)") \
395 $(JTREG_BASIC_OPTIONS) \
396 -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport") \
397 -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTwork") \
398 -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)") \
399 $(JTREG_NATIVE_PATH) \
400 $(JTREG_FAILURE_HANDLER_OPTIONS) \
401 $(JTREG_EXCLUSIONS) \
402 $(JTREG_TEST_OPTIONS) \
403 $(TEST_SELECTION) \
404 ) ; \
405 $(BUNDLE_UP_AND_EXIT) \
406 ) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT)
407
408 PHONY_LIST += jtreg_tests
409
410 # flags used to execute java in test targets
411 TEST_FLAGS += -version -Xinternalversion -X -help
412
413 sanitytest: prep $(PRODUCT_HOME)
414 @for flag in $(TEST_FLAGS); \
415 do \
416 echo Executing java $(JAVA_OPTIONS) $$flag; \
417 $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) $$flag; \
418 res=$$?; \
419 if [ $$res -ne 0 ]; then \
420 exit $$res; \
421 fi; \
422 done
423
424 PHONY_LIST += sanitytest
425
426 ################################################################
427
428 # basicvmtest (make sure various basic java options work)
429
430 # Set up the directory in which the jvm directories live (client/, server/, etc.)
431 ifeq ($(PLATFORM),windows)
432 JVMS_DIR := $(PRODUCT_HOME)/bin
433 else ifeq ($(PLATFORM),bsd)
434 JVMS_DIR := $(PRODUCT_HOME)/lib
435 else
436 # The jvms live in the architecture directory (amd64, sparcv9,
437 # etc.). By using a wildcard there's no need to figure out the exact
438 # name of that directory.
439 JVMS_DIR := $(PRODUCT_HOME)/lib/*
440 endif
441
442 # Use the existance of a directory as a sign that jvm variant is available
443 CANDIDATE_JVM_VARIANTS := client minimal server
444 JVM_VARIANTS := $(strip $(foreach x,$(CANDIDATE_JVM_VARIANTS),$(if $(wildcard $(JVMS_DIR)/$(x)),$(x))))
445
446 hotspot_basicvmtest:
447 for variant in $(JVM_VARIANTS); \
448 do \
449 $(MAKE) JAVA_ARGS="$(JAVA_ARGS) -$$variant" hotspot_$${variant}test; \
450 res=$$?; \
451 if [ $$res -ne 0 ]; then \
452 exit $$res; \
453 fi; \
454 done
455
456 PHONY_LIST += hotspot_basicvmtest
457
458 ################################################################
459
460 # clienttest (make sure various basic java client options work)
461
462 hotspot_clienttest clienttest: sanitytest
463 $(RM) $(PRODUCT_HOME)/jre/lib/*/client/classes.jsa
464 $(RM) $(PRODUCT_HOME)/jre/bin/client/classes.jsa
465 $(PRODUCT_HOME)/bin/java $(JAVA_OPTIONS) -Xshare:dump
466
467 PHONY_LIST += hotspot_clienttest clienttest
468
469 ################################################################
470
471 # minimaltest (make sure various basic java minimal options work)
472
473 hotspot_minimaltest minimaltest: sanitytest
474
475 PHONY_LIST += hotspot_minimaltest minimaltest
476
477 ################################################################
478
479 # servertest (make sure various basic java server options work)
480
481 hotspot_servertest servertest: sanitytest
482
483 PHONY_LIST += hotspot_servertest servertest
484
485 ################################################################
486
487 # Run the native gtest tests from the test image
488
489 hotspot_gtest:
490 $(foreach v, $(JVM_VARIANTS), \
491 $(MAKE) hotspot_gtest$v $(NEWLINE) )
492
493 hotspot_gtestserver hotspot_gtestclient hotspot_gtestminimal: hotspot_gtest%:
494 $(TESTNATIVE_DIR)/hotspot/gtest/$*/gtestLauncher \
495 -jdk $(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)")
496
497 PHONY_LIST += hotspot_gtest hotspot_gtestserver hotspot_gtestclient \
498 hotspot_gtestminimal
499
500 ################################################################
501 # Phony targets (e.g. these are not filenames)
502 .PHONY: all clean prep $(PHONY_LIST)
503
504 ################################################################