Makefile revision 1683:2470510268c7
1274876Sbapt#
2274876Sbapt# Copyright (c) 1995, 2015, Oracle and/or its affiliates. All rights reserved.
3274876Sbapt# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4274876Sbapt#
5274876Sbapt# This code is free software; you can redistribute it and/or modify it
6274876Sbapt# under the terms of the GNU General Public License version 2 only, as
7274876Sbapt# published by the Free Software Foundation.  Oracle designates this
8274876Sbapt# particular file as subject to the "Classpath" exception as provided
9274876Sbapt# by Oracle in the LICENSE file that accompanied this code.
10274876Sbapt#
11274876Sbapt# This code is distributed in the hope that it will be useful, but WITHOUT
12274876Sbapt# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13274876Sbapt# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14274876Sbapt# version 2 for more details (a copy is included in the LICENSE file that
15274876Sbapt# accompanied this code).
16274876Sbapt#
17274876Sbapt# You should have received a copy of the GNU General Public License version
18274876Sbapt# 2 along with this work; if not, write to the Free Software Foundation,
19274876Sbapt# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20274876Sbapt#
21274876Sbapt# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22274876Sbapt# or visit www.oracle.com if you need additional information or have any
23274876Sbapt# questions.
24274876Sbapt#
25274876Sbapt
26274876Sbapt#
27274876Sbapt# Makefile to run various nashorn tests
28274876Sbapt#
29274876Sbapt
30274876Sbapt.DEFAULT : all
31274876Sbapt
32274876Sbapt# Empty these to get rid of some default rules
33274876Sbapt.SUFFIXES:
34274876Sbapt.SUFFIXES: .java
35274876SbaptCO=
36274876SbaptGET=
37274876Sbapt
38274876Sbapt# Utilities used
39274876SbaptAWK       = awk
40274876SbaptCAT       = cat
41274876SbaptCD        = cd
42274876SbaptCHMOD     = chmod
43274876SbaptCP        = cp
44274876SbaptCUT       = cut
45274876SbaptDIRNAME   = dirname
46274876SbaptECHO      = echo
47274876SbaptEGREP     = egrep
48274876SbaptEXPAND    = expand
49274876SbaptFIND      = find
50274876SbaptMKDIR     = mkdir
51274876SbaptPWD       = pwd
52274876SbaptSED       = sed
53274876SbaptSORT      = sort
54274876SbaptTEE       = tee
55274876SbaptUNAME     = uname
56274876SbaptUNIQ      = uniq
57274876SbaptWC        = wc
58274876SbaptZIP       = zip
59274876Sbapt
60274876Sbapt# Get OS name from uname (Cygwin inexplicably adds _NT-5.1)
61274876SbaptUNAME_S := $(shell $(UNAME) -s | $(CUT) -f1 -d_)
62274876Sbapt
63274876Sbapt# Commands to run on paths to make mixed paths for java on windows
64274876Sbaptifeq ($(UNAME_S), CYGWIN)
65274876Sbapt  # Location of developer shared files
66274876Sbapt  SLASH_JAVA = J:
67274876Sbapt  GETMIXEDPATH = cygpath -m
68274876Sbaptelse
69274876Sbapt  # Location of developer shared files
70274876Sbapt  SLASH_JAVA = /java
71294113Sbapt
72274876Sbapt  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 TEST_OUTPUT_DIR
80  $(shell $(MKDIR) -p $(TEST_OUTPUT_DIR)/jtreg)
81  ABS_TEST_OUTPUT_DIR := \
82    $(shell $(CD) $(TEST_OUTPUT_DIR)/jtreg && $(PWD))
83else
84  ifdef ALT_OUTPUTDIR
85    ABS_OUTPUTDIR = $(shell $(CD) $(ALT_OUTPUTDIR) && $(PWD))
86  else
87    ABS_OUTPUTDIR = $(shell $(CD) $(TEST_ROOT)/.. && $(PWD))
88  endif
89
90  ABS_PLATFORM_BUILD_ROOT = $(ABS_OUTPUTDIR)
91  ABS_TEST_OUTPUT_DIR := $(ABS_PLATFORM_BUILD_ROOT)/testoutput/$(UNIQUE_DIR)
92endif
93
94# Expect JPRT to set PRODUCT_HOME (the product or jdk in this case to test)
95ifndef PRODUCT_HOME
96  # Try to use images/jdk if it exists
97  ABS_JDK_IMAGE = $(ABS_PLATFORM_BUILD_ROOT)/images/jdk
98  PRODUCT_HOME :=                       		\
99    $(shell                             		\
100      if [ -d $(ABS_JDK_IMAGE) ] ; then 		\
101         $(ECHO) "$(ABS_JDK_IMAGE)";    		\
102       else                             		\
103         $(ECHO) "$(ABS_PLATFORM_BUILD_ROOT)";		\
104       fi)
105  PRODUCT_HOME := $(PRODUCT_HOME)
106endif
107
108# Expect JPRT to set JPRT_PRODUCT_ARGS (e.g. -server etc.)
109#   Should be passed into 'java' only.
110#   Could include: -d64 -server -client OR any java option
111ifdef JPRT_PRODUCT_ARGS
112  JAVA_ARGS = $(JPRT_PRODUCT_ARGS)
113endif
114
115# Expect JPRT to set JPRT_PRODUCT_VM_ARGS (e.g. -Xcomp etc.)
116#   Should be passed into anything running the vm (java, javac, javadoc, ...).
117ifdef JPRT_PRODUCT_VM_ARGS
118  JAVA_VM_ARGS = $(JPRT_PRODUCT_VM_ARGS)
119endif
120
121# jtreg -nativepath <dir>
122#
123# Local make tests will be TEST_IMAGE_DIR and JPRT with jprt.use.reg.test.bundle=true
124# should be JPRT_TESTNATIVE_PATH
125ifdef TEST_IMAGE_DIR
126  TESTNATIVE_DIR = $(TEST_IMAGE_DIR)
127else ifdef JPRT_TESTNATIVE_PATH
128  TESTNATIVE_DIR = $(JPRT_TESTNATIVE_PATH)
129endif
130ifdef TESTNATIVE_DIR
131  JTREG_NATIVE_PATH = -nativepath:$(shell $(GETMIXEDPATH) "$(TESTNATIVE_DIR)/nashorn/jtreg/native")
132endif
133
134# jtreg failure handler config
135ifeq ($(FAILURE_HANDLER_DIR), )
136  ifneq ($(TESTNATIVE_DIR), )
137    FAILURE_HANDLER_DIR := $(TESTNATIVE_DIR)/failure_handler
138  endif
139endif
140ifneq ($(FAILURE_HANDLER_DIR), )
141  FAILURE_HANDLER_DIR_MIXED := $(shell $(GETMIXEDPATH) "$(FAILURE_HANDLER_DIR)")
142  JTREG_FAILURE_HANDLER_OPTIONS := \
143      -timeoutHandlerDir:$(FAILURE_HANDLER_DIR_MIXED)/jtregFailureHandler.jar \
144      -observerDir:$(FAILURE_HANDLER_DIR_MIXED)/jtregFailureHandler.jar \
145      -timeoutHandler:jdk.test.failurehandler.jtreg.GatherProcessInfoTimeoutHandler \
146      -observer:jdk.test.failurehandler.jtreg.GatherDiagnosticInfoObserver
147  ifeq ($(UNAME_S), CYGWIN)
148    JTREG_FAILURE_HANDLER_OPTIONS += -J-Djava.library.path="$(FAILURE_HANDLER_DIR_MIXED)"
149  endif
150endif
151
152# Expect JPRT to set JPRT_ARCHIVE_BUNDLE (path to zip bundle for results)
153ifdef JPRT_ARCHIVE_BUNDLE
154  ARCHIVE_BUNDLE = $(JPRT_ARCHIVE_BUNDLE)
155else
156  ARCHIVE_BUNDLE = $(ABS_TEST_OUTPUT_DIR)/ARCHIVE_BUNDLE.zip
157endif
158
159# How to create the test bundle (pass or fail, we want to create this)
160#   Follow command with ";$(BUNDLE_UP_AND_EXIT)", so it always gets executed.
161ZIP_UP_RESULTS = ( $(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)`     \
162	           && $(CD) $(ABS_TEST_OUTPUT_DIR)             \
163	           && $(CHMOD) -R a+r . \
164	           && $(ZIP) -q -r $(ARCHIVE_BUNDLE) . )
165
166# important results files
167SUMMARY_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport/text/summary.txt")
168STATS_TXT_NAME = Stats.txt
169STATS_TXT = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/$(STATS_TXT_NAME)")
170RUNLIST   = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/runlist.txt")
171PASSLIST  = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/passlist.txt")
172FAILLIST  = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/faillist.txt")
173EXITCODE  = $(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/exitcode.txt")
174
175TESTEXIT = \
176  if [ ! -s $(EXITCODE) ] ; then \
177    $(ECHO) "ERROR: EXITCODE file not filled in."; \
178    $(ECHO) "1" > $(EXITCODE); \
179  fi ; \
180  testExitCode=`$(CAT) $(EXITCODE)`; \
181  $(ECHO) "EXIT CODE: $${testExitCode}"; \
182  exit $${testExitCode}
183
184BUNDLE_UP_AND_EXIT = \
185( \
186  jtregExitCode=$$? && \
187  _summary="$(SUMMARY_TXT)"; \
188  $(RM) -f $(STATS_TXT) $(RUNLIST) $(PASSLIST) $(FAILLIST) $(EXITCODE); \
189  $(ECHO) "$${jtregExitCode}" > $(EXITCODE); \
190  if [ -r "$${_summary}" ] ; then \
191    $(ECHO) "Summary: $(UNIQUE_DIR)" > $(STATS_TXT); \
192    $(EXPAND) $${_summary} | $(EGREP) -v ' Not run\.' > $(RUNLIST); \
193    $(EGREP) ' Passed\.' $(RUNLIST) \
194      | $(EGREP) -v ' Error\.' \
195      | $(EGREP) -v ' Failed\.' > $(PASSLIST); \
196    ( $(EGREP) ' Failed\.' $(RUNLIST); \
197      $(EGREP) ' Error\.' $(RUNLIST); \
198      $(EGREP) -v ' Passed\.' $(RUNLIST) ) \
199      | $(SORT) | $(UNIQ) > $(FAILLIST); \
200    if [ $${jtregExitCode} != 0 -o -s $(FAILLIST) ] ; then \
201      $(EXPAND) $(FAILLIST) \
202        | $(CUT) -d' ' -f1 \
203        | $(SED) -e 's@^@FAILED: @' >> $(STATS_TXT); \
204      if [ $${jtregExitCode} = 0 ] ; then \
205        jtregExitCode=1; \
206      fi; \
207    fi; \
208    runc="`$(CAT) $(RUNLIST)      | $(WC) -l | $(AWK) '{print $$1;}'`"; \
209    passc="`$(CAT) $(PASSLIST)    | $(WC) -l | $(AWK) '{print $$1;}'`"; \
210    failc="`$(CAT) $(FAILLIST)    | $(WC) -l | $(AWK) '{print $$1;}'`"; \
211    exclc="FIXME CODETOOLS-7900176"; \
212    $(ECHO) "TEST STATS: name=$(UNIQUE_DIR)  run=$${runc}  pass=$${passc}  fail=$${failc}" \
213      >> $(STATS_TXT); \
214  else \
215    $(ECHO) "Missing file: $${_summary}" >> $(STATS_TXT); \
216  fi; \
217  if [ -f $(STATS_TXT) ] ; then \
218    $(CAT) $(STATS_TXT); \
219  fi; \
220  $(ZIP_UP_RESULTS) ; \
221  $(TESTEXIT) \
222)
223
224################################################################
225
226# Default make rule (runs default nashorn tests)
227all: nashorn_default
228	@$(ECHO) "Testing completed successfully"
229
230# Prep for output
231# Change execute permissions on shared library files.
232# Files in repositories should never have execute permissions, but
233# there are some tests that have pre-built shared libraries, and these
234# windows dll files must have execute permission. Adding execute
235# permission may happen automatically on windows when using certain
236# versions of mercurial but it cannot be guaranteed. And blindly
237# adding execute permission might be seen as a mercurial 'change', so
238# we avoid adding execute permission to repository files. But testing
239# from a plain source tree needs the chmod a+rx. Applying the chmod to
240# all shared libraries not just dll files. And with CYGWIN and sshd
241# service, you may need CYGWIN=ntsec for this to work.
242prep:
243	@$(MKDIR) -p $(ABS_TEST_OUTPUT_DIR)
244	@$(MKDIR) -p `$(DIRNAME) $(ARCHIVE_BUNDLE)`
245	@if [ ! -d $(TEST_ROOT)/../.hg ] ; then                          \
246	  $(FIND) $(TEST_ROOT) \( -name \*.dll -o -name \*.DLL -o -name \*.so \)  \
247	        -exec $(CHMOD) a+rx {} \; ;                             \
248        fi
249
250# Cleanup
251clean:
252	@$(RM) -r $(ABS_TEST_OUTPUT_DIR)
253	@$(RM) $(ARCHIVE_BUNDLE)
254
255################################################################
256
257# jtreg tests
258
259# Expect JT_HOME to be set for jtreg tests. (home for jtreg)
260ifndef JT_HOME
261  JT_HOME = $(SLASH_JAVA)/re/jtreg/4.2/promoted/latest/binaries/jtreg
262  ifdef JPRT_JTREG_HOME
263    JT_HOME = $(JPRT_JTREG_HOME)
264  endif
265endif
266
267# Problematic tests to be excluded
268PROBLEM_LISTS=$(call MixedDirs,$(wildcard ProblemList.txt closed/ProblemList.txt))
269
270# Create exclude list for this platform and arch
271ifdef NO_EXCLUDES
272  JTREG_EXCLUSIONS =
273else
274  JTREG_EXCLUSIONS = $(PROBLEM_LISTS:%=-exclude:%)
275endif
276
277# convert list of directories to dos paths
278define MixedDirs
279$(foreach i,$1,$(shell $(GETMIXEDPATH) "${i}"))
280endef
281
282define SummaryInfo
283$(ECHO) "########################################################"
284$(CAT) $(?:%=$(ABS_TEST_OUTPUT_DIR)/%/$(STATS_TXT_NAME))
285$(ECHO) "########################################################"
286endef
287
288# ------------------------------------------------------------------
289
290nashorn_%:
291	$(ECHO) "Running tests: $@"
292	for each in $@; do \
293	        $(MAKE) -j 1 TEST_SELECTION=":$$each" UNIQUE_DIR=$$each jtreg_tests; \
294	done
295
296# ------------------------------------------------------------------
297
298# When called from JPRT the TESTDIRS variable is set to the jtreg tests to run
299ifdef TESTDIRS
300  TEST_SELECTION = $(TESTDIRS)
301endif
302
303ifdef CONCURRENCY
304  EXTRA_JTREG_OPTIONS += -concurrency:$(CONCURRENCY)
305endif
306
307# Default JTREG to run
308JTREG = $(JT_HOME)/bin/jtreg
309# run in agentvm mode
310JTREG_BASIC_OPTIONS += -agentvm
311# Only run automatic tests
312JTREG_BASIC_OPTIONS += -a
313# Always turn on assertions
314JTREG_ASSERT_OPTION = -ea -esa
315JTREG_BASIC_OPTIONS += $(JTREG_ASSERT_OPTION)
316# Report details on all failed or error tests, times too
317JTREG_BASIC_OPTIONS += -v:fail,error,time
318# Retain all files for failing tests
319JTREG_BASIC_OPTIONS += -retain:fail,error
320# Ignore tests are not run and completely silent about it
321JTREG_IGNORE_OPTION = -ignore:quiet
322JTREG_BASIC_OPTIONS += $(JTREG_IGNORE_OPTION)
323# Multiple by 4 the timeout numbers
324JTREG_TIMEOUT_OPTION =  -timeoutFactor:4
325JTREG_BASIC_OPTIONS += $(JTREG_TIMEOUT_OPTION)
326# Set the max memory for jtreg control vm
327JTREG_MEMORY_OPTION = -J-Xmx512m
328JTREG_BASIC_OPTIONS += $(JTREG_MEMORY_OPTION)
329# Give tests access to JT_JAVA, see JDK-8141609
330JTREG_BASIC_OPTIONS += -e:JDK8_HOME=${JT_JAVA}
331# Add any extra options
332JTREG_BASIC_OPTIONS += $(EXTRA_JTREG_OPTIONS)
333# Set other vm and test options
334JTREG_TEST_OPTIONS = $(JAVA_ARGS:%=-javaoptions:%) $(JAVA_VM_ARGS:%=-vmoption:%)
335# Set the GC options for test vms
336#JTREG_GC_OPTION = -vmoption:-XX:+UseSerialGC
337#JTREG_TEST_OPTIONS += $(JTREG_GC_OPTION)
338# Set the max memory for jtreg target test vms
339JTREG_TESTVM_MEMORY_OPTION = -vmoption:-Xmx512m
340JTREG_TEST_OPTIONS += $(JTREG_TESTVM_MEMORY_OPTION)
341
342# Make sure jtreg exists
343$(JTREG): $(JT_HOME)
344
345# Run jtreg
346jtreg_tests: prep $(PRODUCT_HOME) $(JTREG)
347	(                                                                    \
348	  ( JT_HOME=$(shell $(GETMIXEDPATH) "$(JT_HOME)");                   \
349            export JT_HOME;                                                  \
350            $(shell $(GETMIXEDPATH) "$(JTREG)")                              \
351              $(JTREG_BASIC_OPTIONS)                                         \
352              -r:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTreport")  \
353              -w:$(shell $(GETMIXEDPATH) "$(ABS_TEST_OUTPUT_DIR)/JTwork")    \
354              -jdk:$(shell $(GETMIXEDPATH) "$(PRODUCT_HOME)")                \
355              $(JTREG_NATIVE_PATH)                                           \
356              $(JTREG_FAILURE_HANDLER_OPTIONS)                               \
357              $(JTREG_EXCLUSIONS)                                            \
358              $(JTREG_TEST_OPTIONS)                                          \
359              $(TEST_SELECTION)                                                    \
360	  ) ;                                                                \
361	  $(BUNDLE_UP_AND_EXIT)                                              \
362	) 2>&1 | $(TEE) $(ABS_TEST_OUTPUT_DIR)/output.txt ; $(TESTEXIT)
363
364PHONY_LIST += jtreg_tests
365
366################################################################
367
368# Phony targets (e.g. these are not filenames)
369.PHONY: all clean prep $(PHONY_LIST)
370
371################################################################
372