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"