about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--third_party/nix/src/libstore/store-api.cc13
-rw-r--r--third_party/nix/src/tests/CMakeLists.txt10
-rw-r--r--third_party/nix/src/tests/store-api-test.cc49
3 files changed, 72 insertions, 0 deletions
diff --git a/third_party/nix/src/libstore/store-api.cc b/third_party/nix/src/libstore/store-api.cc
index d7ca54fa9a..d8dbea18e9 100644
--- a/third_party/nix/src/libstore/store-api.cc
+++ b/third_party/nix/src/libstore/store-api.cc
@@ -97,30 +97,43 @@ std::optional<BuildResult> BuildResult::FromProto(
   switch (resp.status()) {
     case proto::BuildStatus::Built:
       result.status = BuildResult::Status::Built;
+      break;
     case proto::BuildStatus::Substituted:
       result.status = BuildResult::Status::Substituted;
+      break;
     case proto::BuildStatus::AlreadyValid:
       result.status = BuildResult::Status::AlreadyValid;
+      break;
     case proto::BuildStatus::PermanentFailure:
       result.status = BuildResult::Status::PermanentFailure;
+      break;
     case proto::BuildStatus::InputRejected:
       result.status = BuildResult::Status::InputRejected;
+      break;
     case proto::BuildStatus::OutputRejected:
       result.status = BuildResult::Status::OutputRejected;
+      break;
     case proto::BuildStatus::TransientFailure:
       result.status = BuildResult::Status::TransientFailure;
+      break;
     case proto::BuildStatus::CachedFailure:
       result.status = BuildResult::Status::CachedFailure;
+      break;
     case proto::BuildStatus::TimedOut:
       result.status = BuildResult::Status::TimedOut;
+      break;
     case proto::BuildStatus::MiscFailure:
       result.status = BuildResult::Status::MiscFailure;
+      break;
     case proto::BuildStatus::DependencyFailed:
       result.status = BuildResult::Status::DependencyFailed;
+      break;
     case proto::BuildStatus::LogLimitExceeded:
       result.status = BuildResult::Status::LogLimitExceeded;
+      break;
     case proto::BuildStatus::NotDeterministic:
       result.status = BuildResult::Status::NotDeterministic;
+      break;
     default:
       return {};
   }
diff --git a/third_party/nix/src/tests/CMakeLists.txt b/third_party/nix/src/tests/CMakeLists.txt
index cda8f5da84..f8158d06c3 100644
--- a/third_party/nix/src/tests/CMakeLists.txt
+++ b/third_party/nix/src/tests/CMakeLists.txt
@@ -66,3 +66,13 @@ target_link_libraries(language-tests
 )
 
 gtest_discover_tests(language-tests)
+
+add_executable(store-api-test store-api-test.cc)
+target_link_libraries(store-api-test
+  nixstore
+  rapidcheck
+  rapidcheck_gtest
+  GTest::gtest_main
+)
+
+gtest_discover_tests(store-api-test)
diff --git a/third_party/nix/src/tests/store-api-test.cc b/third_party/nix/src/tests/store-api-test.cc
new file mode 100644
index 0000000000..515613b799
--- /dev/null
+++ b/third_party/nix/src/tests/store-api-test.cc
@@ -0,0 +1,49 @@
+#include "libstore/store-api.hh"
+
+#include <gtest/gtest.h>
+#include <rapidcheck/Assertions.h>
+#include <rapidcheck/Gen.h>
+#include <rapidcheck/gtest.h>
+
+#include "libproto/worker.pb.h"
+
+namespace rc {
+template <>
+struct Arbitrary<nix::BuildResult::Status> {
+  static Gen<nix::BuildResult::Status> arbitrary() {
+    return gen::element(nix::BuildResult::Status::Built,
+                        nix::BuildResult::Status::Substituted,
+                        nix::BuildResult::Status::AlreadyValid,
+                        nix::BuildResult::Status::PermanentFailure,
+                        nix::BuildResult::Status::InputRejected,
+                        nix::BuildResult::Status::OutputRejected,
+                        nix::BuildResult::Status::TransientFailure,
+                        nix::BuildResult::Status::CachedFailure,
+                        nix::BuildResult::Status::TimedOut,
+                        nix::BuildResult::Status::MiscFailure,
+                        nix::BuildResult::Status::DependencyFailed,
+                        nix::BuildResult::Status::LogLimitExceeded,
+                        nix::BuildResult::Status::NotDeterministic);
+  }
+};
+}  // namespace rc
+
+namespace nix {
+
+class BuildResultTest : public ::testing::Test {};
+
+RC_GTEST_PROP(BuildResultTest, StatusToFromProtoRoundTrip,
+              (BuildResult::Status && status)) {
+  BuildResult br;
+  br.status = status;
+
+  auto proto_status = br.status_to_proto();
+  nix::proto::BuildResult br_proto;
+  br_proto.set_status(proto_status);
+
+  auto result = BuildResult::FromProto(br_proto);
+
+  RC_ASSERT(result.value().status == status);
+}
+
+}  // namespace nix