blob: ffc06c616a21c91b17c7c8b980dad49fd0d524a7 [file] [log] [blame]
// Copyright 2018 The Goma Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "lib/execreq_normalizer.h"
#include "absl/strings/match.h"
#include "base/path.h"
#include "google/protobuf/text_format.h"
#include "google/protobuf/util/message_differencer.h"
#include "gtest/gtest.h"
#include "lib/compiler_flag_type_specific.h"
#include "lib/compiler_flags.h"
#include "lib/execreq_verifier.h"
#include "lib/gcc_flags.h"
using google::protobuf::TextFormat;
using google::protobuf::util::MessageDifferencer;
namespace devtools_goma {
namespace {
const char kExecReqToNormalize[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/tmp/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/tmp/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/tmp/src/third_party/target_toolchain\"\n"
"arg: \"-B/tmp/src/out/Release/bin\"\n"
"arg: \"--sysroot=/tmp/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/tmp/src/third_party/clang\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/tmp/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/tmp/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const int kExecReqToNormalizeArgSize = 11;
const char kExecReqToNormalizeGcc[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.8[(Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"/tmp/src/third_party/include\"\n"
"arg: \"-gcc-toolchain=/tmp/src/third_party/target_toolchain\"\n"
"arg: \"-B/tmp/src/out/Release/bin\"\n"
"arg: \"--sysroot=/tmp/src/build/linux/sysroot\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/tmp/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/tmp/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const int kExecReqToNormalizeGccArgSize = 8;
const char kExecReqToNormalizeRelativeArgs[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"../../third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"../../third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=../third_party/target_toolchain\"\n"
"arg: \"-B./bin\"\n"
"arg: \"--sysroot=../../build/linux/sysroot\"\n"
"arg: \"-resource-dir=../../third_party/clang\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/tmp/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/tmp/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalizeLink[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"/tmp/src/third_party/include\"\n"
"arg: \"-L\"\n"
"arg: \"/tmp/src/third_party/lib\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/tmp/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-B/tmp/src/out/Release/bin\"\n"
"arg: \"--sysroot=/tmp/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/tmp/src/third_party/clang\"\n"
"arg: \"hello.o\"\n"
"cwd: \"/tmp/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/tmp/hello.o\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"a.out\"\n";
const char kExecReqToNormalizeWinPNaCl[] =
"command_spec <\n"
" name: \"clang++\"\n"
" version: \"4.2.1[clang version 3.7.0 (https://chromium.googlesource.com"
"/a/native_client/pnacl-clang.git "
"ce163fdd0f16b4481e5cf77a16d45e9b4dc8300e"
") (https://chromium.googlesource.com/a/native_client/pnacl-llvm.git "
"83991f993fea6cd9c515df12c3270ab9c0746215)]\"\n"
" target: \"x86_64--nacl\"\n"
" binary_hash: \"b15df3ea17efb0f8e7a617dd5727aec329eae89a5c8d42dedc9602f9"
"ae433c42\"\n"
" local_compiler_path: \"C:\\\\Users\\\\dummy\\\\pnacl_newlib\\\\bin"
"\\\\x86_64-nacl-clang++.exe\"\n"
" cxx_system_include_path: \"C:\\\\Users\\\\dummy\\\\pnacl_newlib\\\\"
"bin/../x86_64-nacl/include/c++/v1\"\n"
" cxx_system_include_path: \"C:\\\\Users\\\\dummy\\\\pnacl_newlib\\\\"
"bin\\\\..\\\\lib\\\\clang\\\\3.7.0\\\\include\"\n"
" cxx_system_include_path: \"C:\\\\Users\\\\dummy\\\\pnacl_newlib\\\\"
"bin/../x86_64-nacl\\\\include\"\n"
">\n"
"arg: \"../../native_client/toolchain/win_x86/pnacl_newlib/bin/"
"x86_64-nacl-clang++.exe\"\n"
"arg: \"-MMD\"\n"
"arg: \"-MF\"\n"
"arg: \"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o.d\"\n"
"arg: \"-Iclang_newlib_x64/gen\"\n"
"arg: \"-c\"\n"
"arg: \"../../chrome/test/data/nacl/crash/ppapi_crash_via_exit_call.cc\"\n"
"arg: \"-o\"\n"
"arg: \"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o\"\n"
"env: \"PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC\"\n"
"env: \"SystemRoot=C:\\\\Windows\"\n"
"cwd: \"C:\\\\Users\\\\dummy\\\\out\\\\Default\"\n"
"Input {\n"
" filename: \"C:\\\\Users\\\\dummy\\\\pnacl_newlib\\\\bin\\\\..\\\\"
"lib\\\\clang\\\\3.7.0\\\\include\\\\limits.h\"\n"
" hash_key: \"48cdf007c86904f26d7dcd38f04f69d21022add3e48aab145a3d22"
"16c061840d\"\n"
"}\n"
"expected_output_files: "
"\"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o\"\n"
"expected_output_files: "
"\"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o.d\"\n";
const char kExecReqToNormalizePNaClTranslate[] =
"command_spec <\n"
" name: \"clang++\"\n"
" version: \"4.2.1[clang version 3.7.0 (https://chromium.googlesource.com"
"/a/native_client/pnacl-clang.git "
"ce163fdd0f16b4481e5cf77a16d45e9b4dc8300e"
") (https://chromium.googlesource.com/a/native_client/pnacl-llvm.git "
"83991f993fea6cd9c515df12c3270ab9c0746215)]\"\n"
" target: \"le32-unknown-nacl\"\n"
" binary_hash: \"b15df3ea17efb0f8e7a617dd5727aec329eae89a5c8d42dedc9602f9"
"ae433c42\"\n"
" local_compiler_path: \"/dummy/pnacl_newlib/bin/pnacl-clang++\"\n"
" cxx_system_include_path: \"/dummy/pnacl_newlib/"
"bin/../x86_64-nacl/include/c++/v1\"\n"
" cxx_system_include_path: \"/dummy/pnacl_newlib/"
"bin/../lib/clang/3.7.0/include\"\n"
" cxx_system_include_path: \"/dummy/pnacl_newlib/"
"bin/../x86_64-nacl/include\"\n"
">\n"
"arg: \"../../native_client/toolchain/linux_x86/pnacl_newlib/bin/"
"pnacl-clang++\"\n"
"arg: \"-MMD\"\n"
"arg: \"-MF\"\n"
"arg: \"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o.d\"\n"
"arg: \"-Iclang_newlib_x64/gen\"\n"
"arg: \"-c\"\n"
"arg: \"../../chrome/test/data/nacl/crash/ppapi_crash_via_exit_call.cc\"\n"
"arg: \"-o\"\n"
"arg: \"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o\"\n"
"arg: \"--pnacl-allow-translate\"\n"
"arg: \"-arch\"\n"
"arg: \"x86-32-nonsfi\"\n"
"cwd: \"/dummy/out/Default\"\n"
"Input {\n"
" filename: \"/dummy/pnacl_newlib/bin/../"
"lib/clang/3.7.0/include/limits.h\"\n"
" hash_key: \"48cdf007c86904f26d7dcd38f04f69d21022add3e48aab145a3d22"
"16c061840d\"\n"
"}\n"
"expected_output_files: "
"\"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o\"\n"
"expected_output_files: "
"\"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o.d\"\n";
const char kExecReqToNormalizeInputOrder[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"/tmp/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/tmp/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/tmp/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/tmp/hello1.c\"\n"
" hash_key: \"aaaaaaaaaa\"\n"
"}\n"
"Input {\n"
" filename: \"/tmp/src/out/Release/hello.c\"\n"
" hash_key: \"bbbbbbbbbb\"\n"
"}\n"
"Input {\n"
" filename: \"/tmp/test/hello2.c\"\n"
" hash_key: \"cccccccccc\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalizeContent[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"/tmp/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/tmp/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/tmp/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/tmp/hello.c\"\n"
" hash_key: \"dummy_hash_key\"\n"
" content {\n"
" blob_type: FILE\n"
" content: \"0123456789\"\n"
" file_size: 10\n"
" }\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
// TODO: Extract this to separated file.
const char kExecReqToAmbiguaousDebugPrefixMap[] = R"(command_spec {
name: "clang"
version: "4.2.1[clang version 5.0.0 (trunk 300839)]"
target: "x86_64-unknown-linux-gnu"
binary_hash: "5f650cc98121b383aaa25e53a135d8b4c5e0748f25082b4f2d428a5934d22fda"
local_compiler_path: "../../third_party/llvm-build/Release+Asserts/bin/clang++"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward"
cxx_system_include_path: "/home/goma/chromium/src/third_party/llvm-build/Release+Asserts/lib/clang/5.0.0/include"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/include/x86_64-linux-gnu"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/include"
}
arg: "../../third_party/llvm-build/Release+Asserts/bin/clang++"
arg: "-MMD"
arg: "-MF"
arg: "obj/base/allocator/tcmalloc/malloc_hook.o.d"
arg: "-DNO_HEAP_CHECK"
arg: "-DV8_DEPRECATION_WARNINGS"
arg: "-DDCHECK_ALWAYS_ON=1"
arg: "-DUSE_UDEV"
arg: "-DUSE_AURA=1"
arg: "-DUSE_PANGO=1"
arg: "-DUSE_CAIRO=1"
arg: "-DUSE_GLIB=1"
arg: "-DUSE_NSS_CERTS=1"
arg: "-DUSE_X11=1"
arg: "-DFULL_SAFE_BROWSING"
arg: "-DSAFE_BROWSING_CSD"
arg: "-DSAFE_BROWSING_DB_LOCAL"
arg: "-DCHROMIUM_BUILD"
arg: "-DFIELDTRIAL_TESTING_ENABLED"
arg: "-DCR_CLANG_REVISION=\"300839-1\""
arg: "-D_FILE_OFFSET_BITS=64"
arg: "-D_LARGEFILE_SOURCE"
arg: "-D_LARGEFILE64_SOURCE"
arg: "-DNDEBUG"
arg: "-DNVALGRIND"
arg: "-DDYNAMIC_ANNOTATIONS_ENABLED=0"
arg: "-DTCMALLOC_DONT_REPLACE_SYSTEM_ALLOC"
arg: "-I../../base/allocator"
arg: "-I../../third_party/tcmalloc/chromium/src/base"
arg: "-I../../third_party/tcmalloc/chromium/src"
arg: "-I../.."
arg: "-Igen"
arg: "-fno-strict-aliasing"
arg: "--param=ssp-buffer-size=4"
arg: "-fstack-protector"
arg: "-Wno-builtin-macro-redefined"
arg: "-D__DATE__="
arg: "-D__TIME__="
arg: "-D__TIMESTAMP__="
arg: "-funwind-tables"
arg: "-fPIC"
arg: "-pipe"
arg: "-B../../third_party/binutils/Linux_x64/Release/bin"
arg: "-fcolor-diagnostics"
arg: "-fdebug-prefix-map=/home/goma/chromium/src=."
arg: "-m64"
arg: "-march=x86-64"
arg: "-pthread"
arg: "-fomit-frame-pointer"
arg: "-g1"
arg: "--sysroot=../../build/linux/debian_jessie_amd64-sysroot"
arg: "-fvisibility=hidden"
arg: "-Xclang"
arg: "-load"
arg: "-Xclang"
arg: "../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so"
arg: "-Xclang"
arg: "-add-plugin"
arg: "-Xclang"
arg: "find-bad-constructs"
arg: "-Xclang"
arg: "-plugin-arg-find-bad-constructs"
arg: "-Xclang"
arg: "check-auto-raw-pointer"
arg: "-Xclang"
arg: "-plugin-arg-find-bad-constructs"
arg: "-Xclang"
arg: "check-ipc"
arg: "-Wheader-hygiene"
arg: "-Wstring-conversion"
arg: "-Wtautological-overlap-compare"
arg: "-Werror"
arg: "-Wall"
arg: "-Wno-unused-variable"
arg: "-Wno-missing-field-initializers"
arg: "-Wno-unused-parameter"
arg: "-Wno-c++11-narrowing"
arg: "-Wno-covered-switch-default"
arg: "-Wno-unneeded-internal-declaration"
arg: "-Wno-inconsistent-missing-override"
arg: "-Wno-undefined-var-template"
arg: "-Wno-nonportable-include-path"
arg: "-Wno-address-of-packed-member"
arg: "-Wno-unused-lambda-capture"
arg: "-Wno-user-defined-warnings"
arg: "-Wno-reorder"
arg: "-Wno-unused-function"
arg: "-Wno-unused-local-typedefs"
arg: "-Wno-unused-private-field"
arg: "-Wno-sign-compare"
arg: "-Wno-unused-result"
arg: "-O2"
arg: "-fno-ident"
arg: "-fdata-sections"
arg: "-ffunction-sections"
arg: "-fvisibility-inlines-hidden"
arg: "-std=gnu++11"
arg: "-fno-rtti"
arg: "-fno-exceptions"
arg: "-Wno-deprecated"
arg: "-c"
arg: "../../third_party/tcmalloc/chromium/src/malloc_hook.cc"
arg: "-o"
arg: "obj/base/allocator/tcmalloc/malloc_hook.o"
env: "PWD=/home/goma/chromium/src/out/rel_ng"
cwd: "/home/goma/chromium/src/out/rel_ng"
subprogram {
path: "/home/goma/chromium/src/third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so"
binary_hash: "119407f17eb4777402734571183eb5518806900d9c7c7ce5ad71d242aad249f0"
}
subprogram {
path: "/home/goma/chromium/src/third_party/binutils/Linux_x64/Release/bin/objcopy"
binary_hash: "9ccd249906d57ef2ccd24cf19c67c8d645d309c49c284af9d42813caf87fba7e"
}
requester_info {
username: "goma"
compiler_proxy_id: "goma@goma.example.com:8088/1494385386/0"
api_version: 2
pid: 94105
retry: 0
}
Input {
filename: "../../build/linux/debian_sid_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o"
hash_key: "7c893b5861ad2cc08fbf8aa9a23e294447694f01c94fa3be5b643ba9d3d65adc"
}
hermetic_mode: true
expected_output_files: "obj/base/allocator/tcmalloc/malloc_hook.o"
expected_output_files: "obj/base/allocator/tcmalloc/malloc_hook.o.d"
)";
const char kExecReqFDebugCompilationDir[] = R"(command_spec {
name: "clang"
version: "4.2.1[clang version 5.0.0 (trunk 300839)]"
target: "x86_64-unknown-linux-gnu"
binary_hash: "5f650cc98121b383aaa25e53a135d8b4c5e0748f25082b4f2d428a5934d22fda"
local_compiler_path: "../../third_party/llvm-build/Release+Asserts/bin/clang++"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/x86_64-linux-gnu/c++/4.8"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/4.8/../../../../include/c++/4.8/backward"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/include/x86_64-linux-gnu"
cxx_system_include_path: "../../build/linux/debian_jessie_amd64-sysroot/usr/include"
}
arg: "../../third_party/llvm-build/Release+Asserts/bin/clang++"
arg: "-MMD"
arg: "-MF"
arg: "obj/base/allocator/tcmalloc/malloc_hook.o.d"
arg: "-g"
arg: "-DNO_HEAP_CHECK"
arg: "-I../../base/allocator"
arg: "-I../../third_party/tcmalloc/chromium/src/base"
arg: "-I../../third_party/tcmalloc/chromium/src"
arg: "-I../.."
arg: "-Igen"
arg: "-B../../third_party/binutils/Linux_x64/Release/bin"
arg: "-Xclang"
arg: "-fdebug-compilation-dir"
arg: "-Xclang"
arg: "/chromium"
arg: "-m64"
arg: "--sysroot=../../build/linux/debian_jessie_amd64-sysroot"
arg: "-fvisibility=hidden"
arg: "-Xclang"
arg: "-load"
arg: "-Xclang"
arg: "../../third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so"
arg: "-Xclang"
arg: "-add-plugin"
arg: "-Xclang"
arg: "find-bad-constructs"
arg: "-Xclang"
arg: "-plugin-arg-find-bad-constructs"
arg: "-Xclang"
arg: "check-auto-raw-pointer"
arg: "-Xclang"
arg: "-plugin-arg-find-bad-constructs"
arg: "-Xclang"
arg: "check-ipc"
arg: "-c"
arg: "../../third_party/tcmalloc/chromium/src/malloc_hook.cc"
arg: "-o"
arg: "obj/base/allocator/tcmalloc/malloc_hook.o"
env: "PWD=/home/goma/chromium/src/out/rel_ng"
cwd: "/home/goma/chromium/src/out/rel_ng"
subprogram {
path: "/home/goma/chromium/src/third_party/llvm-build/Release+Asserts/lib/libFindBadConstructs.so"
binary_hash: "119407f17eb4777402734571183eb5518806900d9c7c7ce5ad71d242aad249f0"
}
subprogram {
path: "/home/goma/chromium/src/third_party/binutils/Linux_x64/Release/bin/objcopy"
binary_hash: "9ccd249906d57ef2ccd24cf19c67c8d645d309c49c284af9d42813caf87fba7e"
}
requester_info {
username: "goma"
compiler_proxy_id: "goma@goma.example.com:8088/1494385386/0"
api_version: 2
pid: 94105
retry: 0
}
Input {
filename: "../../build/linux/debian_sid_amd64-sysroot/usr/lib/gcc/x86_64-linux-gnu/6/crtbegin.o"
hash_key: "7c893b5861ad2cc08fbf8aa9a23e294447694f01c94fa3be5b643ba9d3d65adc"
}
hermetic_mode: true
expected_output_files: "obj/base/allocator/tcmalloc/malloc_hook.o"
expected_output_files: "obj/base/allocator/tcmalloc/malloc_hook.o.d"
)";
const char kExecReqToNormalizeDebugPrefixMapAlice[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/alice/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/alice/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/alice/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/alice/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/alice/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/alice/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/alice/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/alice/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/home/alice=/base_dir\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/alice/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/home/alice/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalizeDebugPrefixMapBob[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/bob/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/bob/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/bob/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/bob/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/bob/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/bob/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/bob/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/bob/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/home/bob=/base_dir\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/bob/src/out/Release\"\n"
"env: \"PWD=/tmp/src/out/Release\"\n"
"Input {\n"
" filename: \"/home/bob/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
// Test case for arg "-fdebug-prefix-map=/proc/self/cwd="
const char kExecReqToNormalizeDebugPrefixMapAlicePSC[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/alice/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/alice/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/alice/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/alice/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/alice/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/alice/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/alice/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/alice/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/alice/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/alice/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalizeDebugPrefixMapBobPSC[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/bob/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/bob/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/bob/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/bob/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/bob/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/bob/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/bob/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/bob/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/bob/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/bob/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
// Test case for arg both "-fdebug-prefix-map=/proc/self/cwd=" and
// "-fdebug-prefix-map=/home/$USER/src/=" given.
// TODO: Have test to confirm that
// the determinism of build is in the way we intended.
const char kExecReqToNormalize2DebugPrefixMapAlicePSC[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/alice/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/alice/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/alice/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/alice/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/alice/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/alice/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/alice/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/alice/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-fdebug-prefix-map=/home/alice/src/=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/alice/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/alice/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalize2DebugPrefixMapBobPSC[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/bob/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/bob/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/bob/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/bob/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/bob/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/bob/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/bob/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/bob/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-fdebug-prefix-map=/home/bob/src/=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/bob/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/bob/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
// Test case for arg both "-fdebug-prefix-map=/proc/self/cwd=" and
// "-fdebug-prefix-map=/home/$USER/src/=" given in gcc.
const char kExecReqToNormalize2DebugPrefixMapAlicePSCGCC[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/home/alice/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/alice/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"third_party/include\"\n"
"arg: \"-gcc-toolchain=third_party/target_toolchain\"\n"
"arg: \"-Bout/Release/bin\"\n"
"arg: \"--sysroot=/home/alice/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/alice/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-fdebug-prefix-map=/home/alice/src/=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/alice/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/alice/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalize2DebugPrefixMapBobPSCGCC[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/home/bob/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/bob/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"third_party/include\"\n"
"arg: \"-gcc-toolchain=third_party/target_toolchain\"\n"
"arg: \"-Bout/Release/bin\"\n"
"arg: \"--sysroot=/home/bob/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/bob/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-fdebug-prefix-map=/home/bob/src/=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/bob/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/bob/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
// Test case for arg "-fdebug-prefix-map=/proc/self/cwd=" in gcc.
const char kExecReqToNormalizeDebugPrefixMapAlicePSCGCC[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"third_party/include\"\n"
"arg: \"-gcc-toolchain=third_party/target_toolchain\"\n"
"arg: \"-Bout/Release/bin\"\n"
"arg: \"--sysroot=src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/alice/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/alice/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalizeDebugPrefixMapBobPSCGCC[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"third_party/include\"\n"
"arg: \"-gcc-toolchain=third_party/target_toolchain\"\n"
"arg: \"-Bout/Release/bin\"\n"
"arg: \"--sysroot=src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/bob/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/bob/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
// Test case for preserve arg "-fdebug-prefix-map=/proc/self/cwd=" in gcc.
const char kExecReqToNoNormalizeDebugPrefixMapAlicePSCGCC[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"/home/alice/src/third_party/include\"\n"
"arg: \"-gcc-toolchain=/home/alice/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/alice/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/alice/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/alice/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/alice/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/alice/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNoNormalizeDebugPrefixMapBobPSCGCC[] =
"command_spec {\n"
" name: \"gcc\"\n"
" version: \"4.4.3[Ubuntu 4.4.3-4ubuntu5]\"\n"
" target: \"x86_64-linux-gnu\"\n"
" system_include_path: \"/tmp/src/third_party/include\"\n"
" cxx_system_include_path: \"/tmp/src/third_party/include\"\n"
"}\n"
"arg: \"gcc\"\n"
"arg: \"-I\"\n"
"arg: \"/home/bob/src/third_party/include\"\n"
"arg: \"-gcc-toolchain=/home/bob/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/bob/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/bob/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/bob/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/bob/src\"\n"
"env: \"PWD=/proc/self/cwd\"\n"
"Input {\n"
" filename: \"/home/bob/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
// Test case for arg "-fdebug-prefix-map=/proc/self/cwd="
// without PWD=/proc/self/cwd
const char kExecReqToNormalizeDebugPrefixMapAlicePSCNoPWD[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/alice/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/alice/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/alice/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/alice/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/alice/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/alice/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/alice/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/alice/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/alice/src\"\n"
"env: \"PWD=/home/alice/src\"\n"
"Input {\n"
" filename: \"/home/alice/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
const char kExecReqToNormalizeDebugPrefixMapBobPSCNoPWD[] =
"command_spec {\n"
" name: \"clang\"\n"
" version: \"4.2.1[clang version 3.5.0 (trunk 214024)]\"\n"
" target: \"x86_64-unknown-linux-gnu\"\n"
" system_include_path: \"/home/bob/src/third_party/include\"\n"
" cxx_system_include_path: \"/home/bob/src/third_party/include\"\n"
"}\n"
"arg: \"clang\"\n"
"arg: \"-I\"\n"
"arg: \"/home/bob/src/third_party/include\"\n"
"arg: \"-Xclang\"\n"
"arg: \"/home/bob/src/third_party/lib/libFindBadConstructs.so\"\n"
"arg: \"-gcc-toolchain=/home/bob/src/third_party/target_toolchain\"\n"
"arg: \"-B/home/bob/src/out/Release/bin\"\n"
"arg: \"--sysroot=/home/bob/src/build/linux/sysroot\"\n"
"arg: \"-resource-dir=/home/bob/src/third_party/clang\"\n"
"arg: \"-g\"\n"
"arg: \"-fdebug-prefix-map=/proc/self/cwd=\"\n"
"arg: \"-c\"\n"
"arg: \"hello.c\"\n"
"cwd: \"/home/bob/src\"\n"
"env: \"PWD=/home/bob/src\"\n"
"Input {\n"
" filename: \"/home/bob/src/hello.c\"\n"
" hash_key: \"152d72ea117deff2af0cf0ca3aaa46a20a5f0c0e4ccb8b6d"
"559d507401ae81e9\"\n"
"}\n"
"expected_output_files: \"hello.o\"\n";
void NormalizeExecReqForCacheKey(
int id,
bool normalize_include_path,
bool is_linking,
const std::vector<string>& normalize_weak_relative_for_arg,
const std::map<string, string>& debug_prefix_map,
ExecReq* req) {
CompilerFlagTypeSpecific::FromArg(req->command_spec().name())
.NewExecReqNormalizer()
->NormalizeForCacheKey(id, normalize_include_path, is_linking,
normalize_weak_relative_for_arg, debug_prefix_map,
req);
}
bool ValidateOutputFilesAndDirs(const ExecReq& req) {
std::vector<string> args(req.arg().begin(), req.arg().end());
std::vector<string> expected_output_files(req.expected_output_files().begin(),
req.expected_output_files().end());
std::vector<string> expected_output_dirs(req.expected_output_dirs().begin(),
req.expected_output_dirs().end());
GCCFlags flags(args, req.cwd());
return expected_output_files == flags.output_files() &&
expected_output_dirs == flags.output_dirs();
}
} // namespace
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKey) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
// Check all features can be disabled.
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
EXPECT_EQ(kExecReqToNormalizeArgSize, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("/tmp/src/third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("-gcc-toolchain=/tmp/src/third_party/target_toolchain", req.arg(5));
EXPECT_EQ("-B/tmp/src/out/Release/bin", req.arg(6));
EXPECT_EQ("--sysroot=/tmp/src/build/linux/sysroot", req.arg(7));
EXPECT_EQ("-resource-dir=/tmp/src/third_party/clang", req.arg(8));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyRelativeSystemPath) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
// Convert system include path.
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
EXPECT_EQ(kExecReqToNormalizeArgSize, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("/tmp/src/third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("-gcc-toolchain=/tmp/src/third_party/target_toolchain", req.arg(5));
EXPECT_EQ("-B/tmp/src/out/Release/bin", req.arg(6));
EXPECT_EQ("--sysroot=/tmp/src/build/linux/sysroot", req.arg(7));
EXPECT_EQ("-resource-dir=/tmp/src/third_party/clang", req.arg(8));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// Convert arguments followed by the certain flags.
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyRelativeSysroot) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, false, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
EXPECT_EQ(kExecReqToNormalizeArgSize, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("-gcc-toolchain=../../third_party/target_toolchain", req.arg(5));
EXPECT_EQ("-Bbin", req.arg(6));
EXPECT_EQ("--sysroot=../../build/linux/sysroot", req.arg(7));
EXPECT_EQ("-resource-dir=../../third_party/clang", req.arg(8));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -g.
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithFlagG) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-g");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-g" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("/tmp/src/third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("/tmp/src/out/Release", req.cwd());
EXPECT_FALSE(req.env().empty());
EXPECT_EQ("PWD=/tmp/src/out/Release", req.env(0));
EXPECT_EQ(1, req.input_size());
EXPECT_EQ("/tmp/src/hello.c", req.input(0).filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -g0.
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithFlagG0) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-g0");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-g0" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -gsplit-dwarf (fission)
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithFission) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-gsplit-dwarf");
req.add_expected_output_files("hello.dwo");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-gsplit-dwarf" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("/tmp/src/third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("/tmp/src/out/Release", req.cwd());
EXPECT_FALSE(req.env().empty());
EXPECT_EQ("PWD=/tmp/src/out/Release", req.env(0));
EXPECT_EQ(1, req.input_size());
EXPECT_EQ("/tmp/src/hello.c", req.input(0).filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("hello.dwo", req.expected_output_files(0));
EXPECT_EQ("hello.o", req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -fdebug-prefix-map should be normalized with release build.
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithDebugPrefixMap) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-fdebug-prefix-map=/tmp/src=/ts");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-fdebug-prefix-map" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("-fdebug-prefix-map=", req.arg(kExecReqToNormalizeArgSize));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -fdebug-prefix-map should be normalized with -g0
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqForCacheKeyWithDebugPrefixMapWithFlagG0) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-g0");
req.add_arg("-fdebug-prefix-map=/tmp/src=/ts");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +2 because "-g0" and "-fdebug-prefix-map" are added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 2, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("-fdebug-prefix-map=", req.arg(kExecReqToNormalizeArgSize + 1));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// Not normalize args but normalize -fdebug-prefix-map.
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqForCacheKeyWithDebugPrefixMapWithRelativeArgs) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(
TextFormat::ParseFromString(kExecReqToNormalizeRelativeArgs, &req));
req.add_arg("-fdebug-prefix-map=/tmp/src=/ts");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-fdebug-prefix-map" are added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("-fdebug-prefix-map=", req.arg(kExecReqToNormalizeArgSize));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -MD
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMD) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-MD");
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-MD" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_EQ("hello.o", req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -M && -MF
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMMF) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-M");
req.add_arg("-MF");
req.add_arg("hello.d");
req.clear_expected_output_files();
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +3 because "-M", "-MF", and filename are added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 3, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -M
// `gcc -M test.c` does not make any file, but just prints dependency
// to stdout.
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithM) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-M");
req.clear_expected_output_files();
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-M", is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_TRUE(req.expected_output_files().empty());
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// When -MM or -MMD is specified, we can convert system paths to
// relative paths.
// -MMD
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMMD) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-MMD");
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-MMD" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_EQ("hello.o", req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -MM + -MF
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMMMF) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-MM");
req.add_arg("-MF");
req.add_arg("hello.d");
req.clear_expected_output_files();
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +3 because "-MM", "-MF", and filename are added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 3, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -MM
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMM) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-MM");
req.clear_expected_output_files();
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +1 because "-MM", is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 1, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_TRUE(req.expected_output_files().empty());
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -MF only
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMF) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-MF");
req.add_arg("hello.d");
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +2 because "-MF", and filename are added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 2, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_EQ("hello.o", req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// If both -MD and -MMD are speicified, -MMD won't be used,
// regardless of the commandline order.
// -MD & -MMD
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMDMMD) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-MD");
req.add_arg("-MMD");
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +2 because "-MD" and "-MMD" are added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 2, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_EQ("hello.o", req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -MMD & -MD (inverted order)
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMMDMD) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-MMD");
req.add_arg("-MD");
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +2 because "-MD" and "-MMD" are added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 2, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("../../third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_EQ("hello.o", req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// -MMD & -MD (with gcc)
// -MD should be ignored if -MMD exists.
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyWithMMDMDGCC) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalizeGcc, &req));
req.add_arg("-MMD");
req.add_arg("-MD");
req.add_expected_output_files("hello.d");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../third_party/include",
req.command_spec().cxx_system_include_path(0));
// +2 because "-MD" and "-MMD" are added.
EXPECT_EQ(kExecReqToNormalizeGccArgSize + 2, req.arg_size());
EXPECT_EQ("../../third_party/include", req.arg(2));
EXPECT_TRUE(req.cwd().empty());
EXPECT_TRUE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("hello.d", req.expected_output_files(0));
EXPECT_EQ("hello.o", req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// link.
TEST(GCCExecReqNormalizerTest, NormalizeExecReqForCacheKeyForLink) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalizeLink, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, true, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
EXPECT_EQ(11, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("/tmp/src/third_party/lib/libFindBadConstructs.so", req.arg(6));
EXPECT_EQ("-B/tmp/src/out/Release/bin", req.arg(7));
EXPECT_EQ("--sysroot=/tmp/src/build/linux/sysroot", req.arg(8));
EXPECT_EQ("-resource-dir=/tmp/src/third_party/clang", req.arg(9));
EXPECT_FALSE(req.cwd().empty());
EXPECT_FALSE(req.env().empty());
EXPECT_EQ("PWD=/tmp/src/out/Release", req.env(0));
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("a.out", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// subprogram path cleanup.
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqForCacheKeyWithSubprogramPathCleanup) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
devtools_goma::SubprogramSpec* s = req.add_subprogram();
s->set_path(
"/home/goma/chromium/src/third_party/binutils/Linux_x64/Release/bin/as");
s->set_binary_hash(
"2f931b1183b807976cb304a66d1b84dcfe5a32f02b45f54c2358e5c43f9183b0");
s = req.add_subprogram();
s->set_path(
"/home/goma/chromium/src/third_party/binutils/Linux_x64/Release/bin/"
"strip");
s->set_binary_hash(
"4956e195e962c7329c1fd0aee839d5cdbf7bb42bbc19e197be11751da1f3ea3c");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(2, req.subprogram_size());
EXPECT_EQ("", req.subprogram(0).path());
EXPECT_EQ("2f931b1183b807976cb304a66d1b84dcfe5a32f02b45f54c2358e5c43f9183b0",
req.subprogram(0).binary_hash());
EXPECT_EQ("", req.subprogram(1).path());
EXPECT_EQ("4956e195e962c7329c1fd0aee839d5cdbf7bb42bbc19e197be11751da1f3ea3c",
req.subprogram(1).binary_hash());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(ExecReqNormalizeTest, NormalizeExecReqForCacheKeyWithDebugPrefixMap) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
// TODO: On Windows, we should try to use Windows path?
// Currently no one is using debug prefix map on Windows.
// debug_prefix_map.
const std::map<string, string> debug_prefix_map = {
{"/tmp/src", "/ts"},
};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-g");
// Above debug_prefix_map variable is applied actually but
// not to confuse NormalizeExecReqForCacheKey, let me also
// add "-fdebug-prefix-map" here.
req.add_arg("-fdebug-prefix-map=/tmp/src=/ts");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
debug_prefix_map, &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ(file::JoinPath("/ts", "third_party/include"),
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ(file::JoinPath("/ts", "third_party/include"),
req.command_spec().cxx_system_include_path(0));
// +2 because "-g" and "-fdebug-prefix-map" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 2, req.arg_size());
EXPECT_EQ(file::JoinPath("/ts", "third_party/include"), req.arg(2));
EXPECT_EQ(file::JoinPath("/ts", "third_party/lib/libFindBadConstructs.so"),
req.arg(4));
EXPECT_EQ(file::JoinPath("/ts", "out/Release"), req.cwd());
EXPECT_EQ(1, req.input_size());
EXPECT_EQ(file::JoinPath("/ts", "hello.c"), req.input(0).filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
// disable debug_prefix_map.
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqForCacheKeyWithDisabledDebugPrefixMap) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-g");
req.add_arg("-fdebug-prefix-map=/tmp/src=/ts");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
// Note: passing empty debug_prefix_map means disabling the feature.
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
// +2 because "-g" and "-fdebug-prefix-map" is added.
EXPECT_EQ(kExecReqToNormalizeArgSize + 2, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("/tmp/src/third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("/tmp/src/out/Release", req.cwd());
EXPECT_EQ(1, req.input_size());
EXPECT_EQ("/tmp/src/hello.c", req.input(0).filename());
EXPECT_TRUE(req.input(0).has_hash_key());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqShouldNormalizeWithDebugPrefixMap) {
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
devtools_goma::ExecReq alice_req, bob_req;
const std::map<string, string> expected_alice_map = {
{"/home/alice", "/base_dir"},
};
const std::map<string, string> expected_bob_map = {
{"/home/bob", "/base_dir"},
};
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalizeDebugPrefixMapAlice, &alice_req));
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalizeDebugPrefixMapBob,
&bob_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(alice_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(bob_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(alice_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(bob_req));
std::vector<string> alice_args(alice_req.arg().begin(),
alice_req.arg().end());
std::vector<string> bob_args(bob_req.arg().begin(), bob_req.arg().end());
devtools_goma::GCCFlags alice_flags(alice_args, alice_req.cwd());
devtools_goma::GCCFlags bob_flags(bob_args, bob_req.cwd());
ASSERT_EQ(expected_alice_map, alice_flags.fdebug_prefix_map());
ASSERT_EQ(expected_bob_map, bob_flags.fdebug_prefix_map());
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
alice_flags.fdebug_prefix_map(),
&alice_req);
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, kTestOptions, bob_flags.fdebug_prefix_map(), &bob_req);
string normalized_alice;
string normalized_bob;
ASSERT_TRUE(TextFormat::PrintToString(alice_req, &normalized_alice));
ASSERT_TRUE(TextFormat::PrintToString(bob_req, &normalized_bob));
EXPECT_EQ(normalized_alice, normalized_bob);
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqShouldNormalizeWithDebugPrefixMapAndCWD) {
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
devtools_goma::ExecReq alice_req, bob_req;
const std::map<string, string> kExpectedMap = {
{"/proc/self/cwd", ""},
};
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalizeDebugPrefixMapAlicePSC, &alice_req));
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalizeDebugPrefixMapBobPSC, &bob_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(alice_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(bob_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(alice_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(bob_req));
std::vector<string> alice_args(alice_req.arg().begin(),
alice_req.arg().end());
std::vector<string> bob_args(bob_req.arg().begin(), bob_req.arg().end());
devtools_goma::GCCFlags alice_flags(alice_args, alice_req.cwd());
devtools_goma::GCCFlags bob_flags(bob_args, bob_req.cwd());
ASSERT_EQ(kExpectedMap, alice_flags.fdebug_prefix_map());
ASSERT_EQ(kExpectedMap, bob_flags.fdebug_prefix_map());
ASSERT_EQ(alice_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", alice_req.env()[0]);
ASSERT_EQ(bob_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", bob_req.env()[0]);
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
alice_flags.fdebug_prefix_map(),
&alice_req);
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, kTestOptions, bob_flags.fdebug_prefix_map(), &bob_req);
EXPECT_FALSE(MessageDifferencer::Equals(alice_req, bob_req));
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqShouldNormalizeWith2DebugPrefixMapAndCWD) {
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
devtools_goma::ExecReq alice_req, bob_req;
const std::map<string, string> kExpectedMapAlice = {{"/proc/self/cwd", ""},
{"/home/alice/src/", ""}};
const std::map<string, string> kExpectedMapBob = {{"/proc/self/cwd", ""},
{"/home/bob/src/", ""}};
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalize2DebugPrefixMapAlicePSC, &alice_req));
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalize2DebugPrefixMapBobPSC, &bob_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(alice_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(bob_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(alice_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(bob_req));
std::vector<string> alice_args(alice_req.arg().begin(),
alice_req.arg().end());
std::vector<string> bob_args(bob_req.arg().begin(), bob_req.arg().end());
devtools_goma::GCCFlags alice_flags(alice_args, alice_req.cwd());
devtools_goma::GCCFlags bob_flags(bob_args, bob_req.cwd());
ASSERT_EQ(kExpectedMapAlice, alice_flags.fdebug_prefix_map());
ASSERT_EQ(kExpectedMapBob, bob_flags.fdebug_prefix_map());
ASSERT_EQ(alice_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", alice_req.env()[0]);
ASSERT_EQ(bob_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", bob_req.env()[0]);
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
alice_flags.fdebug_prefix_map(),
&alice_req);
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, kTestOptions, bob_flags.fdebug_prefix_map(), &bob_req);
MessageDifferencer differencer;
string difference_reason;
differencer.ReportDifferencesToString(&difference_reason);
EXPECT_TRUE(differencer.Compare(alice_req, bob_req)) << difference_reason;
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqShouldNormalizeWith2DebugPrefixMapAndCWDGCC) {
const std::vector<string> kTestOptions{"B", "I", "gcc-toolchain", "-sysroot",
"resource-dir"};
devtools_goma::ExecReq alice_req, bob_req;
const std::map<string, string> kExpectedMapAlice = {{"/proc/self/cwd", ""},
{"/home/alice/src/", ""}};
const std::map<string, string> kExpectedMapBob = {{"/proc/self/cwd", ""},
{"/home/bob/src/", ""}};
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalize2DebugPrefixMapAlicePSCGCC, &alice_req));
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalize2DebugPrefixMapBobPSCGCC, &bob_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(alice_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(bob_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(alice_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(bob_req));
std::vector<string> alice_args(alice_req.arg().begin(),
alice_req.arg().end());
std::vector<string> bob_args(bob_req.arg().begin(), bob_req.arg().end());
devtools_goma::GCCFlags alice_flags(alice_args, alice_req.cwd());
devtools_goma::GCCFlags bob_flags(bob_args, bob_req.cwd());
ASSERT_EQ(kExpectedMapAlice, alice_flags.fdebug_prefix_map());
ASSERT_EQ(kExpectedMapBob, bob_flags.fdebug_prefix_map());
ASSERT_EQ(alice_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", alice_req.env()[0]);
ASSERT_EQ(bob_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", bob_req.env()[0]);
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
alice_flags.fdebug_prefix_map(),
&alice_req);
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, kTestOptions, bob_flags.fdebug_prefix_map(), &bob_req);
EXPECT_FALSE(MessageDifferencer::Equals(alice_req, bob_req));
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqShouldNormalizeWithDebugPrefixMapAndCWDGCC) {
const std::vector<string> kTestOptions{"B", "I", "gcc-toolchain", "-sysroot",
"resource-dir"};
devtools_goma::ExecReq alice_req, bob_req;
const std::map<string, string> kExpectedMap = {
{"/proc/self/cwd", ""},
};
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalizeDebugPrefixMapAlicePSCGCC, &alice_req));
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalizeDebugPrefixMapBobPSCGCC, &bob_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(alice_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(bob_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(alice_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(bob_req));
std::vector<string> alice_args(alice_req.arg().begin(),
alice_req.arg().end());
std::vector<string> bob_args(bob_req.arg().begin(), bob_req.arg().end());
devtools_goma::GCCFlags alice_flags(alice_args, alice_req.cwd());
devtools_goma::GCCFlags bob_flags(bob_args, bob_req.cwd());
ASSERT_EQ(kExpectedMap, alice_flags.fdebug_prefix_map());
ASSERT_EQ(kExpectedMap, bob_flags.fdebug_prefix_map());
ASSERT_EQ(alice_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", alice_req.env()[0]);
ASSERT_EQ(bob_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", bob_req.env()[0]);
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
alice_flags.fdebug_prefix_map(),
&alice_req);
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, kTestOptions, bob_flags.fdebug_prefix_map(), &bob_req);
EXPECT_FALSE(MessageDifferencer::Equals(alice_req, bob_req));
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqShouldNotNormalizeWithDebugPrefixMapAndCWDGCC) {
const std::vector<string> kTestOptions{"B", "I", "gcc-toolchain", "-sysroot",
"resource-dir"};
devtools_goma::ExecReq alice_req, bob_req;
const std::map<string, string> kExpectedMap = {
{"/proc/self/cwd", ""},
};
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNoNormalizeDebugPrefixMapAlicePSCGCC, &alice_req));
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNoNormalizeDebugPrefixMapBobPSCGCC, &bob_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(alice_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(bob_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(alice_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(bob_req));
std::vector<string> alice_args(alice_req.arg().begin(),
alice_req.arg().end());
std::vector<string> bob_args(bob_req.arg().begin(), bob_req.arg().end());
devtools_goma::GCCFlags alice_flags(alice_args, alice_req.cwd());
devtools_goma::GCCFlags bob_flags(bob_args, bob_req.cwd());
ASSERT_EQ(kExpectedMap, alice_flags.fdebug_prefix_map());
ASSERT_EQ(kExpectedMap, bob_flags.fdebug_prefix_map());
ASSERT_EQ(alice_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", alice_req.env()[0]);
ASSERT_EQ(bob_req.env().size(), 1);
EXPECT_EQ("PWD=/proc/self/cwd", bob_req.env()[0]);
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
alice_flags.fdebug_prefix_map(),
&alice_req);
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, kTestOptions, bob_flags.fdebug_prefix_map(), &bob_req);
EXPECT_FALSE(MessageDifferencer::Equals(alice_req, bob_req));
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqShouldNotNormalizeWithDebugPrefixMapAndCWDNoPWD) {
const std::vector<string> kTestOptions{"B", "I", "gcc-toolchain", "-sysroot",
"resource-dir"};
devtools_goma::ExecReq alice_req, bob_req;
const std::map<string, string> kExpectedMap = {
{"/proc/self/cwd", ""},
};
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalizeDebugPrefixMapAlicePSCNoPWD, &alice_req));
ASSERT_TRUE(TextFormat::ParseFromString(
kExecReqToNormalizeDebugPrefixMapBobPSCNoPWD, &bob_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(alice_req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(bob_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(alice_req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(bob_req));
std::vector<string> alice_args(alice_req.arg().begin(),
alice_req.arg().end());
std::vector<string> bob_args(bob_req.arg().begin(), bob_req.arg().end());
devtools_goma::GCCFlags alice_flags(alice_args, alice_req.cwd());
devtools_goma::GCCFlags bob_flags(bob_args, bob_req.cwd());
ASSERT_EQ(kExpectedMap, alice_flags.fdebug_prefix_map());
ASSERT_EQ(kExpectedMap, bob_flags.fdebug_prefix_map());
ASSERT_EQ(alice_req.env().size(), 1);
EXPECT_EQ("PWD=/home/alice/src", alice_req.env()[0]);
ASSERT_EQ(bob_req.env().size(), 1);
EXPECT_EQ("PWD=/home/bob/src", bob_req.env()[0]);
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
alice_flags.fdebug_prefix_map(),
&alice_req);
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, kTestOptions, bob_flags.fdebug_prefix_map(), &bob_req);
EXPECT_FALSE(MessageDifferencer::Equals(alice_req, bob_req));
}
TEST(GCCExecReqNormalizerTest, NormalizeExecReqInputOrderForCacheKey) {
devtools_goma::ExecReq req;
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalizeInputOrder, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ("bbbbbbbbbb", req.input(0).hash_key());
EXPECT_EQ("aaaaaaaaaa", req.input(1).hash_key());
EXPECT_EQ("cccccccccc", req.input(2).hash_key());
}
TEST(GCCExecReqNormalizerTest, NormalizeExecReqShouldClearContent) {
devtools_goma::ExecReq req;
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalizeContent, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
ASSERT_EQ(1, req.input_size());
ASSERT_EQ("dummy_hash_key", req.input(0).hash_key());
ASSERT_TRUE(req.input(0).has_content());
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(1, req.input_size());
EXPECT_EQ("dummy_hash_key", req.input(0).hash_key());
EXPECT_FALSE(req.input(0).has_content());
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqForCacheKeyShouldNormalizeWindowsPNaClPath) {
devtools_goma::ExecReq req;
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalizeWinPNaCl, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(3, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("..\\..\\pnacl_newlib\\bin\\..\\x86_64-nacl\\include\\c++\\v1",
req.command_spec().cxx_system_include_path(0));
EXPECT_EQ("..\\..\\pnacl_newlib\\bin\\..\\lib\\clang\\3.7.0\\include",
req.command_spec().cxx_system_include_path(1));
EXPECT_EQ("..\\..\\pnacl_newlib\\bin\\..\\x86_64-nacl\\include",
req.command_spec().cxx_system_include_path(2));
EXPECT_TRUE(req.cwd().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
// TODO: expected_output_files and expected_output_dirs should be
// client form. Here, since command line is using path '/' separated,
// expected output paths are also '/' separated.
// I'll fix this later.
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ(
"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o",
req.expected_output_files(0));
EXPECT_EQ(
"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o.d",
req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest,
NormalizeExecReqForCacheKeyShouldNotNormalizePNaClTranslate) {
devtools_goma::ExecReq req;
ASSERT_TRUE(
TextFormat::ParseFromString(kExecReqToNormalizePNaClTranslate, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, true, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(3, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("../../pnacl_newlib/bin/../x86_64-nacl/include/c++/v1",
req.command_spec().cxx_system_include_path(0));
EXPECT_EQ("../../pnacl_newlib/bin/../lib/clang/3.7.0/include",
req.command_spec().cxx_system_include_path(1));
EXPECT_EQ("../../pnacl_newlib/bin/../x86_64-nacl/include",
req.command_spec().cxx_system_include_path(2));
EXPECT_EQ("/dummy/out/Default", req.cwd());
EXPECT_EQ(1, req.input_size());
EXPECT_TRUE(req.input(0).has_filename());
EXPECT_TRUE(req.input(0).has_hash_key());
ValidateOutputFilesAndDirs(req);
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ(
"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o",
req.expected_output_files(0));
EXPECT_EQ(
"clang_newlib_x64/obj/chrome/test/data/nacl/"
"ppapi_crash_via_exit_call_nexe/ppapi_crash_via_exit_call.o.d",
req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, AlwaysRemoveRequesterInfo) {
// Test for b/38184335
const std::vector<string> kTestOptions{"B", "I", "gcc-toolchain", "-sysroot",
"resource-dir"};
devtools_goma::ExecReq req;
ASSERT_TRUE(
TextFormat::ParseFromString(kExecReqToAmbiguaousDebugPrefixMap, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
const std::map<string, string> kExpectedMap = {
{"/home/goma/chromium/src", "."},
};
std::vector<string> args(req.arg().begin(), req.arg().end());
devtools_goma::GCCFlags flags(args, req.cwd());
ASSERT_EQ(kExpectedMap, flags.fdebug_prefix_map());
EXPECT_FALSE(
devtools_goma::HasAmbiguityInDebugPrefixMap(flags.fdebug_prefix_map()));
EXPECT_TRUE(req.has_requester_info());
devtools_goma::NormalizeExecReqForCacheKey(0, true, false, kTestOptions,
flags.fdebug_prefix_map(), &req);
EXPECT_FALSE(req.has_requester_info());
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o",
req.expected_output_files(0));
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o.d",
req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, DropDeveloperDir) {
devtools_goma::ExecReq req;
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
req.add_env("DEVELOPER_DIR=/some/where/to/developer_dir");
bool found_developer_env = false;
for (const auto& env : req.env()) {
if (absl::StartsWith(env, "DEVELOPER_DIR=")) {
found_developer_env = true;
break;
}
}
ASSERT_TRUE(found_developer_env);
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
found_developer_env = false;
for (const auto& env : req.env()) {
if (absl::StartsWith(env, "DEVELOPER_DIR=")) {
found_developer_env = true;
break;
}
}
EXPECT_FALSE(found_developer_env);
ValidateOutputFilesAndDirs(req);
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, ClangCoverageMapping) {
devtools_goma::ExecReq req;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
// Check all features can be disabled.
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqToNormalize, &req));
req.add_arg("-fprofile-instr-generate");
req.add_arg("-fcoverage-mapping");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(1, req.command_spec().system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().system_include_path(0));
EXPECT_EQ(1, req.command_spec().cxx_system_include_path_size());
EXPECT_EQ("/tmp/src/third_party/include",
req.command_spec().cxx_system_include_path(0));
EXPECT_EQ(kExecReqToNormalizeArgSize + 2, req.arg_size());
EXPECT_EQ("/tmp/src/third_party/include", req.arg(2));
EXPECT_EQ("/tmp/src/third_party/lib/libFindBadConstructs.so", req.arg(4));
EXPECT_EQ("-gcc-toolchain=/tmp/src/third_party/target_toolchain", req.arg(5));
EXPECT_EQ("-B/tmp/src/out/Release/bin", req.arg(6));
EXPECT_EQ("--sysroot=/tmp/src/build/linux/sysroot", req.arg(7));
EXPECT_EQ("-resource-dir=/tmp/src/third_party/clang", req.arg(8));
EXPECT_EQ("/tmp/src/out/Release", req.cwd());
EXPECT_FALSE(req.env().empty());
EXPECT_EQ(1, req.input_size());
EXPECT_EQ("/tmp/src/hello.c", req.input(0).filename());
EXPECT_TRUE(req.input(0).has_hash_key());
ValidateOutputFilesAndDirs(req);
EXPECT_EQ(1, req.expected_output_files_size());
EXPECT_EQ("hello.o", req.expected_output_files(0));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, PathShouldNotBeDropped) {
/*
Assum A.h/B.h contains same source.
`const int c = 1;`
c.c is like below.
```
#if __has_include("A.h")
#include "A.h"
#endif
int f() {
return c;
}
#if __has_include("B.h")
#include "B.h"
#endif
```
If we have A.h, c.c can be compiled, but if we have B.h, c.c cannot be
compiled. So, pathname should not be omitted from input.
*/
static const char kExecReq[] = R"(command_spec {
name: "gcc"
version: "7[(Debian 7.3.0-5) 7.3.0]"
target: "x86_64-linux-gnu"
binary_hash: "2ffee45aadb27f30f1b93197b37c0e1c16cc7b7ee296b9145bd4dcf2bb0d3783"
local_compiler_path: "/usr/bin/gcc"
system_include_path: "/usr/lib/gcc/x86_64-linux-gnu/7/include"
system_include_path: "/usr/local/include"
system_include_path: "/usr/lib/gcc/x86_64-linux-gnu/7/include-fixed"
system_include_path: "/usr/include/x86_64-linux-gnu"
system_include_path: "/usr/include"
}
arg: "gcc"
arg: "-g0"
arg: "-c"
arg: "c.c"
env: "PWD=/test"
cwd: "/test"
Input {
filename: "./A.h"
hash_key: "3d0f5d02e111f5c81bfeb5569051a09d1e1802a397a1a4573be4033c94f19929"
}
Input {
filename: "/usr/include/stdc-predef.h"
hash_key: "de7847b43d61360f4ce232a1fea697595fdd51b4e9a22dc4315b4ae12088f821"
}
Input {
filename: "c.c"
hash_key: "3724914edef730722a1a9abbdf1388609aa7355900a906e76d81fe2fc5d0afd4"
}
requester_info {
username: "root"
compiler_proxy_id: "id"
api_version: 2
pid: 0
goma_revision: "a771a05d03d46431d0fcf65b2bddd49a9c469b7d@1522119548"
}
expected_output_files: "c.o"
)";
devtools_goma::ExecReq req_a, req_b;
const std::vector<string> kTestOptions{
"Xclang", "B", "I", "gcc-toolchain", "-sysroot", "resource-dir"};
ASSERT_TRUE(TextFormat::ParseFromString(kExecReq, &req_a));
req_b = req_a;
*(req_b.mutable_input(0)->mutable_filename()) = "./B.h";
EXPECT_EQ(req_a.input(0).filename(), "./A.h");
EXPECT_FALSE(MessageDifferencer::Equals(req_a, req_b));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req_a));
ASSERT_TRUE(devtools_goma::VerifyExecReq(req_b));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req_a));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req_b));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(),
&req_a);
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(),
&req_b);
EXPECT_EQ(req_a.input(0).filename(), "./A.h");
EXPECT_EQ(req_b.input(0).filename(), "./B.h");
EXPECT_FALSE(MessageDifferencer::Equals(req_a, req_b));
EXPECT_EQ(1, req_a.expected_output_files_size());
EXPECT_EQ("c.o", req_a.expected_output_files(0));
EXPECT_TRUE(req_a.expected_output_dirs().empty());
EXPECT_EQ(1, req_b.expected_output_files_size());
EXPECT_EQ("c.o", req_b.expected_output_files(0));
EXPECT_TRUE(req_b.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, FDebugCompilationDir) {
devtools_goma::ExecReq req;
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqFDebugCompilationDir, &req));
req.set_cwd("/home/chromium/chromium/src");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(req.cwd(), "/chromium");
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o",
req.expected_output_files(0));
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o.d",
req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, FDebugCompilationDirFDebugPrefixMap) {
devtools_goma::ExecReq req;
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqFDebugCompilationDir, &req));
req.set_cwd("/home/chromium/chromium/src/");
req.add_arg("-fdebug-prefix-map=/chromium=/home/chrome");
const std::map<string, string> debug_prefix_map{
{"/chromium", "/home/chrome"}};
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), debug_prefix_map, &req);
EXPECT_EQ(req.cwd(), "/home/chrome");
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o",
req.expected_output_files(0));
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o.d",
req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
TEST(GCCExecReqNormalizerTest, FDebugCompilationDirCoverageMapping) {
devtools_goma::ExecReq req;
ASSERT_TRUE(TextFormat::ParseFromString(kExecReqFDebugCompilationDir, &req));
req.set_cwd("/home/chromium/chromium/src");
req.add_arg("-fprofile-instr-generate");
req.add_arg("-fcoverage-mapping");
ASSERT_TRUE(devtools_goma::VerifyExecReq(req));
ASSERT_TRUE(ValidateOutputFilesAndDirs(req));
devtools_goma::NormalizeExecReqForCacheKey(
0, false, false, std::vector<string>(), std::map<string, string>(), &req);
EXPECT_EQ(req.cwd(), "/home/chromium/chromium/src");
EXPECT_EQ(2, req.expected_output_files_size());
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o",
req.expected_output_files(0));
EXPECT_EQ("obj/base/allocator/tcmalloc/malloc_hook.o.d",
req.expected_output_files(1));
EXPECT_TRUE(req.expected_output_dirs().empty());
}
} // namespace devtools_goma