1 /****************************************************************************************
2  * Copyright (c) 2010-2012 Leo Franchi <lfranchi@kde.org>                               *
3  * Copyright (c) 2011 Jeff Mitchell <mitchell@kde.org>                                  *
4  *                                                                                      *
5  * This program is free software; you can redistribute it and/or modify it under        *
6  * the terms of the GNU General Public License as published by the Free Software        *
7  * Foundation; either version 2 of the License, or (at your option) any later           *
8  * version.                                                                             *
9  *                                                                                      *
10  * This program is distributed in the hope that it will be useful, but WITHOUT ANY      *
11  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A      *
12  * PARTICULAR PURPOSE. See the GNU General Public License for more details.             *
13  *                                                                                      *
14  * You should have received a copy of the GNU General Public License along with         *
15  * this program.  If not, see <http://www.gnu.org/licenses/>.                           *
16  ****************************************************************************************/
17 
18 #include "TrackTest.h"
19 
20 #include <QDebug>
21 #include <QNetworkReply>
22 #include <QFile>
23 
initTestCase()24 void TrackTest::initTestCase()
25 {
26     Echonest::Config::instance()->setAPIKey( "JGJCRKWLXLBZIFAZB" );
27     s_mainThread = QThread::currentThread();
28 }
29 
30 
testUploadLocalFile()31 void TrackTest::testUploadLocalFile()
32 {
33     QFile f( QString::fromLatin1( DATA_DIR "/01 - Cellule.mp3" ) );
34 
35     QVERIFY( f.exists() );
36     QVERIFY( f.open( QIODevice::ReadOnly ) );
37 
38     QByteArray data = f.readAll();
39 
40     QVERIFY( !data.isEmpty() );
41 
42     QUrl path( f.fileName() );
43 
44     QNetworkReply* reply = Echonest::Track::uploadLocalFile( path, data, true );
45 
46     qDebug() << "Uploading..";
47     QEventLoop loop;
48     loop.connect( reply, SIGNAL(finished()), SLOT(quit()) );
49     loop.exec();
50     qDebug() << "Verifying uploaded.";
51     QVERIFY( reply->error() == QNetworkReply::NoError );
52     Echonest::Track track = Echonest::Track::parseProfile( reply );
53 
54     verifyTrack1( track );
55 }
56 
testProfileFromMD5()57 void TrackTest::testProfileFromMD5()
58 {
59     QByteArray md5 = "2aceceb60f38e24c3e41365bf26fc7db";
60 
61     QNetworkReply* reply = Echonest::Track::profileFromMD5( md5 );
62 
63     QEventLoop loop;
64     loop.connect( reply, SIGNAL(finished()), SLOT(quit()) );
65     loop.exec();
66 
67     QVERIFY( reply->error() == QNetworkReply::NoError );
68     Echonest::Track track = Echonest::Track::parseProfile( reply );
69 
70     verifyTrack1( track );
71 }
72 
testProfileFromId()73 void TrackTest::testProfileFromId()
74 {
75     QByteArray id = "TRMEQQH12B048DE985";
76 
77     QNetworkReply* reply = Echonest::Track::profileFromTrackId( id );
78 
79     QEventLoop loop;
80     loop.connect( reply, SIGNAL(finished()), SLOT(quit()) );
81     loop.exec();
82 
83     QVERIFY( reply->error() == QNetworkReply::NoError );
84     Echonest::Track track = Echonest::Track::parseProfile( reply );
85 
86     verifyTrack1( track );
87 }
88 
testAnalyzeFromMD5()89 void TrackTest::testAnalyzeFromMD5()
90 {
91     QByteArray md5 = "d41baf84c0d507bf7f861b7820844e05";
92 
93     QNetworkReply* reply = Echonest::Track::analyzeTrackMD5( md5, true );
94 
95 
96     QEventLoop loop;
97     loop.connect( reply, SIGNAL(finished()), SLOT(quit()) );
98     loop.exec();
99 
100     QVERIFY( reply->error() == QNetworkReply::NoError );
101     try {
102         Echonest::Track track = Echonest::Track::parseProfile( reply );
103         verifyTrack2( track );
104     } catch( const Echonest::ParseError& e ) {
105     }
106 }
107 
testAnalyzerFromId()108 void TrackTest::testAnalyzerFromId()
109 {
110     QByteArray id = "TROICNF12B048DE990";
111 
112     QNetworkReply* reply = Echonest::Track::analyzeTrackId( id, true );
113 
114 
115     QEventLoop loop;
116     loop.connect( reply, SIGNAL(finished()), SLOT(quit()) );
117     loop.exec();
118 
119     QVERIFY( reply->error() == QNetworkReply::NoError );
120     Echonest::Track track = Echonest::Track::parseProfile( reply );
121 
122     verifyTrack2( track );
123 }
124 
testThreads()125 void TrackTest::testThreads()
126 {
127     QSet< QThread* > threadSet;
128     for ( int i = 0; i < 4; ++i )
129     {
130         QThread *newThread = new QThread();
131         threadSet.insert( newThread );
132         TrackTestThreadObject *newTestObject = new TrackTestThreadObject();
133         newTestObject->moveToThread( newThread );
134         newThread->start();
135         QMetaObject::invokeMethod( newTestObject, "go" );
136     }
137     while ( !threadSet.isEmpty() )
138     {
139         Q_FOREACH( QThread* thread, threadSet.values() )
140         {
141             if ( thread->isRunning() )
142                 QCoreApplication::processEvents( QEventLoop::AllEvents, 200 );
143             else
144                 threadSet.remove( thread );
145         }
146     }
147 }
148 
verifyTrack1(const Echonest::Track & track)149 void TrackTest::verifyTrack1(const Echonest::Track& track)
150 {
151     QVERIFY( track.status() == Echonest::Analysis::Complete );
152     // Echo Nest doesn't have track info for this Jamendo track
153     QVERIFY( track.artist().isEmpty() );
154     QVERIFY( track.release().isEmpty() );
155     QVERIFY( track.title().isEmpty() );
156 
157     QVERIFY( track.analyzerVersion() == QLatin1String( "3.01a" ) );
158     QVERIFY( track.id() == "TRMEQQH12B048DE985" );
159     QVERIFY( track.bitrate() == 160 );
160     QVERIFY( track.audioMD5() == "2ae41a12e469ba388791b82c11338932" );
161     qDebug() << "md5:" << track.md5();
162     QVERIFY( track.md5() == "2aceceb60f38e24c3e41365bf26fc7db" );
163     QVERIFY( track.samplerate() == 44100 );
164 
165     // AudioSummary
166     QVERIFY( track.audioSummary().key() == 1 );
167     QVERIFY( track.audioSummary().tempo() == 160.003 );
168     QVERIFY( track.audioSummary().mode() == 0 );
169     QVERIFY( track.audioSummary().timeSignature() == 4 );
170     QVERIFY( track.audioSummary().duration() == 220.86485 );
171     QVERIFY( track.audioSummary().loudness() == -11.839 );
172     QVERIFY( track.audioSummary().danceability() > 0 );
173     QVERIFY( track.audioSummary().energy() > 0 );
174 
175     // Detailed audiosummary
176     QNetworkReply* reply =track.audioSummary().fetchFullAnalysis();
177 
178     QEventLoop loop;
179     loop.connect( reply, SIGNAL(finished()), SLOT(quit()) );
180     loop.exec();
181     Echonest::AudioSummary summary = track.audioSummary();
182     summary.parseFullAnalysis( reply );
183     qDebug() << "track detailed summary num segments:" << summary.segments().size();
184     qDebug() << "track detailed summary num bars:" << summary.bars().size();
185     qDebug() << "track detailed summary num beats:" << summary.beats().size();
186     qDebug() << "track detailed summary num sections:" << summary.sections().size();
187     qDebug() << "track detailed summary num tatums:" << summary.tatums().size();
188 //     qDebug() << "track detailed analysis_time:" << summary.analysisTime();
189 //     qDebug() << "track detailed analyzer_version:" << summary.analyzerVersion();
190 //     qDebug() << "track detailed detailed_status:" << summary.detailedStatus();
191 //     qDebug() << "track detailed status:" << summary.analysisStatus();
192 //     qDebug() << "track detailed timestamp:" << summary.timestamp();
193 //     qDebug() << "track detailed end_of_fade_in:" << summary.endOfFadeIn();
194 //     qDebug() << "track detailed key_confidence:" << summary.keyConfidence();
195 //     qDebug() << "track detailed mode_confidence:" << summary.modeConfidence();
196 //     qDebug() << "track detailed num_samples:" << summary.numSamples();
197 //     qDebug() << "track detailed sample_md5:" << summary.sampleMD5();
198 //     qDebug() << "track detailed start_of_fade_out:" << summary.startOfFadeOut();
199 //     qDebug() << "track detailed tempo_confidence:" << summary.tempoConfidence();
200 //     qDebug() << "track detailed time_signature_confidence:" << summary.timeSignatureConfidence();
201     QVERIFY( summary.analysisTime() );
202     QVERIFY( !summary.analyzerVersion().isEmpty() );
203     QVERIFY( !summary.detailedStatus().isEmpty() );
204     QCOMPARE( summary.analysisStatus(), 0 );
205     QVERIFY( summary.timestamp() );
206     QVERIFY( summary.endOfFadeIn() );
207     QVERIFY( summary.keyConfidence() > -1 );
208     QVERIFY( summary.modeConfidence() > -1 );
209     QVERIFY( summary.numSamples() );
210     QVERIFY( !summary.sampleMD5().isEmpty() );
211     QVERIFY( summary.startOfFadeOut() );
212     QVERIFY( summary.tempoConfidence() > -1 );
213     QVERIFY( summary.timeSignatureConfidence() > -1 );
214     QVERIFY( summary.segments().size() );
215     QVERIFY( summary.bars().size() );
216     QVERIFY( summary.beats().size() );
217     QVERIFY( summary.sections().size() );
218     QVERIFY( summary.tatums().size() );
219 }
220 
verifyTrack2(const Echonest::Track & track)221 void TrackTest::verifyTrack2(const Echonest::Track& track)
222 {
223     QVERIFY( track.status() == Echonest::Analysis::Complete );
224     // Echo Nest doesn't have track info for this Jamendo track
225     QVERIFY( track.artist().isEmpty() );
226     QVERIFY( track.release().isEmpty() );
227     QVERIFY( track.title().isEmpty() );
228 
229     QVERIFY( track.analyzerVersion() == QLatin1String( "3.01a" ) );
230     QVERIFY( track.id() == "TROICNF12B048DE990" );
231     QVERIFY( track.bitrate() == 160 );
232     QVERIFY( track.audioMD5() == "360e25b8f205cb5c730b2b73562f5ebd" );
233     qDebug() << "md5:" << track.md5();
234     QVERIFY( track.md5() == "d41baf84c0d507bf7f861b7820844e05" );
235     QVERIFY( track.samplerate() == 44100 );
236 
237     // AudioSummary
238     QVERIFY( track.audioSummary().key() == 1 );
239     QVERIFY( track.audioSummary().tempo() == 135.032 );
240     QVERIFY( track.audioSummary().mode() == 1 );
241     QVERIFY( track.audioSummary().timeSignature() == 4 );
242     QVERIFY( track.audioSummary().duration() == 231.65342 );
243     QVERIFY( track.audioSummary().loudness() == -13.473 );
244 }
245 
246 
247 QTEST_MAIN(TrackTest)
248 
249 #include "TrackTest.moc"
250