diff options
Diffstat (limited to 'mojo/public/cpp/bindings/tests/router_test_util.cc')
-rw-r--r-- | mojo/public/cpp/bindings/tests/router_test_util.cc | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/mojo/public/cpp/bindings/tests/router_test_util.cc b/mojo/public/cpp/bindings/tests/router_test_util.cc new file mode 100644 index 0000000000..9bab1cb360 --- /dev/null +++ b/mojo/public/cpp/bindings/tests/router_test_util.cc @@ -0,0 +1,111 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "mojo/public/cpp/bindings/tests/router_test_util.h" + +#include <stddef.h> +#include <stdint.h> +#include <string.h> + +#include "mojo/public/cpp/bindings/lib/message_builder.h" +#include "mojo/public/cpp/bindings/tests/message_queue.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace mojo { +namespace test { + +void AllocRequestMessage(uint32_t name, const char* text, Message* message) { + size_t payload_size = strlen(text) + 1; // Plus null terminator. + internal::MessageBuilder builder(name, Message::kFlagExpectsResponse, + payload_size, 0); + memcpy(builder.buffer()->Allocate(payload_size), text, payload_size); + *message = std::move(*builder.message()); +} + +void AllocResponseMessage(uint32_t name, + const char* text, + uint64_t request_id, + Message* message) { + size_t payload_size = strlen(text) + 1; // Plus null terminator. + internal::MessageBuilder builder(name, Message::kFlagIsResponse, payload_size, + 0); + builder.message()->set_request_id(request_id); + memcpy(builder.buffer()->Allocate(payload_size), text, payload_size); + *message = std::move(*builder.message()); +} + +MessageAccumulator::MessageAccumulator(MessageQueue* queue, + const base::Closure& closure) + : queue_(queue), closure_(closure) {} + +MessageAccumulator::~MessageAccumulator() {} + +bool MessageAccumulator::Accept(Message* message) { + queue_->Push(message); + if (!closure_.is_null()) { + closure_.Run(); + closure_.Reset(); + } + return true; +} + +ResponseGenerator::ResponseGenerator() {} + +bool ResponseGenerator::Accept(Message* message) { + return false; +} + +bool ResponseGenerator::AcceptWithResponder( + Message* message, + std::unique_ptr<MessageReceiverWithStatus> responder) { + EXPECT_TRUE(message->has_flag(Message::kFlagExpectsResponse)); + + bool result = SendResponse(message->name(), message->request_id(), + reinterpret_cast<const char*>(message->payload()), + responder.get()); + EXPECT_TRUE(responder->IsValid()); + return result; +} + +bool ResponseGenerator::SendResponse(uint32_t name, + uint64_t request_id, + const char* request_string, + MessageReceiver* responder) { + Message response; + std::string response_string(request_string); + response_string += " world!"; + AllocResponseMessage(name, response_string.c_str(), request_id, &response); + + return responder->Accept(&response); +} + +LazyResponseGenerator::LazyResponseGenerator(const base::Closure& closure) + : responder_(nullptr), name_(0), request_id_(0), closure_(closure) {} + +LazyResponseGenerator::~LazyResponseGenerator() = default; + +bool LazyResponseGenerator::AcceptWithResponder( + Message* message, + std::unique_ptr<MessageReceiverWithStatus> responder) { + name_ = message->name(); + request_id_ = message->request_id(); + request_string_ = + std::string(reinterpret_cast<const char*>(message->payload())); + responder_ = std::move(responder); + if (!closure_.is_null()) { + closure_.Run(); + closure_.Reset(); + } + return true; +} + +void LazyResponseGenerator::Complete(bool send_response) { + if (send_response) { + SendResponse(name_, request_id_, request_string_.c_str(), responder_.get()); + } + responder_ = nullptr; +} + +} // namespace test +} // namespace mojo |