test/make/TestMakeBase.gmk
author ihse
Thu, 18 Oct 2018 09:19:29 +0200
changeset 52186 0dac3131b0fd
parent 47334 09d386ddaa42
child 52342 9341b077bd55
permissions -rw-r--r--
8212587: equals in MakeBase does not handle empty strings correctly Reviewed-by: erikj

#
# Copyright (c) 2014, 2018, 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 UtilsForTests.gmk

THIS_FILE := $(TOPDIR)/test/make/TestMakeBase.gmk
DEPS := $(THIS_FILE) \
    $(TOPDIR)/make/common/MakeBase.gmk \
    #

OUTPUT_DIR := $(TESTMAKE_OUTPUTDIR)/make-base
$(call MakeDir, $(OUTPUT_DIR))

################################################################################
# Escape $
ifneq ($(call EscapeDollar, foo$$bar), foo\$$bar)
  $(error EscapeDollar failed $(call EscapeDollar, foo$$bar) foo\$$bar)
endif

ESCAPE_DOLLAR_DIR := $(OUTPUT_DIR)/escape-dollar

$(ESCAPE_DOLLAR_DIR)/_escape_dollar: $(DEPS)
	$(RM) -r $(@D)
	$(MKDIR) -p $(@D)
	$(ECHO) foo\$$bar > $(@D)/file1
	$(ECHO) $(call EscapeDollar, foo$$bar) > $(@D)/file2
	$(ECHO) $(call EscapeDollar, foo\$$bar) > $(@D)/file3
	$(DIFF) $(@D)/file1 $(@D)/file2
	$(DIFF) $(@D)/file1 $(@D)/file3
	$(TOUCH) $@

TEST_TARGETS += $(ESCAPE_DOLLAR_DIR)/_escape_dollar

################################################################################
# Test containing and not-containing

CONT_LIST := foo bar baz foobar foobaz

# Param 1 - string to look for
# Param 2 - expected result
define TestContaining
  value := $$(call containing, $1, $(CONT_LIST))
  ifneq ($$(value), $2)
    $$(info (call containing, $1, $(CONT_LIST)))
    $$(error result >$$(value)<, expected >$2<)
  endif
endef

$(eval $(call TestContaining,bar,bar foobar))
$(eval $(call TestContaining,foo bar,foo bar foobar foobaz))

# Param 1 - string to look for
# Param 2 - expected result
define TestNotContaining
  value := $$(call not-containing, $1, $(CONT_LIST))
  ifneq ($$(value), $2)
    $$(info (call not-containing, $1, $(CONT_LIST)))
    $$(error result >$$(value)<, expected >$2<)
  endif
endef

$(eval $(call TestNotContaining,bar,foo baz foobaz))
$(eval $(call TestNotContaining,foo bar,baz))

################################################################################
# Test Equals

EQUALS_VALUE1 := value1$(SPACE)
EQUALS_VALUE2 := value2
EQUALS_EMPTY :=

ifneq ($(call equals, $(EQUALS_VALUE1), $(EQUALS_VALUE2)), )
  $(error The strings >$(EQUALS_VALUE1)< and >$(EQUALS_VALUE2)< are equal)
endif

ifeq ($(call equals, $(EQUALS_VALUE1), $(EQUALS_VALUE1)), )
  $(error The strings >$(EQUALS_VALUE1)< and >$(EQUALS_VALUE1)< are not equal)
endif

ifeq ($(call equals, $(EQUALS_EMPTY), $(EQUALS_EMPTY)), )
  $(error The strings >$(EQUALS_EMPTY)< and >$(EQUALS_EMPTY)< are not equal)
endif

ifneq ($(call equals, $(EQUALS_EMPTY), $(EQUALS_VALUE2)), )
  $(error The strings >$(EQUALS_EMPTY)< and >$(EQUALS_VALUE2)< are equal)
endif

ifneq ($(call equals, $(EQUALS_VALUE2), $(EQUALS_EMPTY)), )
  $(error The strings >$(EQUALS_VALUE2)< and >$(EQUALS_EMPTY)< are equal)
endif

################################################################################
# Test remove-prefixes

$(eval $(call assert-equals, \
    $(call remove-prefixes, pre, prefix postfix), fix postfix, \
    Prefixes not properly removed))

$(eval $(call assert-equals, \
    $(call remove-prefixes, pre post, prefix postfix), fix fix, \
    Prefixes not properly removed))

################################################################################
# Test ShellQuote

SHELL_QUOTE_VALUE := foo '""' "''" bar
SHELL_QUOTE_RESULT := $(shell $(ECHO) $(call ShellQuote, \
    $(SHELL_QUOTE_VALUE)))

ifneq ($(SHELL_QUOTE_VALUE), $(SHELL_QUOTE_RESULT))
  $(error Expected: >$(SHELL_QUOTE_VALUE)< - Result: >$(SHELL_QUOTE_RESULT)<)
endif

################################################################################
# Test read and write to file

READ_WRITE_FILE := $(OUTPUT_DIR)/read-write
READ_WRITE_VALUE := foo '""' "''" \t\n\\ bar
$(call WriteFile, $(READ_WRITE_VALUE), $(READ_WRITE_FILE))
READ_WRITE_RESULT := $(call ReadFile, $(READ_WRITE_FILE))

ifneq ($(READ_WRITE_VALUE), $(READ_WRITE_RESULT))
  $(error Expected: >$(READ_WRITE_VALUE)< - Result: >$(READ_WRITE_RESULT)<)
endif

################################################################################
# Test creating dependencies on make variables

VARDEP_DIR := $(OUTPUT_DIR)/vardep
VARDEP_SRC_FILE := $(VARDEP_DIR)/src-file
VARDEP_TARGET_FILE := $(VARDEP_DIR)/target-file
VARDEP_FLAG_FILE := $(VARDEP_DIR)/flag-file

$(VARDEP_DIR)/src-file:
	$(MKDIR) -p $(@D)
	$(ECHO) "some string XXX" > $@

$(VARDEP_TARGET_FILE): $(VARDEP_DIR)/src-file \
    $(call DependOnVariable, VARDEP_TEST_VAR)
	$(MKDIR) -p $(@D)
	$(SED) -e 's/XXX/$(VARDEP_TEST_VAR)/g' $< > $@
	$(TOUCH) $(VARDEP_FLAG_FILE)

test-vardep:
	$(RM) $(VARDEP_SRC_FILE) $(VARDEP_TARGET_FILE) $(VARDEP_FLAG_FILE)
        #
        # Simply create the target file and verify that it has the correct value
        #
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR=value1 $(VARDEP_TARGET_FILE)
	$(PRINTF) "Expecting value1: %s\n" "`$(CAT) $(VARDEP_DIR)/target-file`"
	test "some string value1" = "`$(CAT) $(VARDEP_DIR)/target-file`"
	test -e $(VARDEP_FLAG_FILE)
        #
        # Make the target file again and verify that the value is updated with
        # the new value
        #
	$(SLEEP_ON_MAC)
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR=value2 $(VARDEP_TARGET_FILE)
	$(PRINTF) "Expecting value2: %s\n" "`$(CAT) $(VARDEP_DIR)/target-file`"
	test "some string value2" = "`$(CAT) $(VARDEP_DIR)/target-file`"
	test -e $(VARDEP_FLAG_FILE)
        #
        # Make the target again with the same value and verify that the recipe
        # was never run by checking that the flag file was not recreated
        #
	$(SLEEP_ON_MAC)
	$(RM) $(VARDEP_FLAG_FILE)
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR=value2 $(VARDEP_TARGET_FILE)
	$(PRINTF) "Expecting value2: %s\n" "`$(CAT) $(VARDEP_DIR)/target-file`"
	test "some string value2" = "`$(CAT) $(VARDEP_DIR)/target-file`"
	test ! -e $(VARDEP_FLAG_FILE)
        #
        # Test running with spaces at the end and the middle of the value
        # and verify that the file isn't rewritten the second time
        #
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR="value3  foo " $(VARDEP_TARGET_FILE)
	$(RM) $(VARDEP_FLAG_FILE)
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR="value3 foo" $(VARDEP_TARGET_FILE)
	test ! -e $(VARDEP_FLAG_FILE)
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR=" value3  foo" $(VARDEP_TARGET_FILE)
	test ! -e $(VARDEP_FLAG_FILE)
        #
        # Test including some problematic characters
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR='value4 \$$ORIGIN' $(VARDEP_TARGET_FILE)
	$(RM) $(VARDEP_FLAG_FILE)
	$(MAKE) -f $(THIS_FILE) VARDEP_TEST_VAR='value4 \$$ORIGIN' $(VARDEP_TARGET_FILE)
	test ! -e $(VARDEP_FLAG_FILE)

# Test specifying a specific value file to store variable in
VARDEP_VALUE_FILE := $(VARDEP_DIR)/value-file
VARDEP_TEST_VAR2 := value3

VARDEP_RETURN_VALUE := $(call DependOnVariable, VARDEP_TEST_VAR2, $(VARDEP_VALUE_FILE))
$(eval $(call assert-equals, $(VARDEP_RETURN_VALUE), $(VARDEP_VALUE_FILE), \
    Wrong filename returned))
-include $(VARDEP_VALUE_FILE)
$(eval $(call assert-equals, $(VARDEP_TEST_VAR2_old), $(VARDEP_TEST_VAR2), \
    Wrong contents in vardeps file))

# Test with a variable value containing some problematic characters
VARDEP_TEST_VAR3 := foo '""' "''" bar \$$ORIGIN &\#x00a9
VARDEP_VALUE_FILE := $(call DependOnVariable, VARDEP_TEST_VAR3)
-include $(VARDEP_VALUE_FILE)
$(eval $(call assert-equals, $(call EscapeHash,$(VARDEP_TEST_VAR3_old)), \
    $(call EscapeHash,$(VARDEP_TEST_VAR3)), \
    Wrong contents in vardep file))

TEST_TARGETS += test-vardep

################################################################################
# Test sequence

ifneq ($(call sequence, 1, 1), 1)
  $(error Sequence 1, 1 should be "1", but was $(call sequence, 1, 1))
endif

ifneq ($(call sequence, 2, 3), 2 3)
  $(error Sequence 2, 3 should be "2 3", but was $(call sequence, 2, 3))
endif

ifneq ($(call sequence, 4, 9), 4 5 6 7 8 9)
  $(error Sequence 4, 9 should be "4 5 6 7 8 9", but was $(call sequence, 4, 9))
endif

ifneq ($(call sequence, 5, 15), 5 6 7 8 9 10 11 12 13 14 15)
  $(error Sequence 5, 15 should be "5 6 7 8 9 10 11 12 13 14 15", \
      but was $(call sequence, 5, 15))
endif

################################################################################
# Test that PathList is safe when called multiple nested times.

PATHLIST_INPUT := foo bar baz

$(eval $(call assert-equals, \
    $(call PathList, $(call PathList, $(PATHLIST_INPUT))), \
    $(call PathList, $(PATHLIST_INPUT)), \
    PathList call not safe for calling twice))

################################################################################
# Test FindCommonPathPrefix

$(eval $(call assert-equals, \
    $(call FindCommonPathPrefix, /foo/bar/baz, /foo/bar/banan), \
    /foo/bar, \
    FindCommonPathPrefix, \
))

$(eval $(call assert-equals, \
    $(call FindCommonPathPrefix, /foo/bar/baz, /foo/bar), \
    /foo/bar, \
    FindCommonPathPrefix, \
))

$(eval $(call assert-equals, \
    $(call FindCommonPathPrefix, /foo/bar/baz, /foo/bar/), \
    /foo/bar, \
    FindCommonPathPrefix, \
))

$(eval $(call assert-equals, \
    $(call FindCommonPathPrefix, foo/bar/baz, foo/bar/banan), \
    foo/bar, \
    FindCommonPathPrefix, \
))

$(eval $(call assert-equals, \
    $(call FindCommonPathPrefix, foo/bar/baz, /foo/bar/banan), \
    , \
    FindCommonPathPrefix, \
))

################################################################################
# DirToDotDot

$(eval $(call assert-equals, \
    $(call DirToDotDot, foo/bar/baz/), \
    ../../.., \
    DirToDotDot, \
))

$(eval $(call assert-equals, \
    $(call DirToDotDot, foo/bar), \
    ../.., \
    DirToDotDot, \
))

$(eval $(call assert-equals, \
    $(call DirToDotDot, /foo), \
    .., \
    DirToDotDot, \
))

################################################################################
# RelativePath

$(eval $(call assert-equals, \
    $(call RelativePath, foo/bar/baz, foo/bar/banan), \
    ../baz, \
    RelativePath, \
))

$(eval $(call assert-equals, \
    $(call RelativePath, foo/bar/baz/banan/kung, foo/bar/banan/kung), \
    ../../baz/banan/kung, \
    RelativePath, \
))

$(eval $(call assert-equals, \
    $(call RelativePath, /foo/bar/baz/banan/kung, /foo/bar/banan/kung/), \
    ../../baz/banan/kung, \
    RelativePath, \
))

################################################################################
# Test ParseKeywordVariable

KWBASE := APA=banan;GURKA=tomat;COUNT=1%202%203%204%205;SUM=1+2+3+4+5;MANY_WORDS=I have the best words.

$(eval $(call ParseKeywordVariable, KWBASE, \
    KEYWORDS := APA GURKA SUM, \
    STRING_KEYWORDS := COUNT MANY_WORDS, \
))

$(eval $(call assert-equals, \
    $(KWBASE_APA), \
    banan, \
    ParseKeywordVariable failed to parse APA, \
))

$(eval $(call assert-equals, \
    $(KWBASE_COUNT), \
    1 2 3 4 5, \
    ParseKeywordVariable failed to parse COUNT, \
))

$(eval $(call assert-equals, \
    $(KWBASE_SUM), \
    1+2+3+4+5, \
    ParseKeywordVariable failed to parse SUM, \
))

$(eval $(call assert-equals, \
    $(KWBASE_MANY_WORDS), \
    I have the best words., \
    ParseKeywordVariable failed to parse MANY_WORDS, \
))

# Simulate variable set from command line by using "override"
override KWBASE_WEIRD_GURKA := paprika
KWBASE_WEIRD := ;;APA=banan;;;GURKA=apelsin;APA=skansen;;

$(eval $(call ParseKeywordVariable, KWBASE_WEIRD, \
    KEYWORDS := APA GURKA SUM, \
    STRING_KEYWORDS := COUNT, \
))

$(eval $(call assert-equals, \
    $(KWBASE_WEIRD_APA), \
    skansen, \
    ParseKeywordVariable failed to overwrite APA, \
))

$(eval $(call assert-equals, \
    $(KWBASE_WEIRD_GURKA), \
    paprika, \
    ParseKeywordVariable failed to preserve GURKA, \
))

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

all: $(TEST_TARGETS)