From 899edcb72207c14e1e47b4b645157d4e984a9caa Mon Sep 17 00:00:00 2001 From: James Sedgwick Date: Fri, 21 Nov 2014 11:55:49 -0800 Subject: [PATCH] test for OutputBufferingHandler Summary: MLE: my first custom matcher revealed some include issues, also fixed Test Plan: guess Reviewed By: davejwatson@fb.com Subscribers: trunkagent, fugalh, njormrod, folly-diffs@ FB internal diff: D1686223 Signature: t1:1686223:1416334120:41bce88d56dd9ca107f3ddc3927c6be9419370cf --- .../wangle/channel/ChannelHandlerContext.h | 1 + .../test/OutputBufferingHandlerTest.cpp | 67 +++++++++++++++++++ folly/io/async/AsyncTransport.h | 4 ++ 3 files changed, 72 insertions(+) create mode 100644 folly/experimental/wangle/channel/test/OutputBufferingHandlerTest.cpp diff --git a/folly/experimental/wangle/channel/ChannelHandlerContext.h b/folly/experimental/wangle/channel/ChannelHandlerContext.h index b0f1064b..baf413ff 100644 --- a/folly/experimental/wangle/channel/ChannelHandlerContext.h +++ b/folly/experimental/wangle/channel/ChannelHandlerContext.h @@ -16,6 +16,7 @@ #pragma once +#include #include #include diff --git a/folly/experimental/wangle/channel/test/OutputBufferingHandlerTest.cpp b/folly/experimental/wangle/channel/test/OutputBufferingHandlerTest.cpp new file mode 100644 index 00000000..cf7af136 --- /dev/null +++ b/folly/experimental/wangle/channel/test/OutputBufferingHandlerTest.cpp @@ -0,0 +1,67 @@ +/* + * Copyright 2014 Facebook, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include +#include +#include +#include +#include + +using namespace folly; +using namespace folly::wangle; +using namespace testing; + +// TODO(jsedgwick) Extract this to somewhere common and fill it out. +template +class MockChannelHandler : public ChannelHandlerAdapter { + public: + typedef typename ChannelHandlerAdapter::Context Context; + MOCK_METHOD2_T(read, void(Context*, R)); + MOCK_METHOD2_T(write_, void(Context*, W&)); + + Future write(Context* ctx, W msg) override { + write_(ctx, msg); + return makeFuture(); + } +}; + +typedef StrictMock>> +MockHandler; + +MATCHER_P(IOBufContains, str, "") { return arg->moveToFbString() == str; } + +TEST(OutputBufferingHandlerTest, Basic) { + MockHandler mockHandler; + ChannelPipeline, + ChannelHandlerPtr, + OutputBufferingHandler> + pipeline(&mockHandler, OutputBufferingHandler{}); + + EventBase eb; + auto socket = AsyncSocket::newSocket(&eb); + pipeline.attachTransport(socket); + + // Buffering should prevent writes until the EB loops, and the writes should + // be batched into one write call. + auto f1 = pipeline.write(IOBuf::copyBuffer("hello")); + auto f2 = pipeline.write(IOBuf::copyBuffer("world")); + EXPECT_FALSE(f1.isReady()); + EXPECT_FALSE(f2.isReady()); + EXPECT_CALL(mockHandler, write_(_, IOBufContains("helloworld"))); + eb.loopOnce(); + EXPECT_TRUE(f1.isReady()); + EXPECT_TRUE(f2.isReady()); +} diff --git a/folly/io/async/AsyncTransport.h b/folly/io/async/AsyncTransport.h index 0b929c16..66b045b5 100644 --- a/folly/io/async/AsyncTransport.h +++ b/folly/io/async/AsyncTransport.h @@ -16,6 +16,10 @@ #pragma once +#include +#include +#include + namespace folly { /* -- 2.34.1