loadertest.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478
  1. /*
  2. * <one line to give the library's name and an idea of what it does.>
  3. * Copyright 2015 <copyright holder> <email>
  4. *
  5. * This program is free software; you can redistribute it and/or
  6. * modify it under the terms of the GNU General Public License as
  7. * published by the Free Software Foundation; either version 2 of
  8. * the License or (at your option) version 3 or any later version
  9. * accepted by the membership of KDE e.V. (or its successor approved
  10. * by the membership of KDE e.V.), which shall act as a proxy
  11. * defined in Section 14 of version 3 of the license.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  20. *
  21. */
  22. #include "loadertest.h"
  23. #include <QtTest/QtTest>
  24. #include <QtTest/QSignalSpy>
  25. void LoaderTest::initTestCase()
  26. {
  27. m_loader = new TestLoader;
  28. m_rpms << (QList<QString *>() << new QString << new QString << new QString);
  29. m_rpms << (QList<QString *>() << new QString << new QString << new QString);
  30. m_temps << (QList<QString *>() << new QString << new QString << new QString);
  31. m_temps << (QList<QString *>() << new QString << new QString << new QString);
  32. m_pwms << (QList<QString *>() << new QString << new QString);
  33. m_pwms << (QList<QString *>() << new QString << new QString);
  34. m_pwmModes << (QList<QString *>() << new QString << new QString);
  35. m_pwmModes << (QList<QString *>() << new QString << new QString);
  36. QCOMPARE(m_loader->hwmons().size(), 0);
  37. m_loader->addHwmon(new TestHwmon("radeon", m_rpms.at(0), m_pwms.at(0), m_pwmModes.at(0), m_temps.at(0), 0, m_loader));
  38. m_loader->addHwmon(new TestHwmon("coretemp", m_rpms.at(1), m_pwms.at(1), m_pwmModes.at(1), m_temps.at(1), 1, m_loader));
  39. QCOMPARE(m_loader->hwmons().size(), 2);
  40. }
  41. void LoaderTest::cleanupTestCase()
  42. {
  43. delete m_loader;
  44. }
  45. void LoaderTest::init()
  46. {
  47. // Called before each testfunction is executed
  48. }
  49. void LoaderTest::cleanup()
  50. {
  51. // Called after every testfunction
  52. }
  53. void LoaderTest::parseIntervalTest_data()
  54. {
  55. QTest::addColumn<QString>("config");
  56. QTest::addColumn<int>("result");
  57. QTest::addColumn<QString>("error");
  58. QTest::addColumn<bool>("critical");
  59. QTest::newRow("valid4") << "INTERVAL=4" << 4 << "" << false;
  60. QTest::newRow("valid2") << "INTERVAL=2" << 2 << "" << false;
  61. QTest::newRow("valid2") << "INTERVAL= 3" << 3 << "" << false;
  62. QTest::newRow("invalid0") << "INTERVAL=0" << 0 << "Interval must be greater or equal to one!" << true;
  63. QTest::newRow("invalid6") << "INTERVA=6" << 6 << "Unrecognized line in config: \"INTERVA=6\"" << true;
  64. QTest::newRow("invalid1") << "INTEVAL=1" << 1 << "Unrecognized line in config: \"INTEVAL=1\"" << true;
  65. }
  66. void LoaderTest::parseIntervalTest()
  67. {
  68. QFETCH(QString, config);
  69. QFETCH(int, result);
  70. QFETCH(QString, error);
  71. QFETCH(bool, critical);
  72. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  73. m_loader->parse(config);
  74. QCOMPARE(spy.isEmpty(), error.isEmpty());
  75. if (spy.count())
  76. {
  77. QCOMPARE(spy.at(0).at(0).toString(), error);
  78. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  79. }
  80. else
  81. QCOMPARE(m_loader->interval(), result);
  82. }
  83. void LoaderTest::parseFctempTest_data()
  84. {
  85. QTest::addColumn<QString>("config");
  86. QTest::addColumn<PwmFan *>("fan");
  87. QTest::addColumn<Temp *>("temp");
  88. QTest::addColumn<QString>("error");
  89. QTest::addColumn<bool>("critical");
  90. QTest::newRow("fan02temp11") << "FCTEMPS=hwmon0/fan2=hwmon1/temp1" << m_loader->hwmons().at(0)->pwmFan(1) << m_loader->hwmons().at(1)->temp(0) << "" << false;
  91. QTest::newRow("fan11temp03") << "FCTEMPS=hwmon1/fan1=hwmon0/temp3" << m_loader->hwmons().at(1)->pwmFan(0) << m_loader->hwmons().at(0)->temp(2) << "" << false;
  92. QTest::newRow("fan12temp12") << "FCTEMPS=hwmon1/fan2=hwmon1/temp2" << m_loader->hwmons().at(1)->pwmFan(1) << m_loader->hwmons().at(1)->temp(1) << "" << false;
  93. QTest::newRow("invalid0") << "FCTEMPS=hwmon2/fan1=hwmon0/temp3" << static_cast<PwmFan *>(Q_NULLPTR) << m_loader->hwmons().at(0)->temp(2) << "Invalid fan entry: \"hwmon2/fan1\"" << true;
  94. QTest::newRow("invalid1") << "FCTEMPS=hwmon0/fan1=hwmon0/temp4" << m_loader->hwmons().at(0)->pwmFan(0) << static_cast<Temp *>(Q_NULLPTR) << "Invalid temp entry: \"hwmon0/temp4\"" << true;
  95. }
  96. void LoaderTest::parseFctempTest()
  97. {
  98. QFETCH(QString, config);
  99. QFETCH(PwmFan *, fan);
  100. QFETCH(Temp *, temp);
  101. QFETCH(QString, error);
  102. QFETCH(bool, critical);
  103. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  104. m_loader->parse(config);
  105. QCOMPARE(spy.isEmpty(), error.isEmpty());
  106. if (fan)
  107. QCOMPARE(fan->temp(), temp);
  108. if (spy.count())
  109. {
  110. QCOMPARE(spy.at(0).at(0).toString(), error);
  111. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  112. }
  113. else
  114. QCOMPARE(fan->hasTemp(), true);
  115. }
  116. void LoaderTest::parseDevnameTest_data()
  117. {
  118. QTest::addColumn<QString>("config");
  119. QTest::addColumn<QString>("error");
  120. QTest::addColumn<bool>("critical");
  121. QTest::newRow("valid0") << "DEVNAME=hwmon0=radeon" << "" << false;
  122. QTest::newRow("valid1") << "DEVNAME=hwmon1=coretemp" << "" << false;
  123. QTest::newRow("valid2") << "DEVNAME=hwmon0=radeon hwmon1=coretemp" << "" << false;
  124. QTest::newRow("valid3") << "DEVNAME= hwmon1=coretemp hwmon0=radeon" << "" << false;
  125. QTest::newRow("invalid0") << "DEVNAME=hwmon2=radeon" << "Invalid DEVNAME: \"hwmon2=radeon\"! No hwmon with index 2" << true;
  126. QTest::newRow("invalid0") << "DEVNAME=hwmon1=radeon" << "Wrong name for hwmon 1! Should be \"coretemp\"" << true;
  127. }
  128. void LoaderTest::parseDevnameTest()
  129. {
  130. QFETCH(QString, config);
  131. QFETCH(QString, error);
  132. QFETCH(bool, critical);
  133. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  134. m_loader->parse(config);
  135. QCOMPARE(spy.isEmpty(), error.isEmpty());
  136. if (spy.count())
  137. {
  138. QCOMPARE(spy.at(0).at(0).toString(), error);
  139. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  140. }
  141. }
  142. void LoaderTest::parseMintempTest_data()
  143. {
  144. QTest::addColumn<QString>("config");
  145. QTest::addColumn<PwmFan *>("fan");
  146. QTest::addColumn<int>("result");
  147. QTest::addColumn<QString>("error");
  148. QTest::addColumn<bool>("critical");
  149. QTest::newRow("valid01") << "MINTEMP=hwmon0/fan1=20" << m_loader->pwmFan(0, 0) << 20 << "" << false;
  150. QTest::newRow("valid12") << "MINTEMP=hwmon1/fan2=35" << m_loader->pwmFan(1, 1) << 35 << "" << false;
  151. QTest::newRow("valid02") << "MINTEMP=hwmon0/fan2=-35" << m_loader->pwmFan(0, 1) << -35 << "" << false;
  152. QTest::newRow("valid11") << "MINTEMP= hwmon1/fan1=40" << m_loader->pwmFan(1, 0) << 40 << "" << false;
  153. }
  154. void LoaderTest::parseMintempTest()
  155. {
  156. QFETCH(QString, config);
  157. QFETCH(PwmFan *, fan);
  158. QFETCH(int, result);
  159. QFETCH(QString, error);
  160. QFETCH(bool, critical);
  161. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  162. m_loader->parse(config);
  163. QCOMPARE(spy.isEmpty(), error.isEmpty());
  164. if (spy.count())
  165. {
  166. QCOMPARE(spy.at(0).at(0).toString(), error);
  167. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  168. }
  169. else
  170. QCOMPARE(fan->minTemp(), result);
  171. }
  172. void LoaderTest::parseMaxtempTest_data()
  173. {
  174. QTest::addColumn<QString>("config");
  175. QTest::addColumn<PwmFan *>("fan");
  176. QTest::addColumn<int>("result");
  177. QTest::addColumn<QString>("error");
  178. QTest::addColumn<bool>("critical");
  179. QTest::newRow("valid01") << "MAXTEMP=hwmon0/fan1=80" << m_loader->pwmFan(0, 0) << 80 << "" << false;
  180. QTest::newRow("valid12") << "MAXTEMP=hwmon1/fan2=78 #iuf" << m_loader->pwmFan(1, 1) << 78 << "" << false;
  181. QTest::newRow("valid02") << "MAXTEMP=hwmon0/fan2=-78" << m_loader->pwmFan(0, 1) << -78 << "" << false;
  182. QTest::newRow("valid11") << "MAXTEMP= hwmon1/fan1=53" << m_loader->pwmFan(1, 0) << 53 << "" << false;
  183. }
  184. void LoaderTest::parseMaxtempTest()
  185. {
  186. QFETCH(QString, config);
  187. QFETCH(PwmFan *, fan);
  188. QFETCH(int, result);
  189. QFETCH(QString, error);
  190. QFETCH(bool, critical);
  191. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  192. m_loader->parse(config);
  193. QCOMPARE(spy.isEmpty(), error.isEmpty());
  194. if (spy.count())
  195. {
  196. QCOMPARE(spy.at(0).at(0).toString(), error);
  197. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  198. }
  199. else
  200. QCOMPARE(fan->maxTemp(), result);
  201. }
  202. void LoaderTest::parseMinstartTest_data()
  203. {
  204. QTest::addColumn<QString>("config");
  205. QTest::addColumn<PwmFan *>("fan");
  206. QTest::addColumn<int>("result");
  207. QTest::addColumn<QString>("error");
  208. QTest::addColumn<bool>("critical");
  209. QTest::newRow("valid01") << "MINSTART=hwmon0/fan1=20" << m_loader->pwmFan(0, 0) << 20 << "" << false;
  210. QTest::newRow("valid12") << "MINSTART=hwmon1/fan2=35" << m_loader->pwmFan(1, 1) << 35 << "" << false;
  211. QTest::newRow("valid02") << "MINSTART=hwmon0/fan2=0#rtg" << m_loader->pwmFan(0, 1) << 0 << "" << false;
  212. QTest::newRow("valid11") << "MINSTART= hwmon1/fan1=40" << m_loader->pwmFan(1, 0) << 40 << "" << false;
  213. }
  214. void LoaderTest::parseMinstartTest()
  215. {
  216. QFETCH(QString, config);
  217. QFETCH(PwmFan *, fan);
  218. QFETCH(int, result);
  219. QFETCH(QString, error);
  220. QFETCH(bool, critical);
  221. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  222. m_loader->parse(config);
  223. QCOMPARE(spy.isEmpty(), error.isEmpty());
  224. if (spy.count())
  225. {
  226. QCOMPARE(spy.at(0).at(0).toString(), error);
  227. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  228. }
  229. else
  230. QCOMPARE(fan->minStart(), result);
  231. }
  232. void LoaderTest::parseMinstopTest_data()
  233. {
  234. QTest::addColumn<QString>("config");
  235. QTest::addColumn<PwmFan *>("fan");
  236. QTest::addColumn<int>("result");
  237. QTest::addColumn<QString>("error");
  238. QTest::addColumn<bool>("critical");
  239. QTest::newRow("valid01") << "MINSTOP=hwmon0/fan1=20" << m_loader->pwmFan(0, 0) << 20 << "" << false;
  240. QTest::newRow("valid12") << "MINSTOP=hwmon1/fan2=35" << m_loader->pwmFan(1, 1) << 35 << "" << false;
  241. QTest::newRow("valid02") << "MINSTOP=hwmon0/fan2=0" << m_loader->pwmFan(0, 1) << 0 << "" << false;
  242. QTest::newRow("valid11") << "MINSTOP= hwmon1/fan1=40" << m_loader->pwmFan(1, 0) << 40 << "" << false;
  243. }
  244. void LoaderTest::parseMinstopTest()
  245. {
  246. QFETCH(QString, config);
  247. QFETCH(PwmFan *, fan);
  248. QFETCH(int, result);
  249. QFETCH(QString, error);
  250. QFETCH(bool, critical);
  251. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  252. m_loader->parse(config);
  253. QCOMPARE(spy.isEmpty(), error.isEmpty());
  254. if (spy.count())
  255. {
  256. QCOMPARE(spy.at(0).at(0).toString(), error);
  257. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  258. }
  259. else
  260. QCOMPARE(fan->minStop(), result);
  261. }
  262. void LoaderTest::parseMinpwmTest_data()
  263. {
  264. QTest::addColumn<QString>("config");
  265. QTest::addColumn<PwmFan *>("fan");
  266. QTest::addColumn<int>("result");
  267. QTest::addColumn<QString>("error");
  268. QTest::addColumn<bool>("critical");
  269. QTest::newRow("valid01") << "MINPWM=hwmon0/fan1=20#fgiuh" << m_loader->pwmFan(0, 0) << 20 << "" << false;
  270. QTest::newRow("valid12") << "MINPWM=hwmon1/fan2=35" << m_loader->pwmFan(1, 1) << 35 << "" << false;
  271. QTest::newRow("valid02") << "MINPWM=hwmon0/fan2=0" << m_loader->pwmFan(0, 1) << 0 << "" << false;
  272. QTest::newRow("valid11") << "MINPWM= hwmon1/fan1=40" << m_loader->pwmFan(1, 0) << 40 << "" << false;
  273. QTest::newRow("invalid02") << "MINPWM=hwmon0/fan2=256" << m_loader->pwmFan(0, 1) << 256 << "MinPwm cannot exceed 0-255!" << true;
  274. QTest::newRow("invalid11") << "MINPWM=hwmon1/fan2=-2" << m_loader->pwmFan(1, 1) << -2 << "MinPwm cannot exceed 0-255!" << true;
  275. }
  276. void LoaderTest::parseMinpwmTest()
  277. {
  278. QFETCH(QString, config);
  279. QFETCH(PwmFan *, fan);
  280. QFETCH(int, result);
  281. QFETCH(QString, error);
  282. QFETCH(bool, critical);
  283. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  284. m_loader->parse(config);
  285. QCOMPARE(spy.isEmpty(), error.isEmpty());
  286. if (spy.count())
  287. {
  288. QCOMPARE(spy.at(0).at(0).toString(), error);
  289. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  290. }
  291. else
  292. QCOMPARE(fan->minPwm(), result);
  293. }
  294. void LoaderTest::parseMaxpwmTest_data()
  295. {
  296. QTest::addColumn<QString>("config");
  297. QTest::addColumn<PwmFan *>("fan");
  298. QTest::addColumn<int>("result");
  299. QTest::addColumn<QString>("error");
  300. QTest::addColumn<bool>("critical");
  301. QTest::newRow("valid01") << "MAXPWM=hwmon0/fan1=20" << m_loader->pwmFan(0, 0) << 20 << "" << false;
  302. QTest::newRow("valid12") << "MAXPWM=hwmon1/fan2=35 #uivnriuhgfdn" << m_loader->pwmFan(1, 1) << 35 << "" << false;
  303. QTest::newRow("valid02") << "MAXPWM=hwmon0/fan2=0" << m_loader->pwmFan(0, 1) << 0 << "" << false;
  304. QTest::newRow("valid11") << "MAXPWM= hwmon1/fan1=40" << m_loader->pwmFan(1, 0) << 40 << "" << false;
  305. QTest::newRow("invalid02") << "MAXPWM=hwmon0/fan2=256" << m_loader->pwmFan(0, 1) << 256 << "MaxPwm cannot exceed 0-255!" << true;
  306. QTest::newRow("invalid11") << "MAXPWM=hwmon1/fan2=-2" << m_loader->pwmFan(1, 1) << -2 << "MaxPwm cannot exceed 0-255!" << true;
  307. }
  308. void LoaderTest::parseMaxpwmTest()
  309. {
  310. QFETCH(QString, config);
  311. QFETCH(PwmFan *, fan);
  312. QFETCH(int, result);
  313. QFETCH(QString, error);
  314. QFETCH(bool, critical);
  315. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  316. m_loader->parse(config);
  317. QCOMPARE(spy.isEmpty(), error.isEmpty());
  318. if (spy.count())
  319. {
  320. QCOMPARE(spy.at(0).at(0).toString(), error);
  321. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  322. }
  323. else
  324. QCOMPARE(fan->maxPwm(), result);
  325. }
  326. void LoaderTest::parseUnrecognizableLineTest_data()
  327. {
  328. QTest::addColumn<QString>("config");
  329. QTest::addColumn<QString>("error");
  330. QTest::addColumn<bool>("critical");
  331. QTest::newRow("valid01") << "MMAXPWM=hwmon0/fan1=20" << "Unrecognized line in config: \"MMAXPWM=hwmon0/fan1=20\"" << true;
  332. }
  333. void LoaderTest::parseUnrecognizableLineTest()
  334. {
  335. QFETCH(QString, config);
  336. QFETCH(QString, error);
  337. QFETCH(bool, critical);
  338. QSignalSpy spy(m_loader, SIGNAL(error(QString, bool)));
  339. m_loader->parse(config);
  340. QCOMPARE(spy.count(), 1);
  341. if (spy.count())
  342. {
  343. QCOMPARE(spy.at(0).at(0).toString(), error);
  344. QCOMPARE(spy.at(0).at(1).toBool(), critical);
  345. }
  346. }
  347. void LoaderTest::createConfigTest()
  348. {
  349. auto pwmFan = m_loader->pwmFan(0, 0);
  350. pwmFan->setTemp(m_loader->temp(1, 0));
  351. pwmFan->setMinTemp(20);
  352. pwmFan->setMaxTemp(60);
  353. pwmFan->setMaxPwm(200);
  354. pwmFan->setMinPwm(100);
  355. pwmFan->setMinStart(120);
  356. pwmFan->setMinStop(80);
  357. pwmFan = m_loader->pwmFan(1, 1);
  358. pwmFan->setTemp(m_loader->temp(1, 2));
  359. pwmFan->setMinTemp(30);
  360. pwmFan->setMaxTemp(70);
  361. pwmFan->setMaxPwm(255);
  362. pwmFan->setMinPwm(120);
  363. pwmFan->setMinStart(110);
  364. pwmFan->setMinStop(75);
  365. m_loader->setInterval(5);
  366. auto config = m_loader->createConfig();
  367. QString expectedConfig = "# This file was created by Fancontrol-GUI\n"
  368. "INTERVAL=5\n"
  369. "DEVPATH=hwmon0= hwmon1= \n"
  370. "DEVNAME=hwmon0=radeon hwmon1=coretemp \n"
  371. "FCTEMPS=hwmon0/pwm0=hwmon1/temp0_input hwmon1/pwm1=hwmon1/temp2_input \n"
  372. "FCFANS=hwmon0/pwm0=hwmon0/fan0_input hwmon1/pwm1=hwmon1/fan1_input \n"
  373. "MINTEMP=hwmon0/pwm0=20 hwmon1/pwm1=30 \n"
  374. "MAXTEMP=hwmon0/pwm0=60 hwmon1/pwm1=70 \n"
  375. "MINSTART=hwmon0/pwm0=120 hwmon1/pwm1=110 \n"
  376. "MINSTOP=hwmon0/pwm0=80 hwmon1/pwm1=75 \n"
  377. "MINPWM=hwmon0/pwm0=100 hwmon1/pwm1=120 \n"
  378. "MAXPWM=hwmon0/pwm0=200 hwmon1/pwm1=255 \n";
  379. auto expectedLines = expectedConfig.split(QChar(QChar::LineFeed));
  380. auto configLines = config.split(QChar(QChar::LineFeed));
  381. QCOMPARE(configLines.size(), expectedLines.size());
  382. for (auto i=0; i<configLines.size(); i++)
  383. QCOMPARE(configLines.at(i), expectedLines.at(i));
  384. }
  385. QTEST_MAIN(LoaderTest);