test-utils.c 89 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467
  1. /*
  2. * Copyright © 2014 Red Hat, Inc.
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the next
  12. * paragraph) shall be included in all copies or substantial portions of the
  13. * Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. */
  23. #include <config.h>
  24. #include <errno.h>
  25. #include <fcntl.h>
  26. #include <unistd.h>
  27. #include <valgrind/valgrind.h>
  28. #include "util-bits.h"
  29. #include "util-files.h"
  30. #include "util-input-event.h"
  31. #include "util-list.h"
  32. #include "util-macros.h"
  33. #include "util-matrix.h"
  34. #include "util-mem.h"
  35. #include "util-newtype.h"
  36. #include "util-prop-parsers.h"
  37. #include "util-range.h"
  38. #include "util-ratelimit.h"
  39. #include "util-stringbuf.h"
  40. #include "util-strings.h"
  41. #include "util-time.h"
  42. #include "evdev-frame.h"
  43. #include "litest-runner.h"
  44. #include "litest.h"
  45. #define TEST_VERSIONSORT
  46. #include "libinput-versionsort.h"
  47. START_TEST(auto_test)
  48. {
  49. /* This one is just a compile test */
  50. auto tv = usec_to_timeval(usec_from_uint64_t(0));
  51. tv.tv_sec = 0;
  52. litest_assert_int_eq(tv.tv_sec, 0);
  53. }
  54. END_TEST
  55. START_TEST(mkdir_p_test)
  56. {
  57. const char *testdir = "/tmp/litest_mkdir_test";
  58. litest_assert_neg_errno_success(mkdir_p("/"));
  59. rmdir(testdir);
  60. litest_assert_neg_errno_success(mkdir_p(testdir));
  61. /* EEXIST is not an error */
  62. litest_assert_neg_errno_success(mkdir_p(testdir));
  63. rmdir(testdir);
  64. int ret = mkdir_p("/proc/foo");
  65. litest_assert_msg(ret == -ENOENT || ret == -EACCES,
  66. "mkdir_p(\"/proc/foo\") returned %d\n",
  67. ret);
  68. }
  69. END_TEST
  70. START_TEST(rmdir_r_test)
  71. {
  72. const char *testdir = "/tmp/litest_rmdir_test";
  73. _autofree_ char *path = strdup_printf("%s/foo/bar/baz", testdir);
  74. mkdir_p(path);
  75. _autofree_ char *f1 = strdup_printf("%s/remain", testdir);
  76. _autofree_ char *f2 = strdup_printf("%s/foo/remove", testdir);
  77. _autofree_ char *f3 = strdup_printf("%s/foo/bar/to-remove", testdir);
  78. _autofree_ char *f4 = strdup_printf("%s/foo/bar/baz/wipeme", testdir);
  79. litest_assert_errno_success(close(open(f1, O_WRONLY | O_CREAT, 0644)));
  80. litest_assert_errno_success(close(open(f2, O_WRONLY | O_CREAT, 0644)));
  81. litest_assert_errno_success(close(open(f3, O_WRONLY | O_CREAT, 0644)));
  82. litest_assert_errno_success(close(open(f4, O_WRONLY | O_CREAT, 0644)));
  83. struct stat st;
  84. litest_assert_errno_success(stat(f1, &st));
  85. litest_assert_errno_success(stat(f2, &st));
  86. litest_assert_errno_success(stat(f3, &st));
  87. litest_assert_errno_success(stat(f4, &st));
  88. _autofree_ char *rmpath = strdup_printf("%s/foo/", testdir);
  89. int rc = rmdir_r(rmpath);
  90. litest_assert_neg_errno_success(rc);
  91. litest_assert_errno_success(stat(f1, &st));
  92. litest_assert_errno_success(stat(testdir, &st));
  93. rc = stat(f2, &st) < 0 ? -errno : 0;
  94. litest_assert_int_eq(rc, -ENOENT);
  95. rc = stat(f3, &st) < 0 ? -errno : 0;
  96. litest_assert_int_eq(rc, -ENOENT);
  97. rc = stat(f4, &st) < 0 ? -errno : 0;
  98. litest_assert_int_eq(rc, -ENOENT);
  99. }
  100. END_TEST
  101. START_TEST(tmpdir_test)
  102. {
  103. _autofree_ char *tmpdir_path = NULL;
  104. {
  105. _destroy_(tmpdir) *tmpdir = tmpdir_create(NULL);
  106. tmpdir_path = safe_strdup(tmpdir->path);
  107. _autofree_ char *f1 = strdup_printf("%s/wipeme", tmpdir_path);
  108. litest_assert_errno_success(close(open(f1, O_WRONLY | O_CREAT, 0644)));
  109. }
  110. struct stat st;
  111. int rc = stat(tmpdir_path, &st) < 0 ? -errno : 0;
  112. litest_assert_int_eq(rc, -ENOENT);
  113. }
  114. END_TEST
  115. START_TEST(find_files_test)
  116. {
  117. _autofree_ char *dirname = strdup("/tmp/litest_find_files_test.XXXXXX");
  118. mkdtemp(dirname);
  119. _autofree_ char *d1 = strdup_printf("%s/d1", dirname);
  120. _autofree_ char *d2 = strdup_printf("%s/d2", dirname);
  121. _autofree_ char *d3 = strdup_printf("%s/d3", dirname);
  122. litest_assert_neg_errno_success(mkdir_p(d1));
  123. litest_assert_neg_errno_success(mkdir_p(d2));
  124. litest_assert_neg_errno_success(mkdir_p(d3));
  125. /* clang-format off */
  126. struct f {
  127. const char *name;
  128. const char *dir1;
  129. const char *dir2;
  130. const char *dir3;
  131. char *expected;
  132. } files[] = {
  133. { "10-abc.suf", d1, d2, d3 },
  134. { "20-def.suf", d1, NULL, d3 },
  135. { "30-ghi.suf", d1, d2, NULL },
  136. { "40-jkl.suf", NULL, d2, NULL },
  137. { "50-mno.suf", NULL, d2, d3 },
  138. { "60-pgr.suf", NULL, NULL, d3 },
  139. { "70-abc.suf", NULL, NULL, d3 },
  140. { "21-xyz.fix", NULL, NULL, d3 },
  141. { "35-uvw.fix", NULL, d2, d3 },
  142. { "70-rst.fix", d1, NULL, d3 },
  143. { NULL },
  144. };
  145. /* clang-format on */
  146. for (struct f *f = files; f->name; f++) {
  147. if (f->dir1) {
  148. _autofree_ char *path =
  149. strdup_printf("%s/%s", f->dir1, f->name);
  150. close(open(path, O_WRONLY | O_CREAT, 0644));
  151. f->expected = steal(&path);
  152. }
  153. if (f->dir2) {
  154. _autofree_ char *path =
  155. strdup_printf("%s/%s", f->dir2, f->name);
  156. close(open(path, O_WRONLY | O_CREAT, 0644));
  157. if (!f->expected)
  158. f->expected = steal(&path);
  159. }
  160. if (f->dir3) {
  161. _autofree_ char *path =
  162. strdup_printf("%s/%s", f->dir3, f->name);
  163. close(open(path, O_WRONLY | O_CREAT, 0644));
  164. if (!f->expected)
  165. f->expected = steal(&path);
  166. }
  167. }
  168. const char *dirs[] = { d1, d2, d3, NULL };
  169. size_t nfiles;
  170. _autostrvfree_ char **paths = list_files(dirs, "suf", &nfiles);
  171. litest_assert_int_eq(nfiles, (size_t)7);
  172. litest_assert_str_eq(paths[0], files[0].expected);
  173. litest_assert_str_eq(paths[1], files[1].expected);
  174. litest_assert_str_eq(paths[2], files[2].expected);
  175. litest_assert_str_eq(paths[3], files[3].expected);
  176. litest_assert_str_eq(paths[4], files[4].expected);
  177. litest_assert_str_eq(paths[5], files[5].expected);
  178. litest_assert_str_eq(paths[6], files[6].expected);
  179. litest_assert_str_eq(paths[7], NULL);
  180. for (struct f *f = files; f->name; f++) {
  181. if (f->dir1) {
  182. _autofree_ char *path =
  183. strdup_printf("%s/%s", f->dir1, f->name);
  184. unlink(path);
  185. }
  186. if (f->dir2) {
  187. _autofree_ char *path =
  188. strdup_printf("%s/%s", f->dir2, f->name);
  189. unlink(path);
  190. }
  191. if (f->dir3) {
  192. _autofree_ char *path =
  193. strdup_printf("%s/%s", f->dir3, f->name);
  194. unlink(path);
  195. }
  196. free(f->expected);
  197. }
  198. rmdir(d1);
  199. rmdir(d2);
  200. rmdir(d3);
  201. rmdir(dirname);
  202. const char *empty[] = { NULL };
  203. _autostrvfree_ char **empty_path = list_files(empty, "suf", &nfiles);
  204. litest_assert_int_eq(nfiles, (size_t)0);
  205. litest_assert_ptr_notnull(empty_path);
  206. litest_assert_ptr_null(empty_path[0]);
  207. _autostrvfree_ char **also_empty_path = list_files(NULL, "suf", &nfiles);
  208. litest_assert_int_eq(nfiles, (size_t)0);
  209. litest_assert_ptr_notnull(also_empty_path);
  210. litest_assert_ptr_null(also_empty_path[0]);
  211. }
  212. END_TEST
  213. START_TEST(array_for_each)
  214. {
  215. int ai[6];
  216. char ac[10];
  217. struct as {
  218. int a;
  219. char b;
  220. int *ptr;
  221. } as[32];
  222. for (size_t i = 0; i < 6; i++)
  223. ai[i] = 20 + i;
  224. for (size_t i = 0; i < 10; i++)
  225. ac[i] = 100 + i;
  226. for (size_t i = 0; i < 32; i++) {
  227. as[i].a = 10 + i;
  228. as[i].b = 20 + i;
  229. as[i].ptr = (int *)0xab + i;
  230. }
  231. int iexpected = 20;
  232. ARRAY_FOR_EACH(ai, entry) {
  233. litest_assert_int_eq(*entry, iexpected);
  234. ++iexpected;
  235. }
  236. litest_assert_int_eq(iexpected, 26);
  237. int cexpected = 100;
  238. ARRAY_FOR_EACH(ac, entry) {
  239. litest_assert_int_eq(*entry, cexpected);
  240. ++cexpected;
  241. }
  242. litest_assert_int_eq(cexpected, 110);
  243. struct as sexpected = {
  244. .a = 10,
  245. .b = 20,
  246. .ptr = (int *)0xab,
  247. };
  248. ARRAY_FOR_EACH(as, entry) {
  249. litest_assert_int_eq(entry->a, sexpected.a);
  250. litest_assert_int_eq(entry->b, sexpected.b);
  251. litest_assert_ptr_eq(entry->ptr, sexpected.ptr);
  252. ++sexpected.a;
  253. ++sexpected.b;
  254. ++sexpected.ptr;
  255. }
  256. litest_assert_int_eq(sexpected.a, 42);
  257. }
  258. END_TEST
  259. START_TEST(bitfield_helpers)
  260. {
  261. /* This value has a bit set on all of the word boundaries we want to
  262. * test: 0, 1, 7, 8, 31, 32, and 33
  263. */
  264. unsigned char read_bitfield[] = { 0x83, 0x1, 0x0, 0x80, 0x3 };
  265. unsigned char write_bitfield[ARRAY_LENGTH(read_bitfield)] = { 0 };
  266. size_t i;
  267. /* Now check that the bitfield we wrote to came out to be the same as
  268. * the bitfield we were writing from */
  269. for (i = 0; i < ARRAY_LENGTH(read_bitfield) * 8; i++) {
  270. switch (i) {
  271. case 0:
  272. case 1:
  273. case 7:
  274. case 8:
  275. case 31:
  276. case 32:
  277. case 33:
  278. litest_assert(bit_is_set(read_bitfield, i));
  279. set_bit(write_bitfield, i);
  280. break;
  281. default:
  282. litest_assert(!bit_is_set(read_bitfield, i));
  283. clear_bit(write_bitfield, i);
  284. break;
  285. }
  286. }
  287. litest_assert_int_eq(
  288. memcmp(read_bitfield, write_bitfield, sizeof(read_bitfield)),
  289. 0);
  290. }
  291. END_TEST
  292. START_TEST(bitmask_test)
  293. {
  294. {
  295. bitmask_t mask1 = bitmask_from_u32(0x12345678U);
  296. litest_assert(bitmask_as_u32(mask1) == 0x12345678U);
  297. bitmask_t mask2 = bitmask_from_u32(0);
  298. litest_assert_int_eq(bitmask_as_u32(mask2), 0U);
  299. bitmask_t mask3 = bitmask_from_u32(0xFFFFFFFFU);
  300. litest_assert_int_eq(bitmask_as_u32(mask3), 0xFFFFFFFFU);
  301. }
  302. {
  303. bitmask_t mask1 = bitmask_new();
  304. litest_assert(bitmask_is_empty(mask1));
  305. bitmask_t mask2 = bitmask_from_u32(0x00000001U);
  306. litest_assert(!bitmask_is_empty(mask2));
  307. bitmask_t mask3 = bitmask_from_u32(0xFFFFFFFFU);
  308. litest_assert(!bitmask_is_empty(mask3));
  309. }
  310. {
  311. bitmask_t mask1 = bitmask_from_u32(0x0000000FU);
  312. bitmask_t bits1 = bitmask_from_u32(0x00000003U);
  313. litest_assert(bitmask_any(mask1, bits1));
  314. bitmask_t mask2 = bitmask_from_u32(0x0000000FU);
  315. bitmask_t bits2 = bitmask_from_u32(0x000000F0U);
  316. litest_assert(!bitmask_any(mask2, bits2));
  317. bitmask_t mask3 = bitmask_from_u32(0x00000000U);
  318. bitmask_t bits3 = bitmask_from_u32(0x00000001U);
  319. litest_assert(!bitmask_any(mask3, bits3));
  320. bitmask_t mask4 = bitmask_from_u32(0xFFFFFFFFU);
  321. bitmask_t bits4 = bitmask_from_u32(0xFFFFFFFFU);
  322. litest_assert(bitmask_any(mask4, bits4));
  323. bitmask_t mask5 = bitmask_from_u32(0x10000000U);
  324. bitmask_t bits5 = bitmask_from_u32(0x10000000U);
  325. litest_assert(bitmask_any(mask5, bits5));
  326. }
  327. {
  328. bitmask_t mask1 = bitmask_from_u32(0x0000000FU);
  329. bitmask_t bits1 = bitmask_from_u32(0x00000003U);
  330. litest_assert(bitmask_all(mask1, bits1));
  331. litest_assert(!bitmask_all(bits1, mask1));
  332. bitmask_t mask2 = bitmask_from_u32(0x0000000FU);
  333. bitmask_t bits2 = bitmask_from_u32(0x0000000FU);
  334. litest_assert(bitmask_all(mask2, bits2));
  335. litest_assert(bitmask_all(bits2, mask2));
  336. bitmask_t mask3 = bitmask_from_u32(0x00000000U);
  337. bitmask_t bits3 = bitmask_from_u32(0x00000000U);
  338. litest_assert(!bitmask_all(mask3, bits3)); /* zero is special */
  339. bitmask_t mask4 = bitmask_from_u32(0xFFFFFFFFU);
  340. bitmask_t bits4 = bitmask_from_u32(0xFFFFFFFFU);
  341. litest_assert(bitmask_all(mask4, bits4));
  342. bitmask_t mask5 = bitmask_from_u32(0x10000000U);
  343. bitmask_t bits5 = bitmask_from_u32(0x10000000U);
  344. litest_assert(bitmask_all(mask5, bits5));
  345. }
  346. {
  347. bitmask_t mask1 = bitmask_from_u32(0x0000000FU);
  348. bitmask_t bits1 = bitmask_from_u32(0x000000F0U);
  349. litest_assert(!bitmask_merge(&mask1, bits1));
  350. litest_assert_int_eq(mask1.mask, 0x000000FFU);
  351. bitmask_t mask2 = bitmask_from_u32(0x0000000FU);
  352. bitmask_t bits2 = bitmask_from_u32(0x0000000FU);
  353. litest_assert(bitmask_merge(&mask2, bits2));
  354. litest_assert_int_eq(mask2.mask, 0x0000000FU);
  355. bitmask_t mask3 = bitmask_new();
  356. bitmask_t bits3 = bitmask_from_u32(0xFFFFFFFFU);
  357. litest_assert(!bitmask_merge(&mask3, bits3));
  358. litest_assert_int_eq(mask3.mask, 0xFFFFFFFFU);
  359. bitmask_t mask4 = bitmask_from_u32(0x80000000U);
  360. bitmask_t bits4 = bitmask_from_u32(0x00000001U);
  361. litest_assert(!bitmask_merge(&mask4, bits4));
  362. litest_assert_int_eq(mask4.mask, 0x80000001U);
  363. }
  364. {
  365. bitmask_t mask1 = bitmask_from_u32(0x000000FFU);
  366. bitmask_t bits1 = bitmask_from_u32(0x0000000FU);
  367. litest_assert(bitmask_clear(&mask1, bits1));
  368. litest_assert_int_eq(mask1.mask, 0x000000F0U);
  369. bitmask_t mask2 = bitmask_from_u32(0x0000000FU);
  370. bitmask_t bits2 = bitmask_from_u32(0x0000000FU);
  371. litest_assert(bitmask_clear(&mask2, bits2));
  372. litest_assert_int_eq(mask2.mask, 0x00000000U);
  373. bitmask_t mask3 = bitmask_from_u32(0xFFFFFFFFU);
  374. bitmask_t bits3 = bitmask_from_u32(0x00000000U);
  375. litest_assert(!bitmask_clear(&mask3, bits3)); /* zero is special */
  376. litest_assert_int_eq(mask3.mask, 0xFFFFFFFFU);
  377. bitmask_t mask4 = bitmask_from_u32(0xFFFFFFFFU);
  378. bitmask_t bits4 = bitmask_from_u32(0xFFFFFFFFU);
  379. litest_assert(bitmask_clear(&mask4, bits4));
  380. litest_assert_int_eq(mask4.mask, 0x0U);
  381. }
  382. {
  383. bitmask_t mask1 = bitmask_from_u32(0x00000001U);
  384. litest_assert(bitmask_bit_is_set(mask1, 0));
  385. litest_assert(!bitmask_bit_is_set(mask1, 1));
  386. bitmask_t mask2 = bitmask_from_u32(0x80000000U);
  387. litest_assert(bitmask_bit_is_set(mask2, 31));
  388. litest_assert(!bitmask_bit_is_set(mask2, 0));
  389. bitmask_t mask3 = bitmask_from_u32(0xFFFFFFFFU);
  390. litest_assert(bitmask_bit_is_set(mask3, 0));
  391. litest_assert(bitmask_bit_is_set(mask3, 31));
  392. litest_assert(bitmask_bit_is_set(mask3, 16));
  393. bitmask_t mask4 = bitmask_new();
  394. litest_assert(!bitmask_bit_is_set(mask4, 0));
  395. litest_assert(!bitmask_bit_is_set(mask4, 1));
  396. }
  397. {
  398. bitmask_t mask1 = bitmask_new();
  399. litest_assert(!bitmask_set_bit(&mask1, 0));
  400. litest_assert_int_eq(mask1.mask, 0x00000001U);
  401. litest_assert(bitmask_set_bit(&mask1, 0));
  402. litest_assert_int_eq(mask1.mask, 0x00000001U);
  403. litest_assert(!bitmask_set_bit(&mask1, 31));
  404. litest_assert_int_eq(mask1.mask, 0x80000001U);
  405. bitmask_t mask2 = bitmask_from_u32(0x0000000FU);
  406. litest_assert(!bitmask_set_bit(&mask2, 4));
  407. litest_assert_int_eq(mask2.mask, 0x0000001FU);
  408. litest_assert(bitmask_set_bit(&mask2, 4));
  409. litest_assert_int_eq(mask2.mask, 0x0000001FU);
  410. }
  411. {
  412. bitmask_t mask1 = bitmask_from_u32(0xFFFFFFFFU);
  413. litest_assert(bitmask_clear_bit(&mask1, 0));
  414. litest_assert_int_eq(mask1.mask, 0xFFFFFFFEU);
  415. litest_assert(!bitmask_clear_bit(&mask1, 0));
  416. litest_assert_int_eq(mask1.mask, 0xFFFFFFFEU);
  417. litest_assert(bitmask_clear_bit(&mask1, 31));
  418. litest_assert_int_eq(mask1.mask, 0x7FFFFFFEU);
  419. bitmask_t mask2 = bitmask_from_u32(0x0000001FU);
  420. litest_assert(bitmask_clear_bit(&mask2, 4));
  421. litest_assert_int_eq(mask2.mask, 0x0000000FU);
  422. litest_assert(!bitmask_clear_bit(&mask2, 4));
  423. litest_assert_int_eq(mask2.mask, 0x0000000FU);
  424. }
  425. {
  426. bitmask_t mask1 = bitmask_from_bit(0);
  427. litest_assert_int_eq(mask1.mask, 0x00000001U);
  428. bitmask_t mask2 = bitmask_from_bit(31);
  429. litest_assert_int_eq(mask2.mask, 0x80000000U);
  430. bitmask_t mask3 = bitmask_from_bit(16);
  431. litest_assert_int_eq(mask3.mask, 0x00010000U);
  432. }
  433. {
  434. bitmask_t mask1 = bitmask_from_u32(0x12345678U);
  435. litest_assert_int_eq(mask1.mask, 0x12345678U);
  436. bitmask_t mask2 = bitmask_from_u32(0);
  437. litest_assert_int_eq(mask2.mask, 0U);
  438. bitmask_t mask3 = bitmask_from_u32(0xFFFFFFFFU);
  439. litest_assert_int_eq(mask3.mask, 0xFFFFFFFFU);
  440. }
  441. {
  442. bitmask_t mask1 = bitmask_from_bits(1, 2, 5);
  443. litest_assert_int_eq(mask1.mask, bit(1) | bit(2) | bit(5));
  444. bitmask_t mask2 = bitmask_from_bits(0);
  445. litest_assert_int_eq(mask2.mask, bit(0));
  446. }
  447. {
  448. bitmask_t mask1 = bitmask_from_masks(0x1, 0x2, 0x8);
  449. litest_assert_int_eq(mask1.mask, 0x0000000BU);
  450. bitmask_t mask2 = bitmask_from_masks(0x0);
  451. litest_assert_int_eq(mask2.mask, 0x00000000U);
  452. }
  453. }
  454. END_TEST
  455. START_TEST(matrix_helpers)
  456. {
  457. struct matrix m1, m2, m3;
  458. float f[6] = { 1, 2, 3, 4, 5, 6 };
  459. int x, y;
  460. int row, col;
  461. matrix_init_identity(&m1);
  462. for (row = 0; row < 3; row++) {
  463. for (col = 0; col < 3; col++) {
  464. litest_assert_int_eq(m1.val[row][col], (row == col) ? 1 : 0);
  465. }
  466. }
  467. litest_assert(matrix_is_identity(&m1));
  468. matrix_from_farray6(&m2, f);
  469. litest_assert_int_eq(m2.val[0][0], 1);
  470. litest_assert_int_eq(m2.val[0][1], 2);
  471. litest_assert_int_eq(m2.val[0][2], 3);
  472. litest_assert_int_eq(m2.val[1][0], 4);
  473. litest_assert_int_eq(m2.val[1][1], 5);
  474. litest_assert_int_eq(m2.val[1][2], 6);
  475. litest_assert_int_eq(m2.val[2][0], 0);
  476. litest_assert_int_eq(m2.val[2][1], 0);
  477. litest_assert_int_eq(m2.val[2][2], 1);
  478. x = 100;
  479. y = 5;
  480. matrix_mult_vec(&m1, &x, &y);
  481. litest_assert_int_eq(x, 100);
  482. litest_assert_int_eq(y, 5);
  483. matrix_mult(&m3, &m1, &m1);
  484. litest_assert(matrix_is_identity(&m3));
  485. matrix_init_scale(&m2, 2, 4);
  486. litest_assert_int_eq(m2.val[0][0], 2);
  487. litest_assert_int_eq(m2.val[0][1], 0);
  488. litest_assert_int_eq(m2.val[0][2], 0);
  489. litest_assert_int_eq(m2.val[1][0], 0);
  490. litest_assert_int_eq(m2.val[1][1], 4);
  491. litest_assert_int_eq(m2.val[1][2], 0);
  492. litest_assert_int_eq(m2.val[2][0], 0);
  493. litest_assert_int_eq(m2.val[2][1], 0);
  494. litest_assert_int_eq(m2.val[2][2], 1);
  495. matrix_mult_vec(&m2, &x, &y);
  496. litest_assert_int_eq(x, 200);
  497. litest_assert_int_eq(y, 20);
  498. matrix_init_translate(&m2, 10, 100);
  499. litest_assert_int_eq(m2.val[0][0], 1);
  500. litest_assert_int_eq(m2.val[0][1], 0);
  501. litest_assert_int_eq(m2.val[0][2], 10);
  502. litest_assert_int_eq(m2.val[1][0], 0);
  503. litest_assert_int_eq(m2.val[1][1], 1);
  504. litest_assert_int_eq(m2.val[1][2], 100);
  505. litest_assert_int_eq(m2.val[2][0], 0);
  506. litest_assert_int_eq(m2.val[2][1], 0);
  507. litest_assert_int_eq(m2.val[2][2], 1);
  508. matrix_mult_vec(&m2, &x, &y);
  509. litest_assert_int_eq(x, 210);
  510. litest_assert_int_eq(y, 120);
  511. matrix_to_farray6(&m2, f);
  512. litest_assert_int_eq(f[0], 1);
  513. litest_assert_int_eq(f[1], 0);
  514. litest_assert_int_eq(f[2], 10);
  515. litest_assert_int_eq(f[3], 0);
  516. litest_assert_int_eq(f[4], 1);
  517. litest_assert_int_eq(f[5], 100);
  518. }
  519. END_TEST
  520. START_TEST(ratelimit_helpers)
  521. {
  522. struct ratelimit rl;
  523. unsigned int i, j;
  524. /* 10 attempts every 1000ms */
  525. ratelimit_init(&rl, usec_from_millis(1000), 10);
  526. for (j = 0; j < 3; ++j) {
  527. /* a burst of 9 attempts must succeed */
  528. for (i = 0; i < 9; ++i) {
  529. litest_assert_enum_eq(ratelimit_test(&rl), RATELIMIT_PASS);
  530. }
  531. /* the 10th attempt reaches the threshold */
  532. litest_assert_enum_eq(ratelimit_test(&rl), RATELIMIT_THRESHOLD);
  533. /* ..then further attempts must fail.. */
  534. litest_assert_enum_eq(ratelimit_test(&rl), RATELIMIT_EXCEEDED);
  535. /* ..regardless of how often we try. */
  536. for (i = 0; i < 100; ++i) {
  537. litest_assert_enum_eq(ratelimit_test(&rl), RATELIMIT_EXCEEDED);
  538. }
  539. /* ..even after waiting 20ms */
  540. msleep(100);
  541. for (i = 0; i < 100; ++i) {
  542. litest_assert_enum_eq(ratelimit_test(&rl), RATELIMIT_EXCEEDED);
  543. }
  544. /* but after 1000ms the counter is reset */
  545. msleep(950); /* +50ms to account for time drifts */
  546. }
  547. }
  548. END_TEST
  549. struct parser_test {
  550. char *tag;
  551. int expected_value;
  552. };
  553. START_TEST(dpi_parser)
  554. {
  555. /* clang-format off */
  556. struct parser_test tests[] = {
  557. { "450 *1800 3200", 1800 },
  558. { "*450 1800 3200", 450 },
  559. { "450 1800 *3200", 3200 },
  560. { "450 1800 3200", 3200 },
  561. { "450 1800 failboat", 0 },
  562. { "450 1800 *failboat", 0 },
  563. { "0 450 1800 *3200", 0 },
  564. { "450@37 1800@12 *3200@6", 3200 },
  565. { "450@125 1800@125 *3200@125 ", 3200 },
  566. { "450@125 *1800@125 3200@125", 1800 },
  567. { "*this @string fails", 0 },
  568. { "12@34 *45@", 0 },
  569. { "12@a *45@", 0 },
  570. { "12@a *45@25", 0 },
  571. { " * 12, 450, 800", 0 },
  572. { " *12, 450, 800", 12 },
  573. { "*12, *450, 800", 12 },
  574. { "*-23412, 450, 800", 0 },
  575. { "112@125, 450@125, 800@125, 900@-125", 0 },
  576. { "", 0 },
  577. { " ", 0 },
  578. { "* ", 0 },
  579. { NULL, 0 },
  580. };
  581. /* clang-format on */
  582. int i, dpi;
  583. for (i = 0; tests[i].tag != NULL; i++) {
  584. dpi = parse_mouse_dpi_property(tests[i].tag);
  585. litest_assert_int_eq(dpi, tests[i].expected_value);
  586. }
  587. dpi = parse_mouse_dpi_property(NULL);
  588. litest_assert_int_eq(dpi, 0);
  589. }
  590. END_TEST
  591. START_TEST(wheel_click_parser)
  592. {
  593. /* clang-format off */
  594. struct parser_test tests[] = {
  595. { "1", 1 },
  596. { "10", 10 },
  597. { "-12", -12 },
  598. { "360", 360 },
  599. { "0", 0 },
  600. { "-0", 0 },
  601. { "a", 0 },
  602. { "10a", 0 },
  603. { "10-", 0 },
  604. { "sadfasfd", 0 },
  605. { "361", 0 },
  606. { NULL, 0 },
  607. };
  608. /* clang-format on */
  609. int i, angle;
  610. for (i = 0; tests[i].tag != NULL; i++) {
  611. angle = parse_mouse_wheel_click_angle_property(tests[i].tag);
  612. litest_assert_int_eq(angle, tests[i].expected_value);
  613. }
  614. }
  615. END_TEST
  616. START_TEST(wheel_click_count_parser)
  617. {
  618. /* clang-format off */
  619. struct parser_test tests[] = {
  620. { "1", 1 },
  621. { "10", 10 },
  622. { "-12", -12 },
  623. { "360", 360 },
  624. { "0", 0 },
  625. { "-0", 0 },
  626. { "a", 0 },
  627. { "10a", 0 },
  628. { "10-", 0 },
  629. { "sadfasfd", 0 },
  630. { "361", 0 },
  631. { NULL, 0 }
  632. };
  633. /* clang-format on */
  634. int i, angle;
  635. for (i = 0; tests[i].tag != NULL; i++) {
  636. angle = parse_mouse_wheel_click_count_property(tests[i].tag);
  637. litest_assert_int_eq(angle, tests[i].expected_value);
  638. }
  639. angle = parse_mouse_wheel_click_count_property(NULL);
  640. litest_assert_int_eq(angle, 0);
  641. }
  642. END_TEST
  643. START_TEST(dimension_prop_parser)
  644. {
  645. /* clang-format off */
  646. struct parser_test_dimension {
  647. char *tag;
  648. bool success;
  649. size_t x, y;
  650. } tests[] = {
  651. { "10x10", true, 10, 10 },
  652. { "1x20", true, 1, 20 },
  653. { "1x8000", true, 1, 8000 },
  654. { "238492x428210", true, 238492, 428210 },
  655. { "0x0", false, 0, 0 },
  656. { "-10x10", false, 0, 0 },
  657. { "-1", false, 0, 0 },
  658. { "1x-99", false, 0, 0 },
  659. { "0", false, 0, 0 },
  660. { "100", false, 0, 0 },
  661. { "", false, 0, 0 },
  662. { "abd", false, 0, 0 },
  663. { "xabd", false, 0, 0 },
  664. { "0xaf", false, 0, 0 },
  665. { "0x0x", false, 0, 0 },
  666. { "x10", false, 0, 0 },
  667. { NULL, false, 0, 0 },
  668. };
  669. /* clang-format on */
  670. int i;
  671. size_t x, y;
  672. bool success;
  673. for (i = 0; tests[i].tag != NULL; i++) {
  674. x = y = 0xad;
  675. success = parse_dimension_property(tests[i].tag, &x, &y);
  676. litest_assert(success == tests[i].success);
  677. if (success) {
  678. litest_assert_int_eq(x, tests[i].x);
  679. litest_assert_int_eq(y, tests[i].y);
  680. } else {
  681. litest_assert_int_eq(x, 0xadU);
  682. litest_assert_int_eq(y, 0xadU);
  683. }
  684. }
  685. success = parse_dimension_property(NULL, &x, &y);
  686. litest_assert(success == false);
  687. }
  688. END_TEST
  689. START_TEST(reliability_prop_parser)
  690. {
  691. /* clang-format off */
  692. struct parser_test_reliability {
  693. char *tag;
  694. bool success;
  695. enum switch_reliability reliability;
  696. } tests[] = {
  697. { "reliable", true, RELIABILITY_RELIABLE },
  698. { "unreliable", true, RELIABILITY_UNRELIABLE },
  699. { "write_open", true, RELIABILITY_WRITE_OPEN },
  700. { "", false, 0 },
  701. { "0", false, 0 },
  702. { "1", false, 0 },
  703. { NULL, false, 0, },
  704. };
  705. /* clang-format on */
  706. enum switch_reliability r;
  707. bool success;
  708. int i;
  709. for (i = 0; tests[i].tag != NULL; i++) {
  710. r = 0xaf;
  711. success = parse_switch_reliability_property(tests[i].tag, &r);
  712. litest_assert(success == tests[i].success);
  713. if (success)
  714. litest_assert_int_eq(r, tests[i].reliability);
  715. else
  716. litest_assert_int_eq(r, 0xafU);
  717. }
  718. success = parse_switch_reliability_property(NULL, &r);
  719. litest_assert(success == true);
  720. litest_assert_enum_eq(r, RELIABILITY_RELIABLE);
  721. success = parse_switch_reliability_property("foo", NULL);
  722. litest_assert(success == false);
  723. }
  724. END_TEST
  725. START_TEST(calibration_prop_parser)
  726. {
  727. #define DEFAULT_VALUES { 1.0, 2.0, 3.0, 4.0, 5.0, 6.0 }
  728. const float untouched[6] = DEFAULT_VALUES;
  729. /* clang-format off */
  730. struct parser_test_calibration {
  731. char *prop;
  732. bool success;
  733. float values[6];
  734. } tests[] = {
  735. { "", false, DEFAULT_VALUES },
  736. { "banana", false, DEFAULT_VALUES },
  737. { "1 2 3 a 5 6", false, DEFAULT_VALUES },
  738. { "2", false, DEFAULT_VALUES },
  739. { "2 3 4 5 6", false, DEFAULT_VALUES },
  740. { "1 2 3 4 5 6", true, DEFAULT_VALUES },
  741. { "6.00012 3.244 4.238 5.2421 6.0134 8.860", true,
  742. { 6.00012, 3.244, 4.238, 5.2421, 6.0134, 8.860 }},
  743. { "0xff 2 3 4 5 6", false, DEFAULT_VALUES },
  744. { NULL, false, DEFAULT_VALUES },
  745. };
  746. /* clang-format on */
  747. bool success;
  748. float calibration[6];
  749. int rc;
  750. int i;
  751. for (i = 0; tests[i].prop != NULL; i++) {
  752. memcpy(calibration, untouched, sizeof(calibration));
  753. success = parse_calibration_property(tests[i].prop, calibration);
  754. litest_assert_int_eq(success, tests[i].success);
  755. if (success)
  756. rc = memcmp(tests[i].values, calibration, sizeof(calibration));
  757. else
  758. rc = memcmp(untouched, calibration, sizeof(calibration));
  759. litest_assert_int_eq(rc, 0);
  760. }
  761. memcpy(calibration, untouched, sizeof(calibration));
  762. success = parse_calibration_property(NULL, calibration);
  763. litest_assert(success == false);
  764. rc = memcmp(untouched, calibration, sizeof(calibration));
  765. litest_assert_int_eq(rc, 0);
  766. }
  767. END_TEST
  768. START_TEST(range_prop_parser)
  769. {
  770. /* clang-format off */
  771. struct parser_test_range {
  772. char *tag;
  773. bool success;
  774. int hi, lo;
  775. } tests[] = {
  776. { "10:8", true, 10, 8 },
  777. { "100:-1", true, 100, -1 },
  778. { "-203813:-502023", true, -203813, -502023 },
  779. { "238492:28210", true, 238492, 28210 },
  780. { "none", true, 0, 0 },
  781. { "0:0", false, 0, 0 },
  782. { "", false, 0, 0 },
  783. { "abcd", false, 0, 0 },
  784. { "10:30:10", false, 0, 0 },
  785. { NULL, false, 0, 0 },
  786. };
  787. /* clang-format on */
  788. int i;
  789. int hi, lo;
  790. bool success;
  791. for (i = 0; tests[i].tag != NULL; i++) {
  792. hi = lo = 0xad;
  793. success = parse_range_property(tests[i].tag, &hi, &lo);
  794. litest_assert(success == tests[i].success);
  795. if (success) {
  796. litest_assert_int_eq(hi, tests[i].hi);
  797. litest_assert_int_eq(lo, tests[i].lo);
  798. } else {
  799. litest_assert_int_eq(hi, 0xad);
  800. litest_assert_int_eq(lo, 0xad);
  801. }
  802. }
  803. success = parse_range_property(NULL, NULL, NULL);
  804. litest_assert(success == false);
  805. }
  806. END_TEST
  807. START_TEST(boolean_prop_parser)
  808. {
  809. /* clang-format off */
  810. struct parser_test_range {
  811. char *tag;
  812. bool success;
  813. bool b;
  814. } tests[] = {
  815. { "0", true, false },
  816. { "1", true, true },
  817. { "-1", false, false },
  818. { "2", false, false },
  819. { "abcd", false, false },
  820. { NULL, false, false },
  821. };
  822. /* clang-format on */
  823. int i;
  824. bool success, b;
  825. for (i = 0; tests[i].tag != NULL; i++) {
  826. b = false;
  827. success = parse_boolean_property(tests[i].tag, &b);
  828. litest_assert(success == tests[i].success);
  829. if (success)
  830. litest_assert_int_eq(b, tests[i].b);
  831. else
  832. litest_assert_int_eq(b, false);
  833. }
  834. success = parse_boolean_property(NULL, NULL);
  835. litest_assert(success == false);
  836. }
  837. END_TEST
  838. START_TEST(evcode_prop_parser)
  839. {
  840. /* clang-format off */
  841. struct parser_test_tuple {
  842. const char *prop;
  843. bool success;
  844. size_t nevents;
  845. struct input_event events[20];
  846. } tests[] = {
  847. { "+EV_KEY", true, 1, {{ .type = EV_KEY, .code = 0xffff, .value = 1 }} },
  848. { "-EV_ABS;", true, 1, {{ .type = EV_ABS, .code = 0xffff, .value = 0 }} },
  849. { "+ABS_X;", true, 1, {{ .type = EV_ABS, .code = ABS_X, .value = 1 }} },
  850. { "-SW_TABLET_MODE;", true, 1, {{ .type = EV_SW, .code = SW_TABLET_MODE, .value = 0 }} },
  851. { "+EV_SW", true, 1, {{ .type = EV_SW, .code = 0xffff, .value = 1 }} },
  852. { "-ABS_Y", true, 1, {{ .type = EV_ABS, .code = ABS_Y, .value = 0 }} },
  853. { "+EV_ABS:0x00", true, 1, {{ .type = EV_ABS, .code = ABS_X, .value = 1 }} },
  854. { "-EV_ABS:01", true, 1, {{ .type = EV_ABS, .code = ABS_Y, .value = 0 }} },
  855. { "+ABS_TILT_X;-ABS_TILT_Y;", true, 2,
  856. {{ .type = EV_ABS, .code = ABS_TILT_X, .value = 1 },
  857. { .type = EV_ABS, .code = ABS_TILT_Y, .value = 0}} },
  858. { "+BTN_TOOL_DOUBLETAP;+EV_KEY;-KEY_A", true, 3,
  859. {{ .type = EV_KEY, .code = BTN_TOOL_DOUBLETAP, .value = 1 } ,
  860. { .type = EV_KEY, .code = 0xffff, .value = 1 },
  861. { .type = EV_KEY, .code = KEY_A, .value = 0 }} },
  862. { "+REL_Y;-ABS_Z;+BTN_STYLUS", true, 3,
  863. {{ .type = EV_REL, .code = REL_Y, .value = 1},
  864. { .type = EV_ABS, .code = ABS_Z, .value = 0},
  865. { .type = EV_KEY, .code = BTN_STYLUS, .value = 1 }} },
  866. { "-REL_Y;+EV_KEY:0x123;-BTN_STYLUS", true, 3,
  867. {{ .type = EV_REL, .code = REL_Y, .value = 0 },
  868. { .type = EV_KEY, .code = 0x123, .value = 1 },
  869. { .type = EV_KEY, .code = BTN_STYLUS, .value = 0 }} },
  870. { .prop = "", .success = false },
  871. { .prop = "+", .success = false },
  872. { .prop = "-", .success = false },
  873. { .prop = "!", .success = false },
  874. { .prop = "+EV_FOO", .success = false },
  875. { .prop = "+EV_KEY;-EV_FOO", .success = false },
  876. { .prop = "+BTN_STYLUS;-EV_FOO", .success = false },
  877. { .prop = "-BTN_UNKNOWN", .success = false },
  878. { .prop = "+BTN_UNKNOWN;+EV_KEY", .success = false },
  879. { .prop = "-PR_UNKNOWN", .success = false },
  880. { .prop = "-BTN_STYLUS;+PR_UNKNOWN;-ABS_X", .success = false },
  881. { .prop = "-EV_REL:0xffff", .success = false },
  882. { .prop = "-EV_REL:0x123.", .success = false },
  883. { .prop = "-EV_REL:ffff", .success = false },
  884. { .prop = "-EV_REL:blah", .success = false },
  885. { .prop = "+KEY_A:0x11", .success = false },
  886. { .prop = "+EV_KEY:0x11 ", .success = false },
  887. { .prop = "+EV_KEY:0x11not", .success = false },
  888. { .prop = "none", .success = false },
  889. { .prop = NULL },
  890. };
  891. /* clang-format on */
  892. struct parser_test_tuple *t;
  893. for (int i = 0; tests[i].prop; i++) {
  894. bool success;
  895. struct input_event events[32];
  896. size_t nevents = ARRAY_LENGTH(events);
  897. t = &tests[i];
  898. success = parse_evcode_property(t->prop, events, &nevents);
  899. litest_assert(success == t->success);
  900. if (!success)
  901. continue;
  902. litest_assert_int_eq(nevents, t->nevents);
  903. for (size_t j = 0; j < nevents; j++) {
  904. unsigned int type = events[j].type;
  905. unsigned int code = events[j].code;
  906. int value = events[j].value;
  907. litest_assert_int_eq(t->events[j].type, type);
  908. litest_assert_int_eq(t->events[j].code, code);
  909. litest_assert_int_eq(t->events[j].value, value);
  910. }
  911. }
  912. }
  913. END_TEST
  914. START_TEST(input_prop_parser)
  915. {
  916. /* clang-format off */
  917. struct parser_test_val {
  918. const char *prop;
  919. bool success;
  920. size_t nvals;
  921. struct input_prop values[20];
  922. } tests[] = {
  923. { "+INPUT_PROP_BUTTONPAD", true, 1, {{ INPUT_PROP_BUTTONPAD, true }}},
  924. { "+INPUT_PROP_BUTTONPAD;-INPUT_PROP_POINTER", true, 2,
  925. { { INPUT_PROP_BUTTONPAD, true },
  926. { INPUT_PROP_POINTER, false }}},
  927. { "+INPUT_PROP_BUTTONPAD;-0x00;+0x03", true, 3,
  928. { { INPUT_PROP_BUTTONPAD, true },
  929. { INPUT_PROP_POINTER, false },
  930. { INPUT_PROP_SEMI_MT, true }}},
  931. { .prop = "", .success = false },
  932. { .prop = "0xff", .success = false },
  933. { .prop = "INPUT_PROP", .success = false },
  934. { .prop = "INPUT_PROP_FOO", .success = false },
  935. { .prop = "INPUT_PROP_FOO;INPUT_PROP_FOO", .success = false },
  936. { .prop = "INPUT_PROP_POINTER;INPUT_PROP_FOO", .success = false },
  937. { .prop = "none", .success = false },
  938. { .prop = NULL },
  939. };
  940. /* clang-format on */
  941. struct parser_test_val *t;
  942. for (int i = 0; tests[i].prop; i++) {
  943. bool success;
  944. struct input_prop props[32];
  945. size_t nprops = ARRAY_LENGTH(props);
  946. t = &tests[i];
  947. success = parse_input_prop_property(t->prop, props, &nprops);
  948. litest_assert(success == t->success);
  949. if (!success)
  950. continue;
  951. litest_assert_int_eq(nprops, t->nvals);
  952. for (size_t j = 0; j < t->nvals; j++) {
  953. litest_assert_int_eq(t->values[j].prop, props[j].prop);
  954. litest_assert_int_eq(t->values[j].enabled, props[j].enabled);
  955. }
  956. }
  957. }
  958. END_TEST
  959. START_TEST(evdev_abs_parser)
  960. {
  961. /* clang-format off */
  962. struct test {
  963. uint32_t which;
  964. const char *prop;
  965. int min, max, res, fuzz, flat;
  966. } tests[] = {
  967. { .which = (ABS_MASK_MIN|ABS_MASK_MAX),
  968. .prop = "1:2",
  969. .min = 1, .max = 2 },
  970. { .which = (ABS_MASK_MIN|ABS_MASK_MAX),
  971. .prop = "1:2:",
  972. .min = 1, .max = 2 },
  973. { .which = (ABS_MASK_MIN|ABS_MASK_MAX|ABS_MASK_RES),
  974. .prop = "10:20:30",
  975. .min = 10, .max = 20, .res = 30 },
  976. { .which = (ABS_MASK_RES),
  977. .prop = "::100",
  978. .res = 100 },
  979. { .which = (ABS_MASK_MIN),
  980. .prop = "10:",
  981. .min = 10 },
  982. { .which = (ABS_MASK_MAX|ABS_MASK_RES),
  983. .prop = ":10:1001",
  984. .max = 10, .res = 1001 },
  985. { .which = (ABS_MASK_MIN|ABS_MASK_MAX|ABS_MASK_RES|ABS_MASK_FUZZ),
  986. .prop = "1:2:3:4",
  987. .min = 1, .max = 2, .res = 3, .fuzz = 4},
  988. { .which = (ABS_MASK_MIN|ABS_MASK_MAX|ABS_MASK_RES|ABS_MASK_FUZZ|ABS_MASK_FLAT),
  989. .prop = "1:2:3:4:5",
  990. .min = 1, .max = 2, .res = 3, .fuzz = 4, .flat = 5},
  991. { .which = (ABS_MASK_MIN|ABS_MASK_RES|ABS_MASK_FUZZ|ABS_MASK_FLAT),
  992. .prop = "1::3:4:50",
  993. .min = 1, .res = 3, .fuzz = 4, .flat = 50},
  994. { .which = ABS_MASK_FUZZ|ABS_MASK_FLAT,
  995. .prop = ":::5:60",
  996. .fuzz = 5, .flat = 60},
  997. { .which = ABS_MASK_FUZZ,
  998. .prop = ":::5:",
  999. .fuzz = 5 },
  1000. { .which = ABS_MASK_RES, .prop = "::12::",
  1001. .res = 12 },
  1002. /* Malformed property but parsing this one makes us more
  1003. * future proof */
  1004. { .which = (ABS_MASK_RES|ABS_MASK_FUZZ|ABS_MASK_FLAT),
  1005. .prop = "::12:1:2:3:4:5:6",
  1006. .res = 12, .fuzz = 1, .flat = 2 },
  1007. { .which = 0, .prop = ":::::" },
  1008. { .which = 0, .prop = ":" },
  1009. { .which = 0, .prop = "" },
  1010. { .which = 0, .prop = ":asb::::" },
  1011. { .which = 0, .prop = "foo" },
  1012. };
  1013. /* clang-format on */
  1014. ARRAY_FOR_EACH(tests, t) {
  1015. struct input_absinfo abs;
  1016. uint32_t mask;
  1017. mask = parse_evdev_abs_prop(t->prop, &abs);
  1018. litest_assert_int_eq(mask, t->which);
  1019. if (t->which & ABS_MASK_MIN)
  1020. litest_assert_int_eq(abs.minimum, t->min);
  1021. if (t->which & ABS_MASK_MAX)
  1022. litest_assert_int_eq(abs.maximum, t->max);
  1023. if (t->which & ABS_MASK_RES)
  1024. litest_assert_int_eq(abs.resolution, t->res);
  1025. if (t->which & ABS_MASK_FUZZ)
  1026. litest_assert_int_eq(abs.fuzz, t->fuzz);
  1027. if (t->which & ABS_MASK_FLAT)
  1028. litest_assert_int_eq(abs.flat, t->flat);
  1029. }
  1030. }
  1031. END_TEST
  1032. START_TEST(time_conversion)
  1033. {
  1034. litest_assert_int_eq(usec_as_uint64_t(usec_from_uint64_t(0)), 0U);
  1035. litest_assert_int_eq(usec_as_uint64_t(usec_from_uint64_t(12345)), 12345U);
  1036. litest_assert_int_eq(usec_as_uint64_t(usec_from_uint64_t(999999)), 999999U);
  1037. litest_assert_int_eq(usec_as_uint64_t(usec_from_millis(0)), 0U);
  1038. litest_assert_int_eq(usec_as_uint64_t(usec_from_millis(1)), 1000U);
  1039. litest_assert_int_eq(usec_as_uint64_t(usec_from_millis(10)), 10000U);
  1040. litest_assert_int_eq(usec_as_uint64_t(usec_from_millis(1000)), 1000000U);
  1041. litest_assert_int_eq(usec_as_uint64_t(usec_from_seconds(0)), 0U);
  1042. litest_assert_int_eq(usec_as_uint64_t(usec_from_seconds(1)), 1000000U);
  1043. litest_assert_int_eq(usec_as_uint64_t(usec_from_seconds(10)), 10000000U);
  1044. litest_assert_int_eq(usec_as_uint64_t(usec_from_seconds(60)), 60000000U);
  1045. litest_assert_int_eq(usec_as_uint64_t(usec_from_hours(0)), 0ULL);
  1046. litest_assert_int_eq(usec_as_uint64_t(usec_from_hours(1)), 3600000000ULL);
  1047. {
  1048. struct timeval tv = { .tv_sec = 0, .tv_usec = 0 };
  1049. litest_assert_int_eq(usec_as_uint64_t(usec_from_timeval(&tv)), 0U);
  1050. tv.tv_sec = 1;
  1051. tv.tv_usec = 0;
  1052. litest_assert_int_eq(usec_as_uint64_t(usec_from_timeval(&tv)),
  1053. 1000000U);
  1054. tv.tv_sec = 1;
  1055. tv.tv_usec = 234567;
  1056. litest_assert_int_eq(usec_as_uint64_t(usec_from_timeval(&tv)),
  1057. 1234567U);
  1058. tv.tv_sec = 0;
  1059. tv.tv_usec = 999999;
  1060. litest_assert_int_eq(usec_as_uint64_t(usec_from_timeval(&tv)), 999999U);
  1061. }
  1062. {
  1063. struct timespec ts = { .tv_sec = 0, .tv_nsec = 0 };
  1064. litest_assert_int_eq(usec_as_uint64_t(usec_from_timespec(&ts)), 0U);
  1065. ts.tv_sec = 1;
  1066. ts.tv_nsec = 0;
  1067. litest_assert_int_eq(usec_as_uint64_t(usec_from_timespec(&ts)),
  1068. 1000000U);
  1069. ts.tv_sec = 1;
  1070. ts.tv_nsec = 234567000;
  1071. litest_assert_int_eq(usec_as_uint64_t(usec_from_timespec(&ts)),
  1072. 1234567U);
  1073. ts.tv_sec = 0;
  1074. ts.tv_nsec = 999999000;
  1075. litest_assert_int_eq(usec_as_uint64_t(usec_from_timespec(&ts)),
  1076. 999999U);
  1077. }
  1078. litest_assert_int_eq(usec_to_millis(usec_from_uint64_t(0)), 0U);
  1079. litest_assert_int_eq(usec_to_millis(usec_from_uint64_t(1000)), 1U);
  1080. litest_assert_int_eq(usec_to_millis(usec_from_uint64_t(10000)), 10U);
  1081. litest_assert_int_eq(usec_to_millis(usec_from_uint64_t(123456)), 123U);
  1082. litest_assert_int_eq(usec_to_millis(usec_from_uint64_t(999)), 0U);
  1083. litest_assert_int_eq(usec_to_seconds(usec_from_uint64_t(0)), 0U);
  1084. litest_assert_int_eq(usec_to_seconds(usec_from_uint64_t(1000000)), 1U);
  1085. litest_assert_int_eq(usec_to_seconds(usec_from_uint64_t(5000000)), 5U);
  1086. litest_assert_int_eq(usec_to_seconds(usec_from_uint64_t(60000000)), 60U);
  1087. litest_assert_int_eq(usec_to_seconds(usec_from_uint64_t(999999)), 0U);
  1088. litest_assert_int_eq(usec_to_minutes(usec_from_uint64_t(0)), 0U);
  1089. litest_assert_int_eq(usec_to_minutes(usec_from_uint64_t(60000000)), 1U);
  1090. litest_assert_int_eq(usec_to_minutes(usec_from_uint64_t(120000000)), 2U);
  1091. litest_assert_int_eq(usec_to_minutes(usec_from_uint64_t(3600000000)), 60U);
  1092. litest_assert_int_eq(usec_to_minutes(usec_from_uint64_t(59999999)), 0U);
  1093. litest_assert_int_eq(usec_to_hours(usec_from_uint64_t(0)), 0U);
  1094. litest_assert_int_eq(usec_to_hours(usec_from_uint64_t(3600000000)), 1U);
  1095. litest_assert_int_eq(usec_to_hours(usec_from_uint64_t(7200000000)), 2U);
  1096. litest_assert_int_eq(usec_to_hours(usec_from_uint64_t(86400000000)), 24U);
  1097. litest_assert_int_eq(usec_to_hours(usec_from_uint64_t(3599999999)), 0U);
  1098. {
  1099. struct timeval tv;
  1100. tv = usec_to_timeval(usec_from_uint64_t(0));
  1101. litest_assert_int_eq(tv.tv_sec, 0);
  1102. litest_assert_int_eq(tv.tv_usec, 0);
  1103. tv = usec_to_timeval(usec_from_uint64_t(1000000));
  1104. litest_assert_int_eq(tv.tv_sec, 1);
  1105. litest_assert_int_eq(tv.tv_usec, 0);
  1106. tv = usec_to_timeval(usec_from_uint64_t(1234567));
  1107. litest_assert_int_eq(tv.tv_sec, 1);
  1108. litest_assert_int_eq(tv.tv_usec, 234567);
  1109. tv = usec_to_timeval(usec_from_uint64_t(999999));
  1110. litest_assert_int_eq(tv.tv_sec, 0);
  1111. litest_assert_int_eq(tv.tv_usec, 999999);
  1112. }
  1113. {
  1114. struct timespec ts;
  1115. ts = usec_to_timespec(usec_from_uint64_t(0));
  1116. litest_assert_int_eq(ts.tv_sec, 0);
  1117. litest_assert_int_eq(ts.tv_nsec, 0);
  1118. ts = usec_to_timespec(usec_from_uint64_t(1000000));
  1119. litest_assert_int_eq(ts.tv_sec, 1);
  1120. litest_assert_int_eq(ts.tv_nsec, 0);
  1121. ts = usec_to_timespec(usec_from_uint64_t(1234567));
  1122. litest_assert_int_eq(ts.tv_sec, 1);
  1123. litest_assert_int_eq(ts.tv_nsec, 234567000);
  1124. ts = usec_to_timespec(usec_from_uint64_t(999999));
  1125. litest_assert_int_eq(ts.tv_sec, 0);
  1126. litest_assert_int_eq(ts.tv_nsec, 999999000);
  1127. }
  1128. }
  1129. END_TEST
  1130. START_TEST(human_time)
  1131. {
  1132. /* clang-format off */
  1133. struct ht_tests {
  1134. usec_t interval;
  1135. unsigned int value;
  1136. const char *unit;
  1137. } tests[] = {
  1138. { usec_from_uint64_t(0), 0, "us" },
  1139. { usec_from_uint64_t(123), 123, "us" },
  1140. { usec_from_millis(5), 5, "ms" },
  1141. { usec_from_millis(100), 100, "ms" },
  1142. { usec_from_seconds(5), 5, "s" },
  1143. { usec_from_seconds(100), 100, "s" },
  1144. { usec_from_seconds(120), 2, "min" },
  1145. { usec_mul(usec_from_seconds(60), 5), 5, "min" },
  1146. { usec_mul(usec_from_seconds(60), 120), 2, "h" },
  1147. { usec_mul(usec_from_seconds(60), 5 * 60), 5, "h" },
  1148. { usec_mul(usec_from_seconds(60), 48 * 60), 2, "d" },
  1149. { usec_mul(usec_from_seconds(60), 1000 * 24 * 60), 1000, "d" },
  1150. { usec_from_uint64_t(0), 0, NULL },
  1151. };
  1152. /* clang-format on */
  1153. for (int i = 0; tests[i].unit != NULL; i++) {
  1154. struct human_time ht;
  1155. ht = to_human_time(tests[i].interval);
  1156. litest_assert_int_eq(ht.value, tests[i].value);
  1157. litest_assert_str_eq(ht.unit, tests[i].unit);
  1158. }
  1159. }
  1160. END_TEST
  1161. struct atoi_test {
  1162. char *str;
  1163. bool success;
  1164. int val;
  1165. };
  1166. START_TEST(safe_atoi_test)
  1167. {
  1168. /* clang-format off */
  1169. struct atoi_test tests[] = {
  1170. { "10", true, 10 },
  1171. { "20", true, 20 },
  1172. { "-1", true, -1 },
  1173. { "2147483647", true, 2147483647 },
  1174. { "-2147483648", true, -2147483648 },
  1175. { "4294967295", false, 0 },
  1176. { "0x0", false, 0 },
  1177. { "-10x10", false, 0 },
  1178. { "1x-99", false, 0 },
  1179. { "", false, 0 },
  1180. { "abd", false, 0 },
  1181. { "xabd", false, 0 },
  1182. { "0xaf", false, 0 },
  1183. { "0x0x", false, 0 },
  1184. { "x10", false, 0 },
  1185. { NULL, false, 0 },
  1186. };
  1187. /* clang-format on */
  1188. int v;
  1189. bool success;
  1190. for (int i = 0; tests[i].str != NULL; i++) {
  1191. v = 0xad;
  1192. success = safe_atoi(tests[i].str, &v);
  1193. litest_assert(success == tests[i].success);
  1194. if (success)
  1195. litest_assert_int_eq(v, tests[i].val);
  1196. else
  1197. litest_assert_int_eq(v, 0xad);
  1198. }
  1199. }
  1200. END_TEST
  1201. START_TEST(safe_atoi_base_16_test)
  1202. {
  1203. /* clang-format off */
  1204. struct atoi_test tests[] = {
  1205. { "10", true, 0x10 },
  1206. { "20", true, 0x20 },
  1207. { "-1", true, -1 },
  1208. { "0x10", true, 0x10 },
  1209. { "0xff", true, 0xff },
  1210. { "abc", true, 0xabc },
  1211. { "-10", true, -0x10 },
  1212. { "0x0", true, 0 },
  1213. { "0", true, 0 },
  1214. { "0x-99", false, 0 },
  1215. { "0xak", false, 0 },
  1216. { "0x", false, 0 },
  1217. { "x10", false, 0 },
  1218. { NULL, false, 0 },
  1219. };
  1220. /* clang-format on */
  1221. int v;
  1222. bool success;
  1223. for (int i = 0; tests[i].str != NULL; i++) {
  1224. v = 0xad;
  1225. success = safe_atoi_base(tests[i].str, &v, 16);
  1226. litest_assert(success == tests[i].success);
  1227. if (success)
  1228. litest_assert_int_eq(v, tests[i].val);
  1229. else
  1230. litest_assert_int_eq(v, 0xad);
  1231. }
  1232. }
  1233. END_TEST
  1234. START_TEST(safe_atoi_base_8_test)
  1235. {
  1236. /* clang-format off */
  1237. struct atoi_test tests[] = {
  1238. { "7", true, 07 },
  1239. { "10", true, 010 },
  1240. { "20", true, 020 },
  1241. { "-1", true, -1 },
  1242. { "010", true, 010 },
  1243. { "0ff", false, 0 },
  1244. { "abc", false, 0},
  1245. { "0xabc", false, 0},
  1246. { "-10", true, -010 },
  1247. { "0", true, 0 },
  1248. { "00", true, 0 },
  1249. { "0x0", false, 0 },
  1250. { "0x-99", false, 0 },
  1251. { "0xak", false, 0 },
  1252. { "0x", false, 0 },
  1253. { "x10", false, 0 },
  1254. { NULL, false, 0 },
  1255. };
  1256. /* clang-format on */
  1257. int v;
  1258. bool success;
  1259. for (int i = 0; tests[i].str != NULL; i++) {
  1260. v = 0xad;
  1261. success = safe_atoi_base(tests[i].str, &v, 8);
  1262. litest_assert(success == tests[i].success);
  1263. if (success)
  1264. litest_assert_int_eq(v, tests[i].val);
  1265. else
  1266. litest_assert_int_eq(v, 0xad);
  1267. }
  1268. }
  1269. END_TEST
  1270. struct atou_test {
  1271. char *str;
  1272. bool success;
  1273. unsigned int val;
  1274. };
  1275. START_TEST(safe_atou_test)
  1276. {
  1277. /* clang-format off */
  1278. struct atou_test tests[] = {
  1279. { "10", true, 10 },
  1280. { "20", true, 20 },
  1281. { "-1", false, 0 },
  1282. { "2147483647", true, 2147483647 },
  1283. { "-2147483648", false, 0},
  1284. { "0x0", false, 0 },
  1285. { "-10x10", false, 0 },
  1286. { "1x-99", false, 0 },
  1287. { "", false, 0 },
  1288. { "abd", false, 0 },
  1289. { "xabd", false, 0 },
  1290. { "0xaf", false, 0 },
  1291. { "0x0x", false, 0 },
  1292. { "x10", false, 0 },
  1293. { NULL, false, 0 },
  1294. };
  1295. /* clang-format on */
  1296. unsigned int v;
  1297. bool success;
  1298. for (int i = 0; tests[i].str != NULL; i++) {
  1299. v = 0xad;
  1300. success = safe_atou(tests[i].str, &v);
  1301. litest_assert(success == tests[i].success);
  1302. if (success)
  1303. litest_assert_int_eq(v, tests[i].val);
  1304. else
  1305. litest_assert_int_eq(v, 0xadU);
  1306. }
  1307. }
  1308. END_TEST
  1309. START_TEST(safe_atou_base_16_test)
  1310. {
  1311. /* clang-format off */
  1312. struct atou_test tests[] = {
  1313. { "10", true, 0x10 },
  1314. { "20", true, 0x20 },
  1315. { "-1", false, 0 },
  1316. { "0x10", true, 0x10 },
  1317. { "0xff", true, 0xff },
  1318. { "abc", true, 0xabc },
  1319. { "-10", false, 0 },
  1320. { "0x0", true, 0 },
  1321. { "0", true, 0 },
  1322. { "0x-99", false, 0 },
  1323. { "0xak", false, 0 },
  1324. { "0x", false, 0 },
  1325. { "x10", false, 0 },
  1326. { NULL, false, 0 },
  1327. };
  1328. /* clang-format on */
  1329. unsigned int v;
  1330. bool success;
  1331. for (int i = 0; tests[i].str != NULL; i++) {
  1332. v = 0xad;
  1333. success = safe_atou_base(tests[i].str, &v, 16);
  1334. litest_assert(success == tests[i].success);
  1335. if (success)
  1336. litest_assert_int_eq(v, tests[i].val);
  1337. else
  1338. litest_assert_int_eq(v, 0xadU);
  1339. }
  1340. }
  1341. END_TEST
  1342. START_TEST(safe_atou_base_8_test)
  1343. {
  1344. /* clang-format off */
  1345. struct atou_test tests[] = {
  1346. { "7", true, 07 },
  1347. { "10", true, 010 },
  1348. { "20", true, 020 },
  1349. { "-1", false, 0 },
  1350. { "010", true, 010 },
  1351. { "0ff", false, 0 },
  1352. { "abc", false, 0},
  1353. { "0xabc", false, 0},
  1354. { "-10", false, 0 },
  1355. { "0", true, 0 },
  1356. { "00", true, 0 },
  1357. { "0x0", false, 0 },
  1358. { "0x-99", false, 0 },
  1359. { "0xak", false, 0 },
  1360. { "0x", false, 0 },
  1361. { "x10", false, 0 },
  1362. { NULL, false, 0 },
  1363. };
  1364. /* clang-format on */
  1365. unsigned int v;
  1366. bool success;
  1367. for (int i = 0; tests[i].str != NULL; i++) {
  1368. v = 0xad;
  1369. success = safe_atou_base(tests[i].str, &v, 8);
  1370. litest_assert(success == tests[i].success);
  1371. if (success)
  1372. litest_assert_int_eq(v, tests[i].val);
  1373. else
  1374. litest_assert_int_eq(v, 0xadU);
  1375. }
  1376. }
  1377. END_TEST
  1378. struct atou64_test {
  1379. char *str;
  1380. bool success;
  1381. uint64_t val;
  1382. };
  1383. START_TEST(safe_atou64_test)
  1384. {
  1385. /* clang-format off */
  1386. struct atou64_test tests[] = {
  1387. { "10", true, 10 },
  1388. { "20", true, 20 },
  1389. { "-1", false, 0 },
  1390. { "9999999999", true, 9999999999 },
  1391. { "2147483647", true, 2147483647 },
  1392. { "-2147483648", false, 0},
  1393. { "0x0", false, 0 },
  1394. { "-10x10", false, 0 },
  1395. { "1x-99", false, 0 },
  1396. { "", false, 0 },
  1397. { "abd", false, 0 },
  1398. { "xabd", false, 0 },
  1399. { "0xaf", false, 0 },
  1400. { "0x0x", false, 0 },
  1401. { "x10", false, 0 },
  1402. { NULL, false, 0 },
  1403. };
  1404. /* clang-format on */
  1405. uint64_t v;
  1406. bool success;
  1407. for (int i = 0; tests[i].str != NULL; i++) {
  1408. v = 0xad;
  1409. success = safe_atou64(tests[i].str, &v);
  1410. litest_assert(success == tests[i].success);
  1411. if (success)
  1412. litest_assert_int_eq(v, tests[i].val);
  1413. else
  1414. litest_assert_int_eq(v, 0xadU);
  1415. }
  1416. }
  1417. END_TEST
  1418. START_TEST(safe_atod_test)
  1419. {
  1420. /* clang-format off */
  1421. struct atod_test {
  1422. char *str;
  1423. bool success;
  1424. double val;
  1425. } tests[] = {
  1426. { "10", true, 10 },
  1427. { "20", true, 20 },
  1428. { "-1", true, -1 },
  1429. { "2147483647", true, 2147483647 },
  1430. { "-2147483648", true, -2147483648 },
  1431. { "4294967295", true, 4294967295 },
  1432. { "-1.3e-1", true, -0.130},
  1433. { "1.5E2", true, 150.0},
  1434. { "0x0", false, 0 },
  1435. { "0x10", false, 0 },
  1436. { "0xaf", false, 0 },
  1437. { "x80", false, 0 },
  1438. { "0.0", true, 0.0 },
  1439. { "0.1", true, 0.1 },
  1440. { "1.2", true, 1.2 },
  1441. { "-324.9", true, -324.9 },
  1442. { "9324.9", true, 9324.9 },
  1443. { "NAN", false, 0 },
  1444. { "INFINITY", false, 0 },
  1445. { "-10x10", false, 0 },
  1446. { "1x-99", false, 0 },
  1447. { "", false, 0 },
  1448. { "abd", false, 0 },
  1449. { "xabd", false, 0 },
  1450. { "0x0x", false, 0 },
  1451. { NULL, false, 0 },
  1452. };
  1453. /* clang-format on */
  1454. double v;
  1455. bool success;
  1456. for (int i = 0; tests[i].str != NULL; i++) {
  1457. v = 0xad;
  1458. success = safe_atod(tests[i].str, &v);
  1459. litest_assert(success == tests[i].success);
  1460. if (success)
  1461. litest_assert_double_eq(v, tests[i].val);
  1462. else
  1463. litest_assert_int_eq(v, 0xad);
  1464. }
  1465. }
  1466. END_TEST
  1467. START_TEST(strsplit_test)
  1468. {
  1469. /* clang-format off */
  1470. struct strsplit_test {
  1471. const char *string;
  1472. const char *delim;
  1473. const char *results[10];
  1474. const size_t nresults;
  1475. } tests[] = {
  1476. { "one two three", " ", { "one", "two", "three", NULL }, 3 },
  1477. { "one two\tthree", " \t", { "one", "two", "three", NULL }, 3 },
  1478. { "one", " ", { "one", NULL }, 1 },
  1479. { "one two ", " ", { "one", "two", NULL }, 2 },
  1480. { "one two", " ", { "one", "two", NULL }, 2 },
  1481. { " one two", " ", { "one", "two", NULL }, 2 },
  1482. { "one", "\t \r", { "one", NULL }, 1 },
  1483. { "one two three", " t", { "one", "wo", "hree", NULL }, 3 },
  1484. { " one two three", "te", { " on", " ", "wo ", "hr", NULL }, 4 },
  1485. { "one", "ne", { "o", NULL }, 1 },
  1486. { "onene", "ne", { "o", NULL }, 1 },
  1487. { "+1-2++3--4++-+5-+-", "+-", { "1", "2", "3", "4", "5", NULL }, 5 },
  1488. /* special cases */
  1489. { "", " ", { NULL }, 0 },
  1490. { " ", " ", { NULL }, 0 },
  1491. { " ", " ", { NULL }, 0 },
  1492. { "oneoneone", "one", { NULL} , 0 },
  1493. { NULL, NULL, { NULL }, 0},
  1494. };
  1495. /* clang-format on */
  1496. struct strsplit_test *t = tests;
  1497. while (t->string) {
  1498. size_t nelem;
  1499. char **strv = strv_from_string(t->string, t->delim, &nelem);
  1500. for (size_t idx = 0; idx < t->nresults; idx++)
  1501. litest_assert_str_eq(t->results[idx], strv[idx]);
  1502. litest_assert_int_eq(nelem, t->nresults);
  1503. /* When there are no elements validate return value is Null,
  1504. otherwise validate result array is Null terminated. */
  1505. if (t->nresults == 0)
  1506. litest_assert_ptr_eq(strv, NULL);
  1507. else
  1508. litest_assert_ptr_eq(strv[t->nresults], NULL);
  1509. strv_free(strv);
  1510. t++;
  1511. }
  1512. }
  1513. END_TEST
  1514. struct strv_test_data {
  1515. const char *terminate_at;
  1516. unsigned char bitmask[1];
  1517. };
  1518. static int
  1519. strv_test_set_bitmask(const char *str, size_t index, void *data)
  1520. {
  1521. struct strv_test_data *td = data;
  1522. if (streq(str, td->terminate_at))
  1523. return index + 1;
  1524. set_bit(td->bitmask, index);
  1525. return 0;
  1526. }
  1527. START_TEST(strv_for_each_test)
  1528. {
  1529. /* clang-format off */
  1530. struct test_data {
  1531. const char *terminator;
  1532. int index;
  1533. unsigned int bitmask;
  1534. } test_data[] = {
  1535. { "one", 1, 0x0 },
  1536. { "two", 2, 0x1 },
  1537. { "three", 3, 0x3 },
  1538. { "four", 4, 0x7 },
  1539. { "five", 5, 0xf },
  1540. { "does-not-exist", 0, 0x1f },
  1541. { NULL, 0, 0x1f },
  1542. { NULL, 0 },
  1543. };
  1544. /* clang-format on */
  1545. const char *array[] = { "one", "two", "three", "four", "five", NULL };
  1546. struct test_data *t = test_data;
  1547. while (t->terminator || t->bitmask) {
  1548. const int max = 3;
  1549. struct strv_test_data td = {
  1550. .terminate_at = t->terminator,
  1551. .bitmask = { 0 },
  1552. };
  1553. int rc = strv_for_each(array, strv_test_set_bitmask, &td);
  1554. litest_assert_int_eq(rc, t->index);
  1555. litest_assert_int_eq(td.bitmask[0], t->bitmask);
  1556. struct strv_test_data tdmax = {
  1557. .terminate_at = t->terminator,
  1558. .bitmask = { 0 },
  1559. };
  1560. rc = strv_for_each_n(array, max, strv_test_set_bitmask, &tdmax);
  1561. if (max < t->index)
  1562. litest_assert_int_eq(rc, 0);
  1563. else
  1564. litest_assert_int_eq(rc, t->index);
  1565. litest_assert_int_eq(tdmax.bitmask[0], t->bitmask & ((1 << max) - 1));
  1566. t++;
  1567. }
  1568. }
  1569. END_TEST
  1570. __attribute__((format(printf, 1, 0))) static char **
  1571. test_strv_appendv(char *format, ...)
  1572. {
  1573. va_list args;
  1574. va_start(args, format);
  1575. char **strv = NULL;
  1576. strv = strv_append_vprintf(strv, "%s %d", args);
  1577. va_end(args);
  1578. return strv;
  1579. }
  1580. START_TEST(strv_append_test)
  1581. {
  1582. {
  1583. char *test_strv1[] = { "a", "b", "c", NULL };
  1584. char **test_strv2 = NULL;
  1585. litest_assert_int_eq(strv_len(test_strv1), 4U);
  1586. litest_assert_int_eq(strv_len(test_strv2), 0U);
  1587. }
  1588. {
  1589. char **strv = NULL;
  1590. char *dup = safe_strdup("test");
  1591. strv = strv_append_take(strv, &dup);
  1592. litest_assert_ptr_null(dup);
  1593. litest_assert_ptr_notnull(strv);
  1594. litest_assert_str_eq(strv[0], "test");
  1595. litest_assert_ptr_eq(strv[1], NULL);
  1596. litest_assert_int_eq(strv_len(strv), 2U);
  1597. char *dup2 = safe_strdup("test2");
  1598. strv = strv_append_take(strv, &dup2);
  1599. litest_assert_ptr_null(dup2);
  1600. litest_assert_str_eq(strv[1], "test2");
  1601. litest_assert_ptr_eq(strv[2], NULL);
  1602. litest_assert_int_eq(strv_len(strv), 3U);
  1603. strv = strv_append_take(strv, NULL);
  1604. litest_assert_int_eq(strv_len(strv), 3U);
  1605. strv_free(strv);
  1606. }
  1607. {
  1608. char **strv = NULL;
  1609. strv = strv_append_strdup(strv, "banana");
  1610. litest_assert(strv != NULL);
  1611. litest_assert_str_eq(strv[0], "banana");
  1612. litest_assert_ptr_null(strv[1]);
  1613. litest_assert_int_eq(strv_len(strv), 2U);
  1614. strv_free(strv);
  1615. }
  1616. {
  1617. char **strv = test_strv_appendv("%s %d", "apple", 2);
  1618. litest_assert_ptr_notnull(strv);
  1619. litest_assert_str_eq(strv[0], "apple 2");
  1620. litest_assert_ptr_null(strv[1]);
  1621. litest_assert_int_eq(strv_len(strv), 2U);
  1622. strv_free(strv);
  1623. }
  1624. {
  1625. char **strv = NULL;
  1626. strv = strv_append_printf(strv, "coco%s", "nut");
  1627. litest_assert_ptr_notnull(strv);
  1628. litest_assert_str_eq(strv[0], "coconut");
  1629. litest_assert_ptr_null(strv[1]);
  1630. litest_assert_int_eq(strv_len(strv), 2U);
  1631. strv_free(strv);
  1632. }
  1633. }
  1634. END_TEST
  1635. START_TEST(strv_find_test)
  1636. {
  1637. char *strv[] = { "a", "b", "c", NULL };
  1638. bool rc;
  1639. size_t index;
  1640. rc = strv_find(strv, "a", &index);
  1641. litest_assert(rc);
  1642. litest_assert_int_eq(index, 0U);
  1643. rc = strv_find(strv, "b", &index);
  1644. litest_assert(rc);
  1645. litest_assert_int_eq(index, 1U);
  1646. rc = strv_find(strv, "a", NULL);
  1647. litest_assert(rc);
  1648. index = 0xffff;
  1649. rc = strv_find(strv, "d", &index);
  1650. litest_assert(!rc);
  1651. litest_assert_int_eq(index, 0xffffU);
  1652. rc = strv_find(strv, "d", NULL);
  1653. litest_assert(!rc);
  1654. rc = strv_find(NULL, "a", &index);
  1655. litest_assert(!rc);
  1656. litest_assert_int_eq(index, 0xffffU);
  1657. rc = strv_find(NULL, NULL, &index);
  1658. litest_assert(!rc);
  1659. litest_assert_int_eq(index, 0xffffU);
  1660. rc = strv_find(strv, NULL, &index);
  1661. litest_assert(!rc);
  1662. litest_assert_int_eq(index, 0xffffU);
  1663. }
  1664. END_TEST
  1665. START_TEST(strv_find_substring_test)
  1666. {
  1667. char *strv[] = { "a", "bc", "cccc", NULL };
  1668. bool rc;
  1669. size_t index;
  1670. rc = strv_find_substring(strv, "a", &index);
  1671. litest_assert(rc);
  1672. litest_assert_int_eq(index, 0U);
  1673. rc = strv_find_substring(strv, "b", &index);
  1674. litest_assert(rc);
  1675. litest_assert_int_eq(index, 1U);
  1676. rc = strv_find_substring(strv, "c", &index);
  1677. litest_assert(rc);
  1678. litest_assert_int_eq(index, 1U);
  1679. rc = strv_find_substring(strv, "a", NULL);
  1680. litest_assert(rc);
  1681. index = 0xffff;
  1682. rc = strv_find_substring(strv, "d", &index);
  1683. litest_assert(!rc);
  1684. litest_assert_int_eq(index, 0xffffU);
  1685. rc = strv_find_substring(strv, "d", NULL);
  1686. litest_assert(!rc);
  1687. rc = strv_find_substring(NULL, "a", &index);
  1688. litest_assert(!rc);
  1689. litest_assert_int_eq(index, 0xffffU);
  1690. rc = strv_find_substring(NULL, NULL, &index);
  1691. litest_assert(!rc);
  1692. litest_assert_int_eq(index, 0xffffU);
  1693. rc = strv_find_substring(strv, NULL, &index);
  1694. litest_assert(!rc);
  1695. litest_assert_int_eq(index, 0xffffU);
  1696. }
  1697. END_TEST
  1698. START_TEST(double_array_from_string_test)
  1699. {
  1700. /* clang-format off */
  1701. struct double_array_from_string_test {
  1702. const char *string;
  1703. const char *delim;
  1704. const double array[10];
  1705. const size_t len;
  1706. const bool result;
  1707. } tests[] = {
  1708. { "1 2 3", " ", { 1, 2, 3 }, 3 },
  1709. { "1", " ", { 1 }, 1 },
  1710. { "1,2.5,", ",", { 1, 2.5 }, 2 },
  1711. { "1.0 2", " ", { 1, 2.0 }, 2 },
  1712. { " 1 2", " ", { 1, 2 }, 2 },
  1713. { " ; 1;2 3.5 ;;4.1", "; ", { 1, 2, 3.5, 4.1 }, 4 },
  1714. /* special cases */
  1715. { "1 two", " ", { 0 }, 0 },
  1716. { "one two", " ", { 0 }, 0 },
  1717. { "one 2", " ", { 0 }, 0 },
  1718. { "", " ", { 0 }, 0 },
  1719. { " ", " ", { 0 }, 0 },
  1720. { " ", " ", { 0 }, 0 },
  1721. { "", " ", { 0 }, 0 },
  1722. { "oneoneone", "one", { 0 }, 0 },
  1723. { NULL, NULL, { 0 }, 0 },
  1724. };
  1725. /* clang-format on */
  1726. struct double_array_from_string_test *t = tests;
  1727. while (t->string) {
  1728. size_t len;
  1729. double *array = double_array_from_string(t->string, t->delim, &len);
  1730. litest_assert_int_eq(len, t->len);
  1731. for (size_t idx = 0; idx < len; idx++) {
  1732. litest_assert_ptr_notnull(array);
  1733. litest_assert_double_eq(array[idx], t->array[idx]);
  1734. }
  1735. free(array);
  1736. t++;
  1737. }
  1738. }
  1739. END_TEST
  1740. START_TEST(strargv_test)
  1741. {
  1742. /* clang-format off */
  1743. struct argv_test {
  1744. int argc;
  1745. char *argv[10];
  1746. int expected;
  1747. } tests[] = {
  1748. { 0, {NULL}, 0 },
  1749. { 1, {"hello", "World"}, 1 },
  1750. { 2, {"hello", "World"}, 2 },
  1751. { 2, {"", " "}, 2 },
  1752. { 2, {"", NULL}, 0 },
  1753. { 2, {NULL, NULL}, 0 },
  1754. { 1, {NULL, NULL}, 0 },
  1755. { 3, {"hello", NULL, "World"}, 0 },
  1756. };
  1757. /* clang-format on */
  1758. ARRAY_FOR_EACH(tests, t) {
  1759. char **strv = strv_from_argv(t->argc, t->argv);
  1760. if (t->expected == 0) {
  1761. litest_assert(strv == NULL);
  1762. } else {
  1763. int count = 0;
  1764. char **s = strv;
  1765. while (*s) {
  1766. litest_assert_str_eq(*s, t->argv[count]);
  1767. count++;
  1768. s++;
  1769. }
  1770. litest_assert_int_eq(t->expected, count);
  1771. strv_free(strv);
  1772. }
  1773. }
  1774. }
  1775. END_TEST
  1776. START_TEST(kvsplit_double_test)
  1777. {
  1778. /* clang-format off */
  1779. struct kvsplit_dbl_test {
  1780. const char *string;
  1781. const char *psep;
  1782. const char *kvsep;
  1783. ssize_t nresults;
  1784. struct {
  1785. double a;
  1786. double b;
  1787. } results[32];
  1788. } tests[] = {
  1789. { "1:2;3:4;5:6", ";", ":", 3, { {1, 2}, {3, 4}, {5, 6}}},
  1790. { "1.0x2.3 -3.2x4.5 8.090909x-6.00", " ", "x", 3, { {1.0, 2.3}, {-3.2, 4.5}, {8.090909, -6}}},
  1791. { "1:2", "x", ":", 1, {{1, 2}}},
  1792. { "1:2", ":", "x", -1, {}},
  1793. { "1:2", NULL, "x", -1, {}},
  1794. { "1:2", "", "x", -1, {}},
  1795. { "1:2", "x", NULL, -1, {}},
  1796. { "1:2", "x", "", -1, {}},
  1797. { "a:b", "x", ":", -1, {}},
  1798. { "", " ", "x", -1, {}},
  1799. { "1.2.3.4.5", ".", "", -1, {}},
  1800. { NULL },
  1801. };
  1802. /* clang-format on */
  1803. struct kvsplit_dbl_test *t = tests;
  1804. while (t->string) {
  1805. struct key_value_double *result = NULL;
  1806. ssize_t npairs;
  1807. npairs = kv_double_from_string(t->string, t->psep, t->kvsep, &result);
  1808. litest_assert_int_eq(npairs, t->nresults);
  1809. for (ssize_t i = 0; i < npairs; i++) {
  1810. litest_assert_double_eq(t->results[i].a, result[i].key);
  1811. litest_assert_double_eq(t->results[i].b, result[i].value);
  1812. }
  1813. free(result);
  1814. t++;
  1815. }
  1816. }
  1817. END_TEST
  1818. START_TEST(strjoin_test)
  1819. {
  1820. /* clang-format off */
  1821. struct strjoin_test {
  1822. char *strv[10];
  1823. const char *joiner;
  1824. const char *result;
  1825. } tests[] = {
  1826. { { "one", "two", "three", NULL }, " ", "one two three" },
  1827. { { "one", NULL }, "x", "one" },
  1828. { { "one", "two", NULL }, "x", "onextwo" },
  1829. { { "one", "two", NULL }, ",", "one,two" },
  1830. { { "one", "two", NULL }, ", ", "one, two" },
  1831. { { "one", "two", NULL }, "one", "oneonetwo" },
  1832. { { "one", "two", NULL }, NULL, NULL },
  1833. { { "", "", "", NULL }, " ", " " },
  1834. { { "a", "b", "c", NULL }, "", "abc" },
  1835. { { "", "b", "c", NULL }, "x", "xbxc" },
  1836. { { "", "", "", NULL }, "", "" },
  1837. { { NULL }, NULL, NULL },
  1838. };
  1839. /* clang-format on */
  1840. struct strjoin_test *t = tests;
  1841. struct strjoin_test nulltest = { { NULL }, "x", NULL };
  1842. while (t->strv[0]) {
  1843. char *str;
  1844. str = strv_join(t->strv, t->joiner);
  1845. if (t->result == NULL)
  1846. litest_assert(str == NULL);
  1847. else
  1848. litest_assert_str_eq(str, t->result);
  1849. free(str);
  1850. t++;
  1851. }
  1852. litest_assert(strv_join(nulltest.strv, "x") == NULL);
  1853. }
  1854. END_TEST
  1855. START_TEST(strstrip_test)
  1856. {
  1857. /* clang-format off */
  1858. struct strstrip_test {
  1859. const char *string;
  1860. const char *expected;
  1861. const char *what;
  1862. } tests[] = {
  1863. { "foo", "foo", "1234" },
  1864. { "\"bar\"", "bar", "\"" },
  1865. { "'bar'", "bar", "'" },
  1866. { "\"bar\"", "\"bar\"", "'" },
  1867. { "'bar'", "'bar'", "\"" },
  1868. { "\"bar\"", "bar", "\"" },
  1869. { "\"\"", "", "\"" },
  1870. { "\"foo\"bar\"", "foo\"bar", "\"" },
  1871. { "\"'foo\"bar\"", "foo\"bar", "\"'" },
  1872. { "abcfooabcbarbca", "fooabcbar", "abc" },
  1873. { "xxxxfoo", "foo", "x" },
  1874. { "fooyyyy", "foo", "y" },
  1875. { "xxxxfooyyyy", "foo", "xy" },
  1876. { "x xfooy y", " xfooy ", "xy" },
  1877. { " foo\n", "foo", " \n" },
  1878. { "", "", "abc" },
  1879. { "", "", "" },
  1880. { NULL , NULL, NULL },
  1881. };
  1882. /* clang-format on */
  1883. struct strstrip_test *t = tests;
  1884. while (t->string) {
  1885. char *str;
  1886. str = strstrip(t->string, t->what);
  1887. litest_assert_str_eq(str, t->expected);
  1888. free(str);
  1889. t++;
  1890. }
  1891. }
  1892. END_TEST
  1893. START_TEST(strendswith_test)
  1894. {
  1895. /* clang-format off */
  1896. struct strendswith_test {
  1897. const char *string;
  1898. const char *suffix;
  1899. bool expected;
  1900. } tests[] = {
  1901. { "foobar", "bar", true },
  1902. { "foobar", "foo", false },
  1903. { "foobar", "foobar", true },
  1904. { "foo", "foobar", false },
  1905. { "foobar", "", false },
  1906. { "", "", false },
  1907. { "", "foo", false },
  1908. { NULL, NULL, false },
  1909. };
  1910. /* clang-format on */
  1911. for (struct strendswith_test *t = tests; t->string; t++) {
  1912. litest_assert_int_eq(strendswith(t->string, t->suffix), t->expected);
  1913. }
  1914. }
  1915. END_TEST
  1916. START_TEST(strstartswith_test)
  1917. {
  1918. /* clang-format off */
  1919. struct strstartswith_test {
  1920. const char *string;
  1921. const char *suffix;
  1922. bool expected;
  1923. } tests[] = {
  1924. { "foobar", "foo", true },
  1925. { "foobar", "bar", false },
  1926. { "foobar", "foobar", true },
  1927. { "foo", "foobar", false },
  1928. { "foo", "", false },
  1929. { "", "", false },
  1930. { "foo", "", false },
  1931. { NULL, NULL, false },
  1932. };
  1933. /* clang-format on */
  1934. for (struct strstartswith_test *t = tests; t->string; t++) {
  1935. litest_assert_int_eq(strstartswith(t->string, t->suffix), t->expected);
  1936. }
  1937. }
  1938. END_TEST
  1939. START_TEST(strsanitize_test)
  1940. {
  1941. /* clang-format off */
  1942. struct strsanitize_test {
  1943. const char *string;
  1944. const char *expected;
  1945. } tests[] = {
  1946. { "foobar", "foobar" },
  1947. { "", "" },
  1948. { "%", "%%" },
  1949. { "%%%%", "%%%%%%%%" },
  1950. { "x %s", "x %%s" },
  1951. { "x %", "x %%" },
  1952. { "%sx", "%%sx" },
  1953. { "%s%s", "%%s%%s" },
  1954. { "\t", "?" },
  1955. { "\n", "?" },
  1956. { "\r", "?" },
  1957. { "\x1b[31m", "?[31m" },
  1958. { "foo\tbar", "foo?bar" },
  1959. { "foo\nbar", "foo?bar" },
  1960. { "\x01\x1f\x7f", "???" },
  1961. { "clean", "clean" },
  1962. { "a\x1b[0mb", "a?[0mb" },
  1963. { "%\n", "%%?" },
  1964. { NULL, NULL },
  1965. };
  1966. /* clang-format on */
  1967. for (struct strsanitize_test *t = tests; t->string; t++) {
  1968. char *sanitized = str_sanitize(t->string);
  1969. litest_assert_str_eq(sanitized, t->expected);
  1970. free(sanitized);
  1971. }
  1972. }
  1973. END_TEST
  1974. START_TEST(list_test_insert)
  1975. {
  1976. struct list_test {
  1977. int val;
  1978. struct list node;
  1979. } tests[] = {
  1980. { .val = 1 },
  1981. { .val = 2 },
  1982. { .val = 3 },
  1983. { .val = 4 },
  1984. };
  1985. struct list_test *t;
  1986. struct list head;
  1987. int val;
  1988. list_init(&head);
  1989. ARRAY_FOR_EACH(tests, t) {
  1990. list_insert(&head, &t->node);
  1991. }
  1992. val = 4;
  1993. list_for_each(t, &head, node) {
  1994. litest_assert_int_eq(t->val, val);
  1995. val--;
  1996. }
  1997. litest_assert_int_eq(val, 0);
  1998. }
  1999. END_TEST
  2000. START_TEST(list_test_append)
  2001. {
  2002. struct list_test {
  2003. int val;
  2004. struct list node;
  2005. } tests[] = {
  2006. { .val = 1 },
  2007. { .val = 2 },
  2008. { .val = 3 },
  2009. { .val = 4 },
  2010. };
  2011. struct list_test *t;
  2012. struct list head;
  2013. int val;
  2014. list_init(&head);
  2015. ARRAY_FOR_EACH(tests, t) {
  2016. list_append(&head, &t->node);
  2017. }
  2018. val = 1;
  2019. list_for_each(t, &head, node) {
  2020. litest_assert_int_eq(t->val, val);
  2021. val++;
  2022. }
  2023. litest_assert_int_eq(val, 5);
  2024. }
  2025. END_TEST
  2026. START_TEST(list_test_chain)
  2027. {
  2028. struct list_test {
  2029. int val;
  2030. struct list node;
  2031. } tests[] = {
  2032. { .val = 1 },
  2033. { .val = 2 },
  2034. { .val = 3 },
  2035. { .val = 4 },
  2036. };
  2037. struct list l1, l2;
  2038. struct list_test *t;
  2039. int val;
  2040. list_init(&l1);
  2041. list_init(&l2);
  2042. list_chain(&l1, &l2);
  2043. litest_assert(list_empty(&l2));
  2044. list_append(&l2, &tests[0].node);
  2045. list_append(&l2, &tests[1].node);
  2046. list_chain(&l1, &l2);
  2047. litest_assert(list_empty(&l2));
  2048. val = 1;
  2049. list_for_each_safe(t, &l1, node) {
  2050. litest_assert_int_eq(t->val, val);
  2051. val++;
  2052. list_remove(&t->node);
  2053. }
  2054. litest_assert_int_eq(val, 3);
  2055. list_append(&l1, &tests[0].node);
  2056. list_append(&l1, &tests[1].node);
  2057. list_append(&l2, &tests[2].node);
  2058. list_append(&l2, &tests[3].node);
  2059. list_chain(&l1, &l2);
  2060. litest_assert(list_empty(&l2));
  2061. val = 1;
  2062. list_for_each(t, &l1, node) {
  2063. litest_assert_int_eq(t->val, val);
  2064. val++;
  2065. }
  2066. litest_assert_int_eq(val, 5);
  2067. }
  2068. END_TEST
  2069. START_TEST(list_test_foreach)
  2070. {
  2071. struct list_test {
  2072. int val;
  2073. struct list node;
  2074. } tests[] = {
  2075. { .val = 1 },
  2076. { .val = 2 },
  2077. { .val = 3 },
  2078. { .val = 4 },
  2079. };
  2080. struct list_test *t;
  2081. struct list head;
  2082. list_init(&head);
  2083. ARRAY_FOR_EACH(tests, t) {
  2084. list_append(&head, &t->node);
  2085. }
  2086. /* Make sure both loop macros are a single line statement */
  2087. if (false)
  2088. list_for_each(t, &head, node) {
  2089. litest_abort_msg("We should not get here");
  2090. }
  2091. if (false)
  2092. list_for_each_safe(t, &head, node) {
  2093. litest_abort_msg("We should not get here");
  2094. }
  2095. }
  2096. END_TEST
  2097. START_TEST(list_test_first_last)
  2098. {
  2099. struct list_test {
  2100. int val;
  2101. struct list node;
  2102. } tests[] = {
  2103. { .val = 1 },
  2104. { .val = 2 },
  2105. { .val = 3 },
  2106. { .val = 4 },
  2107. };
  2108. struct list head;
  2109. list_init(&head);
  2110. ARRAY_FOR_EACH(tests, t) {
  2111. list_append(&head, &t->node);
  2112. }
  2113. struct list_test *first;
  2114. struct list_test *last;
  2115. first = list_first_entry(&head, first, node);
  2116. last = list_last_entry(&head, last, node);
  2117. litest_assert_ptr_eq(first, &tests[0]);
  2118. litest_assert_ptr_eq(last, &tests[3]);
  2119. struct list_test *second;
  2120. struct list_test *penultimate;
  2121. second = list_first_entry(&first->node, first, node);
  2122. penultimate = list_last_entry(&last->node, last, node);
  2123. litest_assert_ptr_eq(second, &tests[1]);
  2124. litest_assert_ptr_eq(penultimate, &tests[2]);
  2125. /* Now remove nodes */
  2126. /* No change expected */
  2127. list_remove(&tests[2].node);
  2128. first = list_first_entry(&head, first, node);
  2129. last = list_last_entry(&head, last, node);
  2130. litest_assert_ptr_eq(first, &tests[0]);
  2131. litest_assert_ptr_eq(last, &tests[3]);
  2132. list_remove(&tests[3].node);
  2133. first = list_first_entry(&head, first, node);
  2134. last = list_last_entry(&head, last, node);
  2135. litest_assert_ptr_eq(first, &tests[0]);
  2136. litest_assert_ptr_eq(last, &tests[1]);
  2137. list_remove(&tests[0].node);
  2138. first = list_first_entry(&head, first, node);
  2139. last = list_last_entry(&head, last, node);
  2140. litest_assert_ptr_eq(first, &tests[1]);
  2141. litest_assert_ptr_eq(last, &tests[1]);
  2142. }
  2143. END_TEST
  2144. START_TEST(strverscmp_test)
  2145. {
  2146. litest_assert_int_eq(libinput_strverscmp("", ""), 0);
  2147. litest_assert_int_gt(libinput_strverscmp("0.0.1", ""), 0);
  2148. litest_assert_int_lt(libinput_strverscmp("", "0.0.1"), 0);
  2149. litest_assert_int_eq(libinput_strverscmp("0.0.1", "0.0.1"), 0);
  2150. litest_assert_int_eq(libinput_strverscmp("0.0.1", "0.0.2"), -1);
  2151. litest_assert_int_eq(libinput_strverscmp("0.0.2", "0.0.1"), 1);
  2152. litest_assert_int_eq(libinput_strverscmp("0.0.1", "0.1.0"), -1);
  2153. litest_assert_int_eq(libinput_strverscmp("0.1.0", "0.0.1"), 1);
  2154. }
  2155. END_TEST
  2156. START_TEST(streq_test)
  2157. {
  2158. litest_assert(streq("", "") == true);
  2159. litest_assert(streq(NULL, NULL) == true);
  2160. litest_assert(streq("0.0.1", "") == false);
  2161. litest_assert(streq("foo", NULL) == false);
  2162. litest_assert(streq(NULL, "foo") == false);
  2163. litest_assert(streq("0.0.1", "0.0.1") == true);
  2164. }
  2165. END_TEST
  2166. START_TEST(strneq_test)
  2167. {
  2168. litest_assert(strneq("", "", 1) == true);
  2169. litest_assert(strneq(NULL, NULL, 1) == true);
  2170. litest_assert(strneq("0.0.1", "", 6) == false);
  2171. litest_assert(strneq("foo", NULL, 5) == false);
  2172. litest_assert(strneq(NULL, "foo", 5) == false);
  2173. litest_assert(strneq("0.0.1", "0.0.1", 6) == true);
  2174. }
  2175. END_TEST
  2176. START_TEST(basename_test)
  2177. {
  2178. struct test {
  2179. const char *path;
  2180. const char *expected;
  2181. } tests[] = {
  2182. { "a", "a" },
  2183. { "foo.c", "foo.c" },
  2184. { "foo", "foo" },
  2185. { "/path/to/foo.h", "foo.h" },
  2186. { "../bar.foo", "bar.foo" },
  2187. { "./bar.foo.baz", "bar.foo.baz" },
  2188. { "./", NULL },
  2189. { "/", NULL },
  2190. { "/bar/", NULL },
  2191. { "/bar", "bar" },
  2192. { "", NULL },
  2193. };
  2194. ARRAY_FOR_EACH(tests, t) {
  2195. const char *result = safe_basename(t->path);
  2196. if (t->expected == NULL)
  2197. litest_assert(result == NULL);
  2198. else
  2199. litest_assert_str_eq(result, t->expected);
  2200. }
  2201. }
  2202. END_TEST
  2203. START_TEST(trunkname_test)
  2204. {
  2205. struct test {
  2206. const char *path;
  2207. const char *expected;
  2208. } tests[] = {
  2209. { "foo.c", "foo" },
  2210. { "/path/to/foo.h", "foo" },
  2211. { "/path/to/foo", "foo" },
  2212. { "../bar.foo", "bar" },
  2213. { "./bar.foo.baz", "bar.foo" },
  2214. { "./", "" },
  2215. { "/", "" },
  2216. { "/bar/", "" },
  2217. { "/bar", "bar" },
  2218. { "", "" },
  2219. };
  2220. ARRAY_FOR_EACH(tests, t) {
  2221. char *result = trunkname(t->path);
  2222. litest_assert_str_eq(result, t->expected);
  2223. free(result);
  2224. }
  2225. }
  2226. END_TEST
  2227. START_TEST(absinfo_normalize_value_test)
  2228. {
  2229. struct input_absinfo abs = {
  2230. .minimum = 0,
  2231. .maximum = 100,
  2232. };
  2233. litest_assert_double_eq(absinfo_normalize_value(&abs, -100), 0.0);
  2234. litest_assert_double_eq(absinfo_normalize_value(&abs, -1), 0.0);
  2235. litest_assert_double_eq(absinfo_normalize_value(&abs, 0), 0.0);
  2236. litest_assert_double_gt(absinfo_normalize_value(&abs, 1), 0.0);
  2237. litest_assert_double_lt(absinfo_normalize_value(&abs, 99), 1.0);
  2238. litest_assert_double_eq(absinfo_normalize_value(&abs, 100), 1.0);
  2239. litest_assert_double_eq(absinfo_normalize_value(&abs, 101), 1.0);
  2240. litest_assert_double_eq(absinfo_normalize_value(&abs, 200), 1.0);
  2241. abs.minimum = -50;
  2242. abs.maximum = 50;
  2243. litest_assert_double_eq(absinfo_normalize_value(&abs, -51), 0.0);
  2244. litest_assert_double_eq(absinfo_normalize_value(&abs, -50), 0.0);
  2245. litest_assert_double_eq(absinfo_normalize_value(&abs, 0), 0.5);
  2246. litest_assert_double_eq(absinfo_normalize_value(&abs, 50), 1.0);
  2247. litest_assert_double_eq(absinfo_normalize_value(&abs, 51), 1.0);
  2248. abs.minimum = -50;
  2249. abs.maximum = 0;
  2250. litest_assert_double_eq(absinfo_normalize_value(&abs, -51), 0.0);
  2251. litest_assert_double_eq(absinfo_normalize_value(&abs, -50), 0.0);
  2252. litest_assert_double_gt(absinfo_normalize_value(&abs, -49), 0.0);
  2253. litest_assert_double_lt(absinfo_normalize_value(&abs, -1), 1.0);
  2254. litest_assert_double_eq(absinfo_normalize_value(&abs, 0), 1.0);
  2255. }
  2256. END_TEST
  2257. START_TEST(range_test)
  2258. {
  2259. struct range incl = range_init_inclusive(1, 100);
  2260. litest_assert_int_eq(incl.lower, 1);
  2261. litest_assert_int_eq(incl.upper, 101);
  2262. struct range excl = range_init_exclusive(1, 100);
  2263. litest_assert_int_eq(excl.lower, 1);
  2264. litest_assert_int_eq(excl.upper, 100);
  2265. struct range zero = range_init_exclusive(0, 0);
  2266. litest_assert_int_eq(zero.lower, 0);
  2267. litest_assert_int_eq(zero.upper, 0);
  2268. struct range empty = range_init_empty();
  2269. litest_assert_int_eq(empty.lower, 0);
  2270. litest_assert_int_eq(empty.upper, -1);
  2271. litest_assert(range_is_valid(&incl));
  2272. litest_assert(range_is_valid(&excl));
  2273. litest_assert(!range_is_valid(&zero));
  2274. litest_assert(!range_is_valid(&empty));
  2275. int expected = 1;
  2276. int r = 0;
  2277. range_for_each(&incl, r) {
  2278. litest_assert_int_eq(r, expected);
  2279. expected++;
  2280. }
  2281. litest_assert_int_eq(r, 101);
  2282. }
  2283. END_TEST
  2284. START_TEST(stringbuf_test)
  2285. {
  2286. struct stringbuf buf;
  2287. struct stringbuf *b = &buf;
  2288. int rc;
  2289. stringbuf_init(b);
  2290. litest_assert_int_eq(b->len, 0u);
  2291. rc = stringbuf_append_string(b, "foo");
  2292. litest_assert_neg_errno_success(rc);
  2293. rc = stringbuf_append_string(b, "bar");
  2294. litest_assert_neg_errno_success(rc);
  2295. rc = stringbuf_append_string(b, "baz");
  2296. litest_assert_neg_errno_success(rc);
  2297. litest_assert_str_eq(b->data, "foobarbaz");
  2298. litest_assert_int_eq(b->len, strlen("foobarbaz"));
  2299. rc = stringbuf_ensure_space(b, 500);
  2300. litest_assert_neg_errno_success(rc);
  2301. litest_assert_int_ge(b->sz, 500u);
  2302. rc = stringbuf_ensure_size(b, 0);
  2303. litest_assert_neg_errno_success(rc);
  2304. rc = stringbuf_ensure_size(b, 1024);
  2305. litest_assert_neg_errno_success(rc);
  2306. litest_assert_int_ge(b->sz, 1024u);
  2307. char *data = stringbuf_steal(b);
  2308. litest_assert_str_eq(data, "foobarbaz");
  2309. litest_assert_int_eq(b->sz, 0u);
  2310. litest_assert_int_eq(b->len, 0u);
  2311. litest_assert_ptr_null(b->data);
  2312. free(data);
  2313. const char *str = "1234567890";
  2314. rc = stringbuf_append_string(b, str);
  2315. litest_assert_neg_errno_success(rc);
  2316. litest_assert_str_eq(b->data, str);
  2317. litest_assert_int_eq(b->len, 10u);
  2318. stringbuf_reset(b);
  2319. /* intentional double-reset */
  2320. stringbuf_reset(b);
  2321. int pipefd[2];
  2322. rc = pipe2(pipefd, O_CLOEXEC | O_NONBLOCK);
  2323. litest_assert_neg_errno_success(rc);
  2324. str = "foo bar baz";
  2325. char *compare = NULL;
  2326. for (int i = 0; i < 100; i++) {
  2327. rc = write(pipefd[1], str, strlen(str));
  2328. litest_assert_neg_errno_success(rc);
  2329. rc = stringbuf_append_from_fd(b, pipefd[0], 64);
  2330. litest_assert_neg_errno_success(rc);
  2331. char *expected = strdup_printf("%s%s", compare ? compare : "", str);
  2332. litest_assert_ptr_notnull(expected);
  2333. litest_assert_str_eq(b->data, expected);
  2334. free(compare);
  2335. compare = expected;
  2336. }
  2337. free(compare);
  2338. close(pipefd[0]);
  2339. close(pipefd[1]);
  2340. stringbuf_reset(b);
  2341. rc = pipe2(pipefd, O_CLOEXEC | O_NONBLOCK);
  2342. litest_assert_neg_errno_success(rc);
  2343. const size_t stride = 256;
  2344. const size_t maxsize = 4096;
  2345. for (size_t i = 0; i < maxsize; i += stride) {
  2346. char buf[stride];
  2347. memset(buf, i / stride, sizeof(buf));
  2348. rc = write(pipefd[1], buf, sizeof(buf));
  2349. litest_assert_neg_errno_success(rc);
  2350. }
  2351. stringbuf_append_from_fd(b, pipefd[0], 0);
  2352. litest_assert_int_eq(b->len, maxsize);
  2353. litest_assert_int_ge(b->sz, maxsize);
  2354. for (size_t i = 0; i < maxsize; i += stride) {
  2355. char buf[stride];
  2356. memset(buf, i / stride, sizeof(buf));
  2357. litest_assert_int_eq(memcmp(buf, b->data + i, sizeof(buf)), 0);
  2358. }
  2359. close(pipefd[0]);
  2360. close(pipefd[1]);
  2361. stringbuf_reset(b);
  2362. }
  2363. END_TEST
  2364. START_TEST(multivalue_test)
  2365. {
  2366. {
  2367. struct multivalue v = multivalue_new_string("test");
  2368. litest_assert_int_eq(v.type, 's');
  2369. litest_assert_str_eq(v.value.s, "test");
  2370. const char *s;
  2371. multivalue_extract_typed(&v, 's', &s);
  2372. litest_assert_str_eq(s, "test");
  2373. litest_assert_ptr_eq(s, (const char *)v.value.s);
  2374. multivalue_extract(&v, &s);
  2375. litest_assert_str_eq(s, "test");
  2376. litest_assert_ptr_eq(s, (const char *)v.value.s);
  2377. struct multivalue copy = multivalue_copy(&v);
  2378. litest_assert_int_eq(copy.type, v.type);
  2379. litest_assert_str_eq(copy.value.s, v.value.s);
  2380. char *p1 = copy.value.s;
  2381. char *p2 = v.value.s;
  2382. litest_assert_ptr_ne(p1, p2);
  2383. char *str = multivalue_as_str(&v);
  2384. litest_assert_str_eq(str, "test");
  2385. free(str);
  2386. }
  2387. {
  2388. struct multivalue v = multivalue_new_char('x');
  2389. litest_assert_int_eq(v.type, 'c');
  2390. litest_assert_int_eq(v.value.c, 'x');
  2391. char c;
  2392. multivalue_extract_typed(&v, 'c', &c);
  2393. litest_assert_int_eq(c, 'x');
  2394. multivalue_extract(&v, &c);
  2395. litest_assert_int_eq(c, 'x');
  2396. struct multivalue copy = multivalue_copy(&v);
  2397. litest_assert_int_eq(copy.type, v.type);
  2398. litest_assert_int_eq(copy.value.c, v.value.c);
  2399. char *str = multivalue_as_str(&v);
  2400. litest_assert_str_eq(str, "x");
  2401. free(str);
  2402. }
  2403. {
  2404. struct multivalue v = multivalue_new_u32(0x1234);
  2405. litest_assert_int_eq(v.type, 'u');
  2406. litest_assert_int_eq(v.value.u, 0x1234u);
  2407. uint32_t c;
  2408. multivalue_extract_typed(&v, 'u', &c);
  2409. litest_assert_int_eq(c, 0x1234u);
  2410. multivalue_extract(&v, &c);
  2411. litest_assert_int_eq(c, 0x1234u);
  2412. struct multivalue copy = multivalue_copy(&v);
  2413. litest_assert_int_eq(copy.type, v.type);
  2414. litest_assert_int_eq(copy.value.u, v.value.u);
  2415. char *str = multivalue_as_str(&v);
  2416. litest_assert_str_eq(str, "4660");
  2417. free(str);
  2418. }
  2419. {
  2420. struct multivalue v = multivalue_new_i32(-123);
  2421. litest_assert_int_eq(v.type, 'i');
  2422. litest_assert_int_eq(v.value.i, -123);
  2423. int32_t c;
  2424. multivalue_extract_typed(&v, 'i', &c);
  2425. litest_assert_int_eq(c, -123);
  2426. multivalue_extract(&v, &c);
  2427. litest_assert_int_eq(c, -123);
  2428. struct multivalue copy = multivalue_copy(&v);
  2429. litest_assert_int_eq(copy.type, v.type);
  2430. litest_assert_int_eq(copy.value.i, v.value.i);
  2431. char *str = multivalue_as_str(&v);
  2432. litest_assert_str_eq(str, "-123");
  2433. free(str);
  2434. }
  2435. {
  2436. struct multivalue v = multivalue_new_bool(true);
  2437. litest_assert_int_eq(v.type, 'b');
  2438. litest_assert_int_eq(v.value.b, true);
  2439. bool c;
  2440. multivalue_extract_typed(&v, 'b', &c);
  2441. litest_assert_int_eq(c, true);
  2442. multivalue_extract(&v, &c);
  2443. litest_assert_int_eq(c, true);
  2444. struct multivalue copy = multivalue_copy(&v);
  2445. litest_assert_int_eq(copy.type, v.type);
  2446. litest_assert_int_eq(copy.value.b, v.value.b);
  2447. char *str = multivalue_as_str(&v);
  2448. litest_assert_str_eq(str, "true");
  2449. free(str);
  2450. }
  2451. {
  2452. struct multivalue v = multivalue_new_double(0.1234);
  2453. litest_assert_int_eq(v.type, 'd');
  2454. litest_assert_double_eq(v.value.d, 0.1234);
  2455. double c;
  2456. multivalue_extract_typed(&v, 'd', &c);
  2457. litest_assert_double_eq(c, 0.1234);
  2458. multivalue_extract(&v, &c);
  2459. litest_assert_double_eq(c, 0.1234);
  2460. struct multivalue copy = multivalue_copy(&v);
  2461. litest_assert_int_eq(copy.type, v.type);
  2462. litest_assert_double_eq(copy.value.d, v.value.d);
  2463. char *str = multivalue_as_str(&v);
  2464. litest_assert_str_eq(str, "0.123400");
  2465. free(str);
  2466. }
  2467. }
  2468. END_TEST
  2469. DECLARE_NEWTYPE(newint, int);
  2470. DECLARE_NEWTYPE(newdouble, double);
  2471. START_TEST(newtype_test)
  2472. {
  2473. {
  2474. newint_t n1 = newint_from_int(1);
  2475. newint_t n2 = newint_from_int(2);
  2476. litest_assert_int_eq(newint(n1), 1);
  2477. litest_assert_int_eq(newint_as_int(n1), 1);
  2478. litest_assert_int_eq(newint(n2), 2);
  2479. litest_assert_int_eq(newint_as_int(n2), 2);
  2480. litest_assert_int_eq(newint_cmp(n1, n2), -1);
  2481. litest_assert_int_eq(newint_cmp(n1, n1), 0);
  2482. litest_assert_int_eq(newint_cmp(n2, n1), 1);
  2483. newint_t copy = newint_copy(n1);
  2484. litest_assert_int_eq(newint_cmp(n1, copy), 0);
  2485. newint_t min = newint_min(n1, n2);
  2486. newint_t max = newint_max(n1, n2);
  2487. litest_assert_int_eq(newint_cmp(min, n1), 0);
  2488. litest_assert_int_eq(newint_cmp(max, n2), 0);
  2489. litest_assert(newint_gt(n1, 0));
  2490. litest_assert(newint_eq(n1, 1));
  2491. litest_assert(newint_ge(n1, 1));
  2492. litest_assert(newint_le(n1, 1));
  2493. litest_assert(newint_ne(n1, 2));
  2494. litest_assert(newint_lt(n1, 2));
  2495. litest_assert(!newint_gt(n1, 1));
  2496. litest_assert(!newint_eq(n1, 0));
  2497. litest_assert(!newint_ge(n1, 2));
  2498. litest_assert(!newint_le(n1, 0));
  2499. litest_assert(!newint_ne(n1, 1));
  2500. litest_assert(!newint_lt(n1, 1));
  2501. }
  2502. {
  2503. newdouble_t n1 = newdouble_from_double(1.2);
  2504. newdouble_t n2 = newdouble_from_double(2.3);
  2505. litest_assert_double_eq(newdouble(n1), 1.2);
  2506. litest_assert_double_eq(newdouble_as_double(n1), 1.2);
  2507. litest_assert_double_eq(newdouble(n2), 2.3);
  2508. litest_assert_double_eq(newdouble_as_double(n2), 2.3);
  2509. litest_assert_int_eq(newdouble_cmp(n1, n2), -1);
  2510. litest_assert_int_eq(newdouble_cmp(n1, n1), 0);
  2511. litest_assert_int_eq(newdouble_cmp(n2, n1), 1);
  2512. newdouble_t copy = newdouble_copy(n1);
  2513. litest_assert_int_eq(newdouble_cmp(n1, copy), 0);
  2514. newdouble_t min = newdouble_min(n1, n2);
  2515. newdouble_t max = newdouble_max(n1, n2);
  2516. litest_assert_int_eq(newdouble_cmp(min, n1), 0);
  2517. litest_assert_int_eq(newdouble_cmp(max, n2), 0);
  2518. litest_assert(newdouble_gt(n1, 0.0));
  2519. litest_assert(newdouble_eq(n1, 1.2));
  2520. litest_assert(newdouble_ge(n1, 1.2));
  2521. litest_assert(newdouble_le(n1, 1.2));
  2522. litest_assert(newdouble_ne(n1, 2.3));
  2523. litest_assert(newdouble_lt(n1, 2.3));
  2524. litest_assert(!newdouble_gt(n1, 1.2));
  2525. litest_assert(!newdouble_eq(n1, 0.0));
  2526. litest_assert(!newdouble_ge(n1, 2.3));
  2527. litest_assert(!newdouble_le(n1, 0.0));
  2528. litest_assert(!newdouble_ne(n1, 1.2));
  2529. litest_assert(!newdouble_lt(n1, 1.2));
  2530. }
  2531. }
  2532. END_TEST
  2533. struct sunref {};
  2534. struct sdestroy {};
  2535. struct sfree {};
  2536. static void
  2537. sunref_unref(struct sunref *s)
  2538. {
  2539. free(s);
  2540. }
  2541. static void
  2542. sdestroy_destroy(struct sdestroy *s)
  2543. {
  2544. free(s);
  2545. }
  2546. static void
  2547. sfree_free(struct sfree *s)
  2548. {
  2549. free(s);
  2550. }
  2551. DEFINE_UNREF_CLEANUP_FUNC(sunref);
  2552. DEFINE_DESTROY_CLEANUP_FUNC(sdestroy);
  2553. DEFINE_FREE_CLEANUP_FUNC(sfree);
  2554. START_TEST(attribute_cleanup)
  2555. {
  2556. /* These tests will likely only show up in valgrind,
  2557. * the various asserts are just to shut up the compiler
  2558. * about unused variables
  2559. */
  2560. {
  2561. _autofree_ char *autofree = zalloc(64);
  2562. litest_assert(autofree);
  2563. }
  2564. {
  2565. _autofree_ char *stolen = zalloc(64);
  2566. free(steal(&stolen));
  2567. }
  2568. {
  2569. _autoclose_ int fd = open("/proc/self/cmdline", O_RDONLY);
  2570. litest_assert_int_ge(fd, 0);
  2571. _autoclose_ int badfd = -1;
  2572. litest_assert_int_eq(badfd, -1);
  2573. _autoclose_ int stealfd = open("/proc/self/cmdline", O_RDONLY);
  2574. steal_fd(&stealfd);
  2575. litest_assert_int_eq(stealfd, -1);
  2576. }
  2577. {
  2578. _autostrvfree_ char **strv = zalloc(3 * sizeof(*strv));
  2579. for (int i = 0; i < 2; i++) {
  2580. strv[i] = strdup_printf("element %d", i);
  2581. }
  2582. _autostrvfree_ char **badstrv = NULL;
  2583. litest_assert_ptr_null(badstrv);
  2584. }
  2585. {
  2586. _autofclose_ FILE *fp = fopen("/proc/self/cmdline", "r");
  2587. litest_assert_ptr_notnull(fp);
  2588. _autofclose_ FILE *badfd = NULL;
  2589. litest_assert_ptr_null(badfd);
  2590. }
  2591. {
  2592. _unref_(sunref) *s = zalloc(sizeof(*s));
  2593. }
  2594. {
  2595. _destroy_(sdestroy) *s = zalloc(sizeof(*s));
  2596. }
  2597. {
  2598. _free_(sfree) *s = zalloc(sizeof(*s));
  2599. }
  2600. }
  2601. END_TEST
  2602. START_TEST(macros_expand)
  2603. {
  2604. #define _A1(_1) _1, #_1
  2605. #define _A2(_1, _2) _1, _2
  2606. #define A(...) _VARIABLE_MACRO(_A, __VA_ARGS__)
  2607. char buf[64];
  2608. snprintf(buf, sizeof(buf), "%d:%s", A(0));
  2609. litest_assert_str_eq(buf, "0:0");
  2610. snprintf(buf, sizeof(buf), "%d:%s", A(100));
  2611. litest_assert_str_eq(buf, "100:100");
  2612. snprintf(buf, sizeof(buf), "%d:%s", A(100, "hundred"));
  2613. litest_assert_str_eq(buf, "100:hundred");
  2614. #undef _A1
  2615. #undef _A2
  2616. #undef A
  2617. }
  2618. END_TEST
  2619. START_TEST(evdev_frames)
  2620. {
  2621. #define U(u_) evdev_usage_from_uint32_t(u_)
  2622. {
  2623. evdev_frame_unref(NULL); /* unref on NULL is permitted */
  2624. }
  2625. {
  2626. _unref_(evdev_frame) *frame = evdev_frame_new(3);
  2627. litest_assert_int_eq(evdev_frame_get_count(frame), 1U); /* SYN_REPORT */
  2628. litest_assert_ptr_eq(evdev_frame_ref(frame), frame);
  2629. litest_assert_ptr_eq(evdev_frame_unref(frame), NULL);
  2630. }
  2631. {
  2632. _unref_(evdev_frame) *frame = evdev_frame_new(3);
  2633. struct evdev_event toobig[] = {
  2634. {
  2635. .usage = U(EVDEV_ABS_X),
  2636. .value = 1,
  2637. },
  2638. {
  2639. .usage = U(EVDEV_ABS_Y),
  2640. .value = 2,
  2641. },
  2642. {
  2643. .usage = U(EVDEV_ABS_Z),
  2644. .value = 3,
  2645. },
  2646. {
  2647. .usage = U(EVDEV_SYN_REPORT),
  2648. .value = 0,
  2649. },
  2650. };
  2651. int rc = evdev_frame_set(frame, toobig, ARRAY_LENGTH(toobig));
  2652. litest_assert_int_eq(rc, -ENOMEM);
  2653. }
  2654. {
  2655. struct evdev_event events[] = {
  2656. {
  2657. .usage = U(EVDEV_ABS_X),
  2658. .value = 1,
  2659. },
  2660. {
  2661. .usage = U(EVDEV_ABS_Y),
  2662. .value = 2,
  2663. },
  2664. {
  2665. .usage = U(EVDEV_SYN_REPORT),
  2666. .value = 0,
  2667. },
  2668. };
  2669. _unref_(evdev_frame) *frame = evdev_frame_new(3);
  2670. int rc = evdev_frame_set(frame, events, ARRAY_LENGTH(events));
  2671. litest_assert_neg_errno_success(rc);
  2672. litest_assert_int_eq(evdev_frame_get_count(frame),
  2673. ARRAY_LENGTH(events));
  2674. litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
  2675. size_t nevents;
  2676. rc = memcmp(evdev_frame_get_events(frame, &nevents),
  2677. events,
  2678. sizeof(events));
  2679. litest_assert_int_eq(rc, 0);
  2680. litest_assert_int_eq(nevents, ARRAY_LENGTH(events));
  2681. /* Already full, can't append */
  2682. rc = evdev_frame_append(frame, events, 1);
  2683. litest_assert_int_eq(rc, -ENOMEM);
  2684. }
  2685. {
  2686. struct evdev_event events[] = {
  2687. {
  2688. .usage = U(EVDEV_ABS_X),
  2689. .value = 1,
  2690. },
  2691. {
  2692. .usage = U(EVDEV_ABS_Y),
  2693. .value = 2,
  2694. },
  2695. {
  2696. .usage = U(EVDEV_SYN_REPORT),
  2697. .value = 0,
  2698. },
  2699. };
  2700. _unref_(evdev_frame) *frame = evdev_frame_new(3);
  2701. int rc = evdev_frame_set(frame, events, 1);
  2702. litest_assert_neg_errno_success(rc);
  2703. litest_assert_int_eq(evdev_frame_get_count(frame),
  2704. 2U); /* we appended SYN_REPORT */
  2705. rc = evdev_frame_append(frame, events + 1, 1);
  2706. litest_assert_neg_errno_success(rc);
  2707. litest_assert_int_eq(evdev_frame_get_count(frame),
  2708. 3U); /* we appended SYN_REPORT */
  2709. rc = evdev_frame_append(frame, events + 2, 1);
  2710. litest_assert_neg_errno_success(rc);
  2711. litest_assert_int_eq(evdev_frame_get_count(frame),
  2712. 3U); /* SYN_REPORT already there */
  2713. }
  2714. {
  2715. struct evdev_event interrupted[] = {
  2716. {
  2717. .usage = U(EVDEV_ABS_X),
  2718. .value = 1,
  2719. },
  2720. {
  2721. .usage = U(EVDEV_ABS_Y),
  2722. .value = 2,
  2723. },
  2724. {
  2725. .usage = U(EVDEV_SYN_REPORT),
  2726. .value = 0,
  2727. },
  2728. {
  2729. .usage = U(EVDEV_ABS_RX),
  2730. .value = 1,
  2731. },
  2732. {
  2733. .usage = U(EVDEV_ABS_RY),
  2734. .value = 2,
  2735. },
  2736. {
  2737. .usage = U(EVDEV_SYN_REPORT),
  2738. .value = 0,
  2739. },
  2740. };
  2741. _unref_(evdev_frame) *frame = evdev_frame_new(5);
  2742. int rc = evdev_frame_set(frame, interrupted, ARRAY_LENGTH(interrupted));
  2743. litest_assert_neg_errno_success(rc);
  2744. litest_assert_int_eq(evdev_frame_get_count(frame), 3U);
  2745. rc = evdev_frame_set(frame, &interrupted[2], 1);
  2746. litest_assert_neg_errno_success(rc);
  2747. litest_assert_int_eq(evdev_frame_get_count(frame), 1U);
  2748. rc = evdev_frame_set(frame,
  2749. &interrupted[1],
  2750. ARRAY_LENGTH(interrupted) - 1);
  2751. litest_assert_neg_errno_success(rc);
  2752. litest_assert_int_eq(evdev_frame_get_count(frame), 2U);
  2753. /* We never appended a timestamp */
  2754. litest_assert(usec_cmp(evdev_frame_get_time(frame),
  2755. usec_from_uint64_t(0)) == 0);
  2756. }
  2757. {
  2758. struct evdev_event events[] = {
  2759. {
  2760. .usage = U(EVDEV_ABS_X),
  2761. .value = 1,
  2762. },
  2763. {
  2764. .usage = U(EVDEV_ABS_Y),
  2765. .value = 2,
  2766. },
  2767. {
  2768. .usage = U(EVDEV_SYN_REPORT),
  2769. .value = 0,
  2770. },
  2771. };
  2772. _unref_(evdev_frame) *frame = evdev_frame_new(3);
  2773. int rc = evdev_frame_append_one(frame, U(EVDEV_ABS_X), 1);
  2774. litest_assert_neg_errno_success(rc);
  2775. rc = evdev_frame_append_one(frame, U(EVDEV_ABS_Y), 2);
  2776. litest_assert_neg_errno_success(rc);
  2777. rc = evdev_frame_append_one(frame, U(EV_SYN), 0);
  2778. litest_assert_neg_errno_success(rc);
  2779. litest_assert_int_eq(evdev_frame_get_count(frame),
  2780. ARRAY_LENGTH(events));
  2781. litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
  2782. size_t nevents;
  2783. rc = memcmp(evdev_frame_get_events(frame, &nevents),
  2784. events,
  2785. sizeof(events));
  2786. litest_assert_int_eq(rc, 0);
  2787. litest_assert_int_eq(nevents, ARRAY_LENGTH(events));
  2788. /* Already full, can't append */
  2789. rc = evdev_frame_append_one(frame, U(EVDEV_ABS_Z), 1);
  2790. litest_assert_int_eq(rc, -ENOMEM);
  2791. /* Appending SYN_REPORT is a noop */
  2792. rc = evdev_frame_append_one(frame, U(EVDEV_SYN_REPORT), 0);
  2793. litest_assert_neg_errno_success(rc);
  2794. litest_assert_int_eq(evdev_frame_get_count(frame),
  2795. ARRAY_LENGTH(events));
  2796. litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
  2797. }
  2798. {
  2799. struct evdev_event events[] = {
  2800. {
  2801. .usage = U(EVDEV_ABS_X),
  2802. .value = 1,
  2803. },
  2804. {
  2805. .usage = U(EVDEV_ABS_Y),
  2806. .value = 2,
  2807. },
  2808. {
  2809. .usage = U(EVDEV_SYN_REPORT),
  2810. .value = 1,
  2811. },
  2812. };
  2813. _unref_(evdev_frame) *frame = evdev_frame_new(3);
  2814. int rc = evdev_frame_append(frame, events, 3);
  2815. litest_assert_neg_errno_success(rc);
  2816. litest_assert_int_eq(evdev_frame_get_count(frame),
  2817. ARRAY_LENGTH(events));
  2818. litest_assert_int_eq(frame->max_size, ARRAY_LENGTH(events));
  2819. size_t nevents;
  2820. rc = memcmp(evdev_frame_get_events(frame, &nevents),
  2821. events,
  2822. sizeof(events));
  2823. litest_assert_int_eq(rc, 0);
  2824. litest_assert_int_eq(nevents, ARRAY_LENGTH(events));
  2825. for (int v = 0; v < 2; v++) {
  2826. /* Appending SYN_REPORT changes the value to zero */
  2827. rc = evdev_frame_append_one(frame, U(EVDEV_SYN_REPORT), v);
  2828. litest_assert_neg_errno_success(rc);
  2829. litest_assert_int_eq(evdev_frame_get_count(frame),
  2830. ARRAY_LENGTH(events));
  2831. struct evdev_event *evs =
  2832. evdev_frame_get_events(frame, &nevents);
  2833. litest_assert(evdev_usage_eq(evs[2].usage, EVDEV_SYN_REPORT));
  2834. litest_assert_int_eq(evs[2].value, v);
  2835. }
  2836. }
  2837. }
  2838. END_TEST
  2839. START_TEST(infmask_test)
  2840. {
  2841. /* Test empty mask */
  2842. infmask_t empty = infmask_new();
  2843. litest_assert(infmask_is_empty(&empty));
  2844. litest_assert(!infmask_bit_is_set(&empty, 0));
  2845. litest_assert(!infmask_bit_is_set(&empty, 100));
  2846. infmask_reset(&empty);
  2847. /* Test single bit operations */
  2848. infmask_t single = infmask_new();
  2849. litest_assert(!infmask_set_bit(&single, 5));
  2850. litest_assert(infmask_bit_is_set(&single, 5));
  2851. litest_assert(!infmask_bit_is_set(&single, 4));
  2852. litest_assert(!infmask_bit_is_set(&single, 6));
  2853. litest_assert(!infmask_is_empty(&single));
  2854. litest_assert(infmask_clear_bit(&single, 5));
  2855. litest_assert(!infmask_bit_is_set(&single, 5));
  2856. litest_assert(infmask_is_empty(&single));
  2857. infmask_reset(&single);
  2858. /* Test from_bit constructor */
  2859. infmask_t from_bit = infmask_from_bit(7);
  2860. litest_assert(infmask_bit_is_set(&from_bit, 7));
  2861. litest_assert(!infmask_bit_is_set(&from_bit, 6));
  2862. litest_assert(!infmask_bit_is_set(&from_bit, 8));
  2863. infmask_reset(&from_bit);
  2864. /* Test from_bits constructor */
  2865. infmask_t from_bits = infmask_from_bits(1, 3, 5);
  2866. litest_assert(infmask_bit_is_set(&from_bits, 1));
  2867. litest_assert(!infmask_bit_is_set(&from_bits, 2));
  2868. litest_assert(infmask_bit_is_set(&from_bits, 3));
  2869. litest_assert(!infmask_bit_is_set(&from_bits, 4));
  2870. litest_assert(infmask_bit_is_set(&from_bits, 5));
  2871. infmask_reset(&from_bits);
  2872. /* Test high bit operations */
  2873. infmask_t high = infmask_new();
  2874. litest_assert(!infmask_set_bit(&high, 100));
  2875. litest_assert(infmask_bit_is_set(&high, 100));
  2876. litest_assert(!infmask_bit_is_set(&high, 99));
  2877. litest_assert(!infmask_bit_is_set(&high, 101));
  2878. litest_assert(infmask_clear_bit(&high, 100));
  2879. litest_assert(!infmask_bit_is_set(&high, 100));
  2880. infmask_reset(&high);
  2881. /* Test any/all operations */
  2882. infmask_t mask1 = infmask_from_bits(1, 2, 3);
  2883. infmask_t mask2 = infmask_from_bits(2, 3, 4);
  2884. infmask_t mask3 = infmask_from_bits(2, 3);
  2885. litest_assert(infmask_any(&mask1, &mask2));
  2886. litest_assert(!infmask_all(&mask1, &mask2));
  2887. litest_assert(infmask_all(&mask1, &mask3));
  2888. litest_assert(infmask_any(&mask1, &mask3));
  2889. infmask_reset(&mask1);
  2890. infmask_reset(&mask2);
  2891. infmask_reset(&mask3);
  2892. /* Test merge operation */
  2893. infmask_t merge1 = infmask_from_bits(1, 2);
  2894. infmask_t merge2 = infmask_from_bits(2, 3);
  2895. litest_assert(!infmask_merge(&merge1, &merge2));
  2896. litest_assert(infmask_bit_is_set(&merge1, 1));
  2897. litest_assert(infmask_bit_is_set(&merge1, 2));
  2898. litest_assert(infmask_bit_is_set(&merge1, 3));
  2899. infmask_reset(&merge1);
  2900. infmask_reset(&merge2);
  2901. /* Test clear operation */
  2902. infmask_t clear1 = infmask_from_bits(1, 2, 3);
  2903. infmask_t clear2 = infmask_from_bits(2, 3);
  2904. litest_assert(infmask_clear(&clear1, &clear2));
  2905. litest_assert(infmask_bit_is_set(&clear1, 1));
  2906. litest_assert(!infmask_bit_is_set(&clear1, 2));
  2907. litest_assert(!infmask_bit_is_set(&clear1, 3));
  2908. infmask_reset(&clear1);
  2909. infmask_reset(&clear2);
  2910. /* Test growing behavior */
  2911. infmask_t grow = infmask_new();
  2912. litest_assert(!infmask_set_bit(&grow, 5));
  2913. litest_assert(grow.nmasks == 1);
  2914. litest_assert(!infmask_set_bit(&grow, 35));
  2915. litest_assert(grow.nmasks == 2);
  2916. litest_assert(!infmask_set_bit(&grow, 65));
  2917. litest_assert(grow.nmasks == 3);
  2918. litest_assert(infmask_bit_is_set(&grow, 5));
  2919. litest_assert(infmask_bit_is_set(&grow, 35));
  2920. litest_assert(infmask_bit_is_set(&grow, 65));
  2921. infmask_reset(&grow);
  2922. }
  2923. END_TEST
  2924. START_TEST(evdev_mask_test)
  2925. {
  2926. _destroy_(evdev_mask) *mask = evdev_mask_new();
  2927. evdev_mask_reset(mask);
  2928. litest_assert(bitmask_is_empty(mask->ev));
  2929. litest_assert(bitmask_is_empty(mask->rel));
  2930. litest_assert(bitmask_is_empty(mask->sw));
  2931. litest_assert(infmask_is_empty(&mask->key));
  2932. litest_assert(infmask_is_empty(&mask->btn));
  2933. litest_assert(infmask_is_empty(&mask->abs));
  2934. evdev_mask_set_enum(mask, EVDEV_BTN_TOOL_PEN);
  2935. evdev_mask_set_enum(mask, EVDEV_BTN_TOOL_AIRBRUSH);
  2936. litest_assert(bitmask_bit_is_set(mask->ev, EV_KEY));
  2937. /* Verify these are in btn, not key */
  2938. litest_assert(!infmask_is_empty(&mask->btn));
  2939. litest_assert(infmask_is_empty(&mask->key));
  2940. litest_assert(evdev_mask_is_set(mask, evdev_usage_from(EVDEV_BTN_TOOL_PEN)));
  2941. litest_assert(
  2942. !evdev_mask_is_set(mask, evdev_usage_from(EVDEV_BTN_TOOL_RUBBER)));
  2943. litest_assert(
  2944. evdev_mask_is_set(mask, evdev_usage_from(EVDEV_BTN_TOOL_AIRBRUSH)));
  2945. /* Test regular key (should go into key field) */
  2946. evdev_mask_set_enum(mask, EVDEV_KEY_ESC);
  2947. litest_assert(!infmask_is_empty(&mask->key));
  2948. litest_assert(evdev_mask_is_set(mask, evdev_usage_from(EVDEV_KEY_ESC)));
  2949. evdev_mask_set_enum(mask, EVDEV_REL_X);
  2950. litest_assert(bitmask_bit_is_set(mask->ev, EV_REL));
  2951. litest_assert(bitmask_bit_is_set(mask->rel, REL_X));
  2952. litest_assert(evdev_mask_is_set(mask, evdev_usage_from(EVDEV_REL_X)));
  2953. evdev_mask_set_enum(mask, EVDEV_ABS_X);
  2954. litest_assert(bitmask_bit_is_set(mask->ev, EV_ABS));
  2955. litest_assert(!infmask_is_empty(&mask->abs));
  2956. litest_assert(evdev_mask_is_set(mask, evdev_usage_from(EVDEV_ABS_X)));
  2957. }
  2958. END_TEST
  2959. int
  2960. main(void)
  2961. {
  2962. struct litest_runner *runner = litest_runner_new();
  2963. /* not worth forking the tests here */
  2964. litest_runner_set_num_parallel(runner, 0);
  2965. #define ADD_TEST(func_) do { \
  2966. struct litest_runner_test_description tdesc = { \
  2967. .func = func_, \
  2968. };\
  2969. snprintf(tdesc.name, sizeof(tdesc.name), # func_); \
  2970. litest_runner_add_test(runner, &tdesc); \
  2971. } while(0)
  2972. ADD_TEST(auto_test);
  2973. ADD_TEST(mkdir_p_test);
  2974. ADD_TEST(rmdir_r_test);
  2975. ADD_TEST(tmpdir_test);
  2976. ADD_TEST(find_files_test);
  2977. ADD_TEST(array_for_each);
  2978. ADD_TEST(bitfield_helpers);
  2979. ADD_TEST(bitmask_test);
  2980. ADD_TEST(matrix_helpers);
  2981. ADD_TEST(ratelimit_helpers);
  2982. ADD_TEST(dpi_parser);
  2983. ADD_TEST(wheel_click_parser);
  2984. ADD_TEST(wheel_click_count_parser);
  2985. ADD_TEST(dimension_prop_parser);
  2986. ADD_TEST(reliability_prop_parser);
  2987. ADD_TEST(calibration_prop_parser);
  2988. ADD_TEST(range_prop_parser);
  2989. ADD_TEST(boolean_prop_parser);
  2990. ADD_TEST(evcode_prop_parser);
  2991. ADD_TEST(input_prop_parser);
  2992. ADD_TEST(evdev_abs_parser);
  2993. ADD_TEST(safe_atoi_test);
  2994. ADD_TEST(safe_atoi_base_16_test);
  2995. ADD_TEST(safe_atoi_base_8_test);
  2996. ADD_TEST(safe_atou_test);
  2997. ADD_TEST(safe_atou_base_16_test);
  2998. ADD_TEST(safe_atou_base_8_test);
  2999. ADD_TEST(safe_atou64_test);
  3000. ADD_TEST(safe_atod_test);
  3001. ADD_TEST(strsplit_test);
  3002. ADD_TEST(strv_for_each_test);
  3003. ADD_TEST(strv_append_test);
  3004. ADD_TEST(strv_find_test);
  3005. ADD_TEST(strv_find_substring_test);
  3006. ADD_TEST(double_array_from_string_test);
  3007. ADD_TEST(strargv_test);
  3008. ADD_TEST(kvsplit_double_test);
  3009. ADD_TEST(strjoin_test);
  3010. ADD_TEST(strstrip_test);
  3011. ADD_TEST(strendswith_test);
  3012. ADD_TEST(strstartswith_test);
  3013. ADD_TEST(strsanitize_test);
  3014. ADD_TEST(time_conversion);
  3015. ADD_TEST(human_time);
  3016. ADD_TEST(list_test_insert);
  3017. ADD_TEST(list_test_append);
  3018. ADD_TEST(list_test_foreach);
  3019. ADD_TEST(list_test_first_last);
  3020. ADD_TEST(list_test_chain);
  3021. ADD_TEST(strverscmp_test);
  3022. ADD_TEST(streq_test);
  3023. ADD_TEST(strneq_test);
  3024. ADD_TEST(trunkname_test);
  3025. ADD_TEST(basename_test);
  3026. ADD_TEST(absinfo_normalize_value_test);
  3027. ADD_TEST(range_test);
  3028. ADD_TEST(stringbuf_test);
  3029. ADD_TEST(multivalue_test);
  3030. ADD_TEST(newtype_test);
  3031. ADD_TEST(attribute_cleanup);
  3032. ADD_TEST(macros_expand);
  3033. ADD_TEST(evdev_frames);
  3034. ADD_TEST(infmask_test);
  3035. ADD_TEST(evdev_mask_test);
  3036. enum litest_runner_result result = litest_runner_run_tests(runner);
  3037. litest_runner_destroy(runner);
  3038. if (result == LITEST_SKIP)
  3039. return 77;
  3040. return result - LITEST_PASS;
  3041. }