#
# Copyright (c) 2014, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.  Oracle designates this
# particular file as subject to the "Classpath" exception as provided
# by Oracle in the LICENSE file that accompanied this code.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

default: all

include $(SPEC)
include MakeBase.gmk
include JarArchive.gmk
include JavaCompilation.gmk

THIS_FILE := $(SRC_ROOT)/test/make/TestJavaCompilation.gmk
DEPS := $(THIS_FILE) \
    $(SRC_ROOT)/make/common/MakeBase.gmk \
    $(SRC_ROOT)/make/common/JavaCompilation.gmk \
    #

OUTPUT_DIR := $(TESTMAKE_OUTPUTDIR)/java-compilation

################################################################################
# Test: jar1
# Creates a simple jar file and unzips it to verify that the files have not
# changed.

JAR1_SRC_ROOT := $(OUTPUT_DIR)/jar1src
JAR1_UNZIP := $(OUTPUT_DIR)/jar1unzip
JAR1_FILE := $(OUTPUT_DIR)/jar1.jar
JAR1_MANIFEST := $(OUTPUT_DIR)/jar1_manifest

clean-jar1:
	$(RM) -r $(OUTPUT_DIR)/_jar1* $(OUTPUT_DIR)/jar1*

$(JAR1_MANIFEST): | $(OUTPUT_DIR)/_jar1_created
	$(ECHO) "Test-Attribute: value" > $(JAR1_MANIFEST)

$(OUTPUT_DIR)/_jar1_created: $(DEPS)
	$(RM) -r $(JAR1_SRC_ROOT)
	$(RM) $(JAR1_FILE)
	$(RM) -r $(JAR1_UNZIP)
	$(MKDIR) -p $(JAR1_SRC_ROOT)
	$(MKDIR) -p $(JAR1_SRC_ROOT)/dir1
	$(MKDIR) -p $(JAR1_SRC_ROOT)/dir2
	$(MKDIR) -p $(JAR1_SRC_ROOT)/META-INF
	$(TOUCH) $(JAR1_SRC_ROOT)/dir1/file1.class
	$(TOUCH) $(JAR1_SRC_ROOT)/dir2/file2.class
	$(TOUCH) $(JAR1_SRC_ROOT)/META-INF/metafile
	$(TOUCH) $@

$(eval $(call SetupJarArchive, BUILD_JAR1, \
    DEPENDENCIES := $(OUTPUT_DIR)/_jar1_created, \
    SRCS := $(JAR1_SRC_ROOT), \
    MANIFEST := $(JAR1_MANIFEST), \
    JAR := $(JAR1_FILE), \
))

$(OUTPUT_DIR)/_jar1_verified: $(BUILD_JAR1)
	$(RM) -r $(JAR1_UNZIP)
	$(MKDIR) -p $(JAR1_UNZIP)
	$(CD) $(JAR1_UNZIP) && $(UNZIP) $(JAR1_FILE) $(LOG_DEBUG)
	$(DIFF) -r $(JAR1_SRC_ROOT)/dir1 $(JAR1_UNZIP)/dir1
	$(DIFF) -r $(JAR1_SRC_ROOT)/dir2 $(JAR1_UNZIP)/dir2
	$(DIFF) -r $(JAR1_SRC_ROOT)/META-INF/metafile $(JAR1_UNZIP)/META-INF/metafile
	if [ "`$(GREP) 'Test-Attribute: value' $(JAR1_UNZIP)/META-INF/MANIFEST.MF`" = "" ]; then \
	  $(ECHO) "Could not find Test-Attribute in manifest of $(JAR1_FILE)"; \
	  exit 1; \
	fi
	$(TOUCH) $@

create-jar2: $(OUTPUT_DIR)/_jar1_verified
TEST_TARGETS += $(OUTPUT_DIR)/_jar1_verified

# Change a source file and call this makefile again to force the jar to be 
# updated. 
$(OUTPUT_DIR)/_jar1_updated: $(OUTPUT_DIR)/_jar1_verified
	$(ECHO) updated > $(JAR1_SRC_ROOT)/dir1/file1.class
	$(ECHO) updated > $(JAR1_SRC_ROOT)/META-INF/metafile
	$(TOUCH) $(OUTPUT_DIR)/_jar1_created
	+$(MAKE) -f $(THIS_FILE) $(OUTPUT_DIR)/_jar1_verified
	$(TOUCH) $@

update-jar1: $(OUTPUT_DIR)_jar1_updated

# Change the manifest file and call this makefile again to force the jar
# to be updated
$(OUTPUT_DIR)/_jar1_updated_manifest: $(OUTPUT_DIR)/_jar1_updated
	$(ECHO) "Test-Attribute: foobar" > $(JAR1_MANIFEST)
	+$(MAKE) -f $(THIS_FILE) $(BUILD_JAR1)
	$(RM) -r $(JAR1_UNZIP)
	$(MKDIR) -p $(JAR1_UNZIP)
	$(CD) $(JAR1_UNZIP) && $(UNZIP) $(JAR1_FILE) $(LOG_DEBUG)
	if [ "`$(GREP) 'Test-Attribute: foobar' $(JAR1_UNZIP)/META-INF/MANIFEST.MF`" = "" ]; then \
	  $(ECHO) "Could not find Test-Attribute in manifest of $(JAR1_FILE)"; \
	  exit 1; \
	fi
	$(TOUCH) $@

update-jar1-manifest: $(OUTPUT_DIR)/_jar1_updated_manifest

TEST_TARGETS += $(OUTPUT_DIR)/_jar1_updated $(OUTPUT_DIR)/_jar1_updated_manifest

.PHONY: clean-jar1 create-jar1 update-jar1 update-jar1-manifest

################################################################################
# Test: jar2
# Creates a jar file based on 2 source roots

JAR2_SRC_ROOT1 := $(OUTPUT_DIR)/jar2src1
JAR2_SRC_ROOT2 := $(OUTPUT_DIR)/jar2src2
JAR2_UNZIP := $(OUTPUT_DIR)/jar2unzip
JAR2_FILE := $(OUTPUT_DIR)/jar2.jar

clean-jar2:
	$(RM) -r $(OUTPUT_DIR)/_jar2* $(OUTPUT_DIR)/jar2*

$(OUTPUT_DIR)/_jar2_created: $(DEPS)
	$(RM) -r $(JAR2_SRC_ROOT1)
	$(RM) -r $(JAR2_SRC_ROOT2)
	$(RM) $(JAR2_FILE)
	$(RM) -r $(JAR2_UNZIP)
	$(MKDIR) -p $(JAR2_SRC_ROOT1)/dir1
	$(MKDIR) -p $(JAR2_SRC_ROOT2)/dir2
	$(TOUCH) $(JAR2_SRC_ROOT1)/dir1/file1.class
	$(TOUCH) $(JAR2_SRC_ROOT2)/dir2/file2.class
	$(TOUCH) $@

$(eval $(call SetupJarArchive, BUILD_JAR2, \
    DEPENDENCIES := $(OUTPUT_DIR)/_jar2_created, \
    SRCS := $(JAR2_SRC_ROOT1) $(JAR2_SRC_ROOT2), \
    JAR := $(JAR2_FILE), \
))

$(OUTPUT_DIR)/_jar2_verified: $(BUILD_JAR2)
	$(RM) -r $(JAR2_UNZIP)
	$(MKDIR) -p $(JAR2_UNZIP)
	$(CD) $(JAR2_UNZIP) && $(UNZIP) $(JAR2_FILE) $(LOG_DEBUG)
	$(DIFF) -r $(JAR2_SRC_ROOT1)/dir1 $(JAR2_UNZIP)/dir1
	$(DIFF) -r $(JAR2_SRC_ROOT2)/dir2 $(JAR2_UNZIP)/dir2
	$(TOUCH) $@

create-jar2: $(OUTPUT_DIR)/_jar2_verified
TEST_TARGETS += $(OUTPUT_DIR)/_jar2_verified

$(OUTPUT_DIR)/_jar2_updated: $(OUTPUT_DIR)/_jar2_verified
	$(ECHO) updated > $(JAR2_SRC_ROOT1)/dir1/file1.class
	$(TOUCH) $(OUTPUT_DIR)/_jar2_created
	+$(MAKE) -f $(THIS_FILE) $(OUTPUT_DIR)/_jar2_verified
	$(TOUCH) $@

update-jar2: $(OUTPUT_DIR)/_jar2_updated
TEST_TARGETS += $(OUTPUT_DIR)/_jar2_updated

.PHONY: clean-jar2 create-jar2 update-jar2

################################################################################
# Test: jar3
# Creates a jar file based on 2 source roots with an extra file

JAR3_SRC_ROOT1 := $(OUTPUT_DIR)/jar3src1
JAR3_SRC_ROOT2 := $(OUTPUT_DIR)/jar3src2
JAR3_UNZIP := $(OUTPUT_DIR)/jar3unzip
JAR3_FILE := $(OUTPUT_DIR)/jar3.jar

clean-jar3:
	$(RM) -r $(OUTPUT_DIR)/_jar3* $(OUTPUT_DIR)/jar3*

$(OUTPUT_DIR)/_jar3_created: $(DEPS)
	$(RM) -r $(JAR3_SRC_ROOT1)
	$(RM) -r $(JAR3_SRC_ROOT2)
	$(RM) $(JAR3_FILE)
	$(RM) -r $(JAR3_UNZIP)
	$(MKDIR) -p $(JAR3_SRC_ROOT1)/dir1
	$(MKDIR) -p $(JAR3_SRC_ROOT2)/dir2
	$(TOUCH) $(JAR3_SRC_ROOT1)/dir1/file1\$$foo.class
	$(TOUCH) $(JAR3_SRC_ROOT2)/dir2/file2.class
	$(TOUCH) $(JAR3_SRC_ROOT2)/extra-file
	$(TOUCH) $(JAR3_SRC_ROOT2)/extra-file-abs
	$(TOUCH) $(JAR3_SRC_ROOT2)/dir2/file\$$foo.dollar
	$(TOUCH) $@

$(eval $(call SetupJarArchive, BUILD_JAR3, \
    DEPENDENCIES := $(OUTPUT_DIR)/_jar3_created, \
    SRCS := $(JAR3_SRC_ROOT1) $(JAR3_SRC_ROOT2), \
    EXTRA_FILES := extra-file \
        dir2/file$$foo.dollar \
        $(JAR3_SRC_ROOT2)/extra-file-abs, \
    EXCLUDE_FILES := dir1/file1$$foo.class, \
    JAR := $(JAR3_FILE), \
))

$(OUTPUT_DIR)/_jar3_verified: $(BUILD_JAR3)
	$(RM) -r $(JAR3_UNZIP)
	$(MKDIR) -p $(JAR3_UNZIP)
	$(CD) $(JAR3_UNZIP) && $(UNZIP) $(JAR3_FILE) $(LOG_DEBUG)
	if [ -d "$(JAR3_UNZIP)/dir1" ]; then \
	  echo Should not be included $(JAR3_UNZIP)/dir1; \
	  exit 1; \
        fi
	$(DIFF) -r $(JAR3_SRC_ROOT2)/dir2 $(JAR3_UNZIP)/dir2
	$(DIFF) -r $(JAR3_SRC_ROOT2)/extra-file $(JAR3_UNZIP)/extra-file
	$(TOUCH) $@

create-jar3: $(OUTPUT_DIR)/_jar3_verified
TEST_TARGETS += $(OUTPUT_DIR)/_jar3_verified

$(OUTPUT_DIR)/_jar3_updated: $(OUTPUT_DIR)/_jar3_verified
	$(ECHO) updated > $(JAR3_SRC_ROOT2)/extra-file
	$(TOUCH) $(OUTPUT_DIR)/_jar3_created
	+$(MAKE) -f $(THIS_FILE) $(OUTPUT_DIR)/_jar3_verified
	$(TOUCH) $@

update-jar3: $(OUTPUT_DIR)/_jar3_updated
TEST_TARGETS += $(OUTPUT_DIR)/_jar3_updated

.PHONY: clean-jar3 create-jar3 update-jar3

################################################################################
# Test SetupJavaCompilation overrides of java files

$(eval $(call SetupJavaCompiler,BOOT_JAVAC, \
    JAVAC := $(JAVAC), \
    DISABLE_SJAVAC := true, \
))

JAVA_SRC_ROOT1 := $(OUTPUT_DIR)/javaroot1
JAVA_SRC_ROOT2 := $(OUTPUT_DIR)/javaroot2

# Since this makefile calls itself a number of times, protect this macro from
# being executed more than once.
# Param 1 - File name
# Param 2 - Package name
# Param 3 - Class name
# Param 4 - Message
CreateJavaSrc = \
    $(if $(wildcard $1),,$(shell \
        $(MKDIR) -p $(dir $1); \
        $(ECHO) "package $2;" > $1; \
        $(ECHO) "public class $3 {" >> $1; \
        $(ECHO) "    public static void main(String[] args) {" >> $1; \
        $(ECHO) "        System.out.print(\"$4\");" >> $1; \
        $(ECHO) "    }" >> $1; \
        $(ECHO) "}" >> $1; \
    ))

# Since this makefile calls itself a number of times, protect this macro from
# being executed more than once.
# Param 1 - File name
# Param 2 - Message
CreateTextFile = \
    $(if $(wildcard $1),,$(shell \
        $(MKDIR) -p $(dir $1); \
        $(PRINTF) '$2' > $1; \
    ))

$(call CreateJavaSrc,$(JAVA_SRC_ROOT1)/a/A.java,a,A,javaroot1)
$(call CreateJavaSrc,$(JAVA_SRC_ROOT2)/a/A.java,a,A,javaroot2)
$(call CreateTextFile,$(JAVA_SRC_ROOT1)/a/b.txt,javaroot1\n)
$(call CreateTextFile,$(JAVA_SRC_ROOT2)/a/b.txt,javaroot2\n)
$(call CreateTextFile,$(JAVA_SRC_ROOT1)/a/c.properties,#javaroot1\nname=value1\n)
$(call CreateTextFile,$(JAVA_SRC_ROOT2)/a/c.properties,#javaroot2\nname=value2\n)

# Due to a bug in gnu make 3.81, need to add the src roots with trailing slash,
# otherwise $(wildcard ) will not find the directories and the sanity check in
# SetupJavaCompilation will fail.
$(eval $(call SetupJavaCompilation, BUILD_ROOT1_FIRST, \
    SETUP := BOOT_JAVAC, \
    SRC := $(JAVA_SRC_ROOT1)/ $(JAVA_SRC_ROOT2)/, \
    COPY := .txt .java, \
    CLEAN := .properties, \
    BIN := $(OUTPUT_DIR)/root1first/, \
))

$(BUILD_ROOT1_FIRST):

verify-root1-first: $(BUILD_ROOT1_FIRST)
	$(JAVA_SMALL) -cp $(OUTPUT_DIR)/root1first a.A > $(OUTPUT_DIR)/root1first.output
	if [ "`$(CAT) $(OUTPUT_DIR)/root1first.output`" != "javaroot1" ]; then \
	  $(ECHO) "The wrong class was compiled. Expected >javaroot1<"; \
	  $(ECHO) "Got >`$(CAT) $(OUTPUT_DIR)/root1first.output`<"; \
	  false; \
	fi
	if [ "`$(CAT) $(OUTPUT_DIR)/root1first/a/b.txt`" != "javaroot1" ]; then \
	  $(ECHO) "The wrong file was copied. Expected >javaroot1<"; \
	  $(ECHO) "Got >`$(CAT) $(OUTPUT_DIR)/root1first/a/b.txt`<"; \
	  false; \
	fi
	if [ ! -e "$(OUTPUT_DIR)/root1first/a/A.java" ]; then \
	  $(ECHO) "Missed copying $(OUTPUT_DIR)/root1first/a/A.java"; \
	  false; \
	fi
	if [ "`$(CAT) $(OUTPUT_DIR)/root1first/a/c.properties`" != "name=value1" ]; then \
	  $(ECHO) "The wrong file was cleaned. Expected >name=value1<"; \
	  $(ECHO) "Got >`$(CAT) $(OUTPUT_DIR)/root1first/a/c.properties`<"; \
	  false; \
	fi

$(eval $(call SetupJavaCompilation, BUILD_ROOT2_FIRST, \
    SETUP := BOOT_JAVAC, \
    SRC := $(JAVA_SRC_ROOT2)/ $(JAVA_SRC_ROOT1)/, \
    COPY := .txt, \
    CLEAN := .properties, \
    BIN := $(OUTPUT_DIR)/root2first/, \
))

$(BUILD_ROOT2_FIRST):

verify-root2-first: $(BUILD_ROOT2_FIRST)
	$(JAVA_SMALL) -cp $(OUTPUT_DIR)/root2first a.A > $(OUTPUT_DIR)/root2first.output
	if [ "`$(CAT) $(OUTPUT_DIR)/root2first.output`" != "javaroot2" ]; then \
	  $(ECHO) "The wrong class was compiled. Expected >javaroot2<"; \
	  $(ECHO) "Got >`$(CAT) $(OUTPUT_DIR)/root2first.output`<"; \
	  false; \
	fi
	if [ "`$(CAT) $(OUTPUT_DIR)/root2first/a/b.txt`" != "javaroot2" ]; then \
	  $(ECHO) "The wrong file was cleaned. Expected >javaroot2<"; \
	  $(ECHO) "Got >`$(CAT) $(OUTPUT_DIR)/root2first/a/b.txt`<"; \
	  false; \
	fi
	if [ "`$(CAT) $(OUTPUT_DIR)/root2first/a/c.properties`" != "name=value2" ]; then \
	  $(ECHO) "The wrong file was cleaned. Expected >name=value2<"; \
	  $(ECHO) "Got >`$(CAT) $(OUTPUT_DIR)/root2first/a/c.properties`<"; \
	  false; \
	fi

TEST_TARGETS += verify-root1-first verify-root2-first

.PHONY: verify-root1-first verify-root2-first

################################################################################

all: $(TEST_TARGETS)

.PHONY: default all
