From 60bc7d7acd9c6656b3124b2015ab26f26b47cb32 Mon Sep 17 00:00:00 2001 From: Henry Castro Date: Thu, 24 Nov 2022 18:35:08 -0400 Subject: [PATCH] linguistic: add REST API protocol unit test Signed-off-by: Henry Castro Change-Id: I4768f8bb5bfa572d222fa5610f95c99169e6e390 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/143249 Tested-by: Jenkins CollaboraOffice Reviewed-on: https://gerrit.libreoffice.org/c/core/+/145600 Tested-by: Jenkins --- .../CppunitTest_linguistic_restprotocol.mk | 39 ++++ linguistic/Module_linguistic.mk | 7 + linguistic/qa/restprotocol.cxx | 181 ++++++++++++++++++ 3 files changed, 227 insertions(+) create mode 100644 linguistic/CppunitTest_linguistic_restprotocol.mk create mode 100644 linguistic/qa/restprotocol.cxx diff --git a/linguistic/CppunitTest_linguistic_restprotocol.mk b/linguistic/CppunitTest_linguistic_restprotocol.mk new file mode 100644 index 000000000000..4e56286efe0d --- /dev/null +++ b/linguistic/CppunitTest_linguistic_restprotocol.mk @@ -0,0 +1,39 @@ +# -*- Mode: makefile-gmake; tab-width: 4; indent-tabs-mode: t -*- +# +# 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/. +# + +$(eval $(call gb_CppunitTest_CppunitTest,linguistic_restprotocol)) + +$(eval $(call gb_CppunitTest_add_exception_objects,linguistic_restprotocol, \ + linguistic/qa/restprotocol \ +)) + +$(eval $(call gb_CppunitTest_use_libraries,linguistic_restprotocol, \ + comphelper \ + cppu \ + cppuhelper \ + sal \ + svt \ + utl \ + test \ + unotest \ +)) + +$(eval $(call gb_CppunitTest_use_api,linguistic_restprotocol,\ + udkapi \ + offapi \ + oovbaapi \ +)) + +$(eval $(call gb_CppunitTest_use_configuration,linguistic_restprotocol)) + +$(eval $(call gb_CppunitTest_use_ure,linguistic_restprotocol)) + +$(eval $(call gb_CppunitTest_use_rdb,linguistic_restprotocol,services)) + +# vim: set noet sw=4 ts=4: diff --git a/linguistic/Module_linguistic.mk b/linguistic/Module_linguistic.mk index 956c1bbc2e80..b5366b97e611 100644 --- a/linguistic/Module_linguistic.mk +++ b/linguistic/Module_linguistic.mk @@ -16,9 +16,16 @@ $(eval $(call gb_Module_add_targets,linguistic,\ #$(eval $(call gb_Module_add_check_targets,linguistic,\ #)) +ifeq ($(OS),LINUX) +$(eval $(call gb_Module_add_subsequentcheck_targets,linguistic,\ + JunitTest_linguistic_unoapi \ + CppunitTest_linguistic_restprotocol \ +)) +else $(eval $(call gb_Module_add_subsequentcheck_targets,linguistic,\ JunitTest_linguistic_unoapi \ )) +endif # was disabled in old build system # JunitTest_linguistic_complex \ diff --git a/linguistic/qa/restprotocol.cxx b/linguistic/qa/restprotocol.cxx new file mode 100644 index 000000000000..61c04185c757 --- /dev/null +++ b/linguistic/qa/restprotocol.cxx @@ -0,0 +1,181 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ +/* + * 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 + +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +using namespace ::com::sun::star::uno; + +namespace +{ +class MockServerThread : public ::osl::Thread +{ +public: + MockServerThread() + : m_aSocketAddr("localhost", 2022) + { + } + + virtual void SAL_CALL run() + { + if (m_aAcceptorSocket.acceptConnection(m_aStreamSocket) != osl_Socket_Ok) + { + return; + } + + sal_Int32 nReadBytes; + Sequence aBuffer(512); + sal_Int32 nTcpNoDelay = sal_Int32(true); + m_aStreamSocket.setOption(osl_Socket_OptionTcpNoDelay, &nTcpNoDelay, sizeof(nTcpNoDelay), + osl_Socket_LevelTcp); + + nReadBytes = m_aStreamSocket.recv(aBuffer.getArray(), aBuffer.getLength()); + if (nReadBytes) + { + std::string aText(reinterpret_cast(aBuffer.getConstArray()), nReadBytes); + + if (aText.find("POST /api/check") == std::string::npos) + { + NotFound(); + } + else if (aText.find("Content-Type: application/json") == std::string::npos) + { + NotFound(); + } + else + { + ResponseOK(); + } + } + } + + void ResponseOK() + { + OString aResponse( + "HTTP/1.1 200 OK\r\n" + "Server: MockServer\r\n" + "Cache-Control: no-cache\r\n" + "Content-Type: application/json\r\n" + "\r\n" + "{\"check-positions\":[{\"offset\":15,\"length\":6,\"errorcode\":4711,\"type\":" + "\"orth\"," + "\"severity\":1,\"proposals\":[\"Entwurf\",\"Entw\u00fcrfe\"]}," + "{\"offset\":22,\"length\":3,\"errorcode\":8221,\"type\":\"orth\",\"severity\":1}]}"); + + m_aStreamSocket.write(aResponse.getStr(), aResponse.getLength()); + m_aStreamSocket.close(); + } + + void NotFound() + { + OString aResponse("HTTP/1.1 404 Not Found\r\n" + "Connection: Closed\r\n" + "\r\n"); + + m_aStreamSocket.write(aResponse.getStr(), aResponse.getLength()); + m_aStreamSocket.close(); + } + + void stop() + { + m_aAcceptorSocket.close(); + join(); + } + + void init() + { + m_aAcceptorSocket.setOption(osl_Socket_OptionReuseAddr, 1); + CPPUNIT_ASSERT(m_aAcceptorSocket.bind(m_aSocketAddr)); + CPPUNIT_ASSERT(m_aAcceptorSocket.listen()); + } + +private: + ::osl::SocketAddr m_aSocketAddr; + ::osl::AcceptorSocket m_aAcceptorSocket; + ::osl::StreamSocket m_aStreamSocket; +}; +} + +MockServerThread aMockServer; + +class TestRestProtocol : public test::BootstrapFixtureBase +{ +public: + virtual void setUp() override; + virtual void tearDown() override; + +private: + CPPUNIT_TEST_SUITE(TestRestProtocol); + CPPUNIT_TEST(testProofreading); + CPPUNIT_TEST_SUITE_END(); + + void testProofreading(); +}; + +void TestRestProtocol::testProofreading() +{ + css::lang::Locale aLocale("en", "US", ""); + Sequence<::com::sun::star::beans::PropertyValue> aProperties; + SvxLanguageToolOptions& rLanguageOpts = SvxLanguageToolOptions::Get(); + rLanguageOpts.setBaseURL("http://127.0.0.1:2022/api"); + rLanguageOpts.setUsername("hcastro"); + rLanguageOpts.setApiKey("hcvhcvhcv"); + rLanguageOpts.setEnabled(true); + rLanguageOpts.setSSLVerification(false); + rLanguageOpts.setRestProtocol("duden"); + CPPUNIT_ASSERT_EQUAL(OUString("duden"), rLanguageOpts.getRestProtocol()); + + Reference<::com::sun::star::linguistic2::XProofreader> xProofreader( + m_xSFactory->createInstance("com.sun.star.linguistic2.Proofreader"), UNO_QUERY); + CPPUNIT_ASSERT(xProofreader.is()); + + com::sun::star::linguistic2::ProofreadingResult aResult + = xProofreader->doProofreading("id", "ths is a tst", aLocale, 0, 0, aProperties); + + CPPUNIT_ASSERT_EQUAL(2, aResult.aErrors.getLength()); +} + +void TestRestProtocol::setUp() +{ + test::BootstrapFixtureBase::setUp(); + + aMockServer.init(); + aMockServer.create(); + osl::Thread::wait(std::chrono::seconds(1)); +} + +void TestRestProtocol::tearDown() +{ + aMockServer.stop(); + + test::BootstrapFixtureBase::tearDown(); +} + +CPPUNIT_TEST_SUITE_REGISTRATION(TestRestProtocol); + +CPPUNIT_PLUGIN_IMPLEMENT(); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab: */