summaryrefslogtreecommitdiff
path: root/test/buildtool/execution_api/local/local_ac.test.cpp
blob: 6bbe0d646e50d10996806265aef2cc9344a9028e (plain)
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);
}