diff --git a/xplat/Flipper/FireAndForgetBasedFlipperResponder.h b/xplat/Flipper/FireAndForgetBasedFlipperResponder.h index d2a599a51..8cf1ec360 100644 --- a/xplat/Flipper/FireAndForgetBasedFlipperResponder.h +++ b/xplat/Flipper/FireAndForgetBasedFlipperResponder.h @@ -27,13 +27,13 @@ class FireAndForgetBasedFlipperResponder : public FlipperResponder { int64_t responseID) : socket_(socket), responseID_(responseID) {} - void success(const folly::dynamic& response) const override { + void success(const folly::dynamic& response) override { const folly::dynamic message = folly::dynamic::object("id", responseID_)("success", response); socket_->sendMessage(message); } - void error(const folly::dynamic& response) const override { + void error(const folly::dynamic& response) override { const folly::dynamic message = folly::dynamic::object("id", responseID_)("error", response); socket_->sendMessage(message); diff --git a/xplat/Flipper/FlipperResponder.h b/xplat/Flipper/FlipperResponder.h index fce4b15d9..7626000f1 100644 --- a/xplat/Flipper/FlipperResponder.h +++ b/xplat/Flipper/FlipperResponder.h @@ -1,11 +1,9 @@ -/* - * Copyright (c) 2018-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the LICENSE - * file in the root directory of this source tree. +/** + * Copyright (c) Facebook, Inc. and its affiliates. * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. */ - #pragma once #include @@ -24,12 +22,12 @@ class FlipperResponder { /** * Deliver a successful response to the Flipper desktop app. */ - virtual void success(const folly::dynamic& response) const = 0; + virtual void success(const folly::dynamic& response) = 0; /** * Inform the Flipper desktop app of an error in handling the request. */ - virtual void error(const folly::dynamic& response) const = 0; + virtual void error(const folly::dynamic& response) = 0; }; } // namespace flipper diff --git a/xplat/Flipper/FlipperResponderImpl.h b/xplat/Flipper/FlipperResponderImpl.h index 0ab23bbdb..e5e25c063 100644 --- a/xplat/Flipper/FlipperResponderImpl.h +++ b/xplat/Flipper/FlipperResponderImpl.h @@ -24,19 +24,29 @@ class FlipperResponderImpl : public FlipperResponder { downstreamObserver) : downstreamObserver_(downstreamObserver) {} - void success(const folly::dynamic& response) const override { + void success(const folly::dynamic& response) override { const folly::dynamic message = folly::dynamic::object("success", response); + isCompleted = true; downstreamObserver_->onSuccess(message); } - void error(const folly::dynamic& response) const override { + void error(const folly::dynamic& response) override { const folly::dynamic message = folly::dynamic::object("error", response); + isCompleted = true; downstreamObserver_->onSuccess(message); } + ~FlipperResponderImpl() { + if (!isCompleted) { + downstreamObserver_->onSuccess( + folly::dynamic::object("success", folly::dynamic::object())); + } + } + private: std::shared_ptr> downstreamObserver_; + bool isCompleted = false; }; } // namespace flipper diff --git a/xplat/FlipperTestLib/FlipperResponderMock.h b/xplat/FlipperTestLib/FlipperResponderMock.h index 2e763da3b..b59af68d5 100644 --- a/xplat/FlipperTestLib/FlipperResponderMock.h +++ b/xplat/FlipperTestLib/FlipperResponderMock.h @@ -1,11 +1,9 @@ -/* - * Copyright (c) 2018-present, Facebook, Inc. - * - * This source code is licensed under the MIT license found in the LICENSE - * file in the root directory of this source tree. +/** + * Copyright (c) Facebook, Inc. and its affiliates. * + * This source code is licensed under the MIT license found in the LICENSE + * file in the root directory of this source tree. */ - #pragma once #include @@ -22,13 +20,13 @@ class FlipperResponderMock : public FlipperResponder { std::vector* errors = nullptr) : successes_(successes), errors_(errors) {} - void success(const folly::dynamic& response) const override { + void success(const folly::dynamic& response) override { if (successes_) { successes_->push_back(response); } } - void error(const folly::dynamic& response) const override { + void error(const folly::dynamic& response) override { if (errors_) { errors_->push_back(response); } diff --git a/xplat/FlipperTests/FlipperResponderImplTests.cpp b/xplat/FlipperTests/FlipperResponderImplTests.cpp index 62ef4fae3..f4bf6cf52 100644 --- a/xplat/FlipperTests/FlipperResponderImplTests.cpp +++ b/xplat/FlipperTests/FlipperResponderImplTests.cpp @@ -18,6 +18,9 @@ namespace test { using folly::dynamic; +void assertIsSuccess(folly::dynamic d); +void assertIsError(folly::dynamic d); + TEST(FlipperResponderImplTest, testSuccessWrapper) { auto dynamicSingle = yarpl::single::Single::create([](auto observer) mutable { @@ -30,6 +33,7 @@ TEST(FlipperResponderImplTest, testSuccessWrapper) { to->awaitTerminalEvent(); auto output = to->getOnSuccessValue(); + assertIsSuccess(output); EXPECT_EQ(output["success"]["my"], "object"); } @@ -45,9 +49,37 @@ TEST(FlipperResponderImplTest, testErrorWrapper) { to->awaitTerminalEvent(); auto output = to->getOnSuccessValue(); + assertIsError(output); EXPECT_EQ(output["error"]["my"], "object"); } +TEST(FlipperResponderImplTest, testNoExplicitResponseReturnsSuccess) { + auto to = yarpl::single::SingleTestObserver::create(); + { + auto dynamicSingle = yarpl::single::Single::create( + [](auto observer) mutable { + observer->onSubscribe(yarpl::single::SingleSubscriptions::empty()); + auto responder = std::make_shared(observer); + }); + dynamicSingle->subscribe(to); + } + + to->awaitTerminalEvent(); + auto output = to->getOnSuccessValue(); + assertIsSuccess(output); + EXPECT_TRUE(output["success"].empty()); +} + +void assertIsSuccess(folly::dynamic d) { + EXPECT_NE(d.find("success"), d.items().end()); + EXPECT_EQ(d.find("error"), d.items().end()); +} + +void assertIsError(folly::dynamic d) { + EXPECT_NE(d.find("error"), d.items().end()); + EXPECT_EQ(d.find("success"), d.items().end()); +} + } // namespace test } // namespace flipper } // namespace facebook