Skip to content

Commit de85997

Browse files
committedOct 7, 2019
[clangd] Fix raciness in code completion tests
Reviewers: sammccall, ilya-biryukov Subscribers: MaskRay, jkorous, arphaman, usaxena95, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D68273 llvm-svn: 373924
1 parent 90b7dc9 commit de85997

File tree

1 file changed

+19
-11
lines changed

1 file changed

+19
-11
lines changed
 

‎clang-tools-extra/clangd/unittests/CodeCompleteTests.cpp

+19-11
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
#include "TestFS.h"
1919
#include "TestIndex.h"
2020
#include "TestTU.h"
21+
#include "Threading.h"
2122
#include "index/Index.h"
2223
#include "index/MemIndex.h"
2324
#include "clang/Sema/CodeCompleteConsumer.h"
@@ -27,6 +28,8 @@
2728
#include "llvm/Testing/Support/Error.h"
2829
#include "gmock/gmock.h"
2930
#include "gtest/gtest.h"
31+
#include <condition_variable>
32+
#include <mutex>
3033

3134
namespace clang {
3235
namespace clangd {
@@ -1112,8 +1115,9 @@ class IndexRequestCollector : public SymbolIndex {
11121115
bool
11131116
fuzzyFind(const FuzzyFindRequest &Req,
11141117
llvm::function_ref<void(const Symbol &)> Callback) const override {
1115-
std::lock_guard<std::mutex> Lock(Mut);
1118+
std::unique_lock<std::mutex> Lock(Mut);
11161119
Requests.push_back(Req);
1120+
ReceivedRequestCV.notify_one();
11171121
return true;
11181122
}
11191123

@@ -1131,25 +1135,32 @@ class IndexRequestCollector : public SymbolIndex {
11311135
// isn't used in production code.
11321136
size_t estimateMemoryUsage() const override { return 0; }
11331137

1134-
const std::vector<FuzzyFindRequest> consumeRequests() const {
1135-
std::lock_guard<std::mutex> Lock(Mut);
1138+
const std::vector<FuzzyFindRequest> consumeRequests(size_t Num) const {
1139+
std::unique_lock<std::mutex> Lock(Mut);
1140+
EXPECT_TRUE(wait(Lock, ReceivedRequestCV, timeoutSeconds(10),
1141+
[this, Num] { return Requests.size() == Num; }));
11361142
auto Reqs = std::move(Requests);
11371143
Requests = {};
11381144
return Reqs;
11391145
}
11401146

11411147
private:
11421148
// We need a mutex to handle async fuzzy find requests.
1149+
mutable std::condition_variable ReceivedRequestCV;
11431150
mutable std::mutex Mut;
11441151
mutable std::vector<FuzzyFindRequest> Requests;
11451152
};
11461153

1147-
std::vector<FuzzyFindRequest> captureIndexRequests(llvm::StringRef Code) {
1154+
// Clients have to consume exactly Num requests.
1155+
std::vector<FuzzyFindRequest> captureIndexRequests(llvm::StringRef Code,
1156+
size_t Num = 1) {
11481157
clangd::CodeCompleteOptions Opts;
11491158
IndexRequestCollector Requests;
11501159
Opts.Index = &Requests;
11511160
completions(Code, {}, Opts);
1152-
return Requests.consumeRequests();
1161+
const auto Reqs = Requests.consumeRequests(Num);
1162+
EXPECT_EQ(Reqs.size(), Num);
1163+
return Reqs;
11531164
}
11541165

11551166
TEST(CompletionTest, UnqualifiedIdQuery) {
@@ -2098,26 +2109,23 @@ TEST(CompletionTest, EnableSpeculativeIndexRequest) {
20982109

20992110
auto CompleteAtPoint = [&](StringRef P) {
21002111
cantFail(runCodeComplete(Server, File, Test.point(P), Opts));
2101-
// Sleep for a while to make sure asynchronous call (if applicable) is also
2102-
// triggered before callback is invoked.
2103-
std::this_thread::sleep_for(std::chrono::milliseconds(100));
21042112
};
21052113

21062114
CompleteAtPoint("1");
2107-
auto Reqs1 = Requests.consumeRequests();
2115+
auto Reqs1 = Requests.consumeRequests(1);
21082116
ASSERT_EQ(Reqs1.size(), 1u);
21092117
EXPECT_THAT(Reqs1[0].Scopes, UnorderedElementsAre("ns1::"));
21102118

21112119
CompleteAtPoint("2");
2112-
auto Reqs2 = Requests.consumeRequests();
2120+
auto Reqs2 = Requests.consumeRequests(1);
21132121
// Speculation succeeded. Used speculative index result.
21142122
ASSERT_EQ(Reqs2.size(), 1u);
21152123
EXPECT_EQ(Reqs2[0], Reqs1[0]);
21162124

21172125
CompleteAtPoint("3");
21182126
// Speculation failed. Sent speculative index request and the new index
21192127
// request after sema.
2120-
auto Reqs3 = Requests.consumeRequests();
2128+
auto Reqs3 = Requests.consumeRequests(2);
21212129
ASSERT_EQ(Reqs3.size(), 2u);
21222130
}
21232131

0 commit comments

Comments
 (0)
Please sign in to comment.