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