Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(354)

Side by Side Diff: remoting/protocol/buffered_socket_writer_unittest.cc

Issue 10836030: Add unittests for BufferedSocketWriter and fix some bugs in that code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "remoting/protocol/buffered_socket_writer.h"
6
7 #include "base/bind.h"
8 #include "base/message_loop.h"
9 #include "net/base/io_buffer.h"
10 #include "net/base/net_errors.h"
11 #include "remoting/protocol/fake_session.h"
12 #include "testing/gmock/include/gmock/gmock.h"
13 #include "testing/gtest/include/gtest/gtest.h"
14
15 namespace remoting {
16 namespace protocol {
17
18 namespace {
19 const int kTestBufferSize = 10 * 1024; // 10k;
20 const size_t kWriteChunkSize = 1024U;
21 } // namespace
22
23 class BufferedSocketWriterTest : public testing::Test {
24 public:
25 BufferedSocketWriterTest()
26 : write_error_(0) {
27
simonmorris 2012/07/31 20:19:50 Remove blank line.
Sergey Ulanov 2012/07/31 21:37:53 Done.
28 }
29
30 void OnDone() {
31 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
32 }
33
34 void DestroyWriterAndQuit() {
35 written_data_ = socket_->written_data();
36 writer_.reset();
37 socket_.reset();
38 MessageLoop::current()->PostTask(FROM_HERE, MessageLoop::QuitClosure());
39 }
40
41 void Unexpected() {
42 EXPECT_TRUE(false);
43 }
44
45 protected:
46 void SetUp() OVERRIDE {
47 socket_.reset(new FakeSocket());
48 writer_.reset(new BufferedSocketWriter());
49 writer_->Init(socket_.get(), base::Bind(
50 &BufferedSocketWriterTest::OnWriteFailed, base::Unretained(this)));
51 test_buffer_ = new net::IOBufferWithSize(kTestBufferSize);
52 test_buffer_2_ = new net::IOBufferWithSize(kTestBufferSize);
53 }
54
55 void OnWriteFailed(int error) {
56 write_error_ = error;
57 }
58
59 void TestWrite() {
60 writer_->Write(test_buffer_, base::Bind(&BufferedSocketWriterTest::OnDone,
61 base::Unretained(this)));
62 writer_->Write(test_buffer_2_, base::Bind(&BufferedSocketWriterTest::OnDone,
63 base::Unretained(this)));
64 message_loop_.Run();
65 ASSERT_EQ(static_cast<size_t>(test_buffer_->size() +
66 test_buffer_2_->size()),
67 socket_->written_data().size());
68 EXPECT_EQ(0, memcmp(test_buffer_->data(), socket_->written_data().data(),
69 test_buffer_->size()));
70 EXPECT_EQ(0, memcmp(test_buffer_2_->data(),
71 socket_->written_data().data() + test_buffer_->size(),
72 test_buffer_2_->size()));
73 }
74
75 void TestAppendInCallback() {
76 writer_->Write(test_buffer_, base::Bind(
77 base::IgnoreResult(&BufferedSocketWriterBase::Write),
78 base::Unretained(writer_.get()), test_buffer_2_,
79 base::Bind(&BufferedSocketWriterTest::OnDone,
80 base::Unretained(this))));
81 message_loop_.Run();
82 ASSERT_EQ(static_cast<size_t>(test_buffer_->size() +
83 test_buffer_2_->size()),
84 socket_->written_data().size());
85 EXPECT_EQ(0, memcmp(test_buffer_->data(), socket_->written_data().data(),
86 test_buffer_->size()));
87 EXPECT_EQ(0, memcmp(test_buffer_2_->data(),
88 socket_->written_data().data() + test_buffer_->size(),
89 test_buffer_2_->size()));
90 }
91
92 MessageLoop message_loop_;
93 scoped_ptr<FakeSocket> socket_;
94 scoped_ptr<BufferedSocketWriter> writer_;
95 scoped_refptr<net::IOBufferWithSize> test_buffer_;
96 scoped_refptr<net::IOBufferWithSize> test_buffer_2_;
97 std::string written_data_;
98 int write_error_;
99 };
100
101 // Test synchronous write.
102 TEST_F(BufferedSocketWriterTest, WriteFull) {
103 TestWrite();
104 }
105
106 // Test synchronous write in 1k chunks.
107 TEST_F(BufferedSocketWriterTest, WriteChunks) {
108 socket_->set_write_limit(kWriteChunkSize);
109 TestWrite();
110 }
111
112 // Test asynchronous write.
113 TEST_F(BufferedSocketWriterTest, WriteAsync) {
114 socket_->set_async_write(true);
115 socket_->set_write_limit(kWriteChunkSize);
116 TestWrite();
117 }
118
119 // Make sure we can call Write() from the done callback.
120 TEST_F(BufferedSocketWriterTest, AppendInCallbackSync) {
121 TestAppendInCallback();
122 }
123
124 // Make sure we can call Write() from the done callback.
125 TEST_F(BufferedSocketWriterTest, AppendInCallbackAsync) {
126 socket_->set_async_write(true);
127 socket_->set_write_limit(kWriteChunkSize);
128 TestAppendInCallback();
129 }
130
131 // Test that the writer can be destroyed from callback.
132 TEST_F(BufferedSocketWriterTest, DestroyFromCallback) {
133 socket_->set_async_write(true);
134 writer_->Write(test_buffer_, base::Bind(
135 &BufferedSocketWriterTest::DestroyWriterAndQuit,
136 base::Unretained(this)));
137 writer_->Write(test_buffer_2_, base::Bind(
138 &BufferedSocketWriterTest::Unexpected,
139 base::Unretained(this)));
140 socket_->set_async_write(false);
141 message_loop_.Run();
142 ASSERT_GE(written_data_.size(),
143 static_cast<size_t>(test_buffer_->size()));
144 EXPECT_EQ(0, memcmp(test_buffer_->data(), written_data_.data(),
145 test_buffer_->size()));
146 }
147
148 // Verify that it stops writing after the first error.
149 TEST_F(BufferedSocketWriterTest, TestWriteError) {
150 socket_->set_write_limit(kWriteChunkSize);
151 socket_->set_async_write(true);
152 writer_->Write(test_buffer_,
153 base::Bind(&BufferedSocketWriterTest::Unexpected,
154 base::Unretained(this)));
155 writer_->Write(test_buffer_2_,
156 base::Bind(&BufferedSocketWriterTest::Unexpected,
157 base::Unretained(this)));
158 socket_->set_next_write_error(net::ERR_FAILED);
159 message_loop_.RunAllPending();
160 EXPECT_EQ(net::ERR_FAILED, write_error_);
161 EXPECT_EQ(kWriteChunkSize, socket_->written_data().size());
162 }
163
164 } // namespace protocol
165 } // namespace remoting
166
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698