1 /*
2     EmbeddedImageData tests.
3 
4     SPDX-FileCopyrightText: 2018 Alexander Stippich <a.stippich@gmx.net>
5 
6     SPDX-License-Identifier: LGPL-2.1-or-later
7 */
8 
9 #include "embeddedimagedatatest.h"
10 #include "embeddedimagedata.h"
11 #include "indexerextractortestsconfig.h"
12 
13 #include <QMimeDatabase>
14 #include <QTest>
15 #include <QByteArray>
16 
17 using namespace KFileMetaData;
18 
testFilePath(const QString & fileName) const19 QString EmbeddedImageDataTest::testFilePath(const QString& fileName) const
20 {
21     return QLatin1String(INDEXER_TESTS_SAMPLE_FILES_PATH) + QLatin1Char('/') + fileName;
22 }
23 
initTestCase()24 void EmbeddedImageDataTest::initTestCase()
25 {
26     QFile imgFile(testFilePath("cover.jpg"));
27     imgFile.open(QIODevice::ReadOnly);
28     m_coverImage = imgFile.readAll();
29 }
30 
test()31 void EmbeddedImageDataTest::test()
32 {
33     QFETCH(QString, fileName);
34     QMimeDatabase mimeDb;
35     QString testAudioFile;
36     EmbeddedImageData imageData;
37     QMap<EmbeddedImageData::ImageType, QByteArray> images;
38 
39     testAudioFile = testFilePath(fileName);
40     const QString mimeType = mimeDb.mimeTypeForFile(testAudioFile).name();
41     if (!imageData.mimeTypes().contains(mimeType)) {
42         qWarning() << "mimeType" << mimeType << "not in imageData.mimeTypes()" << imageData.mimeTypes();
43     }
44     QVERIFY(imageData.mimeTypes().contains(mimeType));
45     images = imageData.imageData(testAudioFile);
46     QCOMPARE(images.value(EmbeddedImageData::FrontCover), m_coverImage);
47 }
48 
test_data()49 void EmbeddedImageDataTest::test_data()
50 {
51     QTest::addColumn<QString>("fileName");
52 
53     QTest::addRow("aiff")
54             << QStringLiteral("test.aif")
55             ;
56 
57     QTest::addRow("ape")
58             << QStringLiteral("test.ape")
59             ;
60 
61     QTest::addRow("opus")
62             << QStringLiteral("test.opus")
63             ;
64 
65     QTest::addRow("ogg")
66             << QStringLiteral("test.ogg")
67             ;
68 
69     QTest::addRow("flac")
70             << QStringLiteral("test.flac")
71             ;
72 
73     QTest::addRow("mp3")
74             << QStringLiteral("test.mp3")
75             ;
76 
77     QTest::addRow("m4a")
78             << QStringLiteral("test.m4a")
79             ;
80 
81     QTest::addRow("mpc")
82             << QStringLiteral("test.mpc")
83             ;
84 
85     QTest::addRow("speex")
86             << QStringLiteral("test.spx")
87             ;
88 
89     QTest::addRow("wav")
90             << QStringLiteral("test.wav")
91             ;
92 
93     QTest::addRow("wavpack")
94             << QStringLiteral("test.wv")
95             ;
96 
97     QTest::addRow("wma")
98             << QStringLiteral("test.wma")
99             ;
100 }
101 
testWrite()102 void EmbeddedImageDataTest::testWrite()
103 {
104     QFETCH(QString, fileName);
105     EmbeddedImageData imageData;
106 
107     QString testFileName = testFilePath(QStringLiteral("writer") + fileName);
108 
109     QFile::copy(testFilePath(fileName), testFileName);
110 
111     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
112     QMap<EmbeddedImageData::ImageType, QByteArray> readImages;
113 
114     writeImages.insert(EmbeddedImageData::ImageType::FrontCover, m_coverImage);
115     imageData.writeImageData(testFileName, writeImages);
116     readImages = imageData.imageData(testFileName);
117 
118     QCOMPARE(readImages.value(EmbeddedImageData::FrontCover), writeImages.value(EmbeddedImageData::FrontCover));
119 
120     QFile::remove(testFileName);
121 }
122 
testWrite_data()123 void EmbeddedImageDataTest::testWrite_data()
124 {
125     QTest::addColumn<QString>("fileName");
126 
127     QTest::addRow("aiff")
128             << QStringLiteral("test.aif")
129             ;
130 
131     QTest::addRow("ape")
132             << QStringLiteral("test.ape")
133             ;
134 
135     QTest::addRow("opus")
136             << QStringLiteral("test.opus")
137             ;
138 
139     QTest::addRow("ogg")
140             << QStringLiteral("test.ogg")
141             ;
142 
143     QTest::addRow("flac")
144             << QStringLiteral("test.flac")
145             ;
146 
147     QTest::addRow("mp3")
148             << QStringLiteral("test.mp3")
149             ;
150 
151     QTest::addRow("m4a")
152             << QStringLiteral("test.m4a")
153             ;
154 
155     QTest::addRow("mpc")
156             << QStringLiteral("test.mpc")
157             ;
158 
159     QTest::addRow("speex")
160             << QStringLiteral("test.spx")
161             ;
162 
163     QTest::addRow("wav")
164             << QStringLiteral("test.wav")
165             ;
166 
167     QTest::addRow("wavpack")
168             << QStringLiteral("test.wv")
169             ;
170 
171     QTest::addRow("wma")
172             << QStringLiteral("test.wma")
173             ;
174 }
testDelete()175 void EmbeddedImageDataTest::testDelete()
176 {
177     QFETCH(QString, fileName);
178     EmbeddedImageData imageData;
179 
180     QString testFileName = testFilePath(QStringLiteral("writer_del_") + fileName);
181 
182     QFile::copy(testFilePath(fileName), testFileName);
183 
184     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
185     QMap<EmbeddedImageData::ImageType, QByteArray> readImages;
186 
187     writeImages.insert(EmbeddedImageData::ImageType::FrontCover, QByteArray());
188     imageData.writeImageData(testFileName, writeImages);
189     readImages = imageData.imageData(testFileName);
190 
191     QVERIFY(!readImages.contains(EmbeddedImageData::FrontCover));
192 
193     QFile::remove(testFileName);
194 }
195 
testDelete_data()196 void EmbeddedImageDataTest::testDelete_data()
197 {
198     testWrite_data();
199 }
200 
testDeleteInsert()201 void EmbeddedImageDataTest::testDeleteInsert()
202 {
203     QFETCH(QString, fileName);
204     EmbeddedImageData imageData;
205 
206     QString testFileName = testFilePath(QStringLiteral("writer_delinsert_") + fileName);
207 
208     QFile::copy(testFilePath(fileName), testFileName);
209 
210     QFile imgFile(testFilePath("test.jpg"));
211     imgFile.open(QIODevice::ReadOnly);
212 
213     QMap<EmbeddedImageData::ImageType, QByteArray> delImages;
214     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
215     QMap<EmbeddedImageData::ImageType, QByteArray> readImages;
216 
217     delImages.insert(EmbeddedImageData::ImageType::FrontCover, QByteArray());
218     writeImages.insert(EmbeddedImageData::ImageType::FrontCover, m_coverImage);
219 
220     imageData.writeImageData(testFileName, delImages);
221     readImages = imageData.imageData(testFileName);
222 
223     QVERIFY(!readImages.contains(EmbeddedImageData::FrontCover));
224 
225     imageData.writeImageData(testFileName, writeImages);
226     readImages = imageData.imageData(testFileName);
227 
228     QCOMPARE(readImages.value(EmbeddedImageData::FrontCover), writeImages.value(EmbeddedImageData::FrontCover));
229 
230     QFile::remove(testFileName);
231 }
232 
testDeleteInsert_data()233 void EmbeddedImageDataTest::testDeleteInsert_data()
234 {
235     testWrite_data();
236 }
237 
testMultiImage()238 void EmbeddedImageDataTest::testMultiImage()
239 {
240     QFETCH(QString, fileName);
241     QFETCH(EmbeddedImageData::ImageTypes, imageTypes);
242     EmbeddedImageData imageData;
243 
244     QString testFileName = testFilePath(QStringLiteral("writer_multiimage_") + fileName);
245 
246     QFile::copy(testFilePath(fileName), testFileName);
247 
248     QMap<EmbeddedImageData::ImageType, QByteArray> writeImages;
249 
250     auto readImages = imageData.imageData(testFileName);
251     QVERIFY(readImages.contains(EmbeddedImageData::FrontCover));
252 
253     using Image = EmbeddedImageData::ImageType;
254     for (auto type : { Image::Other, Image::BackCover }) {
255 	if (type & imageTypes) {
256 	    writeImages.insert(type, m_coverImage);
257 	}
258     }
259     imageData.writeImageData(testFileName, writeImages);
260 
261     readImages = imageData.imageData(testFileName);
262     // Test if FrontCover still exists
263     QVERIFY(readImages.contains(EmbeddedImageData::FrontCover));
264 
265     for (auto type : { Image::FrontCover, Image::Other, Image::BackCover }) {
266 	if (type & imageTypes) {
267 	    QVERIFY2(readImages.contains(type), qPrintable(QString("has imagetype %1").arg(type)));
268 	    QCOMPARE(readImages.value(type), m_coverImage);
269 	}
270     }
271 
272     QFile::remove(testFileName);
273 }
274 
testMultiImage_data()275 void EmbeddedImageDataTest::testMultiImage_data()
276 {
277     using ImageTypes = EmbeddedImageData::ImageTypes;
278     QTest::addColumn<QString>("fileName");
279     QTest::addColumn<ImageTypes>("imageTypes");
280 
281     using Image = EmbeddedImageData::ImageType;
282     QTest::addRow("aiff") << QStringLiteral("test.aif") << ImageTypes{ Image::Other, Image::Artist };
283     QTest::addRow("opus") << QStringLiteral("test.opus") << ImageTypes{ Image::Other, Image::BackCover };
284     QTest::addRow("flac") << QStringLiteral("test.flac") << ImageTypes{ Image::Other, Image::Composer };
285     QTest::addRow("wma")  << QStringLiteral("test.wma") << ImageTypes{ Image::Other, Image::Band };
286 }
287 
288 
289 QTEST_GUILESS_MAIN(EmbeddedImageDataTest)
290