Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: close logging-channels when closing channels #5592

Merged
merged 9 commits into from
Sep 14, 2024
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,7 @@
- Bugfix: Fixed tab visibility being controllable in the emote popup. (#5530)
- Bugfix: Fixed account switch not being saved if no other settings were changed. (#5558)
- Bugfix: Fixed some tooltips not being readable. (#5578)
- Bugfix: Fixed log files being locked longer than needed. (#5592)
- Dev: Update Windows build from Qt 6.5.0 to Qt 6.7.1. (#5420)
- Dev: Update vcpkg build Qt from 6.5.0 to 6.7.0, boost from 1.83.0 to 1.85.0, openssl from 3.1.3 to 3.3.0. (#5422)
- Dev: Unsingletonize `ISoundController`. (#5462)
Expand Down
10 changes: 10 additions & 0 deletions mocks/include/mocks/Logging.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ class Logging : public ILogging
(const QString &channelName, MessagePtr message,
const QString &platformName, const QString &streamID),
(override));

MOCK_METHOD(void, closeChannel,
(const QString &channelName, const QString &platformName),
(override));
};

class EmptyLogging : public ILogging
Expand All @@ -32,6 +36,12 @@ class EmptyLogging : public ILogging
{
//
}

void closeChannel(const QString &channelName,
const QString &platformName) override
{
//
}
};

} // namespace chatterino::mock
8 changes: 7 additions & 1 deletion src/Application.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ Application::Application(Settings &_settings, const Paths &paths,
, args_(_args)
, themes(new Theme(paths))
, fonts(new Fonts(_settings))
, logging(new Logging(_settings))
, emotes(new Emotes)
, accounts(new AccountController)
, hotkeys(new HotkeyController)
Expand All @@ -175,7 +176,6 @@ Application::Application(Settings &_settings, const Paths &paths,
, ffzEmotes(new FfzEmotes)
, seventvEmotes(new SeventvEmotes)
, seventvEventAPI(makeSeventvEventAPI(_settings))
, logging(new Logging(_settings))
, linkResolver(new LinkResolver)
, streamerMode(new StreamerMode)
, twitchUsers(new TwitchUsers)
Expand Down Expand Up @@ -503,6 +503,7 @@ PubSub *Application::getTwitchPubSub()
ILogging *Application::getChatLogger()
{
assertInGuiThread();
assert(this->logging);

return this->logging.get();
}
Expand Down Expand Up @@ -697,4 +698,9 @@ IApplication *getApp()
return INSTANCE;
}

IApplication *tryGetApp()
{
return INSTANCE;
}

} // namespace chatterino
5 changes: 4 additions & 1 deletion src/Application.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ class Application : public IApplication
private:
std::unique_ptr<Theme> themes;
std::unique_ptr<Fonts> fonts;
const std::unique_ptr<Logging> logging;
std::unique_ptr<Emotes> emotes;
std::unique_ptr<AccountController> accounts;
std::unique_ptr<HotkeyController> hotkeys;
Expand All @@ -169,7 +170,6 @@ class Application : public IApplication
std::unique_ptr<FfzEmotes> ffzEmotes;
std::unique_ptr<SeventvEmotes> seventvEmotes;
std::unique_ptr<SeventvEventAPI> seventvEventAPI;
const std::unique_ptr<Logging> logging;
std::unique_ptr<ILinkResolver> linkResolver;
std::unique_ptr<IStreamerMode> streamerMode;
std::unique_ptr<ITwitchUsers> twitchUsers;
Expand Down Expand Up @@ -239,4 +239,7 @@ class Application : public IApplication

IApplication *getApp();

/// Might return `nullptr` if the app is being destroyed
IApplication *tryGetApp();

} // namespace chatterino
5 changes: 5 additions & 0 deletions src/common/Channel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,11 @@ Channel::Channel(const QString &name, Type type)

Channel::~Channel()
{
auto *app = tryGetApp();
if (app)
{
app->getChatLogger()->closeChannel(this->name_, this->platform_);
}
this->destroyed.invoke();
}

Expand Down
16 changes: 13 additions & 3 deletions src/singletons/Logging.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

#include "messages/Message.hpp"
#include "singletons/helper/LoggingChannel.hpp"
#include "singletons/Paths.hpp"
#include "singletons/Settings.hpp"

#include <QDir>
Expand Down Expand Up @@ -58,20 +57,31 @@ void Logging::addMessage(const QString &channelName, MessagePtr message,
auto map = std::map<QString, std::unique_ptr<LoggingChannel>>();
this->loggingChannels_[platformName] = std::move(map);
auto &ref = this->loggingChannels_.at(platformName);
ref.emplace(channelName, std::move(channel));
ref.emplace(channelName, channel);
return;
}
auto chanIt = platIt->second.find(channelName);
if (chanIt == platIt->second.end())
{
auto *channel = new LoggingChannel(channelName, platformName);
channel->addMessage(message, streamID);
platIt->second.emplace(channelName, std::move(channel));
platIt->second.emplace(channelName, channel);
}
else
{
chanIt->second->addMessage(message, streamID);
}
}

void Logging::closeChannel(const QString &channelName,
const QString &platformName)
{
auto platIt = this->loggingChannels_.find(platformName);
if (platIt == this->loggingChannels_.end())
{
return;
}
platIt->second.erase(channelName);
}

} // namespace chatterino
6 changes: 6 additions & 0 deletions src/singletons/Logging.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,9 @@ class ILogging
virtual void addMessage(const QString &channelName, MessagePtr message,
const QString &platformName,
const QString &streamID) = 0;

virtual void closeChannel(const QString &channelName,
const QString &platformName) = 0;
};

class Logging : public ILogging
Expand All @@ -35,6 +38,9 @@ class Logging : public ILogging
const QString &platformName,
const QString &streamID) override;

void closeChannel(const QString &channelName,
const QString &platformName) override;

private:
using PlatformName = QString;
using ChannelName = QString;
Expand Down
2 changes: 1 addition & 1 deletion src/singletons/helper/LoggingChannel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ QString generateClosingString(
{
QString ret("# Stop logging at ");

ret.append(now.toString("yyyy-MM-dd HH:mm:ss"));
ret.append(now.toString("yyyy-MM-dd HH:mm:ss "));
ret.append(now.timeZoneAbbreviation());
ret.append(ENDLINE);

Expand Down
39 changes: 34 additions & 5 deletions tests/src/ChannelChatters.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#include "common/ChannelChatters.hpp"

#include "mocks/BaseApplication.hpp"
#include "mocks/Channel.hpp"
#include "mocks/Logging.hpp"
#include "Test.hpp"

#include <QColor>
Expand All @@ -9,9 +11,28 @@
using namespace chatterino;
using chatterino::mock::MockChannel;

namespace {

class MockApplication : public mock::BaseApplication
{
public:
MockApplication() = default;

ILogging *getChatLogger() override
{
return &this->logging;
}

mock::EmptyLogging logging;
};

} // namespace

// Ensure inserting the same user does not increase the size of the stored colors
TEST(ChatterChatters, insertSameUser)
TEST(ChannelChatters, insertSameUser)
{
MockApplication app;

MockChannel channel("test");

ChannelChatters chatters(channel);
Expand All @@ -24,8 +45,10 @@ TEST(ChatterChatters, insertSameUser)
}

// Ensure we can update a chatters color
TEST(ChatterChatters, insertSameUserUpdatesColor)
TEST(ChannelChatters, insertSameUserUpdatesColor)
{
MockApplication app;

MockChannel channel("test");

ChannelChatters chatters(channel);
Expand All @@ -37,8 +60,10 @@ TEST(ChatterChatters, insertSameUserUpdatesColor)
}

// Ensure getting a non-existant users color returns an invalid QColor
TEST(ChatterChatters, getNonExistantUser)
TEST(ChannelChatters, getNonExistantUser)
{
MockApplication app;

MockChannel channel("test");

ChannelChatters chatters(channel);
Expand All @@ -47,8 +72,10 @@ TEST(ChatterChatters, getNonExistantUser)
}

// Ensure getting a user doesn't create an entry
TEST(ChatterChatters, getDoesNotCreate)
TEST(ChannelChatters, getDoesNotCreate)
{
MockApplication app;

MockChannel channel("test");

ChannelChatters chatters(channel);
Expand All @@ -59,8 +86,10 @@ TEST(ChatterChatters, getDoesNotCreate)
}

// Ensure the least recently used entry is purged when we reach MAX_SIZE
TEST(ChatterChatters, insertMaxSize)
TEST(ChannelChatters, insertMaxSize)
{
MockApplication app;

MockChannel channel("test");

ChannelChatters chatters(channel);
Expand Down
2 changes: 1 addition & 1 deletion tests/src/Commands.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -55,11 +55,11 @@ class MockApplication : public mock::BaseApplication
return &this->chatLogger;
}

mock::EmptyLogging chatLogger;
AccountController accounts;
CommandController commands;
mock::MockTwitchIrcServer twitch;
Emotes emotes;
mock::EmptyLogging chatLogger;
};

} // namespace
Expand Down
7 changes: 7 additions & 0 deletions tests/src/Filters.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "mocks/Channel.hpp"
#include "mocks/ChatterinoBadges.hpp"
#include "mocks/EmptyApplication.hpp"
#include "mocks/Logging.hpp"
#include "mocks/TwitchIrcServer.hpp"
#include "mocks/UserData.hpp"
#include "providers/ffz/FfzBadges.hpp"
Expand Down Expand Up @@ -75,6 +76,12 @@ class MockApplication : public mock::BaseApplication
return &this->highlights;
}

ILogging *getChatLogger() override
{
return &this->logging;
}

mock::EmptyLogging logging;
AccountController accounts;
Emotes emotes;
mock::UserDataController userData;
Expand Down
11 changes: 9 additions & 2 deletions tests/src/InputCompletion.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
#include "mocks/BaseApplication.hpp"
#include "mocks/Channel.hpp"
#include "mocks/Helix.hpp"
#include "mocks/Logging.hpp"
#include "mocks/TwitchIrcServer.hpp"
#include "singletons/Emotes.hpp"
#include "singletons/Paths.hpp"
Expand Down Expand Up @@ -69,6 +70,12 @@ class MockApplication : public mock::BaseApplication
return &this->seventvEmotes;
}

ILogging *getChatLogger() override
{
return &this->logging;
}

mock::EmptyLogging logging;
AccountController accounts;
mock::MockTwitchIrcServer twitch;
Emotes emotes;
Expand Down Expand Up @@ -133,9 +140,9 @@ class InputCompletionTest : public ::testing::Test

void TearDown() override
{
this->mockApplication.reset();
this->mockHelix.reset();
this->channelPtr.reset();
this->mockHelix.reset();
this->mockApplication.reset();
}

std::unique_ptr<MockApplication> mockApplication;
Expand Down
7 changes: 7 additions & 0 deletions tests/src/MessageBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "mocks/Channel.hpp"
#include "mocks/ChatterinoBadges.hpp"
#include "mocks/DisabledStreamerMode.hpp"
#include "mocks/Logging.hpp"
#include "mocks/TwitchIrcServer.hpp"
#include "mocks/UserData.hpp"
#include "providers/ffz/FfzBadges.hpp"
Expand Down Expand Up @@ -91,6 +92,12 @@ class MockApplication : public mock::BaseApplication
return &this->seventvEmotes;
}

ILogging *getChatLogger() override
{
return &this->logging;
}

mock::EmptyLogging logging;
AccountController accounts;
Emotes emotes;
mock::UserDataController userData;
Expand Down
Loading