deskflow/src/test/unittests/ipc/IpcLogOutputterTests.cpp
Nick Bolton 50d29edd05
Solve SonarCloud security hotspots and bugs (#7383)
* Test: allocLockCursorToScreenInfo_withState_setsState

* Merge remote-tracking branch 'origin/master' into S1-1717-sonarcloud-issues

* Remove header wrappers for gmock/gtest

* Convenience wrapper script for tests

* Use `std::copy` instead of `strcpy`

* Use `std::ranges::copy` instead of `stdcpy`

* Delete dead code

* Add guitests VS Code config and test wrapper

* Revert "Delete dead code"

This reverts commit aa40f5cd35a22b4b69acfd1876aceea053088060.

* Build guitests with CMake

* Run all tests

* Don't use --gtest_filter for Qt tests

* Undo skip for GUI tests

* Coverage for `IpcClient::sendCommand`

* Remove provider and proxy

* Use lamda for StreamProvider to reduce boilerplate

* Restore version checker tests

* Remove activation souces

* Tasks for current/all tests

* Change command for tasks

* Mock QNetworkAccessManager

* Create core app to satisfy Qt assertations

* Use `std::copy` instead of `std::ranges::copy`

* Remove integtests

* Merge guitests into unittests

* Use std::string::length

* Remove include (resolves to root)

* Fix memory leaks

* Disable sigsegv tests

* Fixed formatting

* Remove guitests from CI

* New MainWindowTests

* Passing test for MainWindowTests

* Use alternative to strlen in MainWindow::checkSecureSocket

* Passing test for Log::print

* Fixed dtor call order

* Fixed var name typo

* Use proxy instead of `#define protected public`

* Add args test for log

* Add license ctor

* Fixed log test for release

* Add error log test

* Init qt with -platform offscreen

* Back-out initQt function

* Use QT_QPA_PLATFORM

* Try QT_QPA_PLATFORM=offscreen

* Use more readable env node

* Set QT_QPA_PLATFORM in CI and CodeQL

* Remove env not needed

* Modernize Log::print

* Calculate the length of the format string fmt during the initial scan loop

* More direct and efficient alterative to `strlen`

* Fixed major maint issues in AppConfig

* New clang and cmake rules

* Set `max_pargs_hwrap` to 4

* Undo clang format for now

* Fix missing `Setting::`

* Fixed missing `m_S` on Windows

* Re-add accidental dep resolution (fix later)

* Fixed missing buffer position increment

* Turn on errors

* Fixed tests and improve error message

* Fixed segfault on log refactor

* Extract log time to function

* Copyright date

* Update ChangeLog
2024-07-16 08:30:35 +00:00

174 lines
5.9 KiB
C++

/*
* synergy -- mouse and keyboard sharing utility
* Copyright (C) 2015-2016 Symless Ltd.
*
* This package is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* found in the file LICENSE that should have accompanied this file.
*
* This package is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#define TEST_ENV
#include "test/mock/ipc/MockIpcServer.h"
#include "base/String.h"
#include "common/common.h"
#include "ipc/IpcLogOutputter.h"
#include "mt/Thread.h"
#include <gmock/gmock.h>
#include <gtest/gtest.h>
// HACK: ipc logging only used on windows anyway
#if WINAPI_MSWINDOWS
using ::testing::_;
using ::testing::AtLeast;
using ::testing::Matcher;
using ::testing::MatcherCast;
using ::testing::Property;
using ::testing::Return;
using ::testing::StrEq;
using namespace synergy;
// TODO Fix the IPC Tests for windows, see #6709
// Tests disabled due to gtest/gmock update causing build problems
// Decision to disable tests and create issue instead due to time constraints
// inline const Matcher<const IpcMessage&> IpcLogLineMessageEq(const String& s)
// {
// const Matcher<const IpcLogLineMessage&> m(
// Property(&IpcLogLineMessage::logLine, StrEq(s)));
// return MatcherCast<const IpcMessage&>(m);
// }
//
// TEST(IpcLogOutputterTests, write_threadingEnabled_bufferIsSent)
//{
// MockIpcServer mockServer;
// mockServer.delegateToFake();
//
// ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true));
//
// EXPECT_CALL(mockServer, hasClients(_)).Times(AtLeast(3));
// EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\n"),
// _)).Times(1); EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock
// 2\n"), _)).Times(1);
//
// IpcLogOutputter outputter(mockServer, kIpcClientUnknown, true);
// outputter.write(kNOTE, "mock 1");
// mockServer.waitForSend();
// outputter.write(kNOTE, "mock 2");
// mockServer.waitForSend();
// }
//
// TEST(IpcLogOutputterTests, write_overBufferMaxSize_firstLineTruncated)
//{
// MockIpcServer mockServer;
//
// ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true));
// EXPECT_CALL(mockServer, hasClients(_)).Times(1);
// EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 2\nmock 3\n"),
// _)).Times(1);
//
// IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false);
// outputter.bufferMaxSize(2);
//
// // log more lines than the buffer can contain
// outputter.write(kNOTE, "mock 1");
// outputter.write(kNOTE, "mock 2");
// outputter.write(kNOTE, "mock 3");
// outputter.sendBuffer();
// }
//
// TEST(IpcLogOutputterTests, write_underBufferMaxSize_allLinesAreSent)
//{
// MockIpcServer mockServer;
//
// ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true));
//
// EXPECT_CALL(mockServer, hasClients(_)).Times(1);
// EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"),
// _)).Times(1);
//
// IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false);
// outputter.bufferMaxSize(2);
//
// // log more lines than the buffer can contain
// outputter.write(kNOTE, "mock 1");
// outputter.write(kNOTE, "mock 2");
// outputter.sendBuffer();
// }
//
//// HACK: temporarily disable this intermittently failing unit test.
//// when the build machine is under heavy load, a race condition
//// usually happens.
// #if 0
// TEST(IpcLogOutputterTests, write_overBufferRateLimit_lastLineTruncated)
//{
// MockIpcServer mockServer;
//
// ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true));
//
// EXPECT_CALL(mockServer, hasClients(_)).Times(2);
// EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"),
// _)).Times(1); EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock
// 4\nmock 5\n"), _)).Times(1);
//
// IpcLogOutputter outputter(mockServer, false);
// outputter.bufferRateLimit(2, 1); // 1s
//
// // log 1 more line than the buffer can accept in time limit.
// outputter.write(kNOTE, "mock 1");
// outputter.write(kNOTE, "mock 2");
// outputter.write(kNOTE, "mock 3");
//
// outputter.sendBuffer();
//
// // after waiting the time limit send another to make sure
// // we can log after the time limit passes.
// // HACK: sleep causes the unit test to fail intermittently,
// // so lets try 100ms (there must be a better way to solve this)
// ARCH->sleep(2); // 2s
// outputter.write(kNOTE, "mock 4");
// outputter.write(kNOTE, "mock 5");
// outputter.write(kNOTE, "mock 6");
//
// outputter.sendBuffer();
// }
// #endif
//
// TEST(IpcLogOutputterTests, write_underBufferRateLimit_allLinesAreSent)
//{
// MockIpcServer mockServer;
//
// ON_CALL(mockServer, hasClients(_)).WillByDefault(Return(true));
//
// EXPECT_CALL(mockServer, hasClients(_)).Times(2);
// EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock 1\nmock 2\n"),
// _)).Times(1); EXPECT_CALL(mockServer, send(IpcLogLineMessageEq("mock
// 3\nmock 4\n"), _)).Times(1);
//
// IpcLogOutputter outputter(mockServer, kIpcClientUnknown, false);
// outputter.bufferRateLimit(4, 1); // 1s (should be plenty of time)
//
// // log 1 more line than the buffer can accept in time limit.
// outputter.write(kNOTE, "mock 1");
// outputter.write(kNOTE, "mock 2");
// outputter.sendBuffer();
//
// // after waiting the time limit send another to make sure
// // we can log after the time limit passes.
// outputter.write(kNOTE, "mock 3");
// outputter.write(kNOTE, "mock 4");
// outputter.sendBuffer();
// }
#endif // WINAPI_MSWINDOWS