From: Joel Rosdahl Date: Tue, 26 Mar 2019 20:07:43 +0000 (+0100) Subject: test: Merge depend_different_headers suite with the depend suite X-Git-Tag: v3.7~54 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=bdc40d35a3a6;p=thirdparty%2Fccache.git test: Merge depend_different_headers suite with the depend suite --- diff --git a/test/run b/test/run index 2729801e7..fa6073362 100755 --- a/test/run +++ b/test/run @@ -385,7 +385,6 @@ hardlink direct direct_gcc depend -depend_different_headers basedir compression readonly diff --git a/test/suites/depend.bash b/test/suites/depend.bash index f59b36c4c..f0e74f233 100644 --- a/test/suites/depend.bash +++ b/test/suites/depend.bash @@ -26,6 +26,68 @@ EOF DEPSFLAGS_CCACHE="-MP -MMD -MF test.d" } +set_up_different_sets_of_headers_test() { + BASEDIR=$(pwd) + BASEDIR1="$BASEDIR/test/dir1" + BASEDIR2="$BASEDIR/test/dir2" + BASEDIR3="$BASEDIR/test/dir3" + BASEDIR4="$BASEDIR/test/dir4" + + mkdir -p $BASEDIR1 $BASEDIR2 $BASEDIR3 $BASEDIR4 + + cat <$BASEDIR1/test.c +#include "header.h" +#include + +void test(){ +#ifdef CHANGE_THAT_AFFECTS_OBJECT_FILE +printf("with change"); +#else +printf("no change"); +#endif +} +EOF + cp -f "$BASEDIR1/test.c" $BASEDIR2 + cp -f "$BASEDIR1/test.c" $BASEDIR3 + cp -f "$BASEDIR1/test.c" $BASEDIR4 + + cat <"$BASEDIR1/header.h" +void test(); +EOF + + cat <"$BASEDIR2/header.h" +#define CHANGE_THAT_AFFECTS_OBJECT_FILE +void test(); +EOF + + cat <"$BASEDIR3/header.h" +#define CHANGE_THAT_DOES_NOT_AFFECT_OBJECT_FILE +void test(); +EOF + + cat <"$BASEDIR4/header.h" +#include "header2.h" +void test(); +EOF + cat <"$BASEDIR4/header2.h" +static void some_function(){}; +EOF + + backdate "$BASEDIR1/header.h" "$BASEDIR1/test.c" + backdate "$BASEDIR2/header.h" "$BASEDIR2/test.c" + backdate "$BASEDIR3/header.h" "$BASEDIR3/test.c" + backdate "$BASEDIR4/header.h" "$BASEDIR4/test.c" "$BASEDIR4/header2.h" + + DEPFLAGS="-MD -MF test.d" +} + +generate_reference_compiler_output() { + rm -f *.o *.d + $REAL_COMPILER $DEPFLAGS -c -o test.o test.c + mv test.o reference_test.o + mv test.d reference_test.d +} + SUITE_depend() { # ------------------------------------------------------------------------- TEST "Base case" @@ -39,7 +101,6 @@ SUITE_depend() { expect_stat 'cache miss' 1 expect_stat 'files in cache' 3 # .o + .manifest + .d - CCACHE_DEPEND=1 $CCACHE_COMPILE $DEPSFLAGS_CCACHE -c test.c expect_equal_object_files reference_test.o test.o expect_stat 'cache hit (direct)' 1 @@ -92,5 +153,124 @@ EOF expect_stat 'cache miss' 1 expect_file_content stderr-mf.txt "`cat stderr-baseline.txt`" + # ------------------------------------------------------------------------- + # This test case covers a case in depend mode with unchanged source file + # between compilations, but with changed headers. Header contents do not + # affect the common hash (by which .manifest is stored in cache), only the + # object's hash. + # + # dir1 is baseline + # dir2 has a change in header which affects object file + # dir3 has a change in header which does not affect object file + # dir4 has an additional include header which should change the dependency file + TEST "Different sets of headers for the same source code" + + set_up_different_sets_of_headers_test + + # Compile dir1. + cd $BASEDIR1 + + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR1 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_stat 'cache hit (direct)' 0 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 1 + expect_stat 'files in cache' 3 # .o + .manifest + .d + + # Recompile dir1 first time. + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR1 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_stat 'cache hit (direct)' 1 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 1 + expect_stat 'files in cache' 3 + + # Compile dir2. dir2 header changes the object file compared to dir1. + cd $BASEDIR2 + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR2 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_stat 'cache hit (direct)' 1 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 2 + expect_stat 'files in cache' 5 # 2x .o, 2x .d, 1x manifest + + # Compile dir3. dir3 header change does not change object file compared to + # dir1, but ccache still adds an additional .o/.d file in the cache due to + # different contents of the header file. + cd $BASEDIR3 + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR3 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_stat 'cache hit (direct)' 1 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 3 + expect_stat 'files in cache' 7 # 3x .o, 3x .d, 1x manifest + + # Compile dir4. dir4 header adds a new dependency. + cd $BASEDIR4 + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR4 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_different_files reference_test.d $BASEDIR1/test.d + expect_stat 'cache hit (direct)' 1 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 4 + expect_stat 'files in cache' 9 # 4x .o, 4x .d, 1x manifest + + # Recompile dir1 second time. + cd $BASEDIR1 + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR1 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_stat 'cache hit (direct)' 2 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 4 + expect_stat 'files in cache' 9 + + # Recompile dir2. + cd $BASEDIR2 + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR2 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files test.o test.o + expect_equal_files reference_test.d test.d + expect_stat 'cache hit (direct)' 3 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 4 + expect_stat 'files in cache' 9 + + # Recompile dir3. + cd $BASEDIR3 + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR3 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_stat 'cache hit (direct)' 4 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 4 + expect_stat 'files in cache' 9 + + # Recompile dir4. + cd $BASEDIR4 + generate_reference_compiler_output + CCACHE_DEPEND=1 CCACHE_BASEDIR=$BASEDIR4 $CCACHE_COMPILE $DEPFLAGS -c test.c + expect_equal_object_files reference_test.o test.o + expect_equal_files reference_test.d test.d + expect_different_files reference_test.d $BASEDIR1/test.d + expect_stat 'cache hit (direct)' 5 + expect_stat 'cache hit (preprocessed)' 0 + expect_stat 'cache miss' 4 + expect_stat 'files in cache' 9 + + # ------------------------------------------------------------------------- + # TODO: Add more test cases (see direct.bash for inspiration) }