chore: remove unused tests
Remove Unused Mocks Remove remaing uses of TEST_ENV and its guarded items
This commit is contained in:
@ -51,13 +51,6 @@ public:
|
||||
|
||||
//@}
|
||||
|
||||
#ifdef TEST_ENV
|
||||
void handleDataForTest()
|
||||
{
|
||||
handleData(Event(), nullptr);
|
||||
}
|
||||
#endif
|
||||
|
||||
protected:
|
||||
enum EResult
|
||||
{
|
||||
|
||||
@ -129,9 +129,6 @@ private:
|
||||
bool m_lock;
|
||||
};
|
||||
|
||||
#ifdef TEST_ENV
|
||||
public: // yuck
|
||||
#endif
|
||||
using KeyModifierMaskList = std::vector<KeyModifierMask>;
|
||||
|
||||
private:
|
||||
@ -159,20 +156,4 @@ private:
|
||||
|
||||
// autorepeat state
|
||||
XKeyboardState m_keyboardState;
|
||||
|
||||
#ifdef TEST_ENV
|
||||
public:
|
||||
int32_t group() const
|
||||
{
|
||||
return m_group;
|
||||
}
|
||||
void group(const int32_t &group)
|
||||
{
|
||||
m_group = group;
|
||||
}
|
||||
KeyModifierMaskList modifierFromX() const
|
||||
{
|
||||
return m_modifierFromX;
|
||||
}
|
||||
#endif
|
||||
};
|
||||
|
||||
@ -359,12 +359,6 @@ public:
|
||||
InputFilter(const InputFilter &);
|
||||
virtual ~InputFilter();
|
||||
|
||||
#ifdef TEST_ENV
|
||||
InputFilter() : m_primaryClient(nullptr)
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
InputFilter &operator=(const InputFilter &);
|
||||
|
||||
// add rule, adopting the condition and the actions
|
||||
|
||||
@ -29,12 +29,6 @@ public:
|
||||
PrimaryClient(const std::string &name, deskflow::Screen *screen);
|
||||
~PrimaryClient() override = default;
|
||||
|
||||
#ifdef TEST_ENV
|
||||
PrimaryClient() : BaseClientProxy("")
|
||||
{
|
||||
}
|
||||
#endif
|
||||
|
||||
//! @name manipulators
|
||||
//@{
|
||||
|
||||
|
||||
@ -1,27 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "deskflow/Screen.h"
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
class MockScreen : public deskflow::Screen
|
||||
{
|
||||
public:
|
||||
MockScreen() : deskflow::Screen()
|
||||
{
|
||||
}
|
||||
MOCK_METHOD(void, disable, (), (override));
|
||||
MOCK_METHOD(void, getShape, (int32_t &, int32_t &, int32_t &, int32_t &), (const, override));
|
||||
MOCK_METHOD(void, getCursorPos, (int32_t &, int32_t &), (const, override));
|
||||
MOCK_METHOD(void, resetOptions, (), (override));
|
||||
MOCK_METHOD(void, setOptions, (const OptionsList &), (override));
|
||||
MOCK_METHOD(void, enable, (), (override));
|
||||
};
|
||||
@ -1,23 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "server/Config.h"
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
class MockConfig : public Config
|
||||
{
|
||||
public:
|
||||
MockConfig() : Config()
|
||||
{
|
||||
}
|
||||
MOCK_METHOD(InputFilter *, getInputFilter, (), (override));
|
||||
MOCK_METHOD(bool, isScreen, (const std::string &), (const, override));
|
||||
};
|
||||
@ -1,19 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "server/InputFilter.h"
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
class MockInputFilter : public InputFilter
|
||||
{
|
||||
public:
|
||||
MOCK_METHOD(void, setPrimaryClient, (PrimaryClient *), (override));
|
||||
};
|
||||
@ -1,29 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "server/PrimaryClient.h"
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
|
||||
class MockPrimaryClient : public PrimaryClient
|
||||
{
|
||||
public:
|
||||
MOCK_METHOD(void *, getEventTarget, (), (const, override));
|
||||
MOCK_METHOD(void, getCursorPos, (int32_t &, int32_t &), (const, override));
|
||||
MOCK_METHOD(void, setJumpCursorPos, (int32_t, int32_t), (const));
|
||||
MOCK_METHOD(void, reconfigure, (uint32_t), (override));
|
||||
MOCK_METHOD(void, resetOptions, (), (override));
|
||||
MOCK_METHOD(void, setOptions, (const OptionsList &), (override));
|
||||
MOCK_METHOD(void, enable, (), (override));
|
||||
MOCK_METHOD(void, disable, (), (override));
|
||||
MOCK_METHOD(uint32_t, registerHotKey, (KeyID, KeyModifierMask), (override));
|
||||
MOCK_METHOD(KeyModifierMask, getToggleMask, (), (const, override));
|
||||
MOCK_METHOD(void, unregisterHotKey, (uint32_t), (override));
|
||||
};
|
||||
@ -1,38 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#include "test/shared/TestEventQueue.h"
|
||||
|
||||
#include "base/TMethodEventJob.h"
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
void TestEventQueue::raiseQuitEvent()
|
||||
{
|
||||
addEvent(Event(EventTypes::Quit));
|
||||
}
|
||||
|
||||
void TestEventQueue::initQuitTimeout(double timeout)
|
||||
{
|
||||
assert(m_pQuitTimeoutTimer == nullptr);
|
||||
m_pQuitTimeoutTimer = newOneShotTimer(timeout, nullptr);
|
||||
adoptHandler(
|
||||
EventTypes::Timer, m_pQuitTimeoutTimer,
|
||||
new TMethodEventJob<TestEventQueue>(this, &TestEventQueue::handleQuitTimeout)
|
||||
);
|
||||
}
|
||||
|
||||
void TestEventQueue::cleanupQuitTimeout()
|
||||
{
|
||||
removeHandler(EventTypes::Timer, m_pQuitTimeoutTimer);
|
||||
deleteTimer(m_pQuitTimeoutTimer);
|
||||
m_pQuitTimeoutTimer = nullptr;
|
||||
}
|
||||
|
||||
void TestEventQueue::handleQuitTimeout(const Event &, void *vclient)
|
||||
{
|
||||
throw std::runtime_error("test event queue timeout");
|
||||
}
|
||||
@ -1,30 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "base/EventQueue.h"
|
||||
|
||||
class EventQueueTimer;
|
||||
|
||||
class TestEventQueue : public EventQueue
|
||||
{
|
||||
public:
|
||||
TestEventQueue() : m_pQuitTimeoutTimer(nullptr)
|
||||
{
|
||||
}
|
||||
|
||||
void handleQuitTimeout(const Event &, void *vclient);
|
||||
void raiseQuitEvent();
|
||||
void initQuitTimeout(double timeout);
|
||||
void cleanupQuitTimeout();
|
||||
|
||||
private:
|
||||
void timeoutThread(void *);
|
||||
|
||||
private:
|
||||
EventQueueTimer *m_pQuitTimeoutTimer;
|
||||
};
|
||||
@ -1,520 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2014 - 2020 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#include "deskflow/ProtocolUtil.h"
|
||||
#include "test/mock/io/MockStream.h"
|
||||
|
||||
#include <array>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::DoAll;
|
||||
using ::testing::ElementsAreArray;
|
||||
using ::testing::Eq;
|
||||
using ::testing::Pointee;
|
||||
using ::testing::Return;
|
||||
using ::testing::SetArgPointee;
|
||||
using ::testing::StrEq;
|
||||
using ::testing::TypedEq;
|
||||
|
||||
ACTION_P2(SetValueToVoidPointerArg0, value, size)
|
||||
{
|
||||
memcpy(arg0, value, size);
|
||||
}
|
||||
|
||||
MATCHER_P(EqVoidPointeeInt8, expected, "")
|
||||
{
|
||||
const uint8_t Actual8 = (*static_cast<const uint8_t *>(arg));
|
||||
return (expected == Actual8);
|
||||
}
|
||||
|
||||
MATCHER_P(EqVoidPointeeInt16, expected, "")
|
||||
{
|
||||
const uint16_t Actual16 = (*static_cast<const uint16_t *>(arg));
|
||||
return (expected == (Actual16 >> 8));
|
||||
}
|
||||
|
||||
MATCHER_P(EqVoidPointeeInt32, expected, "")
|
||||
{
|
||||
const uint32_t Actual32 = (*static_cast<const uint32_t *>(arg));
|
||||
return (expected == (Actual32 >> 24));
|
||||
}
|
||||
|
||||
MATCHER_P(EqVoidVectorInt1byte, expected, "")
|
||||
{
|
||||
bool Result = true;
|
||||
const uint8_t *Actual = (static_cast<const uint8_t *>(arg)) + 4;
|
||||
const size_t Size = *(Actual - 1);
|
||||
|
||||
if (Size == expected.size()) {
|
||||
for (size_t i = 0; i < expected.size(); ++i) {
|
||||
if (expected[i] != Actual[i]) {
|
||||
Result = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Result = false;
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
MATCHER_P(EqVoidVectorInt2bytes, expected, "")
|
||||
{
|
||||
bool Result = true;
|
||||
const uint16_t *Actual = (static_cast<const uint16_t *>(arg)) + 2;
|
||||
const size_t Size = *(Actual - 1) >> 8;
|
||||
|
||||
if (Size == expected.size()) {
|
||||
for (size_t i = 0; i < expected.size(); ++i) {
|
||||
if (expected[i] != (Actual[i] >> 8)) {
|
||||
Result = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Result = false;
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
MATCHER_P(EqVoidVectorInt4bytes, expected, "")
|
||||
{
|
||||
bool Result = true;
|
||||
const uint32_t *Actual = (static_cast<const uint32_t *>(arg)) + 1;
|
||||
const size_t Size = *(Actual - 1) >> 24;
|
||||
|
||||
if (Size == expected.size()) {
|
||||
for (size_t i = 0; i < expected.size(); ++i) {
|
||||
if (expected[i] != (Actual[i] >> 24)) {
|
||||
Result = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Result = false;
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
MATCHER_P(EqVectorSymbols, expected, "")
|
||||
{
|
||||
bool Result = true;
|
||||
const uint8_t *Actual = (static_cast<const uint8_t *>(arg));
|
||||
|
||||
for (size_t i = 0; i < expected.size(); ++i) {
|
||||
if (expected[i] != (Actual[i])) {
|
||||
Result = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
return Result;
|
||||
}
|
||||
|
||||
ACTION(ThrowBadAlloc)
|
||||
{
|
||||
throw std::bad_alloc();
|
||||
}
|
||||
|
||||
class ProtocolUtilTests : public ::testing::Test
|
||||
{
|
||||
public:
|
||||
MockStream stream;
|
||||
uint8_t ActualInt8 = 0;
|
||||
uint16_t ActualInt16 = 0;
|
||||
uint32_t ActualInt32 = 0;
|
||||
std::string ActualString;
|
||||
};
|
||||
|
||||
// TODO: fix tests causing segmentation fault
|
||||
#if 0
|
||||
TEST_F(ProtocolUtilTests, readf__XIOEndOfStream_exception) {
|
||||
ON_CALL(stream, read(_, _)).WillByDefault(Return(0));
|
||||
|
||||
EXPECT_FALSE(ProtocolUtil::readf(&stream, "%s", &ActualString));
|
||||
EXPECT_TRUE(ActualString.empty());
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_XIOReadMismatch_exception) {
|
||||
EXPECT_CALL(stream, read(_, _))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0("b", 1), Return(1)));
|
||||
|
||||
EXPECT_FALSE(ProtocolUtil::readf(&stream, "a%s", &ActualString));
|
||||
EXPECT_TRUE(ActualString.empty());
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_bad_alloc_exception) {
|
||||
ON_CALL(stream, read(_, _)).WillByDefault(ThrowBadAlloc());
|
||||
|
||||
EXPECT_FALSE(ProtocolUtil::readf(&stream, "a%s", &ActualString));
|
||||
EXPECT_TRUE(ActualString.empty());
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_asserts) {
|
||||
ASSERT_DEBUG_DEATH(
|
||||
{ ProtocolUtil::readf(&stream, "%x", &ActualString); },
|
||||
"invalid format specifier");
|
||||
|
||||
ASSERT_DEBUG_DEATH(
|
||||
{ ProtocolUtil::readf(&stream, "%5i", &ActualString); },
|
||||
"length to be read is wrong:");
|
||||
|
||||
ASSERT_DEBUG_DEATH(
|
||||
{ ProtocolUtil::readf(&stream, "%5I", &ActualString); }, "");
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_params_validation) {
|
||||
EXPECT_FALSE(ProtocolUtil::readf(nullptr, "%x", nullptr));
|
||||
EXPECT_FALSE(ProtocolUtil::readf(&stream, nullptr, nullptr));
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_string) {
|
||||
const uint8_t Length = 200;
|
||||
const std::string Expected(Length, 'x');
|
||||
std::array<uint8_t, 4> StringSize{{0, 0, 0, Length}};
|
||||
|
||||
EXPECT_CALL(stream, read(_, _))
|
||||
.WillOnce(
|
||||
DoAll(SetValueToVoidPointerArg0(StringSize.data(), StringSize.size()),
|
||||
Return(StringSize.size())))
|
||||
.WillOnce(
|
||||
DoAll(SetValueToVoidPointerArg0(Expected.c_str(), Expected.length()),
|
||||
Return(Expected.length())));
|
||||
|
||||
EXPECT_TRUE(ProtocolUtil::readf(&stream, "%s", &ActualString));
|
||||
EXPECT_EQ(Expected, ActualString);
|
||||
}
|
||||
|
||||
class ReadfIntTestFixture
|
||||
: public ::testing::TestWithParam<std::tuple<const char *, int>> {
|
||||
public:
|
||||
MockStream stream;
|
||||
uint8_t StreamData1Byte = 10;
|
||||
std::array<uint8_t, 2> StreamData2Bytes{{0, 10}};
|
||||
std::array<uint8_t, 4> StreamData4Bytes{{0, 0, 0, 10}};
|
||||
|
||||
uint8_t *getStreamData(int size) {
|
||||
uint8_t *StreamData = nullptr;
|
||||
switch (size) {
|
||||
case 2:
|
||||
StreamData = StreamData2Bytes.data();
|
||||
break;
|
||||
case 4:
|
||||
StreamData = StreamData4Bytes.data();
|
||||
break;
|
||||
default:
|
||||
StreamData = &StreamData1Byte;
|
||||
break;
|
||||
}
|
||||
return StreamData;
|
||||
}
|
||||
};
|
||||
|
||||
TEST_P(ReadfIntTestFixture, readf_int) {
|
||||
int Actual = 0;
|
||||
const int Expected = 10;
|
||||
const char *Format = std::get<0>(GetParam());
|
||||
int StreamDataSize = std::get<1>(GetParam());
|
||||
uint8_t *StreamData = getStreamData(StreamDataSize);
|
||||
|
||||
ON_CALL(stream, read(_, _))
|
||||
.WillByDefault(
|
||||
DoAll(SetValueToVoidPointerArg0(StreamData, StreamDataSize),
|
||||
Return(StreamDataSize)));
|
||||
|
||||
EXPECT_TRUE(ProtocolUtil::readf(&stream, Format, &Actual));
|
||||
EXPECT_EQ(Expected, Actual);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(ReadfIntTests, ReadfIntTestFixture,
|
||||
::testing::Values(std::make_tuple("%1i", 1),
|
||||
std::make_tuple("%2i", 2),
|
||||
std::make_tuple("%4i", 4)));
|
||||
|
||||
class ReadfIntVectorTestFixture : public ReadfIntTestFixture {};
|
||||
|
||||
TEST_P(ReadfIntVectorTestFixture, readf_int_vector) {
|
||||
std::vector<uint8_t> Actual1Byte = {};
|
||||
std::vector<uint16_t> Actual2Bytes = {};
|
||||
std::vector<uint32_t> Actual4Bytes = {};
|
||||
|
||||
const std::vector<uint8_t> Expected1Byte = {10, 10};
|
||||
const std::vector<uint16_t> Expected2Bytes = {10, 10};
|
||||
const std::vector<uint32_t> Expected4Bytes = {10, 10};
|
||||
std::array<uint8_t, 4> StreamVectorSize{{0, 0, 0, 2}};
|
||||
|
||||
const char *Format = std::get<0>(GetParam());
|
||||
int StreamDataSize = std::get<1>(GetParam());
|
||||
uint8_t *StreamData = getStreamData(StreamDataSize);
|
||||
|
||||
MockStream stream;
|
||||
EXPECT_CALL(stream, read(_, _))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(StreamVectorSize.data(),
|
||||
StreamVectorSize.size()),
|
||||
Return(StreamVectorSize.size())))
|
||||
.WillRepeatedly(
|
||||
DoAll(SetValueToVoidPointerArg0(StreamData, StreamDataSize),
|
||||
Return(StreamDataSize)));
|
||||
|
||||
switch (StreamDataSize) {
|
||||
case 2:
|
||||
EXPECT_TRUE(ProtocolUtil::readf(&stream, Format, &Actual2Bytes));
|
||||
EXPECT_EQ(Expected2Bytes, Actual2Bytes);
|
||||
break;
|
||||
case 4:
|
||||
EXPECT_TRUE(ProtocolUtil::readf(&stream, Format, &Actual4Bytes));
|
||||
EXPECT_EQ(Expected4Bytes, Actual4Bytes);
|
||||
break;
|
||||
default:
|
||||
EXPECT_TRUE(ProtocolUtil::readf(&stream, Format, &Actual1Byte));
|
||||
EXPECT_EQ(Expected1Byte, Actual1Byte);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(ReadfIntVectorTests, ReadfIntVectorTestFixture,
|
||||
::testing::Values(std::make_tuple("%1I", 1),
|
||||
std::make_tuple("%2I", 2),
|
||||
std::make_tuple("%4I", 4)));
|
||||
|
||||
class ReadfIntAndStringTest : public ReadfIntTestFixture {
|
||||
public:
|
||||
uint8_t ActualInt8 = 0;
|
||||
uint16_t ActualInt16 = 0;
|
||||
uint32_t ActualInt32 = 32;
|
||||
std::string ActualString;
|
||||
};
|
||||
|
||||
TEST_P(ReadfIntAndStringTest, readf_int_and_string) {
|
||||
const int ExpectedInt = 10;
|
||||
const uint8_t StringLength = 200;
|
||||
const std::string ExpectedString(StringLength, 'x');
|
||||
std::array<uint8_t, 4> StringSize{{0, 0, 0, StringLength}};
|
||||
|
||||
const char *Format = std::get<0>(GetParam());
|
||||
int StreamDataSize = std::get<1>(GetParam());
|
||||
uint8_t *StreamData = getStreamData(StreamDataSize);
|
||||
|
||||
EXPECT_CALL(stream, read(_, _))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(StreamData, StreamDataSize),
|
||||
Return(StreamDataSize)))
|
||||
.WillOnce(
|
||||
DoAll(SetValueToVoidPointerArg0(StringSize.data(), StringSize.size()),
|
||||
Return(StringSize.size())))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(ExpectedString.c_str(),
|
||||
ExpectedString.length()),
|
||||
Return(ExpectedString.length())));
|
||||
|
||||
switch (StreamDataSize) {
|
||||
case 2:
|
||||
EXPECT_TRUE(
|
||||
ProtocolUtil::readf(&stream, Format, &ActualInt16, &ActualString));
|
||||
EXPECT_EQ(ExpectedInt, ActualInt16);
|
||||
break;
|
||||
case 4:
|
||||
EXPECT_TRUE(
|
||||
ProtocolUtil::readf(&stream, Format, &ActualInt32, &ActualString));
|
||||
EXPECT_EQ(ExpectedInt, ActualInt32);
|
||||
break;
|
||||
default:
|
||||
EXPECT_TRUE(
|
||||
ProtocolUtil::readf(&stream, Format, &ActualInt8, &ActualString));
|
||||
EXPECT_EQ(ExpectedInt, ActualInt8);
|
||||
break;
|
||||
}
|
||||
EXPECT_EQ(ExpectedString, ActualString);
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(IntAndStringTest, ReadfIntAndStringTest,
|
||||
::testing::Values(std::make_tuple("%1i%s", 1),
|
||||
std::make_tuple("%2i%s", 2),
|
||||
std::make_tuple("%4i%s", 4)));
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_string_and_int4bytes) {
|
||||
const uint8_t ExpectedInt = 10;
|
||||
std::array<uint8_t, 4> StreamIntData{{0, 0, 0, ExpectedInt}};
|
||||
|
||||
const std::string ExpectedStr(32768, 'x');
|
||||
std::array<uint8_t, 4> Size{{0, 0, 128, 0}};
|
||||
|
||||
EXPECT_CALL(stream, read(_, _))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(Size.data(), Size.size()),
|
||||
Return(Size.size())))
|
||||
.WillOnce(DoAll(
|
||||
SetValueToVoidPointerArg0(ExpectedStr.c_str(), ExpectedStr.length()),
|
||||
Return(ExpectedStr.length())))
|
||||
.WillOnce(DoAll(
|
||||
SetValueToVoidPointerArg0(StreamIntData.data(), StreamIntData.size()),
|
||||
Return(StreamIntData.size())));
|
||||
|
||||
EXPECT_TRUE(
|
||||
ProtocolUtil::readf(&stream, "%s%4i", &ActualString, &ActualInt32));
|
||||
EXPECT_EQ(ExpectedStr, ActualString);
|
||||
EXPECT_EQ(ExpectedInt, ActualInt32);
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_string_and_vector_int4bytes) {
|
||||
std::vector<uint32_t> Actual = {};
|
||||
const std::vector<uint32_t> Expected4Bytes = {10, 10};
|
||||
std::array<uint8_t, 4> StreamVectorSize{{0, 0, 0, 2}};
|
||||
std::array<uint8_t, 4> StreamData4Bytes{{0, 0, 0, 10}};
|
||||
|
||||
const std::string ExpString(32768, 'x');
|
||||
std::array<uint8_t, 4> SizeString{{0, 0, 128, 0}};
|
||||
|
||||
EXPECT_CALL(stream, read(_, _))
|
||||
.WillOnce(
|
||||
DoAll(SetValueToVoidPointerArg0(SizeString.data(), SizeString.size()),
|
||||
Return(SizeString.size())))
|
||||
.WillOnce(DoAll(
|
||||
SetValueToVoidPointerArg0(ExpString.c_str(), ExpString.length()),
|
||||
Return(ExpString.length())))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(StreamVectorSize.data(),
|
||||
StreamVectorSize.size()),
|
||||
Return(StreamVectorSize.size())))
|
||||
.WillRepeatedly(DoAll(SetValueToVoidPointerArg0(StreamData4Bytes.data(),
|
||||
StreamData4Bytes.size()),
|
||||
Return(StreamData4Bytes.size())));
|
||||
|
||||
EXPECT_TRUE(ProtocolUtil::readf(&stream, "%s%4I", &ActualString, &Actual));
|
||||
EXPECT_EQ(ExpString, ActualString);
|
||||
EXPECT_EQ(Expected4Bytes, Actual);
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, readf_vector_int4bytes_and_string) {
|
||||
std::vector<uint32_t> Actual4Bytes = {};
|
||||
const std::vector<uint32_t> Expected4Bytes = {10, 10};
|
||||
std::array<uint8_t, 4> StreamVectorSize{{0, 0, 0, 2}};
|
||||
std::array<uint8_t, 4> StreamData4Bytes{{0, 0, 0, 10}};
|
||||
|
||||
const std::string ExpectedString(32768, 'x');
|
||||
std::array<uint8_t, 4> StringSize{{0, 0, 128, 0}};
|
||||
|
||||
EXPECT_CALL(stream, read(_, _))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(StreamVectorSize.data(),
|
||||
StreamVectorSize.size()),
|
||||
Return(StreamVectorSize.size())))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(StreamData4Bytes.data(),
|
||||
StreamData4Bytes.size()),
|
||||
Return(StreamData4Bytes.size())))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(StreamData4Bytes.data(),
|
||||
StreamData4Bytes.size()),
|
||||
Return(StreamData4Bytes.size())))
|
||||
.WillOnce(
|
||||
DoAll(SetValueToVoidPointerArg0(StringSize.data(), StringSize.size()),
|
||||
Return(StringSize.size())))
|
||||
.WillOnce(DoAll(SetValueToVoidPointerArg0(ExpectedString.c_str(),
|
||||
ExpectedString.length()),
|
||||
Return(ExpectedString.length())));
|
||||
|
||||
EXPECT_TRUE(
|
||||
ProtocolUtil::readf(&stream, "%4I%s", &Actual4Bytes, &ActualString));
|
||||
EXPECT_EQ(ExpectedString, ActualString);
|
||||
EXPECT_EQ(Expected4Bytes, Actual4Bytes);
|
||||
}
|
||||
|
||||
class WriteIntTest
|
||||
: public ::testing::TestWithParam<std::tuple<const char *, int>> {
|
||||
public:
|
||||
MockStream stream;
|
||||
uint8_t Expected1Byte = 5;
|
||||
uint16_t Expected2Bytes = 10;
|
||||
uint32_t Expected4Bytes = 15;
|
||||
};
|
||||
|
||||
TEST_P(WriteIntTest, write_int) {
|
||||
const char *Format = std::get<0>(GetParam());
|
||||
const int DataSize = std::get<1>(GetParam());
|
||||
switch (DataSize) {
|
||||
case 2:
|
||||
EXPECT_CALL(stream,
|
||||
write(EqVoidPointeeInt16(Expected2Bytes), Eq(DataSize)));
|
||||
ProtocolUtil::writef(&stream, Format, Expected2Bytes);
|
||||
break;
|
||||
case 4:
|
||||
EXPECT_CALL(stream,
|
||||
write(EqVoidPointeeInt32(Expected4Bytes), Eq(DataSize)));
|
||||
ProtocolUtil::writef(&stream, Format, Expected4Bytes);
|
||||
break;
|
||||
default:
|
||||
EXPECT_CALL(stream, write(EqVoidPointeeInt8(Expected1Byte), Eq(DataSize)));
|
||||
ProtocolUtil::writef(&stream, Format, Expected1Byte);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(WriteIntTest, WriteIntTest,
|
||||
::testing::Values(std::make_tuple("%1i", 1),
|
||||
std::make_tuple("%2i", 2),
|
||||
std::make_tuple("%4i", 4)));
|
||||
|
||||
class WriteIntVectorTest
|
||||
: public ::testing::TestWithParam<std::tuple<const char *, int>> {
|
||||
public:
|
||||
MockStream stream;
|
||||
const std::vector<uint8_t> Expected1Byte = {10, 20, 30};
|
||||
const std::vector<uint16_t> Expected2Byte = {40, 50, 60};
|
||||
const std::vector<uint32_t> Expected4Byte = {70, 80, 90};
|
||||
};
|
||||
|
||||
TEST_P(WriteIntVectorTest, write_vector_int) {
|
||||
const char *Format = std::get<0>(GetParam());
|
||||
const int Type = std::get<1>(GetParam());
|
||||
|
||||
switch (Type) {
|
||||
case 2:
|
||||
EXPECT_CALL(stream,
|
||||
write(EqVoidVectorInt2bytes(Expected2Byte),
|
||||
Eq(Type * Expected2Byte.size() + sizeof(uint32_t))));
|
||||
ProtocolUtil::writef(&stream, Format, &Expected2Byte);
|
||||
break;
|
||||
case 4:
|
||||
EXPECT_CALL(stream,
|
||||
write(EqVoidVectorInt4bytes(Expected4Byte),
|
||||
Eq(Type * Expected4Byte.size() + sizeof(uint32_t))));
|
||||
ProtocolUtil::writef(&stream, Format, &Expected4Byte);
|
||||
break;
|
||||
default:
|
||||
EXPECT_CALL(stream, write(EqVoidVectorInt1byte(Expected1Byte),
|
||||
Eq(Expected1Byte.size() + sizeof(uint32_t))));
|
||||
ProtocolUtil::writef(&stream, Format, &Expected1Byte);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
INSTANTIATE_TEST_SUITE_P(WriteIntVectorTest, WriteIntVectorTest,
|
||||
::testing::Values(std::make_tuple("%1I", 1),
|
||||
std::make_tuple("%2I", 2),
|
||||
std::make_tuple("%4I", 4)));
|
||||
|
||||
TEST_F(ProtocolUtilTests, write_string_test) {
|
||||
const std::string Expected = "Expected";
|
||||
const std::vector<uint8_t> ExpectedVector = {'E', 'x', 'p', 'e',
|
||||
'c', 't', 'e', 'd'};
|
||||
EXPECT_CALL(stream, write(EqVoidVectorInt1byte(ExpectedVector),
|
||||
Expected.size() + sizeof(uint32_t)));
|
||||
ProtocolUtil::writef(&stream, "%s", &Expected);
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, write_raw_bytes_test) {
|
||||
const uint32_t Size = 5;
|
||||
const std::array<uint8_t, Size> Expected{{10, 20, 30, 40, 50}};
|
||||
EXPECT_CALL(stream, write(EqVoidVectorInt1byte(Expected),
|
||||
Expected.size() + sizeof(uint32_t)));
|
||||
ProtocolUtil::writef(&stream, "%S", Size, &Expected);
|
||||
}
|
||||
|
||||
TEST_F(ProtocolUtilTests, write_symbols_from_format_test) {
|
||||
const std::vector<uint8_t> Expected = {'%', '1', '2', '3', '4', '5'};
|
||||
EXPECT_CALL(stream, write(EqVectorSymbols(Expected), Expected.size()));
|
||||
ProtocolUtil::writef(&stream, "%%12345");
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -4,8 +4,6 @@
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "deskflow/ArgParser.h"
|
||||
#include "deskflow/ServerApp.h"
|
||||
#include "deskflow/ServerArgs.h"
|
||||
|
||||
@ -1,522 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2025 Deskflow Developers
|
||||
* SPDX-FileCopyrightText: (C) 2013 - 2016 Symless Ltd.
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
// TODO: fix, tests failing intermittently and/or with segfault
|
||||
#if 0
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "base/Log.h"
|
||||
#include "base/TMethodEventJob.h"
|
||||
#include "base/TMethodJob.h"
|
||||
#include "client/Client.h"
|
||||
#include "deskflow/FileChunk.h"
|
||||
#include "deskflow/StreamChunker.h"
|
||||
#include "mt/Thread.h"
|
||||
#include "net/NetworkAddress.h"
|
||||
#include "net/SocketMultiplexer.h"
|
||||
#include "net/TCPSocketFactory.h"
|
||||
#include "server/ClientListener.h"
|
||||
#include "server/ClientProxy.h"
|
||||
#include "server/Server.h"
|
||||
#include "test/mock/deskflow/MockScreen.h"
|
||||
#include "test/mock/server/MockConfig.h"
|
||||
#include "test/mock/server/MockInputFilter.h"
|
||||
#include "test/mock/server/MockPrimaryClient.h"
|
||||
#include "test/shared/TestEventQueue.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <gtest/gtest.h>
|
||||
#include <iostream>
|
||||
#include <stdexcept>
|
||||
#include <stdio.h>
|
||||
|
||||
using namespace std;
|
||||
using ::testing::_;
|
||||
using ::testing::Invoke;
|
||||
using ::testing::NiceMock;
|
||||
using ::testing::Return;
|
||||
|
||||
#define TEST_PORT 24803
|
||||
#define TEST_HOST "localhost"
|
||||
|
||||
const size_t kMockDataSize = 1024 * 1024 * 10; // 10MB
|
||||
const uint16_t kMockDataChunkIncrement = 1024; // 1KB
|
||||
const char *kMockFilename = "tmp/test/NetworkTests.mock";
|
||||
const size_t kMockFileSize = 1024 * 1024 * 10; // 10MB
|
||||
|
||||
void getScreenShape(int32_t &x, int32_t &y, int32_t &w, int32_t &h);
|
||||
void getCursorPos(int32_t &x, int32_t &y);
|
||||
uint8_t *newMockData(size_t size);
|
||||
void createFile(fstream &file, const char *filename, size_t size);
|
||||
|
||||
class NetworkTests : public ::testing::Test {
|
||||
public:
|
||||
NetworkTests() : m_mockData(nullptr), m_mockDataSize(0), m_mockFileSize(0) {
|
||||
m_mockData = newMockData(kMockDataSize);
|
||||
createFile(m_mockFile, kMockFilename, kMockFileSize);
|
||||
}
|
||||
|
||||
~NetworkTests() {
|
||||
remove(kMockFilename);
|
||||
delete[] m_mockData;
|
||||
}
|
||||
|
||||
void sendMockData(void *eventTarget);
|
||||
|
||||
void
|
||||
sendToClient_mockData_handleClientConnected(const Event &, void *vlistener);
|
||||
void sendToClient_mockData_fileReceiveCompleted(const Event &, void *);
|
||||
|
||||
void
|
||||
sendToClient_mockFile_handleClientConnected(const Event &, void *vlistener);
|
||||
void sendToClient_mockFile_fileReceiveCompleted(const Event &event, void *);
|
||||
|
||||
void
|
||||
sendToServer_mockData_handleClientConnected(const Event &, void *vlistener);
|
||||
void sendToServer_mockData_fileReceiveCompleted(const Event &event, void *);
|
||||
|
||||
void
|
||||
sendToServer_mockFile_handleClientConnected(const Event &, void *vlistener);
|
||||
void sendToServer_mockFile_fileReceiveCompleted(const Event &event, void *);
|
||||
|
||||
public:
|
||||
TestEventQueue m_events;
|
||||
uint8_t *m_mockData;
|
||||
size_t m_mockDataSize;
|
||||
fstream m_mockFile;
|
||||
size_t m_mockFileSize;
|
||||
};
|
||||
|
||||
TEST_F(NetworkTests, sendToClient_mockData) {
|
||||
// server and client
|
||||
NetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
||||
|
||||
serverAddress.resolve();
|
||||
|
||||
// server
|
||||
SocketMultiplexer serverSocketMultiplexer;
|
||||
TCPSocketFactory *serverSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
||||
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
|
||||
NiceMock<MockScreen> serverScreen;
|
||||
NiceMock<MockPrimaryClient> primaryClient;
|
||||
NiceMock<MockConfig> serverConfig;
|
||||
NiceMock<MockInputFilter> serverInputFilter;
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forClientListener().connected(), &listener,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToClient_mockData_handleClientConnected,
|
||||
&listener));
|
||||
|
||||
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
||||
ON_CALL(serverConfig, getInputFilter())
|
||||
.WillByDefault(Return(&serverInputFilter));
|
||||
|
||||
deskflow::ServerArgs serverArgs;
|
||||
serverArgs.m_enableDragDrop = true;
|
||||
Server server(
|
||||
serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs);
|
||||
server.m_mock = true;
|
||||
listener.setServer(&server);
|
||||
|
||||
// client
|
||||
NiceMock<MockScreen> clientScreen;
|
||||
SocketMultiplexer clientSocketMultiplexer;
|
||||
TCPSocketFactory *clientSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
||||
|
||||
ON_CALL(clientScreen, getShape(_, _, _, _))
|
||||
.WillByDefault(Invoke(getScreenShape));
|
||||
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
||||
|
||||
deskflow::ClientArgs clientArgs;
|
||||
clientArgs.m_enableDragDrop = true;
|
||||
clientArgs.m_enableCrypto = false;
|
||||
Client client(
|
||||
&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen,
|
||||
clientArgs);
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forFile().fileReceiveCompleted(), &client,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToClient_mockData_fileReceiveCompleted));
|
||||
|
||||
client.connect();
|
||||
|
||||
m_events.initQuitTimeout(10);
|
||||
m_events.loop();
|
||||
m_events.removeHandler(m_events.forClientListener().connected(), &listener);
|
||||
m_events.removeHandler(m_events.forFile().fileReceiveCompleted(), &client);
|
||||
m_events.cleanupQuitTimeout();
|
||||
}
|
||||
|
||||
TEST_F(NetworkTests, sendToClient_mockFile) {
|
||||
// server and client
|
||||
NetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
||||
|
||||
serverAddress.resolve();
|
||||
|
||||
// server
|
||||
SocketMultiplexer serverSocketMultiplexer;
|
||||
TCPSocketFactory *serverSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
||||
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
|
||||
NiceMock<MockScreen> serverScreen;
|
||||
NiceMock<MockPrimaryClient> primaryClient;
|
||||
NiceMock<MockConfig> serverConfig;
|
||||
NiceMock<MockInputFilter> serverInputFilter;
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forClientListener().connected(), &listener,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToClient_mockFile_handleClientConnected,
|
||||
&listener));
|
||||
|
||||
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
||||
ON_CALL(serverConfig, getInputFilter())
|
||||
.WillByDefault(Return(&serverInputFilter));
|
||||
|
||||
deskflow::ServerArgs serverArgs;
|
||||
serverArgs.m_enableDragDrop = true;
|
||||
Server server(
|
||||
serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs);
|
||||
server.m_mock = true;
|
||||
listener.setServer(&server);
|
||||
|
||||
// client
|
||||
NiceMock<MockScreen> clientScreen;
|
||||
SocketMultiplexer clientSocketMultiplexer;
|
||||
TCPSocketFactory *clientSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
||||
|
||||
ON_CALL(clientScreen, getShape(_, _, _, _))
|
||||
.WillByDefault(Invoke(getScreenShape));
|
||||
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
||||
|
||||
deskflow::ClientArgs clientArgs;
|
||||
clientArgs.m_enableDragDrop = true;
|
||||
clientArgs.m_enableCrypto = false;
|
||||
Client client(
|
||||
&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen,
|
||||
clientArgs);
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forFile().fileReceiveCompleted(), &client,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToClient_mockFile_fileReceiveCompleted));
|
||||
|
||||
client.connect();
|
||||
|
||||
m_events.initQuitTimeout(10);
|
||||
m_events.loop();
|
||||
m_events.removeHandler(m_events.forClientListener().connected(), &listener);
|
||||
m_events.removeHandler(m_events.forFile().fileReceiveCompleted(), &client);
|
||||
m_events.cleanupQuitTimeout();
|
||||
}
|
||||
|
||||
TEST_F(NetworkTests, sendToServer_mockData) {
|
||||
// server and client
|
||||
NetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
||||
serverAddress.resolve();
|
||||
|
||||
// server
|
||||
SocketMultiplexer serverSocketMultiplexer;
|
||||
TCPSocketFactory *serverSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
||||
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
|
||||
NiceMock<MockScreen> serverScreen;
|
||||
NiceMock<MockPrimaryClient> primaryClient;
|
||||
NiceMock<MockConfig> serverConfig;
|
||||
NiceMock<MockInputFilter> serverInputFilter;
|
||||
|
||||
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
||||
ON_CALL(serverConfig, getInputFilter())
|
||||
.WillByDefault(Return(&serverInputFilter));
|
||||
|
||||
deskflow::ServerArgs serverArgs;
|
||||
serverArgs.m_enableDragDrop = true;
|
||||
Server server(
|
||||
serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs);
|
||||
server.m_mock = true;
|
||||
listener.setServer(&server);
|
||||
|
||||
// client
|
||||
NiceMock<MockScreen> clientScreen;
|
||||
SocketMultiplexer clientSocketMultiplexer;
|
||||
TCPSocketFactory *clientSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
||||
|
||||
ON_CALL(clientScreen, getShape(_, _, _, _))
|
||||
.WillByDefault(Invoke(getScreenShape));
|
||||
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
||||
|
||||
deskflow::ClientArgs clientArgs;
|
||||
clientArgs.m_enableDragDrop = true;
|
||||
clientArgs.m_enableCrypto = false;
|
||||
Client client(
|
||||
&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen,
|
||||
clientArgs);
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forClientListener().connected(), &listener,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToServer_mockData_handleClientConnected,
|
||||
&client));
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forFile().fileReceiveCompleted(), &server,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToServer_mockData_fileReceiveCompleted));
|
||||
|
||||
client.connect();
|
||||
|
||||
m_events.initQuitTimeout(10);
|
||||
m_events.loop();
|
||||
m_events.removeHandler(m_events.forClientListener().connected(), &listener);
|
||||
m_events.removeHandler(m_events.forFile().fileReceiveCompleted(), &server);
|
||||
m_events.cleanupQuitTimeout();
|
||||
}
|
||||
|
||||
TEST_F(NetworkTests, sendToServer_mockFile) {
|
||||
// server and client
|
||||
NetworkAddress serverAddress(TEST_HOST, TEST_PORT);
|
||||
|
||||
serverAddress.resolve();
|
||||
|
||||
// server
|
||||
SocketMultiplexer serverSocketMultiplexer;
|
||||
TCPSocketFactory *serverSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &serverSocketMultiplexer);
|
||||
ClientListener listener(serverAddress, serverSocketFactory, &m_events, SecurityLevel::PlainText);
|
||||
NiceMock<MockScreen> serverScreen;
|
||||
NiceMock<MockPrimaryClient> primaryClient;
|
||||
NiceMock<MockConfig> serverConfig;
|
||||
NiceMock<MockInputFilter> serverInputFilter;
|
||||
|
||||
ON_CALL(serverConfig, isScreen(_)).WillByDefault(Return(true));
|
||||
ON_CALL(serverConfig, getInputFilter())
|
||||
.WillByDefault(Return(&serverInputFilter));
|
||||
|
||||
deskflow::ServerArgs serverArgs;
|
||||
serverArgs.m_enableDragDrop = true;
|
||||
Server server(
|
||||
serverConfig, &primaryClient, &serverScreen, &m_events, serverArgs);
|
||||
server.m_mock = true;
|
||||
listener.setServer(&server);
|
||||
|
||||
// client
|
||||
NiceMock<MockScreen> clientScreen;
|
||||
SocketMultiplexer clientSocketMultiplexer;
|
||||
TCPSocketFactory *clientSocketFactory =
|
||||
new TCPSocketFactory(&m_events, &clientSocketMultiplexer);
|
||||
|
||||
ON_CALL(clientScreen, getShape(_, _, _, _))
|
||||
.WillByDefault(Invoke(getScreenShape));
|
||||
ON_CALL(clientScreen, getCursorPos(_, _)).WillByDefault(Invoke(getCursorPos));
|
||||
|
||||
deskflow::ClientArgs clientArgs;
|
||||
clientArgs.m_enableDragDrop = true;
|
||||
clientArgs.m_enableCrypto = false;
|
||||
Client client(
|
||||
&m_events, "stub", serverAddress, clientSocketFactory, &clientScreen,
|
||||
clientArgs);
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forClientListener().connected(), &listener,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToServer_mockFile_handleClientConnected,
|
||||
&client));
|
||||
|
||||
m_events.adoptHandler(
|
||||
m_events.forFile().fileReceiveCompleted(), &server,
|
||||
new TMethodEventJob<NetworkTests>(
|
||||
this, &NetworkTests::sendToServer_mockFile_fileReceiveCompleted));
|
||||
|
||||
client.connect();
|
||||
|
||||
m_events.initQuitTimeout(10);
|
||||
m_events.loop();
|
||||
m_events.removeHandler(m_events.forClientListener().connected(), &listener);
|
||||
m_events.removeHandler(m_events.forFile().fileReceiveCompleted(), &server);
|
||||
m_events.cleanupQuitTimeout();
|
||||
}
|
||||
|
||||
void NetworkTests::sendToClient_mockData_handleClientConnected(
|
||||
const Event &, void *vlistener) {
|
||||
ClientListener *listener = static_cast<ClientListener *>(vlistener);
|
||||
Server *server = listener->getServer();
|
||||
|
||||
ClientProxy *client = listener->getNextClient();
|
||||
if (client == nullptr) {
|
||||
throw runtime_error("client is null");
|
||||
}
|
||||
|
||||
BaseClientProxy *bcp = client;
|
||||
server->adoptClient(bcp);
|
||||
server->setActive(bcp);
|
||||
|
||||
sendMockData(server);
|
||||
}
|
||||
|
||||
void NetworkTests::sendToClient_mockData_fileReceiveCompleted(
|
||||
const Event &event, void *) {
|
||||
Client *client = static_cast<Client *>(event.getTarget());
|
||||
EXPECT_TRUE(client->isReceivedFileSizeValid());
|
||||
|
||||
m_events.raiseQuitEvent();
|
||||
}
|
||||
|
||||
void NetworkTests::sendToClient_mockFile_handleClientConnected(
|
||||
const Event &, void *vlistener) {
|
||||
ClientListener *listener = static_cast<ClientListener *>(vlistener);
|
||||
Server *server = listener->getServer();
|
||||
|
||||
ClientProxy *client = listener->getNextClient();
|
||||
if (client == nullptr) {
|
||||
throw runtime_error("client is null");
|
||||
}
|
||||
|
||||
BaseClientProxy *bcp = client;
|
||||
server->adoptClient(bcp);
|
||||
server->setActive(bcp);
|
||||
|
||||
server->sendFileToClient(kMockFilename);
|
||||
}
|
||||
|
||||
void NetworkTests::sendToClient_mockFile_fileReceiveCompleted(
|
||||
const Event &event, void *) {
|
||||
Client *client = static_cast<Client *>(event.getTarget());
|
||||
EXPECT_TRUE(client->isReceivedFileSizeValid());
|
||||
|
||||
m_events.raiseQuitEvent();
|
||||
}
|
||||
|
||||
void NetworkTests::sendToServer_mockData_handleClientConnected(
|
||||
const Event &, void *vclient) {
|
||||
Client *client = static_cast<Client *>(vclient);
|
||||
sendMockData(client);
|
||||
}
|
||||
|
||||
void NetworkTests::sendToServer_mockData_fileReceiveCompleted(
|
||||
const Event &event, void *) {
|
||||
Server *server = static_cast<Server *>(event.getTarget());
|
||||
EXPECT_TRUE(server->isReceivedFileSizeValid());
|
||||
|
||||
m_events.raiseQuitEvent();
|
||||
}
|
||||
|
||||
void NetworkTests::sendToServer_mockFile_handleClientConnected(
|
||||
const Event &, void *vclient) {
|
||||
Client *client = static_cast<Client *>(vclient);
|
||||
client->sendFileToServer(kMockFilename);
|
||||
}
|
||||
|
||||
void NetworkTests::sendToServer_mockFile_fileReceiveCompleted(
|
||||
const Event &event, void *) {
|
||||
Server *server = static_cast<Server *>(event.getTarget());
|
||||
EXPECT_TRUE(server->isReceivedFileSizeValid());
|
||||
|
||||
m_events.raiseQuitEvent();
|
||||
}
|
||||
|
||||
void NetworkTests::sendMockData(void *eventTarget) {
|
||||
// send first message (file size)
|
||||
std::string size = deskflow::string::sizeTypeToString(kMockDataSize);
|
||||
FileChunk *sizeMessage = FileChunk::start(size);
|
||||
|
||||
m_events.addEvent(
|
||||
Event(m_events.forFile().fileChunkSending(), eventTarget, sizeMessage));
|
||||
|
||||
// send chunk messages with incrementing chunk size
|
||||
size_t lastSize = 0;
|
||||
size_t sentLength = 0;
|
||||
while (true) {
|
||||
size_t dataSize = lastSize + kMockDataChunkIncrement;
|
||||
|
||||
// make sure we don't read too much from the mock data.
|
||||
if (sentLength + dataSize > kMockDataSize) {
|
||||
dataSize = kMockDataSize - sentLength;
|
||||
}
|
||||
|
||||
// first byte is the chunk mark, last is \0
|
||||
FileChunk *chunk = FileChunk::data(m_mockData, dataSize);
|
||||
m_events.addEvent(
|
||||
Event(m_events.forFile().fileChunkSending(), eventTarget, chunk));
|
||||
|
||||
sentLength += dataSize;
|
||||
lastSize = dataSize;
|
||||
|
||||
if (sentLength == kMockDataSize) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// send last message
|
||||
FileChunk *transferFinished = FileChunk::end();
|
||||
m_events.addEvent(Event(
|
||||
m_events.forFile().fileChunkSending(), eventTarget, transferFinished));
|
||||
}
|
||||
|
||||
uint8_t *newMockData(size_t size) {
|
||||
uint8_t *buffer = new uint8_t[size];
|
||||
|
||||
uint8_t *data = buffer;
|
||||
const uint8_t head[] = "mock head... ";
|
||||
size_t headSize = sizeof(head) - 1;
|
||||
const uint8_t tail[] = "... mock tail";
|
||||
size_t tailSize = sizeof(tail) - 1;
|
||||
const uint8_t deskflowRocks[] = "deskflow\0 rocks! ";
|
||||
size_t deskflowRocksSize = sizeof(deskflowRocks) - 1;
|
||||
|
||||
memcpy(data, head, headSize);
|
||||
data += headSize;
|
||||
|
||||
size_t times = (size - headSize - tailSize) / deskflowRocksSize;
|
||||
for (size_t i = 0; i < times; ++i) {
|
||||
memcpy(data, deskflowRocks, deskflowRocksSize);
|
||||
data += deskflowRocksSize;
|
||||
}
|
||||
|
||||
size_t remainder = (size - headSize - tailSize) % deskflowRocksSize;
|
||||
if (remainder != 0) {
|
||||
memset(data, '.', remainder);
|
||||
data += remainder;
|
||||
}
|
||||
|
||||
memcpy(data, tail, tailSize);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
void createFile(fstream &file, const char *filename, size_t size) {
|
||||
uint8_t *buffer = newMockData(size);
|
||||
|
||||
file.open(filename, ios::out | ios::binary);
|
||||
if (!file.is_open()) {
|
||||
throw runtime_error("file not open");
|
||||
}
|
||||
|
||||
file.write(reinterpret_cast<char *>(buffer), size);
|
||||
file.close();
|
||||
|
||||
delete[] buffer;
|
||||
}
|
||||
|
||||
void getScreenShape(int32_t &x, int32_t &y, int32_t &w, int32_t &h) {
|
||||
x = 0;
|
||||
y = 0;
|
||||
w = 1;
|
||||
h = 1;
|
||||
}
|
||||
|
||||
void getCursorPos(int32_t &x, int32_t &y) {
|
||||
x = 0;
|
||||
y = 0;
|
||||
}
|
||||
|
||||
#endif // WINAPI_CARBON
|
||||
@ -1,138 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
|
||||
* SPDX-FileCopyrightText: (C) 2011 Nick Bolton
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
// TODO: fix Assertion failed: s_instance != nullptr
|
||||
#if 0
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "base/TMethodJob.h"
|
||||
#include "platform/MSWindowsDesks.h"
|
||||
#include "platform/MSWindowsKeyState.h"
|
||||
#include "platform/MSWindowsScreen.h"
|
||||
#include "platform/MSWindowsScreenSaver.h"
|
||||
#include "test/mock/deskflow/MockEventQueue.h"
|
||||
#include "test/mock/deskflow/MockKeyMap.h"
|
||||
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
// wParam = flags, HIBYTE(lParam) = virtual key, LOBYTE(lParam) = scan code
|
||||
#define DESKFLOW_MSG_FAKE_KEY DESKFLOW_HOOK_LAST_MSG + 4
|
||||
|
||||
using ::testing::_;
|
||||
using ::testing::NiceMock;
|
||||
|
||||
class MSWindowsKeyStateTests : public ::testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
m_hook.loadLibrary();
|
||||
m_screensaver = new MSWindowsScreenSaver();
|
||||
}
|
||||
|
||||
virtual void TearDown() { delete m_screensaver; }
|
||||
|
||||
MSWindowsDesks *newDesks(IEventQueue *eventQueue) {
|
||||
return new MSWindowsDesks(
|
||||
true, false, m_screensaver, eventQueue,
|
||||
new TMethodJob<MSWindowsKeyStateTests>(
|
||||
this, &MSWindowsKeyStateTests::updateKeysCB),
|
||||
false);
|
||||
}
|
||||
|
||||
void *getEventTarget() const {
|
||||
return const_cast<MSWindowsKeyStateTests *>(this);
|
||||
}
|
||||
|
||||
private:
|
||||
void updateKeysCB(void *) {}
|
||||
IScreenSaver *m_screensaver;
|
||||
MSWindowsHook m_hook;
|
||||
};
|
||||
|
||||
TEST_F(MSWindowsKeyStateTests, disable_eventQueueNotUsed) {
|
||||
NiceMock<MockEventQueue> eventQueue;
|
||||
MSWindowsDesks *desks = newDesks(&eventQueue);
|
||||
MockKeyMap keyMap;
|
||||
MSWindowsKeyState keyState(
|
||||
desks, getEventTarget(), &eventQueue, keyMap, {"en"}, true);
|
||||
|
||||
EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(0);
|
||||
|
||||
keyState.disable();
|
||||
delete desks;
|
||||
}
|
||||
|
||||
TEST_F(
|
||||
MSWindowsKeyStateTests,
|
||||
testAutoRepeat_noRepeatAndButtonIsZero_resultIsTrue) {
|
||||
NiceMock<MockEventQueue> eventQueue;
|
||||
MSWindowsDesks *desks = newDesks(&eventQueue);
|
||||
MockKeyMap keyMap;
|
||||
MSWindowsKeyState keyState(
|
||||
desks, getEventTarget(), &eventQueue, keyMap, {"en"}, true);
|
||||
keyState.setLastDown(1);
|
||||
|
||||
bool actual = keyState.testAutoRepeat(true, false, 1);
|
||||
|
||||
ASSERT_TRUE(actual);
|
||||
delete desks;
|
||||
}
|
||||
|
||||
TEST_F(MSWindowsKeyStateTests, testAutoRepeat_pressFalse_lastDownIsZero) {
|
||||
NiceMock<MockEventQueue> eventQueue;
|
||||
MSWindowsDesks *desks = newDesks(&eventQueue);
|
||||
MockKeyMap keyMap;
|
||||
MSWindowsKeyState keyState(
|
||||
desks, getEventTarget(), &eventQueue, keyMap, {"en"}, true);
|
||||
keyState.setLastDown(1);
|
||||
|
||||
keyState.testAutoRepeat(false, false, 1);
|
||||
|
||||
ASSERT_EQ(0, keyState.getLastDown());
|
||||
delete desks;
|
||||
}
|
||||
|
||||
TEST_F(MSWindowsKeyStateTests, saveModifiers_noModifiers_savedModifiers0) {
|
||||
NiceMock<MockEventQueue> eventQueue;
|
||||
MSWindowsDesks *desks = newDesks(&eventQueue);
|
||||
MockKeyMap keyMap;
|
||||
MSWindowsKeyState keyState(
|
||||
desks, getEventTarget(), &eventQueue, keyMap, {"en"}, true);
|
||||
|
||||
keyState.saveModifiers();
|
||||
|
||||
ASSERT_EQ(0, keyState.getSavedModifiers());
|
||||
delete desks;
|
||||
}
|
||||
|
||||
TEST_F(
|
||||
MSWindowsKeyStateTests, testKoreanLocale_inputModeKey_resultCorrectKeyID) {
|
||||
NiceMock<MockEventQueue> eventQueue;
|
||||
MSWindowsDesks *desks = newDesks(&eventQueue);
|
||||
MockKeyMap keyMap;
|
||||
MSWindowsKeyState keyState(
|
||||
desks, getEventTarget(), &eventQueue, keyMap, {"en"}, true);
|
||||
|
||||
keyState.setKeyLayout((HKL)0x00000412u); // for ko-KR local ID
|
||||
ASSERT_EQ(
|
||||
0xEF31, keyState.getKeyID(0x15u, 0x1f2u)); // VK_HANGUL from Hangul key
|
||||
ASSERT_EQ(
|
||||
0xEF34, keyState.getKeyID(0x19u, 0x1f1u)); // VK_HANJA from Hanja key
|
||||
ASSERT_EQ(
|
||||
0xEF31, keyState.getKeyID(0x15u, 0x11du)); // VK_HANGUL from R-Alt key
|
||||
ASSERT_EQ(
|
||||
0xEF34, keyState.getKeyID(0x19u, 0x138u)); // VK_HANJA from R-Ctrl key
|
||||
|
||||
keyState.setKeyLayout((HKL)0x00000411); // for ja-jp locale ID
|
||||
ASSERT_EQ(0xEF26, keyState.getKeyID(0x15u, 0x1du)); // VK_KANA
|
||||
ASSERT_EQ(0xEF2A, keyState.getKeyID(0x19u, 0x38u)); // VK_KANJI
|
||||
|
||||
delete desks;
|
||||
}
|
||||
|
||||
#endif
|
||||
@ -1,208 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
|
||||
* SPDX-FileCopyrightText: (C) 2011 Nick Bolton
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
// TODO: fix Assertion `s_instance != nullptr' failed.
|
||||
#if 0
|
||||
|
||||
#define TEST_ENV
|
||||
|
||||
#include "test/mock/deskflow/MockEventQueue.h"
|
||||
#include "test/mock/deskflow/MockKeyMap.h"
|
||||
|
||||
#include "base/Log.h"
|
||||
#include "platform/XWindowsKeyState.h"
|
||||
|
||||
#define XK_LATIN1
|
||||
#define XK_MISCELLANY
|
||||
#include <X11/keysymdef.h>
|
||||
|
||||
#if HAVE_XKB_EXTENSION
|
||||
#include <X11/XKBlib.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include <gmock/gmock.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
class XWindowsKeyStateTests : public ::testing::Test {
|
||||
protected:
|
||||
XWindowsKeyStateTests() : m_display(nullptr) {}
|
||||
|
||||
~XWindowsKeyStateTests() {
|
||||
if (m_display != nullptr) {
|
||||
LOG((CLOG_DEBUG "closing display"));
|
||||
XCloseDisplay(m_display);
|
||||
}
|
||||
}
|
||||
|
||||
virtual void SetUp() {
|
||||
// open the display only once for the entire test suite
|
||||
if (this->m_display == nullptr) {
|
||||
LOG((CLOG_DEBUG "opening display"));
|
||||
this->m_display = XOpenDisplay(nullptr);
|
||||
|
||||
ASSERT_TRUE(this->m_display != nullptr)
|
||||
<< "unable to open display: " << errno;
|
||||
}
|
||||
}
|
||||
|
||||
virtual void TearDown() {}
|
||||
|
||||
Display *m_display;
|
||||
};
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, setActiveGroup_pollAndSet_groupIsZero) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
keyState.setActiveGroup(XWindowsKeyState::kGroupPollAndSet);
|
||||
|
||||
ASSERT_EQ(0, keyState.group());
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, setActiveGroup_poll_groupIsNotSet) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
keyState.setActiveGroup(XWindowsKeyState::kGroupPoll);
|
||||
|
||||
ASSERT_LE(-1, keyState.group());
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, setActiveGroup_customGroup_groupWasSet) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
keyState.setActiveGroup(1);
|
||||
|
||||
ASSERT_EQ(1, keyState.group());
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, mapModifiersFromX_zeroState_zeroMask) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
int mask = keyState.mapModifiersFromX(0);
|
||||
|
||||
ASSERT_EQ(0, mask);
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, mapModifiersToX_zeroMask_resultIsTrue) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
unsigned int modifiers = 0;
|
||||
bool result = keyState.mapModifiersToX(0, modifiers);
|
||||
|
||||
ASSERT_TRUE(result);
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, fakeCtrlAltDel_default_returnsFalse) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
bool result = keyState.fakeCtrlAltDel();
|
||||
|
||||
ASSERT_FALSE(result);
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, pollActiveModifiers_defaultState_returnsZero) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
KeyModifierMask actual = keyState.pollActiveModifiers();
|
||||
|
||||
ASSERT_EQ(0, actual);
|
||||
}
|
||||
|
||||
#if 0 // TODO: fix, causes sigsegv
|
||||
TEST_F(XWindowsKeyStateTests, pollActiveModifiers_shiftKeyDownThenUp_masksAreCorrect)
|
||||
{
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(
|
||||
m_display, true, &eventQueue, keyMap);
|
||||
|
||||
// set mock modifier mapping
|
||||
std::fill(keyState.modifierFromX().begin(), keyState.modifierFromX().end(), 0);
|
||||
keyState.modifierFromX()[ShiftMapIndex] = KeyModifierShift;
|
||||
|
||||
KeyCode key = XKeysymToKeycode(m_display, XK_Shift_L);
|
||||
|
||||
// fake shift key down (without using deskflow)
|
||||
XTestFakeKeyEvent(m_display, key, true, CurrentTime);
|
||||
|
||||
// function under test (1st call)
|
||||
KeyModifierMask modDown = keyState.pollActiveModifiers();
|
||||
|
||||
// fake shift key up (without using deskflow)
|
||||
XTestFakeKeyEvent(m_display, key, false, CurrentTime);
|
||||
|
||||
// function under test (2nd call)
|
||||
KeyModifierMask modUp = keyState.pollActiveModifiers();
|
||||
|
||||
EXPECT_TRUE((modDown & KeyModifierShift) == KeyModifierShift)
|
||||
<< "shift key not in mask - key was not pressed";
|
||||
|
||||
EXPECT_TRUE((modUp & KeyModifierShift) == 0)
|
||||
<< "shift key still in mask - make sure no keys are being held down";
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, pollActiveGroup_defaultState_returnsZero) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
int32_t actual = keyState.pollActiveGroup();
|
||||
|
||||
ASSERT_EQ(0, actual);
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, pollActiveGroup_positiveGroup_returnsGroup) {
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
keyState.group(3);
|
||||
|
||||
int32_t actual = keyState.pollActiveGroup();
|
||||
|
||||
ASSERT_EQ(3, actual);
|
||||
}
|
||||
|
||||
TEST_F(XWindowsKeyStateTests, pollActiveGroup_xkb_areEqual) {
|
||||
#if HAVE_XKB_EXTENSION
|
||||
MockKeyMap keyMap;
|
||||
MockEventQueue eventQueue;
|
||||
XWindowsKeyState keyState(m_display, true, &eventQueue, keyMap);
|
||||
|
||||
// reset the group
|
||||
keyState.group(-1);
|
||||
|
||||
XkbStateRec state;
|
||||
|
||||
// compare pollActiveGroup() with XkbGetState()
|
||||
if (XkbGetState(m_display, XkbUseCoreKbd, &state) == Success) {
|
||||
int32_t actual = keyState.pollActiveGroup();
|
||||
|
||||
ASSERT_EQ(state.group, actual);
|
||||
} else {
|
||||
FAIL() << "XkbGetState() returned error " << errno;
|
||||
}
|
||||
#else
|
||||
SUCCEED() << "Xkb extension not installed";
|
||||
#endif
|
||||
}
|
||||
#endif
|
||||
@ -1,37 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
|
||||
* SPDX-FileCopyrightText: (C) 2011 Nick Bolton
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
// TODO: fix tests
|
||||
#if 0
|
||||
|
||||
#include "platform/XWindowsScreenSaver.h"
|
||||
#include "test/mock/deskflow/MockEventQueue.h"
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
using ::testing::_;
|
||||
|
||||
// TODO: not working on build machine for some reason
|
||||
TEST(CXWindowsScreenSaverTests, activate_defaultScreen_todo)
|
||||
{
|
||||
Display* display = XOpenDisplay(":0.0");
|
||||
Window window = DefaultRootWindow(display);
|
||||
MockEventQueue eventQueue;
|
||||
EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(1);
|
||||
CXWindowsScreenSaver screenSaver(
|
||||
display, window, nullptr, &eventQueue);
|
||||
|
||||
screenSaver.activate();
|
||||
|
||||
bool isActive = screenSaver.isActive();
|
||||
|
||||
screenSaver.deactivate();
|
||||
|
||||
ASSERT_EQ(true, isActive);
|
||||
}
|
||||
#endif
|
||||
@ -1,33 +0,0 @@
|
||||
/*
|
||||
* Deskflow -- mouse and keyboard sharing utility
|
||||
* SPDX-FileCopyrightText: (C) 2012 - 2016 Symless Ltd.
|
||||
* SPDX-FileCopyrightText: (C) 2011 Nick Bolton
|
||||
* SPDX-License-Identifier: GPL-2.0-only WITH LicenseRef-OpenSSL-Exception
|
||||
*/
|
||||
|
||||
#include "test/mock/deskflow/MockEventQueue.h"
|
||||
|
||||
#include <gtest/gtest.h>
|
||||
|
||||
#include "platform/XWindowsScreen.h"
|
||||
|
||||
using ::testing::_;
|
||||
|
||||
// TODO: fix failing tests
|
||||
#if 0
|
||||
TEST(CXWindowsScreenTests, fakeMouseMove_nonPrimary_getCursorPosValuesCorrect) {
|
||||
MockEventQueue eventQueue;
|
||||
EXPECT_CALL(eventQueue, adoptHandler(_, _, _)).Times(2);
|
||||
EXPECT_CALL(eventQueue, adoptBuffer(_)).Times(2);
|
||||
EXPECT_CALL(eventQueue, removeHandler(_, _)).Times(2);
|
||||
XWindowsScreen screen(
|
||||
":0.0", false, false, 0, &eventQueue);
|
||||
|
||||
screen.fakeMouseMove(10, 20);
|
||||
|
||||
int x, y;
|
||||
screen.getCursorPos(x, y);
|
||||
ASSERT_EQ(10, x);
|
||||
ASSERT_EQ(20, y);
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user