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