diff options
Diffstat (limited to 'clang-tools-extra/unittests')
-rw-r--r-- | clang-tools-extra/unittests/clangd/ClangdTests.cpp | 103 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/CodeCompleteTests.cpp | 30 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/SyncAPI.cpp | 6 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/SyncAPI.h | 3 | ||||
-rw-r--r-- | clang-tools-extra/unittests/clangd/XRefsTests.cpp | 8 |
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( |