1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
#include <string>
#include "catch2/catch.hpp"
#include "gsl-lite/gsl-lite.hpp"
#include "src/buildtool/execution_api/local/local_ac.hpp"
#include "src/buildtool/file_system/file_system_manager.hpp"
#include "test/utils/hermeticity/local.hpp"
[[nodiscard]] static auto RunDummyExecution(gsl::not_null<LocalAC*> const& ac,
bazel_re::Digest const& action_id,
std::string const& seed) -> bool;
TEST_CASE_METHOD(HermeticLocalTestFixture,
"LocalAC: Single action, single result",
"[execution_api]") {
LocalCAS cas{};
LocalAC ac{&cas};
auto action_id = ArtifactDigest::Create("action");
CHECK(not ac.CachedResult(action_id));
CHECK(RunDummyExecution(&ac, action_id, "result"));
auto ac_result = ac.CachedResult(action_id);
CHECK(ac_result);
}
TEST_CASE_METHOD(HermeticLocalTestFixture,
"LocalAC: Two different actions, two different results",
"[execution_api]") {
LocalCAS cas{};
LocalAC ac{&cas};
auto action_id1 = ArtifactDigest::Create("action1");
auto action_id2 = ArtifactDigest::Create("action2");
CHECK(not ac.CachedResult(action_id1));
CHECK(not ac.CachedResult(action_id2));
std::string result_content1{};
std::string result_content2{};
CHECK(RunDummyExecution(&ac, action_id1, "result1"));
auto ac_result1 = ac.CachedResult(action_id1);
REQUIRE(ac_result1);
CHECK(ac_result1->SerializeToString(&result_content1));
CHECK(RunDummyExecution(&ac, action_id2, "result2"));
auto ac_result2 = ac.CachedResult(action_id2);
REQUIRE(ac_result2);
CHECK(ac_result2->SerializeToString(&result_content2));
// check different actions, different result
CHECK(action_id1.hash() != action_id2.hash());
CHECK(result_content1 != result_content2);
}
TEST_CASE_METHOD(HermeticLocalTestFixture,
"LocalAC: Two different actions, same two results",
"[execution_api]") {
LocalCAS cas{};
LocalAC ac{&cas};
auto action_id1 = ArtifactDigest::Create("action1");
auto action_id2 = ArtifactDigest::Create("action2");
CHECK(not ac.CachedResult(action_id1));
CHECK(not ac.CachedResult(action_id2));
std::string result_content1{};
std::string result_content2{};
CHECK(RunDummyExecution(&ac, action_id1, "same result"));
auto ac_result1 = ac.CachedResult(action_id1);
REQUIRE(ac_result1);
CHECK(ac_result1->SerializeToString(&result_content1));
CHECK(RunDummyExecution(&ac, action_id2, "same result"));
auto ac_result2 = ac.CachedResult(action_id2);
REQUIRE(ac_result2);
CHECK(ac_result2->SerializeToString(&result_content2));
// check different actions, but same result
CHECK(action_id1.hash() != action_id2.hash());
CHECK(result_content1 == result_content2);
}
TEST_CASE_METHOD(HermeticLocalTestFixture,
"LocalAC: Same two actions, two differnet results",
"[execution_api]") {
LocalCAS cas{};
LocalAC ac{&cas};
auto action_id = ArtifactDigest::Create("same action");
CHECK(not ac.CachedResult(action_id));
std::string result_content1{};
std::string result_content2{};
CHECK(RunDummyExecution(&ac, action_id, "result1"));
auto ac_result1 = ac.CachedResult(action_id);
REQUIRE(ac_result1);
CHECK(ac_result1->SerializeToString(&result_content1));
CHECK(RunDummyExecution(&ac, action_id, "result2")); // updated
auto ac_result2 = ac.CachedResult(action_id);
REQUIRE(ac_result2);
CHECK(ac_result2->SerializeToString(&result_content2));
// check same actions, different cached result
CHECK(result_content1 != result_content2);
}
auto RunDummyExecution(gsl::not_null<LocalAC*> const& ac,
bazel_re::Digest const& action_id,
std::string const& seed) -> bool {
bazel_re::ActionResult result{};
*result.add_output_files() = [&]() {
bazel_re::OutputFile out{};
out.set_path(seed);
return out;
}();
return ac->StoreResult(action_id, result);
}
|