Replace () with (void) in function prototypes
[platform/core/system/dlog.git] / src / tests / libdlog_android_wrapper.c
1 /*
2  * Copyright (c) 2018-2020, Samsung Electronics Co., Ltd. All rights reserved.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include <assert.h>
18 #ifdef USE_ANDROID_MONOTONIC
19 #include <time.h>
20 #endif /* USE_ANDROID_MONOTONIC */
21
22 #include <sys/uio.h>
23
24 #include <dlog.h>
25 #include <logcommon.h>
26 #include <logconfig.h>
27 #ifdef USE_ANDROID_MONOTONIC
28 #include <queued_entry.h>
29 #endif /* USE_ANDROID_MONOTONIC */
30
31 int (*write_to_log)(log_id_t, log_priority, const char *tag, const char *msg, struct timespec *tp_mono) = NULL;
32 void (*destroy_backend)(void) = NULL;
33 extern void __dlog_init_android(const struct log_config *conf);
34
35 static struct log_config CONF;
36
37 static bool fail_open;
38 static size_t closed = 0;
39 static int fake_buf_fd[LOG_ID_MAX];
40 int __wrap_close(int fd)
41 {
42         size_t i;
43         for (i = 0; i < 4; ++i) {
44                 if (fd != fake_buf_fd[i])
45                         continue;
46                 fake_buf_fd[i] = 0;
47                 break;
48         }
49         assert(!fail_open || i != 4);
50         closed++;
51         return 0;
52 }
53
54 int __wrap_logger_open_buffer_from_config(int buf_id, const struct log_config *conf, int open_flags, int *fd)
55 {
56         if (fail_open && buf_id == 2)
57                 return -EIO;
58
59         assert(conf == &CONF);
60
61         assert(buf_id >= 0);
62         assert(buf_id < LOG_ID_MAX);
63         assert(!fake_buf_fd[buf_id]);
64
65         if (buf_id == 3) {
66                 fake_buf_fd[buf_id] = -1;
67                 return 0;
68         }
69
70         const int fake_fd = buf_id + 10;
71         *fd = fake_fd;
72         fake_buf_fd[buf_id] = fake_fd;
73         return 1;
74 }
75
76 // a sample of monologues to make sure longer messages are handled correctly. Stay a while and listen!
77 static const char *LONG_TEXTS[] = {
78         "Kostka Horadrimow, ktora posiadasz, to wielki skarb. Wedlug podan, za jej pomoca mozna odtworzyc Laske Horadrimow! Aby to zrobic, musisz uzyc Kostki tak, jak zwoju. Kiedy sie otworzy, umiesc w niej obie czesci Laski i uzyj mocy transmutacyjnej, jaka w niej zawarto. Na pewno ucieszysz sie takze, gdy ci powiem, ze Kostke mozna wykorzystywac rowniez w inny sposob. Umiesc w niej 5 klejnotow tego samego rodzaju i jakosci, a bedziesz mogl przemienic je w jeden klejnot o wiekszej wartosci. Szesc klejnotow oraz miecz zmienia sie w dlugi miecz z miejscem na osadzenie klejnotu. Mozna takze transmutowac dwa kolczany beltow do kusz w jeden kolczan ze strzalami - albo dwa kolczany ze strzalami w jeden kolczan beltow. Tobie pozostawiam odkrycie innych formul przemiany.",
79         "Dziekuje ci wielce za przyjscie mi z pomoca! W dowod wdziecznosci bede dla ciebie za darmo identyfikowal przedmioty. Niestety, nie moglem nic zrobic, aby zapobiec zniszczeniu Tristram. Wyglada na to, ze nasze najgorsze obawy sie sprawdzily. Diablo znowu jest na wolnosci! Jak ci wiadomo, jakis czas temu Pan Grozy zostal zabity w kryptach pod Tristram przez wielkiego wojownika. Kiedy nasz bohater wyszedl z tuneli, opromieniony chwala, przez kilka dni swietowalismy jego zwyciestwo. Ale w ciagu nastepnych tygodni zaczal unikac ludzi i wygladalo na to, ze popadl w depresje. Myslalem, ze moze po prostu nie moze sie otrzasnac po tym, co przeszedl. Z kazdym dniem nasz wybawiciel popadal w wieksza udreke. Pamietam, jak nieraz budzil sie w nocy z krzykiem, wspominajac cos o krainach Wschodu. Pewnego dnia po prostu odszedl, a niedlugo potem Tristram zaatakowaly legiony demonow. Wielu utracilo wtedy zycie, a te diabelskie bestie zostawily mnie, zebym skonal w tej piekielnej klatce. Pewnie to wlasnie pogromca Diablo przechodzil tedy, zanim klasztor opanowalo zlo. Obawiam sie czegos gorszego. Boje sie, ze Diablo zawladnal cialem tego, ktory go zgladzil. Jesli to prawda, to Pan Grozy stanie sie potezniejszy niz kiedykolwiek. Musisz go powstrzymac albo bedziemy zgubieni.",
80         "Jestem Akara, najwyzsza kaplanka Siostr Niewidzacego Oka. Witaj w naszym obozie, ale obawiam sie, ze nie mamy ci do zaoferowania nic poza sypiacymi sie murami. Widzisz, na nasz klasztor spadlo okrutne przeklenstwo. Potezna cytadela, w ktorej od pokolen strzeglysmy drogi na wschod zostala opanowana przez demonice o imieniu Andariel. Ciagle trudno mi uwierzyc, ale udalo sie jej przeciagnac na swoja strone inne siostry i wspolnie z nimi wypedzic nas z domu przodkow. Teraz ostatnie obronczynie zakonu albo juz nie zyja, albo zostaly rozproszone. Blagam cie, pomoz nam! Znajdz jakis sposob, aby zdjac klatwe, a przysiegniemy ci wiernosc po wsze czasy. Na pustkowiu znajduje sie miejsce, w ktorym skoncentrowalo sie wiele zlej mocy. Zwiadowczynie Kashyi doniosly mi, ze w pobliskiej jaskini roi sie od mrocznych bestii i potworow z piekla rodem. Obawiam sie, ze te poczwary szykuja sie do ataku na nasz oboz. Jesli naprawde chcesz nam pomoc, to udaj sie do jaskini i zniszcz te plugawe bestie! Niech Niewidzace Oko ma cie w swojej pieczy.",
81         "Dobrze cie widziec, szlachetny Paladynie. Dawno juz nie widzialem na Zachodzie zadnego z was. Zaszczytem bedzie dla mnie pomoc ci! Na pewno doszla twych uszu wiesc o tragedii, jaka spadla na miasteczko Tristram! Niektorzy uwazaja, ze Diablo, Pan Grozy, znowu chodzi po swiecie. Nie wiem, czy w to wierzyc, ale kilka tygodniu temu przeszedl tym szlakiem mroczny wedrowiec. Podazal na wschod w strone przeleczy chronionej przez klasztor Lotrzyc. Moze to nic takiego, ale wkrotce potem wrota klasztoru zostaly zamkniete, a kraj zaczely nawiedzac dziwne stwory. Pozostane tu z moja karawana, az zrobi sie bezpieczniej, a bramy zostana otwarte. Mam nadzieje wyruszyc do Lut Gholein zanim nas wszystkich pochlonie cien, jaki padl na Tristram. Jezeli przezyjesz do tego czasu, zabiore cie ze soba. Powinienes tez porozmawiac z Akara. Wyglada na to, ze to ona rzadzi w tym obozie - moze powie ci cos wiecej.",
82 };
83
84 #ifdef USE_ANDROID_MONOTONIC
85 #define SEC 13
86 #define NSEC 123456789
87 int __real_clock_gettime(clockid_t clk_id, struct timespec *tp);
88 int __wrap_clock_gettime(clockid_t clk_id, struct timespec *tp)
89 {
90         if (clk_id == CLOCK_MONOTONIC) {
91                 tp->tv_sec = SEC;
92                 tp->tv_nsec = NSEC;
93                 return 0;
94         }
95
96         return __real_clock_gettime(clk_id, tp);
97 }
98 #endif /* USE_ANDROID_MONOTONIC */
99
100 static ssize_t writev_ret;
101 static int errno_to_set;
102 static bool writev_called;
103 static const char *used_tag;
104 static const char *used_msg;
105 ssize_t __wrap_writev(int fd, const struct iovec *iov, int iovcnt)
106 {
107         int i = 0;
108         while (i < 4 && fake_buf_fd[i] != fd)
109                 ++i;
110         assert(i != 4);
111
112 #ifdef USE_ANDROID_MONOTONIC
113         assert(iovcnt == 4);
114 #else
115         assert(iovcnt == 3);
116 #endif /* USE_ANDROID_MONOTONIC */
117         assert(iov[0].iov_len == 1);
118         assert(*((char *)iov[0].iov_base) == i + 3);
119         assert(iov[1].iov_len == strlen(used_tag) + 1);
120         assert(!strcmp(used_tag, (char *)iov[1].iov_base));
121         assert(iov[2].iov_len == strlen(used_msg) + 1);
122         assert(!strcmp(used_msg, (char *)iov[2].iov_base));
123 #ifdef USE_ANDROID_MONOTONIC
124         assert(iov[3].iov_len == sizeof(struct android_logger_footer));
125         struct android_logger_footer *alf = iov[3].iov_base;
126         assert(alf->magic == ANDROID_LOGGER_FOOTER_MAGIC);
127         assert(alf->sec_sent_mono == SEC);
128         assert(alf->nsec_sent_mono == NSEC);
129 #endif /* USE_ANDROID_MONOTONIC */
130
131         writev_called = true;
132         errno = errno_to_set;
133         return writev_ret;
134 }