From 2c094f79836d7defb6114e59b6412157658c0f90 Mon Sep 17 00:00:00 2001 From: David Pursell Date: Wed, 3 Feb 2016 10:23:05 -0800 Subject: [PATCH] fastboot: fix SocketMock send failures. Fixes SocketMock::ExpectSendFailure() to allow unit testing of errors during send, and adds tests for ExpectSendFailure() and AddReceiveFailure(). Also adds missing tests to make sure ReceiveAll() continues to read until failure or all bytes have been read. Bug: http://b/26157893 Change-Id: I67e7d6de8e8ec4a3b62a6b7d7217f7530862edf7 --- fastboot/socket_mock.cpp | 12 ++++++------ fastboot/socket_mock.h | 3 +++ fastboot/socket_test.cpp | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/fastboot/socket_mock.cpp b/fastboot/socket_mock.cpp index bcb91ecf3..c962f303d 100644 --- a/fastboot/socket_mock.cpp +++ b/fastboot/socket_mock.cpp @@ -55,8 +55,9 @@ bool SocketMock::Send(const void* data, size_t length) { return false; } + bool return_value = events_.front().return_value; events_.pop(); - return true; + return return_value; } // Mock out multi-buffer send to be one large send, since that's what it should looks like from @@ -115,13 +116,12 @@ std::unique_ptr SocketMock::Accept() { } void SocketMock::ExpectSend(std::string message) { - events_.push(Event(EventType::kSend, std::move(message), 0, nullptr)); + events_.push(Event(EventType::kSend, std::move(message), true, nullptr)); } -// TODO: make this properly return false to the caller. -//void SocketMock::ExpectSendFailure(std::string message) { -// events_.push(Event(EventType::kSend, std::move(message), 0, nullptr)); -//} +void SocketMock::ExpectSendFailure(std::string message) { + events_.push(Event(EventType::kSend, std::move(message), false, nullptr)); +} void SocketMock::AddReceive(std::string message) { ssize_t return_value = message.length(); diff --git a/fastboot/socket_mock.h b/fastboot/socket_mock.h index c48aa7bd9..41fe06db0 100644 --- a/fastboot/socket_mock.h +++ b/fastboot/socket_mock.h @@ -65,6 +65,9 @@ class SocketMock : public Socket { // Adds an expectation for Send(). void ExpectSend(std::string message); + // Adds an expectation for Send() that returns false. + void ExpectSendFailure(std::string message); + // Adds data to provide for Receive(). void AddReceive(std::string message); diff --git a/fastboot/socket_test.cpp b/fastboot/socket_test.cpp index 9365792a1..cc7107529 100644 --- a/fastboot/socket_test.cpp +++ b/fastboot/socket_test.cpp @@ -250,6 +250,9 @@ TEST(SocketMockTest, TestSendSuccess) { TEST(SocketMockTest, TestSendFailure) { SocketMock* mock = new SocketMock; + mock->ExpectSendFailure("foo"); + EXPECT_FALSE(SendString(mock, "foo")); + EXPECT_NONFATAL_FAILURE(SendString(mock, "foo"), "no message was expected"); mock->ExpectSend("foo"); @@ -274,11 +277,24 @@ TEST(SocketMockTest, TestReceiveSuccess) { mock.AddReceive("123"); EXPECT_TRUE(ReceiveString(&mock, "abc")); EXPECT_TRUE(ReceiveString(&mock, "123")); + + // Make sure ReceiveAll() can piece together multiple receives. + mock.AddReceive("foo"); + mock.AddReceive("bar"); + mock.AddReceive("123"); + EXPECT_TRUE(ReceiveString(&mock, "foobar123")); } TEST(SocketMockTest, TestReceiveFailure) { SocketMock* mock = new SocketMock; + mock->AddReceiveFailure(); + EXPECT_FALSE(ReceiveString(mock, "foo")); + + mock->AddReceive("foo"); + mock->AddReceiveFailure(); + EXPECT_FALSE(ReceiveString(mock, "foobar")); + EXPECT_NONFATAL_FAILURE(ReceiveString(mock, "foo"), "no message was ready"); mock->ExpectSend("foo");