[Libreoffice-commits] online.git: test/fakesockettest.cpp test/Makefile.am
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Thu Nov 1 09:52:15 UTC 2018
test/Makefile.am | 7 +
test/fakesockettest.cpp | 226 ++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 231 insertions(+), 2 deletions(-)
New commits:
commit 02d3ac47eebd48f2594a9a2325293114ea90a00c
Author: Tor Lillqvist <tml at collabora.com>
AuthorDate: Thu Nov 1 11:18:07 2018 +0200
Commit: Tor Lillqvist <tml at collabora.com>
CommitDate: Thu Nov 1 11:51:34 2018 +0200
Add a Cppunit test for the FakeSocket API
Based on Mobile/TestFakeSocket/TestFakeSocket/main.mm. Needs work,
does not really test the interesting semantic corner cases that have
been fixed only recently.
Change-Id: Ie2f3dbd2b478ab3acb4bfef0e0d3031c817d0f37
diff --git a/test/Makefile.am b/test/Makefile.am
index 7e59fa621..cd8a7c643 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -5,9 +5,9 @@ AUTOMAKE_OPTION = serial-tests
# unittest: tests that do not need loolwsd running, and that are run during a
# normal build
# test: tests that need loolwsd running, and that are run via 'make check'
-check_PROGRAMS = test
+check_PROGRAMS = test fakesockettest
-noinst_PROGRAMS = test unittest
+noinst_PROGRAMS = test fakesockettest unittest
AM_CXXFLAGS = $(CPPUNIT_CFLAGS) -DTDOC=\"$(top_srcdir)/test/data\" \
-I${top_srcdir}/common -I${top_srcdir}/net -I${top_srcdir}/wsd -I${top_srcdir}/kit
@@ -77,6 +77,9 @@ test_CPPFLAGS = -I$(top_srcdir) -DBUILDING_TESTS
test_SOURCES = $(test_all_source) test.cpp
test_LDADD = $(CPPUNIT_LIBS)
+fakesockettest_SOURCES = fakesockettest.cpp ../net/FakeSocket.cpp
+fakesockettest_LDADD = $(CPPUNIT_LIBS)
+
# unit test modules:
unit_oob_la_SOURCES = UnitOOB.cpp
unit_fuzz_la_SOURCES = UnitFuzz.cpp
diff --git a/test/fakesockettest.cpp b/test/fakesockettest.cpp
new file mode 100644
index 000000000..417c636a6
--- /dev/null
+++ b/test/fakesockettest.cpp
@@ -0,0 +1,226 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#include <config.h>
+
+#include <algorithm>
+#include <condition_variable>
+#include <mutex>
+#include <thread>
+#include <regex>
+#include <vector>
+
+#include <cppunit/BriefTestProgressListener.h>
+#include <cppunit/CompilerOutputter.h>
+#include <cppunit/TestResult.h>
+#include <cppunit/TestResultCollector.h>
+#include <cppunit/TestRunner.h>
+#include <cppunit/TextTestProgressListener.h>
+#include <cppunit/extensions/HelperMacros.h>
+#include <cppunit/extensions/TestFactoryRegistry.h>
+
+#define MOBILEAPP // A bit ugly, but currently FakeSocket.hpp is surrounded by a MOBILEAPP ifdef,
+ // and probably it is not a good idea to remove that?
+#include "FakeSocket.hpp"
+
+class FakeSocketTest : public CPPUNIT_NS::TestFixture
+{
+ CPPUNIT_TEST_SUITE(FakeSocketTest);
+
+ CPPUNIT_TEST(testBasic);
+
+ CPPUNIT_TEST_SUITE_END();
+
+ void testBasic();
+
+public:
+ FakeSocketTest()
+ {
+ }
+
+ void setUp()
+ {
+ fakeSocketSetLoggingCallback([](const std::string& line)
+ {
+ std::cerr << line << "\n";
+ });
+ }
+
+ void tearDown()
+ {
+ }
+};
+
+void FakeSocketTest::testBasic()
+{
+ try
+ {
+ // Create three sockets: s0, s1 and s2.
+ int s0 = fakeSocketSocket();
+ CPPUNIT_ASSERT(s0 >= 0);
+ int s1 = fakeSocketSocket();
+ CPPUNIT_ASSERT(s1 >= 0);
+ int s2 = fakeSocketSocket();
+ CPPUNIT_ASSERT(s2 >= 0);
+
+ CPPUNIT_ASSERT(s0 != s1);
+ CPPUNIT_ASSERT(s1 != s2);
+
+ // Close s1 and create it anew
+ fakeSocketClose(s1);
+
+ s1 = fakeSocketSocket();
+ CPPUNIT_ASSERT(s1 >= 0);
+
+ // Listen on s0
+ int rc = fakeSocketListen(s0);
+ CPPUNIT_ASSERT(rc != -1);
+
+ // Start a thread that accepts two connections to s0, producing sockets s3 and s4.
+ int s3 = -1, s4 = -1;
+ std::thread t0([&] {
+ s3 = fakeSocketAccept4(s0, 0);
+ CPPUNIT_ASSERT(s3 >= 0);
+
+ s4 = fakeSocketAccept4(s0, 0);
+ CPPUNIT_ASSERT(s4 >= 0);
+ });
+
+ // Connect s1 and s2 to s0 (that is, to the sockets produced by accepting connections to
+ // s0).
+ rc = fakeSocketConnect(s1, s0);
+ CPPUNIT_ASSERT(rc != -1);
+
+ rc = fakeSocketConnect(s2, s0);
+ CPPUNIT_ASSERT(rc != -1);
+
+ // Verify that we got the accepts.
+ t0.join();
+ CPPUNIT_ASSERT(s3 != -1);
+ CPPUNIT_ASSERT(s4 != -1);
+
+ // s1 should now be connected to s3, and s2 to s4.
+ CPPUNIT_ASSERT(fakeSocketPeer(s1) == s3);
+ CPPUNIT_ASSERT(fakeSocketPeer(s3) == s1);
+ CPPUNIT_ASSERT(fakeSocketPeer(s2) == s4);
+ CPPUNIT_ASSERT(fakeSocketPeer(s4) == s2);
+
+ // Some writing and reading
+ rc = fakeSocketWrite(s1, "hello", 5);
+ CPPUNIT_ASSERT(rc != -1);
+
+ rc = fakeSocketWrite(s1, "there", 5);
+ CPPUNIT_ASSERT(rc != -1);
+
+ rc = fakeSocketWrite(s2, "moin", 4);
+ CPPUNIT_ASSERT(rc != -1);
+
+ char buf[100];
+
+ rc = fakeSocketRead(s3, buf, 100);
+ CPPUNIT_ASSERT(rc != -1);
+ CPPUNIT_ASSERT(rc > 0);
+
+ rc = fakeSocketRead(s4, buf, 100);
+ CPPUNIT_ASSERT(rc != -1);
+ CPPUNIT_ASSERT(rc > 0);
+
+ rc = fakeSocketWrite(s3, "goodbye", 7);
+ CPPUNIT_ASSERT(rc != -1);
+ CPPUNIT_ASSERT(rc > 0);
+
+ rc = fakeSocketRead(s1, buf, 4);
+ CPPUNIT_ASSERT(rc == -1);
+
+ rc = fakeSocketRead(s1, buf, 100);
+ CPPUNIT_ASSERT(rc != -1);
+ CPPUNIT_ASSERT(rc > 0);
+
+ // Close s3. Reading from s1 should then return an EOF indication (0).
+ fakeSocketClose(s3);
+ rc = fakeSocketRead(s1, buf, 100);
+ CPPUNIT_ASSERT(rc == 0);
+
+ rc = fakeSocketRead(s1, buf, 100);
+ CPPUNIT_ASSERT(rc == 0);
+
+ // Test the "pipe" functionality, that creates an already connected socket pair.
+ int pipe[2];
+ rc = fakeSocketPipe2(pipe);
+ CPPUNIT_ASSERT(rc == 0);
+
+ rc = fakeSocketWrite(pipe[0], "x", 1);
+ CPPUNIT_ASSERT(rc == 1);
+
+ rc = fakeSocketRead(pipe[1], buf, 1);
+ CPPUNIT_ASSERT(rc == 1);
+
+ CPPUNIT_ASSERT(buf[0] == 'x');
+
+ rc = fakeSocketWrite(pipe[1], "y", 1);
+ CPPUNIT_ASSERT(rc == 1);
+
+ rc = fakeSocketRead(pipe[0], buf, 1);
+ CPPUNIT_ASSERT(rc == 1);
+ CPPUNIT_ASSERT(buf[0] == 'y');
+
+ rc = fakeSocketWrite(pipe[0], "z", 1);
+ CPPUNIT_ASSERT(rc == 1);
+
+ rc = fakeSocketShutdown(pipe[0]);
+ CPPUNIT_ASSERT(rc == 0);
+
+ rc = fakeSocketRead(pipe[1], buf, 1);
+ CPPUNIT_ASSERT(rc == 1);
+ CPPUNIT_ASSERT(buf[0] == 'z');
+
+ rc = fakeSocketWrite(pipe[0], "a", 1);
+ CPPUNIT_ASSERT(rc == -1);
+ CPPUNIT_ASSERT(errno == EPIPE);
+
+ rc = fakeSocketRead(pipe[0], buf, 1);
+ CPPUNIT_ASSERT(rc == 0);
+
+ rc = fakeSocketRead(pipe[0], buf, 1);
+ CPPUNIT_ASSERT(rc == 0);
+ }
+ catch (const std::exception& exception)
+ {
+ CPPUNIT_FAIL(exception.what());
+ }
+}
+
+
+CPPUNIT_TEST_SUITE_REGISTRATION(FakeSocketTest);
+
+int main(int, char**)
+{
+ CPPUNIT_NS::TestResult controller;
+ CPPUNIT_NS::TestResultCollector result;
+ controller.addListener(&result);
+ CPPUNIT_NS::BriefTestProgressListener progress;
+ controller.addListener(&progress);
+ controller.addListener(new CPPUNIT_NS::TextTestProgressListener());
+
+ CPPUNIT_NS::Test* testRegistry = CPPUNIT_NS::TestFactoryRegistry::getRegistry().makeTest();
+
+ CPPUNIT_NS::TestRunner runner;
+ runner.addTest(testRegistry);
+ runner.run(controller);
+
+ CPPUNIT_NS::CompilerOutputter outputter(&result, std::cerr);
+ outputter.setNoWrap();
+ outputter.write();
+
+ fakeSocketDumpState();
+
+ return result.wasSuccessful();
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
More information about the Libreoffice-commits
mailing list