1#
2# Copyright (c) 1995, 2013, 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
35CO=
36GET=
37
38# Utilities used
39AWK       = awk
40CAT       = cat
41CD        = cd
42CHMOD     = chmod
43CP        = cp
44CUT       = cut
45DIRNAME   = dirname
46ECHO      = echo
47EGREP     = egrep
48EXPAND    = expand
49FIND      = find
50MKDIR     = mkdir
51PWD       = pwd
52SED       = sed
53SORT      = sort
54TEE       = tee
55UNAME     = uname
56UNIQ      = uniq
57WC        = wc
58ZIP       = zip
59
60# Get OS name from uname (Cygwin inexplicably adds _NT-5.1)
61UNAME_S := $(shell $(UNAME) -s | $(CUT) -f1 -d_)
62
63# Commands to run on paths to make mixed paths for java on windows
64ifeq ($(UNAME_S), CYGWIN)
65  # Location of developer shared files
66  SLASH_JAVA = J:
67  GETMIXEDPATH = cygpath -m
68else
69  # Location of developer shared files
70  SLASH_JAVA = /java
71
72  GETMIXEDPATH=$(ECHO)
73endif
74
75# Root of this test area (important to use full paths in some places)
76TEST_ROOT := $(shell $(PWD))
77
78# Root of all test results
79ifdef ALT_OUTPUTDIR
80  ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD))
81else
82  ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD))
83endif
84
85ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR)
86ABS_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)
89ifndef 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)
100endif
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
105ifdef JPRT_PRODUCT_ARGS
106  JAVA_ARGS = $(JPRT_PRODUCT_ARGS)
107endif
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, ...).
111ifdef JPRT_PRODUCT_VM_ARGS
112  JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS)
113endif
114
115# Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results)
116ifdef JPRT_ARCHIVE_BUNDLE
117  ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE)
118else
119  ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip
120endif
121
122# How to create the test bundle (pass or fail, we want to create this)
123#   Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed.
124ZIP_UP_RESULTS = ( $(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)`     \
125	           && $(CD) $(ABS_TEST_OUTPUT_DIR)             \
126	           && $(CHMOD) -R a+r . \
127	           && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . )
128
129# important results files
130SUMMARY_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport/text/summary.txt")
131STATS_TXT_NAME = Stats.txt
132STATS_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/$(STATS_TXT_NAME)")
133RUNLIST   = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/runlist.txt")
134PASSLIST  = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/passlist.txt")
135FAILLIST  = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/faillist.txt")
136EXITCODE  = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/exitcode.txt")
137
138TESTEXIT = \
139  if [ ! -s $(EXITCODE) ] ; then \
140    $(ECHO) "ERROR: EXITCODE file not filled in."; \
141    $(ECHO) "1" > $(EXITCODE); \
142  fi ; \
143  testExitCode=`$(CAT) $(EXITCODE)`; \
144  $(ECHO) "EXIT CODE: $${testExitCode}"; \
145  exit $${testExitCode}
146
147BUNDLE_UP_AND_EXIT = \
148( \
149  jtregExitCode=$$? && \
150  _summary="$(SUMMARY_TXT)"; \
151  $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \
152  $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \
153  if [ -r "$${_summary}" ] ; then \
154    $(ECHO) "Summary: $(UNIQUE_DIR)" > $(STATS_TXT); \
155    $(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \
156    $(EGREP) ' Passed\.' $(RUNLIST) \
157      | $(EGREP) -v ' Error\.' \
158      | $(EGREP) -v ' Failed\.' > $(PASSLIST); \
159    ( $(EGREP) ' Failed\.' $(RUNLIST); \
160      $(EGREP) ' Error\.' $(RUNLIST); \
161      $(EGREP) -v ' Passed\.' $(RUNLIST) ) \
162      | $(SORT) | $(UNIQ) > $(FAILLIST); \
163    if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \
164      $(EXPAND) $(FAILLIST) \
165        | $(CUT) -d' ' -f1 \
166        | $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \
167      if [ $${jtregExitCode} = 0 ] ; then \
168        jtregExitCode=1; \
169      fi; \
170    fi; \
171    runc="`$(CAT) $(RUNLIST)      | $(WC) -l | $(AWK) '{print $$1;}'`"; \
172    passc="`$(CAT) $(PASSLIST)    | $(WC) -l | $(AWK) '{print $$1;}'`"; \
173    failc="`$(CAT) $(FAILLIST)    | $(WC) -l | $(AWK) '{print $$1;}'`"; \
174    exclc="FIXME CODETOOLS-7900176"; \
175    $(ECHO) "TEST STATS: name=$(UNIQUE_DIR)  run=$${runc}  pass=$${passc}  fail=$${failc}" \
176      >> $(STATS_TXT); \
177  else \
178    $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \
179  fi; \
180  if [ -f $(STATS_TXT) ] ; then \
181    $(CAT) $(STATS_TXT); \
182  fi; \
183  $(ZIP_UP_RESULTS) ; \
184  $(TESTEXIT) \
185)
186
187################################################################
188
189# Default make rule (runs default jdk tests)
190all: jdk_default
191	@$(ECHO) "Testing completed successfully"
192
193# Prep for output
194# Change execute permissions on shared library files.
195# Files in repositories should never have execute permissions, but
196# there are some tests that have pre-built shared libraries, and these
197# windows dll files must have execute permission. Adding execute
198# permission may happen automatically on windows when using certain
199# versions of mercurial but it cannot be guaranteed. And blindly
200# adding execute permission might be seen as a mercurial 'change', so
201# we avoid adding execute permission to repository files. But testing
202# from a plain source tree needs the chmod a+rx. Applying the chmod to
203# all shared libraries not just dll files. And with CYGWIN and sshd
204# service, you may need CYGWIN=ntsec for this to work.
205prep:
206	@$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR)
207	@$(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)`
208	@if [ ! -d $(TEST_ROOT)/../.hg ] ; then                          \
209	  $(FIND) $(TEST_ROOT) \( -name \*.dll -o -name \*.DLL -o -name \*.so \)  \
210	        -exec $(CHMOD) a+rx {} \; ;                             \
211        fi
212
213# Cleanup
214clean:
215	@$(RM) -r $(ABS_TEST_OUTPUT_DIR)
216	@$(RM) $(ARCHIVE_BUNDLE)
217
218################################################################
219
220# jtreg tests
221
222# Expect JT_HOME to be set for jtreg tests. (home for jtreg)
223ifndef JT_HOME
224  JT_HOME = $(SLASH_JAVA)/re/jtreg/4.1/promoted/latest/binaries/jtreg
225  ifdef JPRT_JTREG_HOME
226    JT_HOME = $(JPRT_JTREG_HOME)
227  endif
228endif
229
230# Problematic tests to be excluded
231PROBLEM_LISTS=$(call MixedDirs,$(wildcard ProblemList.txt closed/ProblemList.txt))
232
233# Create exclude list for this platform and arch
234ifdef NO_EXCLUDES
235  JTREG_EXCLUSIONS =
236else
237  JTREG_EXCLUSIONS = $(PROBLEM_LISTS:%=-exclude:%)
238endif
239
240# convert list of directories to dos paths
241define MixedDirs
242$(foreach i,$1,$(shell $(GETMIXEDPATH) "${i}"))
243endef
244
245define SummaryInfo
246$(ECHO) "########################################################"
247$(CAT) $(?:%=$(ABS_TEST_OUTPUT_DIR)/%/$(STATS_TXT_NAME))
248$(ECHO) "########################################################"
249endef
250
251# ------------------------------------------------------------------
252
253jdk_% core_% svc_%:
254	$(ECHO) "Running tests: $@"
255	for each in $@; do \
256	        $(MAKE) -j 1 TEST_SELECTION=":$$each" UNIQUE_DIR=$$each jtreg_tests; \
257	done
258
259# ------------------------------------------------------------------
260
261ifdef CONCURRENCY
262  EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY)
263endif
264
265# Default JTREG to run
266JTREG = $(JT_HOME)/bin/jtreg
267# run in agentvm mode
268JTREG_BASIC_OPTIONS += -agentvm
269# Only run automatic tests
270JTREG_BASIC_OPTIONS += -a
271# Always turn on assertions
272JTREG_ASSERT_OPTION = -ea -esa
273JTREG_BASIC_OPTIONS += $(JTREG_ASSERT_OPTION)
274# Report details on all failed or error tests, times too
275JTREG_BASIC_OPTIONS += -v:fail,error,summary
276# Retain all files for failing tests
277JTREG_BASIC_OPTIONS += -retain:fail,error
278# Ignore tests are not run and completely silent about it
279JTREG_IGNORE_OPTION = -ignore:quiet
280JTREG_BASIC_OPTIONS += $(JTREG_IGNORE_OPTION)
281# Multiple by 4 the timeout numbers
282JTREG_TIMEOUT_OPTION =  -timeoutFactor:4
283JTREG_BASIC_OPTIONS += $(JTREG_TIMEOUT_OPTION)
284# Set the max memory for jtreg control vm
285JTREG_MEMORY_OPTION = -J-Xmx512m
286JTREG_BASIC_OPTIONS += $(JTREG_MEMORY_OPTION)
287# Add any extra options
288JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS)
289# Set other vm and test options
290JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_VM_ARGS:%=-vmoption:%)
291# Set the GC options for test vms
292#JTREG_GC_OPTION = -vmoption:-XX:+UseSerialGC
293#JTREG_TEST_OPTIONS += $(JTREG_GC_OPTION)
294# Set the max memory for jtreg target test vms
295JTREG_TESTVM_MEMORY_OPTION = -vmoption:-Xmx512m
296JTREG_TEST_OPTIONS += $(JTREG_TESTVM_MEMORY_OPTION)
297
298# Make sure jtreg exists
299$(JTREG): $(JT_HOME)
300
301# Run jtreg
302jtreg_tests: prep $(PRODUCT_HOME) $(JTREG)
303	(                                                                    \
304	  ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)");                   \
305            export JT_HOME;                                                  \
306            $(shell $(GETMIXEDPATH) "$(JTREG)")                              \
307              $(JTREG_BASIC_OPTIONS)                                         \
308              -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport")  \
309              -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTwork")    \
310              -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)")                \
311              $(JTREG_EXCLUSIONS)                                            \
312              $(JTREG_TEST_OPTIONS)                                          \
313              $(TEST_SELECTION)                                                    \
314	  ) ;                                                                \
315	  $(BUNDLE_UP_AND_EXIT)                                              \
316	) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT)
317
318PHONY_LIST += jtreg_tests
319
320################################################################
321
322# Phony targets (e.g. these are not filenames)
323.PHONY: all clean prep $(PHONY_LIST)
324
325################################################################
326