From 65ec5046965f2915f56478156e6b34f8bf90c282 Mon Sep 17 00:00:00 2001 From: SerhiiGadzhilov <71632867+SerhiiGadzhilov@users.noreply.github.com> Date: Wed, 13 Oct 2021 13:01:27 +0300 Subject: [PATCH] Synergy 1267 endless notifications during connection (#7104) * SYNERGY-1267 Endless notification during connection * SYNERGY-1267 Endless notification. Server part * SYNERGY-1267 Change notification trace level * Update ChangeLog * SYNERGY-1267 Fix Linux compilation * SYNERGY-1267 Fix code smell * SYNERGY-1267 Add requested changes --- ChangeLog | 2 +- src/lib/client/Client.cpp | 51 +++++----- src/lib/client/Client.h | 3 + src/lib/server/ClientProxyUnknown.cpp | 30 ++---- src/lib/server/ClientProxyUnknown.h | 2 + src/lib/server/Server.cpp | 12 +++ src/lib/server/Server.h | 10 +- src/lib/synergy/AppUtil.cpp | 19 ---- src/lib/synergy/AppUtil.h | 6 +- src/lib/synergy/CMakeLists.txt | 4 +- src/lib/synergy/IAppUtil.h | 14 --- src/lib/synergy/languages/LanguageManager.cpp | 94 +++++++++++++++++++ src/lib/synergy/languages/LanguageManager.h | 71 ++++++++++++++ src/lib/synergy/unix/AppUtilUnix.cpp | 2 +- src/lib/synergy/win32/AppUtilWindows.cpp | 2 +- src/test/unittests/CMakeLists.txt | 4 +- src/test/unittests/synergy/AppUtilTests.cpp | 39 -------- .../languages/LanguageManagerTests.cpp | 58 ++++++++++++ 18 files changed, 285 insertions(+), 138 deletions(-) create mode 100644 src/lib/synergy/languages/LanguageManager.cpp create mode 100644 src/lib/synergy/languages/LanguageManager.h delete mode 100644 src/test/unittests/synergy/AppUtilTests.cpp create mode 100644 src/test/unittests/synergy/languages/LanguageManagerTests.cpp diff --git a/ChangeLog b/ChangeLog index 8c0149fd0..c1c253272 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,7 +2,7 @@ v1.14.2-snapshot =========== Bug fixes: - #7070 Fix radio button shifted focus on macOS -- #7038 Fix client and server different keyboard layout errors +- #7038 | #7104 Fix client and server different keyboard layout errors - #7078 Fix clipboard re-enables automatically - #7077 Fix Ubuntu, CentOS and Debian build after SYNERGY-1161 - #7080 Add trace if the system can't open file with trusted fingerprints diff --git a/src/lib/client/Client.cpp b/src/lib/client/Client.cpp index d38896134..f32fc97eb 100644 --- a/src/lib/client/Client.cpp +++ b/src/lib/client/Client.cpp @@ -206,6 +206,7 @@ Client::handshakeComplete() { m_ready = true; m_screen->enable(); + checkMissedLanguages(); sendEvent(m_events->forClient().connected(), NULL); } @@ -723,13 +724,14 @@ void Client::handleHello(const Event&, void*) { SInt16 major, minor; - String keyboardLayoutList(""); - if (!ProtocolUtil::readf(m_stream, kMsgHello, &major, &minor, &keyboardLayoutList)) { + String remoteLanguages; + if (!ProtocolUtil::readf(m_stream, kMsgHello, &major, &minor, &remoteLanguages)) { sendConnectionFailedEvent("Protocol error from server, check encryption settings"); cleanupTimer(); cleanupConnection(); return; } + m_languageManager.setRemoteLanguages(remoteLanguages); // check versions LOG((CLOG_DEBUG1 "got hello version %d.%d", major, minor)); @@ -749,37 +751,11 @@ Client::handleHello(const Event&, void*) } // say hello back - LOG((CLOG_DEBUG1 "say hello version %d.%d", kProtocolMajorVersion, kProtocolMinorVersion)); - String allKeyboardLayoutsStr; - for (const auto& layout : AppUtil::instance().getKeyboardLayoutList()) { - allKeyboardLayoutsStr += layout; - } - LOG((CLOG_DEBUG1 "say hello version %d.%d", helloBackMajor, helloBackMinor)); + auto localLanguages = m_languageManager.getSerializedLocalLanguages(); ProtocolUtil::writef(m_stream, kMsgHelloBack, helloBackMajor, - helloBackMinor, & m_name, &allKeyboardLayoutsStr); - - if(m_args.m_enableLangSync) { - std::vector missed; - std::vector supported; - AppUtil::getKeyboardLayoutsDiff(keyboardLayoutList, - AppUtil::instance().getKeyboardLayoutList(), - missed, supported); - - if(!supported.empty()) { - LOG((CLOG_DEBUG "Supported server languages: %s", AppUtil::joinStrVector(supported, ", ").c_str())); - } - - if(!missed.empty()) { - auto result = AppUtil::joinStrVector(missed, ", "); - AppUtil::instance().showNotification("Language synchronization error", - "These languages are required for client proper work: " + result); - } - } - else { - LOG((CLOG_DEBUG "Language sync logic is disabled.")); - } + helloBackMinor, & m_name, &localLanguages); // now connected but waiting to complete handshake setupScreen(); @@ -841,6 +817,21 @@ Client::onFileRecieveCompleted() } } +void +Client::checkMissedLanguages() const +{ + if (m_args.m_enableLangSync) { + auto missedLanguages = m_languageManager.getMissedLanguages(); + if (!missedLanguages.empty()) { + AppUtil::instance().showNotification("Language synchronization error", + "These languages are required for the client to work: " + missedLanguages); + } + } + else { + LOG((CLOG_DEBUG "Language sync logic is disabled.")); + } +} + void Client::handleStopRetry(const Event&, void*) { diff --git a/src/lib/client/Client.h b/src/lib/client/Client.h index c8171b273..0e6565170 100644 --- a/src/lib/client/Client.h +++ b/src/lib/client/Client.h @@ -24,6 +24,7 @@ #include "synergy/DragInformation.h" #include "synergy/INode.h" #include "synergy/ClientArgs.h" +#include "synergy/languages/LanguageManager.h" #include "net/NetworkAddress.h" #include "base/EventTypes.h" #include "mt/CondVar.h" @@ -208,6 +209,7 @@ private: void handleStopRetry(const Event&, void*); void onFileRecieveCompleted(); void sendClipboardThread(void*); + void checkMissedLanguages() const; public: bool m_mock; @@ -241,4 +243,5 @@ private: size_t m_maximumClipboardSize; lib::synergy::ClientArgs m_args; size_t m_resolvedAddressesCount = 0; + synergy::languages::LanguageManager m_languageManager; }; diff --git a/src/lib/server/ClientProxyUnknown.cpp b/src/lib/server/ClientProxyUnknown.cpp index 8809a8386..facf67dba 100644 --- a/src/lib/server/ClientProxyUnknown.cpp +++ b/src/lib/server/ClientProxyUnknown.cpp @@ -60,14 +60,11 @@ ClientProxyUnknown::ClientProxyUnknown(synergy::IStream* stream, double timeout, addStreamHandlers(); LOG((CLOG_DEBUG1 "saying hello")); - String allKeyboardLayoutsStr; - for (const auto& layout : AppUtil::instance().getKeyboardLayoutList()) { - allKeyboardLayoutsStr += layout; - } + auto localLanguages = m_languageManager.getSerializedLocalLanguages(); ProtocolUtil::writef(m_stream, kMsgHello, kProtocolMajorVersion, kProtocolMinorVersion, - &allKeyboardLayoutsStr); + &localLanguages); } ClientProxyUnknown::~ClientProxyUnknown() @@ -186,7 +183,7 @@ ClientProxyUnknown::handleData(const Event&, void*) LOG((CLOG_DEBUG1 "parsing hello reply")); String name(""); - String keyboardLayoutList(""); + try { // limit the maximum length of the hello UInt32 n = m_stream->getSize(); @@ -197,10 +194,13 @@ ClientProxyUnknown::handleData(const Event&, void*) // parse the reply to hello SInt16 major, minor; + String remoteLanguages; if (!ProtocolUtil::readf(m_stream, kMsgHelloBack, - &major, &minor, &name, &keyboardLayoutList)) { + &major, &minor, &name, &remoteLanguages)) { throw XBadClient(); } + m_languageManager.setRemoteLanguages(remoteLanguages); + m_server->setLanguageManager(m_languageManager); // disallow invalid version numbers if (major <= 0 || minor < 0) { @@ -254,22 +254,6 @@ ClientProxyUnknown::handleData(const Event&, void*) throw XIncompatibleClient(major, minor); } - std::vector missed; - std::vector supported; - AppUtil::getKeyboardLayoutsDiff(keyboardLayoutList, - AppUtil::instance().getKeyboardLayoutList(), - missed, supported); - - if(!supported.empty()) { - LOG((CLOG_DEBUG "Supported client languages: %s", AppUtil::joinStrVector(supported, ", ").c_str())); - } - - if(!missed.empty()) { - auto result = AppUtil::joinStrVector(missed, ", "); - AppUtil::instance().showNotification("Language synchronization error", - "These languages are required for server proper work: " + result); - } - // the proxy is created and now proxy now owns the stream LOG((CLOG_DEBUG1 "created proxy for client \"%s\" version %d.%d", name.c_str(), major, minor)); m_stream = NULL; diff --git a/src/lib/server/ClientProxyUnknown.h b/src/lib/server/ClientProxyUnknown.h index 21982d85f..6bc471ca7 100644 --- a/src/lib/server/ClientProxyUnknown.h +++ b/src/lib/server/ClientProxyUnknown.h @@ -20,6 +20,7 @@ #include "base/Event.h" #include "base/EventTypes.h" +#include "synergy/languages/LanguageManager.h" class ClientProxy; class EventQueueTimer; @@ -73,4 +74,5 @@ private: bool m_ready; Server* m_server; IEventQueue* m_events; + synergy::languages::LanguageManager m_languageManager; }; diff --git a/src/lib/server/Server.cpp b/src/lib/server/Server.cpp index f8ddd12a8..79f67b28f 100644 --- a/src/lib/server/Server.cpp +++ b/src/lib/server/Server.cpp @@ -348,6 +348,8 @@ Server::adoptClient(BaseClientProxy* client) client->screensaver(true); } + checkMissedLanguages(); + // send notification Server::ScreenConnectedInfo* info = new Server::ScreenConnectedInfo(getName(client)); @@ -1931,6 +1933,16 @@ Server::sendDragInfo(BaseClientProxy* newScreen) } } +void +Server::checkMissedLanguages() const +{ + auto missedLanguages = m_languageManager.getMissedLanguages(); + if (!missedLanguages.empty()) { + AppUtil::instance().showNotification("Language synchronization error", + "These languages are required for the server to work: " + missedLanguages); + } +} + void Server::onMouseMoveSecondary(SInt32 dx, SInt32 dy) { diff --git a/src/lib/server/Server.h b/src/lib/server/Server.h index 1628e4b50..8a5272267 100644 --- a/src/lib/server/Server.h +++ b/src/lib/server/Server.h @@ -26,6 +26,7 @@ #include "synergy/INode.h" #include "synergy/DragInformation.h" #include "synergy/ServerArgs.h" +#include "synergy/languages/LanguageManager.h" #include "base/Event.h" #include "base/Stopwatch.h" #include "base/EventTypes.h" @@ -155,7 +156,10 @@ public: //! Store ClientListener pointer void setListener(ClientListener* p) { m_clientListener = p; } - + + //! Set language manager + void setLanguageManager(const synergy::languages::LanguageManager& manager) { m_languageManager = manager; } + //@} //! @name accessors //@{ @@ -373,6 +377,9 @@ private: // send drag info to new client screen void sendDragInfo(BaseClientProxy* newScreen); + //Shows notification if there are missed languages + void checkMissedLanguages() const; + public: bool m_mock; @@ -487,4 +494,5 @@ private: ClientListener* m_clientListener; lib::synergy::ServerArgs m_args; + synergy::languages::LanguageManager m_languageManager; }; diff --git a/src/lib/synergy/AppUtil.cpp b/src/lib/synergy/AppUtil.cpp index df352e84d..52f121e98 100644 --- a/src/lib/synergy/AppUtil.cpp +++ b/src/lib/synergy/AppUtil.cpp @@ -52,22 +52,3 @@ AppUtil::instance() assert(s_instance != nullptr); return *s_instance; } - -void -AppUtil::getKeyboardLayoutsDiff(const String& remoteCompressedLanguages, - const std::vector& localLanguages, - std::vector& missedLang, - std::vector& supportedLang) -{ - missedLang.clear(); - supportedLang.clear(); - for(int i = 0; i <= (int)remoteCompressedLanguages.size() - 2; i +=2) { - auto layout = remoteCompressedLanguages.substr(i, 2); - if (std::find(localLanguages.begin(), localLanguages.end(), layout) == localLanguages.end()) { - missedLang.push_back(layout); - } - else { - supportedLang.push_back(layout); - } - } -} diff --git a/src/lib/synergy/AppUtil.h b/src/lib/synergy/AppUtil.h index 78c0aeb3b..05bd45d78 100644 --- a/src/lib/synergy/AppUtil.h +++ b/src/lib/synergy/AppUtil.h @@ -33,11 +33,7 @@ public: static AppUtil& instance(); static void exitAppStatic(int code) { instance().exitApp(code); } virtual void beforeAppExit() {} - static void getKeyboardLayoutsDiff(const String& remoteCompressedLanguages, - const std::vector& localLanguages, - std::vector& missedLang, - std::vector& supportedLang); - + private: IApp* m_app; static AppUtil* s_instance; diff --git a/src/lib/synergy/CMakeLists.txt b/src/lib/synergy/CMakeLists.txt index af6ecfbef..11f68499a 100644 --- a/src/lib/synergy/CMakeLists.txt +++ b/src/lib/synergy/CMakeLists.txt @@ -14,8 +14,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -file(GLOB headers "*.h") -file(GLOB sources "*.cpp") +file(GLOB headers "*.h" "languages/*.h") +file(GLOB sources "*.cpp" "languages/*.cpp") # arch if (WIN32) diff --git a/src/lib/synergy/IAppUtil.h b/src/lib/synergy/IAppUtil.h index a35fc1ca6..d4fa1654b 100644 --- a/src/lib/synergy/IAppUtil.h +++ b/src/lib/synergy/IAppUtil.h @@ -32,18 +32,4 @@ public: virtual std::vector getKeyboardLayoutList() = 0; virtual String getCurrentLanguageCode() = 0; virtual void showNotification(const String& title, const String& text) const = 0; - - static String joinStrVector(const std::vector& source, const String& delim) - { - String result; - for(size_t i = 0; i < source.size(); i++) - { - result += source[i]; - - if(i < source.size() - 1) { - result += delim; - } - } - return std::move(result); - } }; diff --git a/src/lib/synergy/languages/LanguageManager.cpp b/src/lib/synergy/languages/LanguageManager.cpp new file mode 100644 index 000000000..ca0ac6137 --- /dev/null +++ b/src/lib/synergy/languages/LanguageManager.cpp @@ -0,0 +1,94 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2014-2021 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 . + */ +#include "LanguageManager.h" +#include "base/Log.h" + +#include + +namespace { + +String vectorToString(const std::vector& vector, const String& delimiter = "") +{ + String string; + for (const auto& item : vector) { + if (&item != &vector[0]) { + string += delimiter; + } + string += item; + } + return string; +} + +} //anonymous namespace + +namespace synergy { + +namespace languages { + +LanguageManager::LanguageManager(const std::vector& localLanguages) : + m_localLanguages(localLanguages) +{ + LOG((CLOG_INFO "Local languages: %s", vectorToString(m_localLanguages, ", ").c_str())); +} + +void LanguageManager::setRemoteLanguages(const String& remoteLanguages) +{ + m_remoteLanguages.clear(); + if (!remoteLanguages.empty()) { + for (size_t i = 0; i <= remoteLanguages.size() - 2; i +=2) { + m_remoteLanguages.push_back(remoteLanguages.substr(i, 2)); + } + } + LOG((CLOG_INFO "Remote languages: %s", vectorToString(m_remoteLanguages, ", ").c_str())); +} + +const std::vector& LanguageManager::getRemoteLanguages() const +{ + return m_remoteLanguages; +} + +const std::vector& LanguageManager::getLocalLanguages() const +{ + return m_localLanguages; +} + +String LanguageManager::getMissedLanguages() const +{ + String missedLanguages; + + for (const auto& language : m_remoteLanguages) { + if (std::find(m_localLanguages.begin(), m_localLanguages.end(), language) == m_localLanguages.end()) { + if (!missedLanguages.empty()) { + missedLanguages += ", "; + } + missedLanguages += language; + } + } + + return missedLanguages; +} + +String LanguageManager::getSerializedLocalLanguages() const +{ + return vectorToString(m_localLanguages); +} + +} //namespace languages + +} //namespace synergy + + diff --git a/src/lib/synergy/languages/LanguageManager.h b/src/lib/synergy/languages/LanguageManager.h new file mode 100644 index 000000000..5f61e57a8 --- /dev/null +++ b/src/lib/synergy/languages/LanguageManager.h @@ -0,0 +1,71 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2014-2021 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 . + */ +#ifndef SYNERGY_LANGUAGESLANGUAGEMANAGER_H +#define SYNERGY_LANGUAGESLANGUAGEMANAGER_H + +#include "synergy/AppUtil.h" +#include "base/String.h" +#include + +namespace synergy { + +namespace languages { + +class LanguageManager +{ + std::vector m_remoteLanguages; + std::vector m_localLanguages; + +public: + explicit LanguageManager(const std::vector& localLanguages = AppUtil::instance().getKeyboardLayoutList()); + + /** + * @brief setRemoteLanguages sets remote languages + * @param remoteLanguages is a string with sericalized languages + */ + void setRemoteLanguages(const String& remoteLanguages); + + /** + * @brief getRemoteLanguages getter for remote languages + * @return vector of remote languages + */ + const std::vector& getRemoteLanguages() const; + + /** + * @brief getLocalLanguages getter for local languages + * @return vector of local languages + */ + const std::vector& getLocalLanguages() const; + + /** + * @brief getMissedLanguages getter for missed languages on local machine + * @return difference between remote and local languages as a coma separated string + */ + String getMissedLanguages() const; + + /** + * @brief getSerializedLocalLanguages getter for local serialized languages + * @return serialized local languages as a string + */ + String getSerializedLocalLanguages() const; +}; + +} //namespace languages + +} //namespace synergy + +#endif // SYNERGY_LANGUAGESLANGUAGEMANAGER_H diff --git a/src/lib/synergy/unix/AppUtilUnix.cpp b/src/lib/synergy/unix/AppUtilUnix.cpp index 9b46f444c..441cf2293 100644 --- a/src/lib/synergy/unix/AppUtilUnix.cpp +++ b/src/lib/synergy/unix/AppUtilUnix.cpp @@ -172,8 +172,8 @@ AppUtilUnix::getCurrentLanguageCode() void AppUtilUnix::showNotification(const String & title, const String & text) const { - LOG((CLOG_DEBUG "Showing notification. Title: \"%s\". Text: \"%s\"", title.c_str(), text.c_str())); #if WINAPI_XWINDOWS + LOG((CLOG_INFO "Showing notification. Title: \"%s\". Text: \"%s\"", title.c_str(), text.c_str())); if (!notify_init("Synergy")) { LOG((CLOG_INFO "Failed to initialize libnotify")); diff --git a/src/lib/synergy/win32/AppUtilWindows.cpp b/src/lib/synergy/win32/AppUtilWindows.cpp index 94d005162..4db969048 100644 --- a/src/lib/synergy/win32/AppUtilWindows.cpp +++ b/src/lib/synergy/win32/AppUtilWindows.cpp @@ -249,7 +249,7 @@ public: void AppUtilWindows::showNotification(const String & title, const String & text) const { - LOG((CLOG_DEBUG "Showing notification. Title: \"%s\". Text: \"%s\"", title.c_str(), text.c_str())); + LOG((CLOG_INFO "Showing notification. Title: \"%s\". Text: \"%s\"", title.c_str(), text.c_str())); if (!WinToastLib::WinToast::isCompatible()) { LOG((CLOG_INFO "This system does not support toast notifications")); return; diff --git a/src/test/unittests/CMakeLists.txt b/src/test/unittests/CMakeLists.txt index 5e1efe9d4..fe05de2f0 100644 --- a/src/test/unittests/CMakeLists.txt +++ b/src/test/unittests/CMakeLists.txt @@ -14,8 +14,8 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -file(GLOB_RECURSE headers "*.h") -file(GLOB_RECURSE sources "*.cpp") +file(GLOB_RECURSE headers "*.h" "languages/*.h") +file(GLOB_RECURSE sources "*.cpp" "languages/*.cpp") file(GLOB_RECURSE remove_platform "platform/*") list(REMOVE_ITEM headers ${remove_platform}) diff --git a/src/test/unittests/synergy/AppUtilTests.cpp b/src/test/unittests/synergy/AppUtilTests.cpp deleted file mode 100644 index a32f79f9b..000000000 --- a/src/test/unittests/synergy/AppUtilTests.cpp +++ /dev/null @@ -1,39 +0,0 @@ -/* - * synergy -- mouse and keyboard sharing utility - * Copyright (C) 2014-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 . - */ - -#include "test/global/gtest.h" -#include "synergy/AppUtil.h" - -TEST(AppUtilTests, keyboardLayoutTest) -{ - String layoutList1 = "ruenby"; - std::vector layoutList2 = { "ru", "en" }; - std::vector missed; - std::vector supported; - AppUtil::getKeyboardLayoutsDiff(layoutList1, layoutList2, missed, supported); - - EXPECT_EQ(missed, std::vector{ "by" }); - EXPECT_EQ(supported, layoutList2); -} - -TEST(AppUtilTests, joinVectorTest) -{ - std::vector layouts = { "ru", "en" }; - auto result = AppUtil::joinStrVector(layouts, ", "); - - EXPECT_EQ(result, "ru, en"); -} diff --git a/src/test/unittests/synergy/languages/LanguageManagerTests.cpp b/src/test/unittests/synergy/languages/LanguageManagerTests.cpp new file mode 100644 index 000000000..9e6af0f0e --- /dev/null +++ b/src/test/unittests/synergy/languages/LanguageManagerTests.cpp @@ -0,0 +1,58 @@ +/* + * synergy -- mouse and keyboard sharing utility + * Copyright (C) 2014-2021 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 . + */ + +#include "synergy/languages/LanguageManager.h" +#include "test/global/gtest.h" + + +TEST(LanguageManager, RemoteLanguagesTest) +{ + std::string remoteLanguages = "ruenuk"; + synergy::languages::LanguageManager manager({"ru", "en", "uk"}); + + manager.setRemoteLanguages(remoteLanguages); + EXPECT_EQ((std::vector {"ru", "en", "uk"}), manager.getRemoteLanguages()); + + manager.setRemoteLanguages(String()); + EXPECT_TRUE(manager.getRemoteLanguages().empty()); +} + +TEST(LanguageManager, LocalLanguagesTest) +{ + std::vector localLanguages = {"ru", "en", "uk"}; + synergy::languages::LanguageManager manager(localLanguages); + + EXPECT_EQ((std::vector {"ru", "en", "uk"}), manager.getLocalLanguages()); +} + +TEST(LanguageManager, MissedLanguagesTest) +{ + String remoteLanguages = "ruenuk"; + std::vector localLanguages = {"en"}; + synergy::languages::LanguageManager manager(localLanguages); + + manager.setRemoteLanguages(remoteLanguages); + EXPECT_EQ("ru, uk", manager.getMissedLanguages()); +} + +TEST(LanguageManager, SerializeLocalLanguagesTest) +{ + std::vector localLanguages = {"ru", "en", "uk"}; + synergy::languages::LanguageManager manager(localLanguages); + + EXPECT_EQ("ruenuk", manager.getSerializedLocalLanguages()); +}