Index: test/CommunicationTest.cpp |
diff --git a/test/CommunicationTest.cpp b/test/CommunicationTest.cpp |
index fb9d4c34f35220fdaab146f480a15be2e9fff40d..875bbddaab9a292536f70aea71f79e96d98bdb60 100644 |
--- a/test/CommunicationTest.cpp |
+++ b/test/CommunicationTest.cpp |
@@ -17,114 +17,206 @@ |
#include <gtest/gtest.h> |
+#include <thread> |
+#include <chrono> |
+#include <memory> |
#include "../src/shared/AutoHandle.h" |
#include "../src/shared/Communication.h" |
const std::wstring pipeName(L"\\\\.\\pipe\\adblockplustests"); |
-namespace |
+TEST(CommunicationTest, PipeReadWrite) |
Eric
2015/02/17 18:15:13
As long as we're improving the unit tests, can we
sergei
2015/02/18 14:13:06
Actually I would not like to improve tests in that
Eric
2015/02/18 18:12:47
OK. I am most concerned with eliminating the expli
|
{ |
- DWORD WINAPI CreatePipe(LPVOID param) |
+ auto serverThread = std::thread([] |
{ |
Communication::Pipe pipe(pipeName, Communication::Pipe::MODE_CREATE); |
- return 0; |
+ }); |
+ std::this_thread::sleep_for(std::chrono::milliseconds(100)); |
+ ASSERT_NO_THROW(Communication::Pipe pipe(pipeName, Communication::Pipe::MODE_CONNECT)); |
+ serverThread.join(); |
+} |
+ |
+TEST(CommunicationTest, SendReceivePipe) |
+{ |
+ std::unique_ptr<Communication::Pipe> server; |
+ auto serverThread = std::thread([&server] |
Eric
2015/02/17 18:15:13
Is it necessary to use a separate thread to initia
|
+ { |
+ server.reset(new Communication::Pipe(pipeName, Communication::Pipe::MODE_CREATE)); |
+ }); |
+ std::this_thread::sleep_for(std::chrono::milliseconds(100)); |
Eric
2015/02/17 18:15:13
I myself have had trouble with the Communication u
|
+ Communication::Pipe client(pipeName, Communication::Pipe::MODE_CONNECT); |
+ // send to the server |
+ { |
+ Communication::OutputBuffer message; |
+ message << Communication::ProcType::PROC_IS_WHITELISTED_URL |
+ << std::string("This is a test message") << 64ll << 32 << true << false; |
+ client.WriteMessage(message); |
+ } |
+ // receive on the server and send back |
+ { |
+ Communication::OutputBuffer response; |
+ Communication::InputBuffer message = server->ReadMessage(); |
+ Communication::ProcType proc; |
+ message >> proc; |
+ EXPECT_EQ(Communication::ProcType::PROC_IS_WHITELISTED_URL, proc); |
+ response << Communication::ProcType::PROC_IS_FIRST_RUN_ACTION_NEEDED; |
+ |
Eric
2015/02/17 18:15:13
Each of these individual tests on disparate variab
sergei
2015/02/18 14:13:06
The tests of each type are below, it's not a testi
Eric
2015/02/18 18:12:47
I don't want to belabor the point here, but they'r
|
+ std::string text; |
+ message >> text; |
+ EXPECT_EQ("This is a test message", text); |
+ response << std::string("Response"); |
+ |
+ int64_t integer64; |
+ message >> integer64; |
+ EXPECT_EQ(64ll, integer64); |
+ response << 46ll; |
+ |
+ int32_t integer32; |
+ message >> integer32; |
+ EXPECT_EQ(32, integer32); |
+ response << 23; |
+ |
+ bool boolean; |
+ message >> boolean; |
+ EXPECT_TRUE(boolean); |
+ response << false; |
+ |
+ message >> boolean; |
+ EXPECT_FALSE(boolean); |
+ response << true; |
+ |
+ server->WriteMessage(response); |
} |
- DWORD WINAPI ReceiveSend(LPVOID param) |
+ // receive on the client |
{ |
- Communication::Pipe pipe(pipeName, Communication::Pipe::MODE_CREATE); |
+ Communication::InputBuffer message = client.ReadMessage(); |
+ Communication::ProcType proc; |
+ message >> proc; |
+ EXPECT_EQ(Communication::ProcType::PROC_IS_FIRST_RUN_ACTION_NEEDED, proc); |
- Communication::InputBuffer message = pipe.ReadMessage(); |
+ std::string text; |
+ message >> text; |
+ EXPECT_EQ("Response", text); |
- std::string stringValue; |
- std::wstring wstringValue; |
- int64_t int64Value; |
- int32_t int32Value; |
- bool boolValue; |
- message >> stringValue >> wstringValue >> int64Value >> int32Value >> boolValue; |
+ int64_t integer64; |
+ message >> integer64; |
+ EXPECT_EQ(46ll, integer64); |
- stringValue += " Received"; |
- wstringValue += L" \u043f\u0440\u0438\u043d\u044f\u0442\u043e"; |
- int64Value += 1; |
- int32Value += 2; |
- boolValue = !boolValue; |
+ int32_t integer32; |
+ message >> integer32; |
+ EXPECT_EQ(23, integer32); |
- Communication::OutputBuffer response; |
- response << stringValue << wstringValue << int64Value << int32Value << boolValue; |
- pipe.WriteMessage(response); |
+ bool boolean; |
+ message >> boolean; |
+ EXPECT_FALSE(boolean); |
- return 0; |
+ message >> boolean; |
+ EXPECT_TRUE(boolean); |
} |
+ serverThread.join(); |
} |
-TEST(CommunicationTest, ConnectPipe) |
+namespace |
{ |
- AutoHandle thread(CreateThread(0, 0, CreatePipe, 0, 0, 0)); |
+ template<typename TestedType, typename AnotherType> |
+ void SendReceiveTypes(TestedType value, AnotherType anotherTypeValue) |
Eric
2015/02/17 18:15:13
You're combining two kinds of test here.
1) Ensure
sergei
2015/02/18 14:13:06
Before the everything was in one test, would you m
Eric
2015/02/18 18:12:47
That's fine.
|
+ { |
+ Communication::OutputBuffer message; |
+ message << anotherTypeValue << value; |
+ Communication::InputBuffer response(message.Get()); |
Eric
2015/02/17 18:15:13
I don't particularly care for Get() in the current
sergei
2015/02/18 14:13:06
I find it as overkill here.
On 2015/02/17 18:15:1
|
+ TestedType received; |
+ ASSERT_ANY_THROW(response >> received); |
+ AnotherType anotherTypeValueReceived; |
+ response >> anotherTypeValueReceived; |
+ response >> received; |
+ EXPECT_EQ(value, received); |
+ } |
+} |
- Sleep(100); |
+TEST(CommunicationTest, TypeProc) |
+{ |
+ SendReceiveTypes(Communication::ProcType::PROC_GET_ELEMHIDE_SELECTORS, std::string("non-ProcType")); |
+} |
- ASSERT_NO_THROW(Communication::Pipe pipe(pipeName, Communication::Pipe::MODE_CONNECT)); |
+TEST(CommunicationTest, TypeString) |
+{ |
+ int32_t nonStringTypeValue = 10; |
+ SendReceiveTypes(std::string("stringValue"), nonStringTypeValue); |
} |
-TEST(CommunicationTest, SendReceive) |
+TEST(CommunicationTest, SendWString_ReceiveWString) |
Eric
2015/02/17 18:15:13
Probably better to spell out "Wide" here and below
sergei
2015/02/18 14:13:06
done.
|
{ |
- AutoHandle thread(CreateThread(0, 0, ReceiveSend, 0, 0, 0)); |
+ int32_t nonStringTypeValue = 10; |
+ SendReceiveTypes(std::wstring(L"stringValue"), nonStringTypeValue); |
+} |
- Sleep(100); |
+TEST(CommunicationTest, SendString_ReceiveWString) |
+{ |
+ Communication::OutputBuffer message; |
+ message << std::string("test"); |
+ Communication::InputBuffer response(message.Get()); |
+ std::wstring received; |
+ response >> received; |
+ EXPECT_EQ(L"test", received); |
+} |
- Communication::Pipe pipe(pipeName, Communication::Pipe::MODE_CONNECT); |
+TEST(CommunicationTest, SendWString_ReceiveString) |
+{ |
+ Communication::OutputBuffer message; |
+ message << std::wstring(L"test"); |
+ Communication::InputBuffer response(message.Get()); |
+ std::string received; |
+ response >> received; |
+ EXPECT_EQ("test", received); |
+} |
+TEST(CommunicationTest, SendStrings_ReceiveWStrings) |
+{ |
Communication::OutputBuffer message; |
- message << std::string("Foo") << std::wstring(L"Bar") << int64_t(9876543210L) << int32_t(5) << true; |
- pipe.WriteMessage(message); |
- |
- Communication::InputBuffer response = pipe.ReadMessage(); |
- |
- std::string stringValue; |
- std::wstring wstringValue; |
- int64_t int64Value; |
- int32_t int32Value; |
- bool boolValue; |
- |
- ASSERT_ANY_THROW(response >> wstringValue); |
- ASSERT_ANY_THROW(response >> int64Value); |
- ASSERT_ANY_THROW(response >> int32Value); |
- ASSERT_ANY_THROW(response >> boolValue); |
- |
- response >> stringValue >> wstringValue; |
- |
- ASSERT_ANY_THROW(response >> stringValue); |
- ASSERT_ANY_THROW(response >> wstringValue); |
- ASSERT_ANY_THROW(response >> int32Value); |
- ASSERT_ANY_THROW(response >> boolValue); |
- |
- response >> int64Value >> int32Value >> boolValue; |
- |
- ASSERT_ANY_THROW(response >> stringValue); |
- ASSERT_ANY_THROW(response >> wstringValue); |
- ASSERT_ANY_THROW(response >> int64Value); |
- ASSERT_ANY_THROW(response >> int32Value); |
- ASSERT_ANY_THROW(response >> boolValue); |
- |
- ASSERT_EQ("Foo Received", stringValue); |
- ASSERT_EQ(L"Bar \u043f\u0440\u0438\u043d\u044f\u0442\u043e", wstringValue); |
- ASSERT_EQ(9876543211L, int64Value); |
- ASSERT_EQ(7, int32Value); |
- ASSERT_FALSE(boolValue); |
+ std::vector<std::string> strings; |
+ strings.emplace_back("test0"); |
+ strings.emplace_back("test1"); |
+ message << strings; |
+ Communication::InputBuffer response(message.Get()); |
+ std::vector<std::wstring> received; |
+ response >> received; |
+ ASSERT_EQ(2u, received.size()); |
+ EXPECT_EQ(L"test0", received[0]); |
+ EXPECT_EQ(L"test1", received[1]); |
} |
-void SendReceiveStrings(const std::vector<std::string>& src) |
+TEST(CommunicationTest, TypeInt64) |
+{ |
+ SendReceiveTypes<int64_t>(10, std::string("non-ProcType")); |
+} |
+ |
+TEST(CommunicationTest, TypeInt32) |
+{ |
+ SendReceiveTypes<int32_t>(10, std::string("non-ProcType")); |
+} |
+ |
+TEST(CommunicationTest, TypeBool) |
+{ |
+ SendReceiveTypes<bool>(true, std::string("non-ProcType")); |
+ SendReceiveTypes<bool>(false, std::string("non-ProcType")); |
+} |
+ |
+namespace |
{ |
- Communication::OutputBuffer outputBuffer; |
- outputBuffer << src; |
- Communication::InputBuffer inputBuffer(outputBuffer.Get()); |
- std::vector<std::string> dst; |
- inputBuffer >> dst; |
- auto dstSize = dst.size(); |
- ASSERT_EQ(dstSize, src.size()); |
- for (auto i = 0; i < dstSize; ++i) |
+ void SendReceiveStrings(const std::vector<std::string>& src) |
Eric
2015/02/17 18:15:13
We should test narrow-wide conversions here as wel
sergei
2015/02/18 14:13:06
added
|
{ |
- EXPECT_EQ(dst[i], src[i]); |
+ Communication::OutputBuffer outputBuffer; |
+ outputBuffer << src; |
+ Communication::InputBuffer inputBuffer(outputBuffer.Get()); |
+ std::vector<std::string> dst; |
+ inputBuffer >> dst; |
+ auto dstSize = dst.size(); |
+ ASSERT_EQ(dstSize, src.size()); |
+ for (auto i = 0u; i < dstSize; ++i) |
+ { |
+ EXPECT_EQ(dst[i], src[i]); |
+ } |
} |
} |