]> git.ipfire.org Git - thirdparty/ccache.git/commitdiff
test: Merge depend_different_headers suite with the depend suite
authorJoel Rosdahl <joel@rosdahl.net>
Tue, 26 Mar 2019 20:07:43 +0000 (21:07 +0100)
committerJoel Rosdahl <joel@rosdahl.net>
Tue, 26 Mar 2019 20:07:43 +0000 (21:07 +0100)
test/run
test/suites/depend.bash

index 2729801e73086d2c8bfe5d926f883a133821feb0..fa607336243ce7e7489fe73801bf6e33ca444298 100755 (executable)
--- a/test/run
+++ b/test/run
@@ -385,7 +385,6 @@ hardlink
 direct
 direct_gcc
 depend
-depend_different_headers
 basedir
 compression
 readonly
index f59b36c4c35250fc03c9c01689d82be590970a4e..f0e74f2332a61a4ae26f381fff8d71a9432758eb 100644 (file)
@@ -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 <<EOF >$BASEDIR1/test.c
+#include "header.h"
+#include <stdio.h>
+
+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 <<EOF >"$BASEDIR1/header.h"
+void test();
+EOF
+
+    cat <<EOF >"$BASEDIR2/header.h"
+#define CHANGE_THAT_AFFECTS_OBJECT_FILE
+void test();
+EOF
+
+    cat <<EOF >"$BASEDIR3/header.h"
+#define CHANGE_THAT_DOES_NOT_AFFECT_OBJECT_FILE
+void test();
+EOF
+
+    cat <<EOF >"$BASEDIR4/header.h"
+#include "header2.h"
+void test();
+EOF
+    cat <<EOF >"$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)
 }