summaryrefslogtreecommitdiffstats
path: root/clang-tools-extra/unittests/clangd
diff options
context:
space:
mode:
Diffstat (limited to 'clang-tools-extra/unittests/clangd')
-rw-r--r--clang-tools-extra/unittests/clangd/ClangdTests.cpp103
-rw-r--r--clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp30
-rw-r--r--clang-tools-extra/unittests/clangd/SyncAPI.cpp6
-rw-r--r--clang-tools-extra/unittests/clangd/SyncAPI.h3
-rw-r--r--clang-tools-extra/unittests/clangd/XRefsTests.cpp8
5 files changed, 59 insertions, 91 deletions
diff --git a/clang-tools-extra/unittests/clangd/ClangdTests.cpp b/clang-tools-extra/unittests/clangd/ClangdTests.cpp
index 3e9bda15e8f..5d799303a33 100644
--- a/clang-tools-extra/unittests/clangd/ClangdTests.cpp
+++ b/clang-tools-extra/unittests/clangd/ClangdTests.cpp
@@ -148,8 +148,7 @@ protected:
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
for (const auto &FileWithContents : ExtraFiles)
FS.Files[testPath(FileWithContents.first)] = FileWithContents.second;
@@ -202,8 +201,7 @@ TEST_F(ClangdVFSTest, Reparse) {
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
const auto SourceContents = R"cpp(
#include "foo.h"
@@ -239,9 +237,7 @@ TEST_F(ClangdVFSTest, ReparseOnHeaderChange) {
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
-
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
const auto SourceContents = R"cpp(
#include "foo.h"
@@ -280,10 +276,7 @@ TEST_F(ClangdVFSTest, CheckVersions) {
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
- // Run ClangdServer synchronously.
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto FooCpp = testPath("foo.cpp");
const auto SourceContents = "int a;";
@@ -293,15 +286,13 @@ TEST_F(ClangdVFSTest, CheckVersions) {
// Use default completion options.
clangd::CodeCompleteOptions CCOpts;
- // No need to sync reparses, because requests are processed on the calling
- // thread.
FS.Tag = "123";
- Server.addDocument(FooCpp, SourceContents);
+ runAddDocument(Server, FooCpp, SourceContents);
EXPECT_EQ(runCodeComplete(Server, FooCpp, Position(), CCOpts).Tag, FS.Tag);
EXPECT_EQ(DiagConsumer.lastVFSTag(), FS.Tag);
FS.Tag = "321";
- Server.addDocument(FooCpp, SourceContents);
+ runAddDocument(Server, FooCpp, SourceContents);
EXPECT_EQ(DiagConsumer.lastVFSTag(), FS.Tag);
EXPECT_EQ(runCodeComplete(Server, FooCpp, Position(), CCOpts).Tag, FS.Tag);
}
@@ -317,10 +308,7 @@ TEST_F(ClangdVFSTest, SearchLibDir) {
{"-xc++", "-target", "x86_64-linux-unknown",
"-m64", "--gcc-toolchain=/randomusr",
"-stdlib=libstdc++"});
- // Run ClangdServer synchronously.
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
// Just a random gcc version string
SmallString<8> Version("4.9.3");
@@ -349,16 +337,14 @@ mock_string x;
)cpp";
FS.Files[FooCpp] = SourceContents;
- // No need to sync reparses, because requests are processed on the calling
- // thread.
- Server.addDocument(FooCpp, SourceContents);
+ runAddDocument(Server, FooCpp, SourceContents);
EXPECT_FALSE(DiagConsumer.hadErrorInLastDiags());
const auto SourceContentsWithError = R"cpp(
#include <string>
std::string x;
)cpp";
- Server.addDocument(FooCpp, SourceContentsWithError);
+ runAddDocument(Server, FooCpp, SourceContentsWithError);
EXPECT_TRUE(DiagConsumer.hadErrorInLastDiags());
}
#endif // LLVM_ON_UNIX
@@ -367,12 +353,8 @@ TEST_F(ClangdVFSTest, ForceReparseCompileCommand) {
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
- // No need to sync reparses, because reparses are performed on the calling
- // thread.
auto FooCpp = testPath("foo.cpp");
const auto SourceContents1 = R"cpp(
template <class T>
@@ -388,26 +370,27 @@ struct bar { T x; };
// First parse files in C mode and check they produce errors.
CDB.ExtraClangFlags = {"-xc"};
- Server.addDocument(FooCpp, SourceContents1);
+ runAddDocument(Server, FooCpp, SourceContents1);
EXPECT_TRUE(DiagConsumer.hadErrorInLastDiags());
- Server.addDocument(FooCpp, SourceContents2);
+ runAddDocument(Server, FooCpp, SourceContents2);
EXPECT_TRUE(DiagConsumer.hadErrorInLastDiags());
// Now switch to C++ mode.
CDB.ExtraClangFlags = {"-xc++"};
// Currently, addDocument never checks if CompileCommand has changed, so we
// expect to see the errors.
- Server.addDocument(FooCpp, SourceContents1);
+ runAddDocument(Server, FooCpp, SourceContents1);
EXPECT_TRUE(DiagConsumer.hadErrorInLastDiags());
- Server.addDocument(FooCpp, SourceContents2);
+ runAddDocument(Server, FooCpp, SourceContents2);
EXPECT_TRUE(DiagConsumer.hadErrorInLastDiags());
// But forceReparse should reparse the file with proper flags.
Server.forceReparse(FooCpp);
+ ASSERT_TRUE(Server.blockUntilIdleForTest());
EXPECT_FALSE(DiagConsumer.hadErrorInLastDiags());
// Subsequent addDocument calls should finish without errors too.
- Server.addDocument(FooCpp, SourceContents1);
+ runAddDocument(Server, FooCpp, SourceContents1);
EXPECT_FALSE(DiagConsumer.hadErrorInLastDiags());
- Server.addDocument(FooCpp, SourceContents2);
+ runAddDocument(Server, FooCpp, SourceContents2);
EXPECT_FALSE(DiagConsumer.hadErrorInLastDiags());
}
@@ -415,12 +398,8 @@ TEST_F(ClangdVFSTest, ForceReparseCompileCommandDefines) {
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
- // No need to sync reparses, because reparses are performed on the calling
- // thread.
auto FooCpp = testPath("foo.cpp");
const auto SourceContents = R"cpp(
#ifdef WITH_ERROR
@@ -434,20 +413,21 @@ int main() { return 0; }
// Parse with define, we expect to see the errors.
CDB.ExtraClangFlags = {"-DWITH_ERROR"};
- Server.addDocument(FooCpp, SourceContents);
+ runAddDocument(Server, FooCpp, SourceContents);
EXPECT_TRUE(DiagConsumer.hadErrorInLastDiags());
// Parse without the define, no errors should be produced.
CDB.ExtraClangFlags = {};
// Currently, addDocument never checks if CompileCommand has changed, so we
// expect to see the errors.
- Server.addDocument(FooCpp, SourceContents);
+ runAddDocument(Server, FooCpp, SourceContents);
EXPECT_TRUE(DiagConsumer.hadErrorInLastDiags());
// But forceReparse should reparse the file with proper flags.
Server.forceReparse(FooCpp);
+ ASSERT_TRUE(Server.blockUntilIdleForTest());
EXPECT_FALSE(DiagConsumer.hadErrorInLastDiags());
// Subsequent addDocument call should finish without errors too.
- Server.addDocument(FooCpp, SourceContents);
+ runAddDocument(Server, FooCpp, SourceContents);
EXPECT_FALSE(DiagConsumer.hadErrorInLastDiags());
}
@@ -476,9 +456,7 @@ int hello;
MockFSProvider FS;
MockCompilationDatabase CDB;
MultipleErrorCheckingDiagConsumer DiagConsumer;
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto FooCpp = testPath("foo.cpp");
auto BarCpp = testPath("bar.cpp");
@@ -492,6 +470,7 @@ int hello;
Server.addDocument(FooCpp, FooSource.code());
Server.addDocument(BarCpp, BarSource.code());
Server.addDocument(BazCpp, BazSource.code());
+ ASSERT_TRUE(Server.blockUntilIdleForTest());
EXPECT_THAT(DiagConsumer.filesWithDiags(),
UnorderedElementsAre(Pair(FooCpp, false), Pair(BarCpp, true),
@@ -507,6 +486,7 @@ int hello;
DiagConsumer.clear();
Server.removeDocument(BazCpp);
Server.reparseOpenedFiles();
+ ASSERT_TRUE(Server.blockUntilIdleForTest());
EXPECT_THAT(DiagConsumer.filesWithDiags(),
UnorderedElementsAre(Pair(FooCpp, false), Pair(BarCpp, false)));
@@ -521,12 +501,8 @@ TEST_F(ClangdVFSTest, MemoryUsage) {
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
- // No need to sync reparses, because reparses are performed on the calling
- // thread.
Path FooCpp = testPath("foo.cpp");
const auto SourceContents = R"cpp(
struct Something {
@@ -542,14 +518,17 @@ struct Something {
Server.addDocument(FooCpp, SourceContents);
Server.addDocument(BarCpp, SourceContents);
+ ASSERT_TRUE(Server.blockUntilIdleForTest());
EXPECT_THAT(Server.getUsedBytesPerFile(),
UnorderedElementsAre(Pair(FooCpp, Gt(0u)), Pair(BarCpp, Gt(0u))));
Server.removeDocument(FooCpp);
+ ASSERT_TRUE(Server.blockUntilIdleForTest());
EXPECT_THAT(Server.getUsedBytesPerFile(), ElementsAre(Pair(BarCpp, Gt(0u))));
Server.removeDocument(BarCpp);
+ ASSERT_TRUE(Server.blockUntilIdleForTest());
EXPECT_THAT(Server.getUsedBytesPerFile(), IsEmpty());
}
@@ -558,9 +537,7 @@ TEST_F(ClangdVFSTest, InvalidCompileCommand) {
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto FooCpp = testPath("foo.cpp");
// clang cannot create CompilerInvocation if we pass two files in the
@@ -569,7 +546,7 @@ TEST_F(ClangdVFSTest, InvalidCompileCommand) {
CDB.ExtraClangFlags.push_back(FooCpp);
// Clang can't parse command args in that case, but we shouldn't crash.
- Server.addDocument(FooCpp, "int main() {}");
+ runAddDocument(Server, FooCpp, "int main() {}");
EXPECT_EQ(runDumpAST(Server, FooCpp), "<no-ast>");
EXPECT_ERROR(runFindDefinitions(Server, FooCpp, Position()));
@@ -678,8 +655,7 @@ int d;
TestDiagConsumer DiagConsumer;
{
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
// Prepare some random distributions for the test.
std::random_device RandGen;
@@ -825,9 +801,7 @@ TEST_F(ClangdVFSTest, CheckSourceHeaderSwitch) {
MockFSProvider FS;
ErrorCheckingDiagConsumer DiagConsumer;
MockCompilationDatabase CDB;
-
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto SourceContents = R"cpp(
#include "foo.h"
@@ -953,8 +927,7 @@ int d;
NoConcurrentAccessDiagConsumer DiagConsumer(std::move(StartSecondPromise));
MockCompilationDatabase CDB;
- ClangdServer Server(CDB, DiagConsumer, FS, /*AsyncThreadsCount=*/4,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
Server.addDocument(FooCpp, SourceContentsWithErrors);
StartSecond.wait();
Server.addDocument(FooCpp, SourceContentsWithoutErrors);
@@ -968,12 +941,8 @@ TEST_F(ClangdVFSTest, InsertIncludes) {
MockCompilationDatabase CDB;
std::string SearchDirArg = (llvm::Twine("-I") + testRoot()).str();
CDB.ExtraClangFlags.insert(CDB.ExtraClangFlags.end(), {SearchDirArg.c_str()});
- ClangdServer Server(CDB, DiagConsumer, FS,
- /*AsyncThreadsCount=*/0,
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
- // No need to sync reparses, because reparses are performed on the calling
- // thread.
auto FooCpp = testPath("foo.cpp");
const auto Code = R"cpp(
#include "x.h"
@@ -981,7 +950,7 @@ TEST_F(ClangdVFSTest, InsertIncludes) {
void f() {}
)cpp";
FS.Files[FooCpp] = Code;
- Server.addDocument(FooCpp, Code);
+ runAddDocument(Server, FooCpp, Code);
auto Inserted = [&](llvm::StringRef Original, llvm::StringRef Preferred,
llvm::StringRef Expected) {
diff --git a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
index ccf2bedc56f..9e093af8213 100644
--- a/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
+++ b/clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp
@@ -117,12 +117,10 @@ CompletionList completions(StringRef Text,
MockFSProvider FS;
MockCompilationDatabase CDB;
IgnoreDiagnostics DiagConsumer;
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto File = testPath("foo.cpp");
Annotations Test(Text);
- Server.addDocument(File, Test.code());
- EXPECT_TRUE(Server.blockUntilIdleForTest()) << "Waiting for preamble";
+ runAddDocument(Server, File, Test.code());
auto CompletionList = runCodeComplete(Server, File, Test.point(), Opts).Value;
// Sanity-check that filterText is valid.
EXPECT_THAT(CompletionList.items, Each(NameContainsFilter()));
@@ -522,8 +520,7 @@ TEST(CompletionTest, IndexSuppressesPreambleCompletions) {
MockFSProvider FS;
MockCompilationDatabase CDB;
IgnoreDiagnostics DiagConsumer;
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
FS.Files[testPath("bar.h")] =
R"cpp(namespace ns { struct preamble { int member; }; })cpp";
@@ -534,8 +531,7 @@ TEST(CompletionTest, IndexSuppressesPreambleCompletions) {
void f() { ns::^; }
void f() { ns::preamble().$2^; }
)cpp");
- Server.addDocument(File, Test.code());
- ASSERT_TRUE(Server.blockUntilIdleForTest()) << "Waiting for preamble";
+ runAddDocument(Server, File, Test.code());
clangd::CodeCompleteOptions Opts = {};
auto I = memIndex({var("ns::index")});
@@ -558,17 +554,16 @@ TEST(CompletionTest, DynamicIndexMultiFile) {
MockFSProvider FS;
MockCompilationDatabase CDB;
IgnoreDiagnostics DiagConsumer;
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true,
- /*BuildDynamicSymbolIndex=*/true);
+ auto Opts = ClangdServer::optsForTest();
+ Opts.BuildDynamicSymbolIndex = true;
+ ClangdServer Server(CDB, FS, DiagConsumer, Opts);
FS.Files[testPath("foo.h")] = R"cpp(
namespace ns { class XYZ {}; void foo(int x) {} }
)cpp";
- Server.addDocument(testPath("foo.cpp"), R"cpp(
+ runAddDocument(Server, testPath("foo.cpp"), R"cpp(
#include "foo.h"
)cpp");
- ASSERT_TRUE(Server.blockUntilIdleForTest()) << "Waiting for preamble";
auto File = testPath("bar.cpp");
Annotations Test(R"cpp(
@@ -579,8 +574,7 @@ TEST(CompletionTest, DynamicIndexMultiFile) {
}
void f() { ns::^ }
)cpp");
- Server.addDocument(File, Test.code());
- ASSERT_TRUE(Server.blockUntilIdleForTest()) << "Waiting for preamble";
+ runAddDocument(Server, File, Test.code());
auto Results = runCodeComplete(Server, File, Test.point(), {}).Value;
// "XYZ" and "foo" are not included in the file being completed but are still
@@ -605,12 +599,10 @@ SignatureHelp signatures(StringRef Text) {
MockFSProvider FS;
MockCompilationDatabase CDB;
IgnoreDiagnostics DiagConsumer;
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto File = testPath("foo.cpp");
Annotations Test(Text);
- Server.addDocument(File, Test.code());
- EXPECT_TRUE(Server.blockUntilIdleForTest()) << "Waiting for preamble";
+ runAddDocument(Server, File, Test.code());
auto R = runSignatureHelp(Server, File, Test.point());
assert(R);
return R.get().Value;
diff --git a/clang-tools-extra/unittests/clangd/SyncAPI.cpp b/clang-tools-extra/unittests/clangd/SyncAPI.cpp
index 75cc781900e..62b68caef1f 100644
--- a/clang-tools-extra/unittests/clangd/SyncAPI.cpp
+++ b/clang-tools-extra/unittests/clangd/SyncAPI.cpp
@@ -11,6 +11,12 @@
namespace clang {
namespace clangd {
+void runAddDocument(ClangdServer &Server, PathRef File, StringRef Contents) {
+ Server.addDocument(File, Contents);
+ if (!Server.blockUntilIdleForTest())
+ llvm_unreachable("not idle after addDocument");
+}
+
namespace {
/// A helper that waits for async callbacks to fire and exposes their result in
/// the output variable. Intended to be used in the following way:
diff --git a/clang-tools-extra/unittests/clangd/SyncAPI.h b/clang-tools-extra/unittests/clangd/SyncAPI.h
index 31d8483e339..9bfe155e6e1 100644
--- a/clang-tools-extra/unittests/clangd/SyncAPI.h
+++ b/clang-tools-extra/unittests/clangd/SyncAPI.h
@@ -18,6 +18,9 @@
namespace clang {
namespace clangd {
+// Calls addDocument and then blockUntilIdleForTest.
+void runAddDocument(ClangdServer &Server, PathRef File, StringRef Contents);
+
Tagged<CompletionList> runCodeComplete(ClangdServer &Server, PathRef File,
Position Pos,
clangd::CodeCompleteOptions Opts);
diff --git a/clang-tools-extra/unittests/clangd/XRefsTests.cpp b/clang-tools-extra/unittests/clangd/XRefsTests.cpp
index 8183c980f50..c2dd053bf11 100644
--- a/clang-tools-extra/unittests/clangd/XRefsTests.cpp
+++ b/clang-tools-extra/unittests/clangd/XRefsTests.cpp
@@ -243,13 +243,13 @@ int baz = f^oo;
IgnoreDiagnostics DiagConsumer;
MockCompilationDatabase CDB(/*UseRelPaths=*/true);
MockFSProvider FS;
- ClangdServer Server(CDB, DiagConsumer, FS, /*AsyncThreadsCount=*/0,
- /*StorePreambleInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto FooCpp = testPath("foo.cpp");
FS.Files[FooCpp] = "";
Server.addDocument(FooCpp, SourceAnnotations.code());
+ runAddDocument(Server, FooCpp, SourceAnnotations.code());
auto Locations =
runFindDefinitions(Server, FooCpp, SourceAnnotations.point());
EXPECT_TRUE(bool(Locations)) << "findDefinitions returned an error";
@@ -568,9 +568,7 @@ TEST(GoToInclude, All) {
MockFSProvider FS;
IgnoreDiagnostics DiagConsumer;
MockCompilationDatabase CDB;
-
- ClangdServer Server(CDB, DiagConsumer, FS, getDefaultAsyncThreadsCount(),
- /*StorePreamblesInMemory=*/true);
+ ClangdServer Server(CDB, FS, DiagConsumer, ClangdServer::optsForTest());
auto FooCpp = testPath("foo.cpp");
const char *SourceContents = R"cpp(
OpenPOWER on IntegriCloud