diff options
author | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2023-03-27 18:28:14 +0200 |
---|---|---|
committer | Paul Cristian Sarbu <paul.cristian.sarbu@huawei.com> | 2023-03-30 13:45:00 +0200 |
commit | 1d8321976c7634f80b7f878b4219899fe0748d70 (patch) | |
tree | b1f740fcd88f22f51baf7e3dce799e54d4a600c0 | |
parent | b1eeb28905d38231f5eda70148de0ebf8eb1cd8a (diff) | |
download | justbuild-1d8321976c7634f80b7f878b4219899fe0748d70.tar.gz |
test: Make GitCAS thread-safety tests more strict
Move the creation of a fake repository on top of an existing odb
into the individual threads, to ensure the thread-safety of the
operations on fake repositories is properly tested.
-rw-r--r-- | test/buildtool/file_system/git_repo.test.cpp | 21 | ||||
-rw-r--r-- | test/buildtool/file_system/git_tree.test.cpp | 7 |
2 files changed, 20 insertions, 8 deletions
diff --git a/test/buildtool/file_system/git_repo.test.cpp b/test/buildtool/file_system/git_repo.test.cpp index 55e51148..34be03ff 100644 --- a/test/buildtool/file_system/git_repo.test.cpp +++ b/test/buildtool/file_system/git_repo.test.cpp @@ -372,10 +372,6 @@ TEST_CASE("Multi-threaded fake repository operations", "[git_repo]") { REQUIRE(remote_repo_path); auto remote_cas = GitCAS::Open(*remote_repo_path); REQUIRE(remote_cas); - auto remote_repo = GitRepo::Open(remote_cas); - REQUIRE(remote_repo); - REQUIRE(remote_repo->GetGitCAS() == remote_cas); - REQUIRE(remote_repo->IsRepoFake()); // setup dummy logger auto logger = std::make_shared<GitRepo::anon_logger_t>( @@ -395,12 +391,15 @@ TEST_CASE("Multi-threaded fake repository operations", "[git_repo]") { constexpr int NUM_CASES = 5; for (int id{}; id < kNumThreads; ++id) { threads.emplace_back( - [&remote_repo, &remote_repo_path, &logger, &starting_signal]( + [&remote_cas, &remote_repo_path, &logger, &starting_signal]( int tid) { starting_signal.wait(false); // cases based on thread number switch (tid % NUM_CASES) { case 0: { + auto remote_repo = GitRepo::Open(remote_cas); + REQUIRE(remote_repo); + REQUIRE(remote_repo->IsRepoFake()); // Get subtree entry id from commit auto entry_bazbar_c = remote_repo->GetSubtreeFromCommit( @@ -409,6 +408,9 @@ TEST_CASE("Multi-threaded fake repository operations", "[git_repo]") { CHECK(*entry_bazbar_c == kBarId); } break; case 1: { + auto remote_repo = GitRepo::Open(remote_cas); + REQUIRE(remote_repo); + REQUIRE(remote_repo->IsRepoFake()); // Get subtree entry id from root tree id auto entry_bazbar_t = remote_repo->GetSubtreeFromTree( @@ -417,6 +419,9 @@ TEST_CASE("Multi-threaded fake repository operations", "[git_repo]") { CHECK(*entry_bazbar_t == kBarId); } break; case 2: { + auto remote_repo = GitRepo::Open(remote_cas); + REQUIRE(remote_repo); + REQUIRE(remote_repo->IsRepoFake()); // Find repository root from path auto root_path_from_bazbar = GitRepo::GetRepoRootFromPath( @@ -425,6 +430,9 @@ TEST_CASE("Multi-threaded fake repository operations", "[git_repo]") { CHECK(*root_path_from_bazbar == *remote_repo_path); } break; case 3: { + auto remote_repo = GitRepo::Open(remote_cas); + REQUIRE(remote_repo); + REQUIRE(remote_repo->IsRepoFake()); // Get subtree entry id from path auto path_bazbar = *remote_repo_path / "baz/bar"; auto entry_bazbar_p = @@ -434,6 +442,9 @@ TEST_CASE("Multi-threaded fake repository operations", "[git_repo]") { CHECK(*entry_bazbar_p == kBarId); } break; case 4: { + auto remote_repo = GitRepo::Open(remote_cas); + REQUIRE(remote_repo); + REQUIRE(remote_repo->IsRepoFake()); auto result_containing = remote_repo->CheckCommitExists(kRootCommit, logger); diff --git a/test/buildtool/file_system/git_tree.test.cpp b/test/buildtool/file_system/git_tree.test.cpp index 7c5b53e3..1526e9c9 100644 --- a/test/buildtool/file_system/git_tree.test.cpp +++ b/test/buildtool/file_system/git_tree.test.cpp @@ -555,13 +555,14 @@ TEST_CASE("Thread-safety", "[git_tree]") { SECTION("Parsing same tree with same CAS") { auto cas = GitCAS::Open(*repo_path); REQUIRE(cas); - auto repo = GitRepo::Open(cas); - REQUIRE(repo); for (int id{}; id < kNumThreads; ++id) { - threads.emplace_back([&repo, &starting_signal]() { + threads.emplace_back([&cas, &starting_signal]() { starting_signal.wait(false); + auto repo = GitRepo::Open(cas); + REQUIRE(repo); + auto entries = repo->ReadTree(kTreeId, true); REQUIRE(entries); }); |