File indexing completed on 2024-05-12 04:49:45
0001 /**************************************************************************************** 0002 * Copyright (c) 2009 Maximilian Kossick <maximilian.kossick@googlemail.com> * 0003 * Copyright (c) 2010-2013 Ralf Engels <ralf-engels@gmx.de> * 0004 * * 0005 * This program is free software; you can redistribute it and/or modify it under * 0006 * the terms of the GNU General Public License as published by the Free Software * 0007 * Foundation; either version 2 of the License, or (at your option) any later * 0008 * version. * 0009 * * 0010 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0011 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0012 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0013 * * 0014 * You should have received a copy of the GNU General Public License along with * 0015 * this program. If not, see <http://www.gnu.org/licenses/>. * 0016 ****************************************************************************************/ 0017 0018 #include "TestGenericScanManager.h" 0019 0020 #include "amarokconfig.h" 0021 #include "MetaTagLib.h" 0022 #include "scanner/GenericScanManager.h" 0023 0024 #include "config-amarok-test.h" 0025 0026 #include <QImage> 0027 #include <QScopedPointer> 0028 #include <QTest> 0029 0030 #include <unistd.h> 0031 0032 QTEST_MAIN( TestGenericScanManager ) 0033 0034 TestGenericScanManager::TestGenericScanManager() 0035 : QObject() 0036 { 0037 // QString help = i18n("Amarok"); // prevent a bug when the scanner is the first thread creating a translator 0038 } 0039 0040 void 0041 TestGenericScanManager::initTestCase() 0042 { 0043 AmarokConfig::instance("amarokrc"); 0044 0045 // setenv( "LC_ALL", "", 1 ); // this breaks the test 0046 // Amarok does not force LC_ALL=C but obviously the test does it which 0047 // will prevent scanning of files with umlauts. 0048 0049 // that is the original mp3 file that we use to generate the "real" tracks 0050 m_sourcePath = QDir::toNativeSeparators( QString( AMAROK_TEST_DIR ) + "/data/audio/Platz 01.mp3" ); 0051 QVERIFY( QFile::exists( m_sourcePath ) ); 0052 0053 m_scanManager = new GenericScanManager( this ); 0054 0055 connect( m_scanManager, &GenericScanManager::started, 0056 this, &TestGenericScanManager::slotStarted ); 0057 connect( m_scanManager, &GenericScanManager::directoryCount, this, &TestGenericScanManager::slotDirectoryCount ); 0058 connect( m_scanManager, &GenericScanManager::directoryScanned, 0059 this, &TestGenericScanManager::slotDirectoryScanned ); 0060 connect( m_scanManager, &GenericScanManager::succeeded, this, &TestGenericScanManager::slotSucceeded ); 0061 connect( m_scanManager, &GenericScanManager::failed, this, &TestGenericScanManager::slotFailed ); 0062 0063 AmarokConfig::setScanRecursively( true ); 0064 AmarokConfig::setMonitorChanges( false ); 0065 0066 // switch on writing back so that we can create the test files with all the information 0067 AmarokConfig::setWriteBack( true ); 0068 AmarokConfig::setWriteBackStatistics( true ); 0069 AmarokConfig::setWriteBackCover( true ); 0070 } 0071 0072 void 0073 TestGenericScanManager::cleanupTestCase() 0074 { } 0075 0076 void 0077 TestGenericScanManager::init() 0078 { 0079 m_tmpCollectionDir = new QTemporaryDir; 0080 0081 QStringList collectionFolders; 0082 collectionFolders << m_tmpCollectionDir->path(); 0083 0084 m_started = false; 0085 m_finished = false; 0086 0087 m_scannedDirsCount = 0; 0088 m_scannedTracksCount = 0; 0089 m_scannedCoversCount = 0; 0090 } 0091 0092 void 0093 TestGenericScanManager::cleanup() 0094 { 0095 m_scanManager->abort(); 0096 delete m_tmpCollectionDir; 0097 } 0098 0099 void 0100 TestGenericScanManager::testScanSingle() 0101 { 0102 createSingleTrack(); 0103 fullScanAndWait(); 0104 0105 QCOMPARE( m_scannedDirsCount, 3 ); 0106 QCOMPARE( m_scannedTracksCount, 1 ); 0107 QCOMPARE( m_scannedCoversCount, 0 ); 0108 } 0109 0110 void 0111 TestGenericScanManager::testScanDirectory() 0112 { 0113 createAlbum(); 0114 fullScanAndWait(); 0115 0116 // -- check the commit 0117 QCOMPARE( m_scannedDirsCount, 3 ); 0118 QCOMPARE( m_scannedTracksCount, 9 ); 0119 QCOMPARE( m_scannedCoversCount, 0 ); 0120 } 0121 0122 void 0123 TestGenericScanManager::testRestartScanner() 0124 { 0125 #ifndef QT_NO_DEBUG 0126 createAlbum(); 0127 0128 // the scanner crashes at a special file: 0129 Meta::FieldHash values; 0130 values.clear(); 0131 values.insert( Meta::valUniqueId, QVariant("c6c29f50279ab9523a0f44928bc1e96b") ); 0132 values.insert( Meta::valUrl, QVariant("Thriller/crash_amarok_here.ogg") ); 0133 createTrack( values ); 0134 0135 fullScanAndWait(); 0136 0137 // -- check the commit 0138 QCOMPARE( m_scannedDirsCount, 4 ); 0139 QCOMPARE( m_scannedTracksCount, 9 ); 0140 QCOMPARE( m_scannedCoversCount, 0 ); 0141 0142 #else 0143 QSKIP( "Collection scanner only crashes in debug build.", SkipAll ); 0144 #endif 0145 } 0146 0147 void 0148 TestGenericScanManager::testAlbumImage() 0149 { 0150 createSingleTrack(); 0151 createAlbum(); 0152 0153 // put an image into the album directory 0154 QString imageSourcePath = QDir::toNativeSeparators( QString( AMAROK_TEST_DIR ) + "/data/playlists/no-playlist.png" ); 0155 QVERIFY( QFile::exists( imageSourcePath ) ); 0156 QString targetPath; 0157 targetPath = m_tmpCollectionDir->path() + '/' + "Pop/Thriller/cover.png"; 0158 QVERIFY( QFile::copy( m_sourcePath, targetPath ) ); 0159 0160 // set an embedded image 0161 targetPath = m_tmpCollectionDir->path() + '/' + "Various Artists/Big Screen Adventures/28 - Theme From Armageddon.mp3"; 0162 Meta::Tag::setEmbeddedCover( targetPath, QImage( 200, 200, QImage::Format_RGB32 ) ); 0163 0164 fullScanAndWait(); 0165 0166 // -- check the commit 0167 QCOMPARE( m_scannedDirsCount, 5 ); 0168 QCOMPARE( m_scannedTracksCount, 10 ); 0169 QCOMPARE( m_scannedCoversCount, 1 ); 0170 } 0171 0172 void 0173 TestGenericScanManager::slotStarted( GenericScanManager::ScanType type ) 0174 { 0175 Q_UNUSED( type ); 0176 0177 QVERIFY( !m_started ); 0178 QVERIFY( !m_finished ); 0179 0180 m_started = true; 0181 } 0182 0183 void 0184 TestGenericScanManager::slotDirectoryCount( int count ) 0185 { 0186 Q_UNUSED( count ); 0187 0188 QVERIFY( m_started ); 0189 QVERIFY( !m_finished ); 0190 } 0191 0192 void 0193 TestGenericScanManager::slotDirectoryScanned( QSharedPointer<CollectionScanner::Directory> dir ) 0194 { 0195 QVERIFY( m_started ); 0196 QVERIFY( !m_finished ); 0197 0198 m_scannedDirsCount += 1; 0199 m_scannedTracksCount += dir->tracks().count(); 0200 m_scannedCoversCount += dir->covers().count(); 0201 } 0202 0203 void 0204 TestGenericScanManager::slotSucceeded() 0205 { 0206 QVERIFY( m_started ); 0207 QVERIFY( !m_finished ); 0208 0209 m_finished = true; 0210 } 0211 0212 void 0213 TestGenericScanManager::slotFailed( const QString& message ) 0214 { 0215 Q_UNUSED( message ); 0216 0217 QVERIFY( m_started ); 0218 QVERIFY( !m_finished ); 0219 0220 m_finished = true; 0221 } 0222 0223 void 0224 TestGenericScanManager::fullScanAndWait() 0225 { 0226 QList<QUrl> urls; 0227 urls << QUrl::fromLocalFile( m_tmpCollectionDir->path() ); 0228 0229 QSignalSpy spy( m_scanManager, &GenericScanManager::succeeded ); 0230 m_scanManager->requestScan( urls ); 0231 waitScannerFinished( spy ); 0232 0233 QVERIFY( m_started ); 0234 QVERIFY( m_finished ); 0235 } 0236 0237 void 0238 TestGenericScanManager::waitScannerFinished( QSignalSpy &spy ) 0239 { 0240 QVERIFY( m_scanManager->isRunning() ); 0241 QVERIFY2( spy.wait( 5000 ), "ScanManager didn't finish scan within timeout" ); 0242 // m_scanManager needs a little time to delete its worker job after it emits succeeded. 0243 int wait = 0; 0244 while( wait < 50 && m_scanManager->isRunning() ) 0245 { 0246 wait++; 0247 usleep( 100 ); 0248 } 0249 QVERIFY( !m_scanManager->isRunning() ); 0250 } 0251 0252 void 0253 TestGenericScanManager::createTrack( const Meta::FieldHash &values ) 0254 { 0255 // -- copy the file from our original 0256 QVERIFY( values.contains( Meta::valUrl ) ); 0257 const QString targetPath = m_tmpCollectionDir->path() + '/' + values.value( Meta::valUrl ).toString(); 0258 QVERIFY( QDir( m_tmpCollectionDir->path() ).mkpath( QFileInfo( values.value( Meta::valUrl ).toString() ).path() ) ); 0259 0260 QVERIFY( QFile::copy( m_sourcePath, targetPath ) ); 0261 0262 // -- set all the values that we need 0263 Meta::Tag::writeTags( targetPath, values, true ); 0264 } 0265 0266 void 0267 TestGenericScanManager::createSingleTrack() 0268 { 0269 Meta::FieldHash values; 0270 0271 values.insert( Meta::valUniqueId, QVariant("794b1bd040d5dd9b5b45c1494d84cc82") ); 0272 values.insert( Meta::valUrl, QVariant("Various Artists/Big Screen Adventures/28 - Theme From Armageddon.mp3") ); 0273 values.insert( Meta::valFormat, QVariant("1") ); 0274 values.insert( Meta::valTitle, QVariant("Theme From Armageddon") ); 0275 values.insert( Meta::valArtist, QVariant("Soundtrack & Theme Orchestra") ); 0276 values.insert( Meta::valAlbumArtist, QVariant("Theme Orchestra") ); 0277 values.insert( Meta::valAlbum, QVariant("Big Screen Adventures") ); 0278 values.insert( Meta::valComposer, QVariant("Unknown Composer") ); 0279 values.insert( Meta::valComment, QVariant("Amazon.com Song ID: 210541237") ); 0280 values.insert( Meta::valGenre, QVariant("Broadway & Vocalists") ); 0281 values.insert( Meta::valYear, QVariant(2009) ); 0282 values.insert( Meta::valTrackNr, QVariant(28) ); 0283 // values.insert( Meta::valBitrate, QVariant(216) ); // the bitrate can not be set. it's computed 0284 // values.insert( Meta::valLength, QVariant(184000) ); // also can't be set 0285 // values.insert( Meta::valSamplerate, QVariant(44100) ); // again 0286 // values.insert( Meta::valFilesize, QVariant(5094892) ); // again 0287 values.insert( Meta::valScore, QVariant(0.875) ); 0288 values.insert( Meta::valPlaycount, QVariant(5) ); 0289 // TODO: set an embedded cover 0290 0291 createTrack( values ); 0292 } 0293 0294 void 0295 TestGenericScanManager::createAlbum() 0296 { 0297 Meta::FieldHash values; 0298 0299 values.insert( Meta::valUniqueId, QVariant("1dc7022c52a3e4c51b46577da9b3c8ff") ); 0300 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 01 - Michael Jackson - Track01.mp3") ); 0301 values.insert( Meta::valTitle, QVariant("Wanna Be Startin' Somethin'") ); 0302 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0303 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0304 values.insert( Meta::valYear, QVariant(1982) ); 0305 values.insert( Meta::valTrackNr, QVariant(1) ); 0306 createTrack( values ); 0307 0308 values.clear(); 0309 values.insert( Meta::valUniqueId, QVariant("1dc708934a3e4c51b46577da9b3ab11") ); 0310 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 02 - Michael Jackson - Track02.mp3") ); 0311 values.insert( Meta::valTitle, QVariant("Baby Be Mine") ); 0312 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0313 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0314 values.insert( Meta::valYear, QVariant(1982) ); 0315 values.insert( Meta::valTrackNr, QVariant(2) ); 0316 createTrack( values ); 0317 0318 values.clear(); 0319 values.insert( Meta::valUniqueId, QVariant("15a6b1bf79747fdc8e9c6b6f06203017") ); 0320 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 03 - Michael Jackson - Track03.mp3") ); 0321 values.insert( Meta::valTitle, QVariant("The Girl Is Mine") ); 0322 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0323 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0324 values.insert( Meta::valYear, QVariant(1982) ); 0325 values.insert( Meta::valTrackNr, QVariant(3) ); 0326 createTrack( values ); 0327 0328 values.clear(); 0329 values.insert( Meta::valUniqueId, QVariant("4aba4c8b1d1893c03c112cc3c01221e9") ); 0330 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 04 - Michael Jackson - Track04.mp3") ); 0331 values.insert( Meta::valTitle, QVariant("Thriller") ); 0332 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0333 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0334 values.insert( Meta::valYear, QVariant(1982) ); 0335 values.insert( Meta::valTrackNr, QVariant(4) ); 0336 createTrack( values ); 0337 0338 values.clear(); 0339 values.insert( Meta::valUniqueId, QVariant("cb44d2a3d8053829b04672723bf0bd6e") ); 0340 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 05 - Michael Jackson - Track05.mp3") ); 0341 values.insert( Meta::valTitle, QVariant("Beat It") ); 0342 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0343 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0344 values.insert( Meta::valYear, QVariant(1982) ); 0345 values.insert( Meta::valTrackNr, QVariant(5) ); 0346 createTrack( values ); 0347 0348 values.clear(); 0349 values.insert( Meta::valUniqueId, QVariant("eba1858eeeb3c6d97fe3385200114d86") ); 0350 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 06 - Michael Jackson - Track06.mp3") ); 0351 values.insert( Meta::valTitle, QVariant("Billy Jean") ); 0352 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0353 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0354 values.insert( Meta::valYear, QVariant(1982) ); 0355 values.insert( Meta::valTrackNr, QVariant(6) ); 0356 createTrack( values ); 0357 0358 values.clear(); 0359 values.insert( Meta::valUniqueId, QVariant("4623850290998486b0f7b39a2719904e") ); 0360 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 07 - Michael Jackson - Track07.mp3") ); 0361 values.insert( Meta::valTitle, QVariant("Human Nature") ); 0362 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0363 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0364 values.insert( Meta::valYear, QVariant(1982) ); 0365 values.insert( Meta::valTrackNr, QVariant(7) ); 0366 createTrack( values ); 0367 0368 values.clear(); 0369 values.insert( Meta::valUniqueId, QVariant("6d9a7de13af1e16bb13a6208e44b046d") ); 0370 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 08 - Michael Jackson - Track08.mp3") ); 0371 values.insert( Meta::valTitle, QVariant("P.Y.T. (Pretty Young Thing)") ); 0372 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0373 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0374 values.insert( Meta::valYear, QVariant(1982) ); 0375 values.insert( Meta::valTrackNr, QVariant(8) ); 0376 createTrack( values ); 0377 0378 values.clear(); 0379 values.insert( Meta::valUniqueId, QVariant("91cf9a7c0d255399f9f6babfacae432b") ); 0380 values.insert( Meta::valUrl, QVariant("Pop/Thriller/Thriller - 09 - Michael Jackson - Track09.mp3") ); 0381 values.insert( Meta::valTitle, QVariant("The Lady In My Life") ); 0382 values.insert( Meta::valArtist, QVariant("Michael Jackson") ); 0383 values.insert( Meta::valAlbum, QVariant("Thriller") ); 0384 values.insert( Meta::valYear, QVariant(1982) ); 0385 values.insert( Meta::valTrackNr, QVariant(9) ); 0386 createTrack( values ); 0387 } 0388