blob: cf17efdcd2aed697837efb62d030a6de62570c9f [file] [log] [blame]
// Copyright 2011 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/compiler_flags.h"
#include <limits.h>
#include <algorithm>
#include <memory>
#include <string>
#include <vector>
#include "absl/strings/str_cat.h"
#include "base/filesystem.h"
#include "base/path.h"
#include "glog/logging.h"
#include "glog/stl_logging.h"
#include "gtest/gtest.h"
#include "lib/clang_tidy_flags.h"
#include "lib/file_helper.h"
#include "lib/gcc_flags.h"
#include "lib/java_flags.h"
#include "lib/path_resolver.h"
#include "lib/vc_flags.h"
#ifdef _WIN32
# include "config_win.h"
// we'll ignore the warnings:
// warning C4996: 'strdup': The POSIX name for this item is deprecated.
# pragma warning(disable:4996)
#endif // _WIN32
namespace devtools_goma {
class CompilerFlagsTest : public ::testing::Test {
};
TEST_F(CompilerFlagsTest, CommandClassification) {
static const int kGCC = 1 << 0;
static const int kClang = 1 << 1;
static const int kVC = 1 << 2;
static const int kClangCl = 1 << 3;
static const int kJavac = 1 << 4;
static const int kClangTidy = 1 << 5;
struct TestCast {
const char* command;
int expected;
} testcases[] = {
// gcc
{ "gcc", kGCC },
{ "/usr/bin/gcc", kGCC },
{ "x86_64-linux-gnu-gcc", kGCC },
{ "g++", kGCC },
{ "/usr/bin/g++", kGCC },
{ "x86_64-linux-gnu-g++", kGCC },
{ "c++", kGCC },
{ "/usr/bin/c++", kGCC },
{ "cc", kGCC },
{ "/usr/bin/cc", kGCC },
{ "i586-mingw32msvc-cc", kGCC },
{ "g++-4.8", kGCC },
{ "arm-gnueabihf-gcc-4.9", kGCC },
{ "nacl-gcc", kGCC },
{ "i686-nacl-gcc", kGCC },
{ "nacl-gcc.exe", kGCC },
// clang
{ "clang", kGCC | kClang },
{ "clang.exe", kGCC | kClang },
{ "/usr/local/bin/clang", kGCC | kClang },
{ "clang++", kGCC | kClang },
{ "/usr/local/bin/clang++", kGCC | kClang },
{ "pnacl-clang", kGCC | kClang },
{ "pnacl-clang++", kGCC | kClang },
{ "clang++-3.7", kGCC | kClang },
{ "/usr/local/google/home/jlebar/bin/clang++-3.7", kGCC | kClang },
{ "armv7a-cros-linux-gnueabi-clang++", kGCC | kClang }, // ChromeOS clang
{ "/usr/bin/local/clang-tidy/clang", kGCC | kClang }, // not clang-tidy.
// clang (negative)
{ "clang-check", 0 },
{ "clang-tblgen", 0 },
{ "clang-format", 0 },
{ "clang-tidy-diff", 0 }, // not clang-tidy, too.
// cl
{ "cl", kVC },
{ "CL", kVC },
{ "cl.exe", kVC },
{ "CL.EXE", kVC },
{ "cL.eXe", kVC },
{ "Cl.Exe", kVC },
{ "C:\\VS10\\VC\\bin\\cl.exe", kVC },
{ "D:\\Program Files\\Microsoft Visual Studio 10\\VC\\bin\\Cl.Exe", kVC },
{ "D:\\VS9\\cl.exe\\cl.exe", kVC },
// cl (negative)
{ "D:\\VS9\\cl.exe\\cl.exe.manifest", 0 },
{ "D:\\VS9\\cl.exe\\", 0 },
{ "cl.exe.manifest", 0 },
// clang-cl
{ "clang-cl", kClangCl },
{ "clang-cl.exe", kClangCl },
{ "CLANG-CL.EXE", kClangCl },
{ "/usr/local/bin/clang-cl", kClangCl },
{ "/usr/local/bin/clang-cl.exe", kClangCl },
{ "C:\\clang-cl", kClangCl },
{ "C:\\clang-cl.exe", kClangCl },
{ "D:\\example\\clang-cl.exe", kClangCl },
{ "D:\\EXAMPLE\\CLANG-CL.EXE", kClangCl },
// javac
{ "javac", kJavac },
{ "/usr/bin/javac", kJavac },
// javac (negative)
{ "/usr/bin/javaco/yes", 0 },
// clang-tidy
{ "clang-tidy", kClangTidy },
{ "/usr/bin/local/clang-tidy", kClangTidy },
// others
{ "nacl.exe", 0 },
{ "D:\\nacl_sdk\\pepper_18\\toolchain\\win_x86_newlib\\bin\\nacl.exe", 0 },
{ "/usr/lib/gcc/bin/ar", 0 },
};
for (const auto& tc : testcases) {
EXPECT_EQ(GCCFlags::IsGCCCommand(tc.command),
(tc.expected & kGCC) ? true : false)
<< "command = " << tc.command;
EXPECT_EQ(GCCFlags::IsClangCommand(tc.command),
(tc.expected & kClang) ? true : false)
<< "command = " << tc.command;
EXPECT_EQ(VCFlags::IsVCCommand(tc.command),
(tc.expected & kVC) ? true : false)
<< "command = " << tc.command;
EXPECT_EQ(VCFlags::IsClangClCommand(tc.command),
(tc.expected & kClangCl) ? true : false)
<< "command = " << tc.command;
EXPECT_EQ(JavacFlags::IsJavacCommand(tc.command),
(tc.expected & kJavac) ? true : false)
<< "command = " << tc.command;
EXPECT_EQ(ClangTidyFlags::IsClangTidyCommand(tc.command),
(tc.expected & kClangTidy) ? true : false)
<< "command = " << tc.command;
}
}
} // namespace devtools_goma