1 /*
2  * Strawberry Music Player
3  * This file was part of Clementine.
4  * Copyright 2010, David Sansome <me@davidsansome.com>
5  * Copyright 2019-2021, Jonas Kvinge <jonas@jkvinge.net>
6  *
7  * Strawberry is free software: you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation, either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * Strawberry is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with Strawberry.  If not, see <http://www.gnu.org/licenses/>.
19  *
20  */
21 
22 #include <gtest/gtest.h>
23 
24 #include <QByteArray>
25 #include <QString>
26 #include <QDateTime>
27 #include <QtDebug>
28 
29 #include "test_utils.h"
30 #include "core/utilities.h"
31 #include "core/logging.h"
32 
TEST(UtilitiesTest,PrettyTimeDelta)33 TEST(UtilitiesTest, PrettyTimeDelta) {
34 
35   ASSERT_EQ(Utilities::PrettyTimeDelta(60), "+1:00");
36 
37   ASSERT_EQ(Utilities::PrettyTimeDelta(3600), "+1:00:00");
38 
39   ASSERT_EQ(Utilities::PrettyTimeDelta(9600), "+2:40:00");
40 
41 }
42 
TEST(UtilitiesTest,PrettyTime)43 TEST(UtilitiesTest, PrettyTime) {
44 
45   ASSERT_EQ(Utilities::PrettyTime(60), "1:00");
46 
47   ASSERT_EQ(Utilities::PrettyTime(3600), "1:00:00");
48 
49   ASSERT_EQ(Utilities::PrettyTime(9600), "2:40:00");
50 
51 }
52 
TEST(UtilitiesTest,PrettyTimeNanosec)53 TEST(UtilitiesTest, PrettyTimeNanosec) {}
54 
TEST(UtilitiesTest,WordyTime)55 TEST(UtilitiesTest, WordyTime) {
56 
57   ASSERT_EQ(Utilities::WordyTime(787200), "9 days 2:40:00");
58 
59 }
60 
TEST(UtilitiesTest,WordyTimeNanosec)61 TEST(UtilitiesTest, WordyTimeNanosec) {}
62 
TEST(UtilitiesTest,Ago)63 TEST(UtilitiesTest, Ago) {
64 
65   ASSERT_EQ(Utilities::Ago(QDateTime::currentDateTime().toSecsSinceEpoch() - 604800, QLocale()), "7 days ago");
66 
67 }
68 
TEST(UtilitiesTest,PrettyFutureDate)69 TEST(UtilitiesTest, PrettyFutureDate) {}
70 
TEST(UtilitiesTest,PrettySize)71 TEST(UtilitiesTest, PrettySize) {
72 
73   ASSERT_EQ(Utilities::PrettySize(787200), "787.2 KB");
74 
75 }
76 
TEST(UtilitiesTest,ColorToRgba)77 TEST(UtilitiesTest, ColorToRgba) {
78 
79   ASSERT_EQ(Utilities::ColorToRgba(QColor(33, 22, 128)), "rgba(33, 22, 128, 255)");
80 
81 }
82 
TEST(UtilitiesTest,HmacFunctions)83 TEST(UtilitiesTest, HmacFunctions) {
84 
85   QString key("key");
86   QString data("The quick brown fox jumps over the lazy dog");
87 
88   // Test Hmac MD5
89   QString result_hash_md5 = Utilities::HmacMd5(key.toLocal8Bit(), data.toLocal8Bit()).toHex();
90   bool result_md5 = result_hash_md5 == QString("80070713463e7749b90c2dc24911e275");
91   EXPECT_TRUE(result_md5);
92 
93   // Test Hmac SHA256
94   QString result_hash_sha256 = Utilities::HmacSha256(key.toLocal8Bit(), data.toLocal8Bit()).toHex();
95   bool result_sha256 = result_hash_sha256 == QString("f7bc83f430538424b13298e6aa6fb143ef4d59a14946175997479dbc2d1a3cd8");
96   EXPECT_TRUE(result_sha256);
97 
98 }
99 
TEST(UtilitiesTest,PrettySize2)100 TEST(UtilitiesTest, PrettySize2) {
101 
102   ASSERT_EQ(Utilities::PrettySize(QSize(22, 32)), "22x32");
103 
104 }
105 
TEST(UtilitiesTest,ParseRFC822DateTime)106 TEST(UtilitiesTest, ParseRFC822DateTime) {
107 
108   QDateTime result_DateTime = Utilities::ParseRFC822DateTime(QString("22 Feb 2008 00:16:17 GMT"));
109   EXPECT_TRUE(result_DateTime.isValid());
110 
111   result_DateTime = Utilities::ParseRFC822DateTime(QString("Thu, 13 Dec 2012 13:27:52 +0000"));
112   EXPECT_TRUE(result_DateTime.isValid());
113 
114   result_DateTime = Utilities::ParseRFC822DateTime(QString("Mon, 12 March 2012 20:00:00 +0100"));
115   EXPECT_TRUE(result_DateTime.isValid());
116 
117 }
118 
TEST(UtilitiesTest,DecodeHtmlEntities)119 TEST(UtilitiesTest, DecodeHtmlEntities) {
120 
121   ASSERT_EQ(Utilities::DecodeHtmlEntities("&amp;"), "&");
122   ASSERT_EQ(Utilities::DecodeHtmlEntities("&#38;"), "&");
123   ASSERT_EQ(Utilities::DecodeHtmlEntities("&quot;"), "\"");
124   ASSERT_EQ(Utilities::DecodeHtmlEntities("&#34;"), "\"");
125   ASSERT_EQ(Utilities::DecodeHtmlEntities("&apos;"), "'");
126   ASSERT_EQ(Utilities::DecodeHtmlEntities("&#39;"), "'");
127   ASSERT_EQ(Utilities::DecodeHtmlEntities("&lt;"), "<");
128   ASSERT_EQ(Utilities::DecodeHtmlEntities("&#60;"), "<");
129   ASSERT_EQ(Utilities::DecodeHtmlEntities("&gt;"), ">");
130   ASSERT_EQ(Utilities::DecodeHtmlEntities("&#62;"), ">");
131 
132 }
133 
TEST(UtilitiesTest,PathWithoutFilenameExtension)134 TEST(UtilitiesTest, PathWithoutFilenameExtension) {
135 
136   ASSERT_EQ(Utilities::PathWithoutFilenameExtension("/home/jonas/test/filename.txt"), "/home/jonas/test/filename");
137 
138 }
139 
TEST(UtilitiesTest,FiddleFileExtension)140 TEST(UtilitiesTest, FiddleFileExtension) {
141 
142   ASSERT_EQ(Utilities::FiddleFileExtension("/home/jonas/test/filename.txt", "db"), "/home/jonas/test/filename.db");
143 
144 }
145 
TEST(UtilitiesTest,SetEnvGetEnv)146 TEST(UtilitiesTest, SetEnvGetEnv) {
147 
148   QString var = "STRAWBERRY_UNIT_TEST_" + Utilities::GetRandomStringWithCharsAndNumbers(20);
149   QString value = "STRAWBERRY_UNIT_TEST_" + Utilities::GetRandomStringWithCharsAndNumbers(20);
150 
151   Utilities::SetEnv(var.toUtf8(), value);
152   ASSERT_EQ(Utilities::GetEnv(var), value);
153   Utilities::SetEnv(var.toUtf8(), "");
154 
155 }
156 
TEST(UtilitiesTest,Random)157 TEST(UtilitiesTest, Random) {
158 
159   EXPECT_FALSE(Utilities::GetRandomStringWithChars(20) == Utilities::GetRandomStringWithChars(20));
160 
161   EXPECT_FALSE(Utilities::GetRandomStringWithCharsAndNumbers(20) == Utilities::GetRandomStringWithCharsAndNumbers(20));
162 
163   EXPECT_FALSE(Utilities::CryptographicRandomString(20) == Utilities::CryptographicRandomString(20));
164 
165   EXPECT_FALSE(Utilities::GetRandomString(20, "&%XVBGQ") == Utilities::GetRandomString(20, "&%XVBGQ"));
166 
167 }
168 
TEST(UtilitiesTest,UnicodeToAscii)169 TEST(UtilitiesTest, UnicodeToAscii) {
170 
171   ASSERT_EQ(Utilities::UnicodeToAscii("ÆØÅ"), "AEOA");
172 
173 }
174 
TEST(UtilitiesTest,ReplaceVariable)175 TEST(UtilitiesTest, ReplaceVariable) {
176 
177   Song song;
178   song.set_title(Utilities::GetRandomStringWithChars(8));
179   song.set_album(Utilities::GetRandomStringWithChars(8));
180   song.set_artist(Utilities::GetRandomStringWithChars(8));
181   song.set_albumartist(Utilities::GetRandomStringWithChars(8));
182   song.set_track(5);
183   song.set_disc(2);
184   song.set_year(1999);
185   song.set_originalyear(2000);
186   song.set_genre(Utilities::GetRandomStringWithChars(8));
187   song.set_composer(Utilities::GetRandomStringWithChars(8));
188   song.set_performer(Utilities::GetRandomStringWithChars(8));
189   song.set_grouping(Utilities::GetRandomStringWithChars(8));
190   song.set_length_nanosec(900000000000);
191   song.set_url(QUrl("file:///home/jonas/Music/test_song.flac"));
192   song.set_skipcount(20);
193   song.set_playcount(90);
194   song.set_rating(1.0);
195 
196   ASSERT_EQ(Utilities::ReplaceVariable("%title%", song, ""), song.title());
197   ASSERT_EQ(Utilities::ReplaceVariable("%album%", song, ""), song.album());
198   ASSERT_EQ(Utilities::ReplaceVariable("%artist%", song, ""), song.artist());
199   ASSERT_EQ(Utilities::ReplaceVariable("%albumartist%", song, ""), song.effective_albumartist());
200   ASSERT_EQ(Utilities::ReplaceVariable("%track%", song, ""), QString::number(song.track()));
201   ASSERT_EQ(Utilities::ReplaceVariable("%disc%", song, ""), QString::number(song.disc()));
202   ASSERT_EQ(Utilities::ReplaceVariable("%year%", song, ""), QString::number(song.year()));
203   ASSERT_EQ(Utilities::ReplaceVariable("%originalyear%", song, ""), QString::number(song.originalyear()));
204   ASSERT_EQ(Utilities::ReplaceVariable("%genre%", song, ""), song.genre());
205   ASSERT_EQ(Utilities::ReplaceVariable("%composer%", song, ""), song.composer());
206   ASSERT_EQ(Utilities::ReplaceVariable("%performer%", song, ""), song.performer());
207   ASSERT_EQ(Utilities::ReplaceVariable("%grouping%", song, ""), song.grouping());
208   ASSERT_EQ(Utilities::ReplaceVariable("%length%", song, ""), song.PrettyLength());
209   ASSERT_EQ(Utilities::ReplaceVariable("%filename%", song, ""), song.basefilename());
210   ASSERT_EQ(Utilities::ReplaceVariable("%url%", song, ""), song.url().toString());
211   ASSERT_EQ(Utilities::ReplaceVariable("%playcount%", song, ""), QString::number(song.playcount()));
212   ASSERT_EQ(Utilities::ReplaceVariable("%skipcount%", song, ""), QString::number(song.skipcount()));
213   ASSERT_EQ(Utilities::ReplaceVariable("%rating%", song, ""), song.PrettyRating());
214 
215 }
216 
TEST(UtilitiesTest,ReplaceMessage)217 TEST(UtilitiesTest, ReplaceMessage) {
218 
219   Song song;
220   song.set_title(Utilities::GetRandomStringWithChars(8));
221   song.set_album(Utilities::GetRandomStringWithChars(8));
222   song.set_artist(Utilities::GetRandomStringWithChars(8));
223   song.set_albumartist(Utilities::GetRandomStringWithChars(8));
224   song.set_track(5);
225   song.set_disc(2);
226   song.set_year(1999);
227   song.set_originalyear(2000);
228   song.set_genre(Utilities::GetRandomStringWithChars(8));
229   song.set_composer(Utilities::GetRandomStringWithChars(8));
230   song.set_performer(Utilities::GetRandomStringWithChars(8));
231   song.set_grouping(Utilities::GetRandomStringWithChars(8));
232   song.set_length_nanosec(900000000000);
233   song.set_url(QUrl("file:///home/jonas/Music/test_song.flac"));
234   song.set_skipcount(20);
235   song.set_playcount(90);
236   song.set_rating(1.0);
237 
238   ASSERT_EQ(Utilities::ReplaceMessage("%title% - %artist%", song, ""), song.title() + " - " + song.artist());
239 
240 }
241