File indexing completed on 2024-05-12 04:49:41

0001 /****************************************************************************************
0002  * Copyright (c) 2010 Maximilian Kossick <maximilian.kossick@googlemail.com>            *
0003  *                                                                                      *
0004  * This program is free software; you can redistribute it and/or modify it under        *
0005  * the terms of the GNU General Public License as published by the Free Software        *
0006  * Foundation; either version 2 of the License, or (at your option) any later           *
0007  * version.                                                                             *
0008  *                                                                                      *
0009  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
0010  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
0011  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
0012  *                                                                                      *
0013  * You should have received a copy of the GNU General Public License along with         *
0014  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
0015  ****************************************************************************************/
0016 
0017 #include "TestLogger.h"
0018 
0019 #include "core/logger/Logger.h"
0020 
0021 #include "mocks/MockLogger.h"
0022 
0023 #include <ThreadWeaver/ThreadWeaver>
0024 #include <ThreadWeaver/Job>
0025 
0026 #include <QCoreApplication>
0027 
0028 #include <KJob>
0029 
0030 #include <gmock/gmock.h>
0031 
0032 QTEST_GUILESS_MAIN( TestLogger )
0033 
0034 using ::testing::Return;
0035 using ::testing::AnyNumber;
0036 using ::testing::_;
0037 using ::testing::Mock;
0038 
0039 
0040 class DummyJob : public KJob
0041 {
0042 public:
0043     void start() override {}
0044 };
0045 
0046 TestLogger::TestLogger()
0047 {
0048     int argc = 1;
0049     char **argv = (char **) malloc(sizeof(char *));
0050     argv[0] = strdup( QCoreApplication::applicationName().toLocal8Bit().data() );
0051     ::testing::InitGoogleMock( &argc, argv );
0052     delete[] argv;
0053 }
0054 
0055 void
0056 TestLogger::init()
0057 {
0058 }
0059 
0060 void
0061 TestLogger::cleanup()
0062 {
0063 }
0064 
0065 class ProgressJob : public QObject, public ThreadWeaver::Job
0066 {
0067     Q_OBJECT
0068 public:
0069     ProgressJob() : deleteJob( false ), deleteObject( false ) {}
0070     void run(ThreadWeaver::JobPointer self, ThreadWeaver::Thread *thread) override
0071     {
0072         Q_UNUSED(self);
0073         Q_UNUSED(thread);
0074         KJob *job = new DummyJob();
0075         QObject *obj = new QObject();
0076         Amarok::Logger::newProgressOperation( job, QString( "foo" ), obj );
0077 
0078         if( deleteJob ) delete job;
0079         if( deleteObject ) delete obj;
0080     }
0081 
0082     bool deleteJob;
0083     bool deleteObject;
0084 
0085     protected:
0086     void defaultBegin(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread) override
0087     {
0088         Q_EMIT started(self);
0089         ThreadWeaver::Job::defaultBegin(self, thread);
0090     }
0091 
0092     void defaultEnd(const ThreadWeaver::JobPointer& self, ThreadWeaver::Thread *thread) override
0093     {
0094         ThreadWeaver::Job::defaultEnd(self, thread);
0095         if (!self->success()) {
0096             Q_EMIT failed(self);
0097         }
0098         Q_EMIT done(self);
0099     }
0100 
0101     Q_SIGNALS:
0102     /** This signal is emitted when this job is being processed by a thread. */
0103     void started(ThreadWeaver::JobPointer);
0104     /** This signal is emitted when the job has been finished (no matter if it succeeded or not). */
0105     void done(ThreadWeaver::JobPointer);
0106     /** This job has failed.
0107      * This signal is emitted when success() returns false after the job is executed. */
0108     void failed(ThreadWeaver::JobPointer);
0109 };
0110 
0111 void
0112 TestLogger::testDoNotForwardDeletedJob()
0113 {
0114     Amarok::MockLogger *mock = new Amarok::MockLogger();
0115     EXPECT_CALL( *mock, newProgressOperationImpl( An<KJob*>(), _, _, _, _ ) ).Times( 0 );
0116 
0117     ProgressJob *job = new ProgressJob();
0118     job->deleteJob = true;
0119     ThreadWeaver::Queue::instance()->enqueue( QSharedPointer<ThreadWeaver::Job>(job) );
0120 
0121     QTest::qSleep( 10 ); //ensure that the job has time to run
0122     QTest::qWait( 20 ); //give the Logger-internal timer time to fire
0123 
0124     QVERIFY( Mock::VerifyAndClearExpectations( &mock ) );
0125     delete mock;
0126 }
0127 
0128 void
0129 TestLogger::testDoNotForwardDeletedSlot()
0130 {
0131     Amarok::MockLogger *mock = new Amarok::MockLogger();
0132     EXPECT_CALL( *mock, newProgressOperationImpl( An<KJob*>(), _, nullptr, _, _ ) ).Times( 1 ).WillOnce( Return() );
0133 
0134     ProgressJob *job = new ProgressJob();
0135     job->deleteObject = true;
0136     ThreadWeaver::Queue::instance()->enqueue( QSharedPointer<ThreadWeaver::Job>(job) );
0137 
0138     QTest::qSleep( 10 ); //ensure that the job has time to run
0139     QTest::qWait( 20 ); //give the Logger-internal timer time to fire
0140 
0141     QVERIFY( Mock::VerifyAndClearExpectations( &mock ) );
0142     delete mock;
0143 }
0144 
0145 void
0146 TestLogger::testForwardLongMessage()
0147 {
0148     Amarok::MockLogger *mock = new Amarok::MockLogger();
0149     EXPECT_CALL( *mock, longMessageImpl( _, _ ) ).Times( 1 ).WillOnce( Return() );
0150 
0151     Amarok::Logger::longMessage( "foo", Amarok::Logger::Information );
0152 
0153     QTest::qWait( 20 );
0154 
0155     QVERIFY( Mock::VerifyAndClearExpectations( &mock ) );
0156     delete mock;
0157 }
0158 
0159 void
0160 TestLogger::testForwardProgressOperation()
0161 {
0162     Amarok::MockLogger *mock = new Amarok::MockLogger();
0163     EXPECT_CALL( *mock, newProgressOperationImpl( An<KJob*>(), _, _, _, _ ) ).Times( 1 ).WillOnce( Return() );
0164 
0165     Amarok::Logger::newProgressOperation( new DummyJob(), QString( "foo" ) );
0166 
0167     QTest::qWait( 20 );
0168 
0169     QVERIFY( Mock::VerifyAndClearExpectations( &mock ) );
0170     delete mock;
0171 }
0172 
0173 void
0174 TestLogger::testForwardShortMessage()
0175 {
0176     Amarok::MockLogger *mock = new Amarok::MockLogger();
0177     EXPECT_CALL( *mock, shortMessageImpl( _ ) ).Times( 1 ).WillOnce( Return() );
0178 
0179     Amarok::Logger::shortMessage( "foo" );
0180 
0181     QTest::qWait( 20 );
0182 
0183     QVERIFY( Mock::VerifyAndClearExpectations( &mock ) );
0184     delete mock;
0185 }
0186 
0187 #include "TestLogger.moc"