LCOV - code coverage report
Current view: top level - test - test-util.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 252 254 99.2 %
Date: 2019-08-23 13:36:53 Functions: 17 17 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 224 442 50.7 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       2                 :            : 
       3                 :            : #include <errno.h>
       4                 :            : #include <string.h>
       5                 :            : #include <sys/wait.h>
       6                 :            : #include <unistd.h>
       7                 :            : 
       8                 :            : #include "fileio.h"
       9                 :            : #include "fs-util.h"
      10                 :            : #include "limits-util.h"
      11                 :            : #include "memory-util.h"
      12                 :            : #include "missing_syscall.h"
      13                 :            : #include "parse-util.h"
      14                 :            : #include "process-util.h"
      15                 :            : #include "raw-clone.h"
      16                 :            : #include "rm-rf.h"
      17                 :            : #include "string-util.h"
      18                 :            : #include "tests.h"
      19                 :            : #include "util.h"
      20                 :            : 
      21                 :          4 : static void test_align_power2(void) {
      22                 :            :         unsigned long i, p2;
      23                 :            : 
      24         [ +  - ]:          4 :         log_info("/* %s */", __func__);
      25                 :            : 
      26         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(0) == 0);
      27         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(1) == 1);
      28         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(2) == 2);
      29         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(3) == 4);
      30         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(12) == 16);
      31                 :            : 
      32         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(ULONG_MAX) == 0);
      33         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(ULONG_MAX - 1) == 0);
      34         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(ULONG_MAX - 1024) == 0);
      35         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(ULONG_MAX / 2) == ULONG_MAX / 2 + 1);
      36         [ -  + ]:          4 :         assert_se(ALIGN_POWER2(ULONG_MAX + 1) == 0);
      37                 :            : 
      38         [ +  + ]:     524284 :         for (i = 1; i < 131071; ++i) {
      39         [ +  + ]:    8912756 :                 for (p2 = 1; p2 < i; p2 <<= 1)
      40                 :            :                         /* empty */ ;
      41                 :            : 
      42         [ -  + ]:     524280 :                 assert_se(ALIGN_POWER2(i) == p2);
      43                 :            :         }
      44                 :            : 
      45         [ +  + ]:       4100 :         for (i = ULONG_MAX - 1024; i < ULONG_MAX; ++i) {
      46   [ +  +  +  - ]:     266240 :                 for (p2 = 1; p2 && p2 < i; p2 <<= 1)
      47                 :            :                         /* empty */ ;
      48                 :            : 
      49         [ -  + ]:       4096 :                 assert_se(ALIGN_POWER2(i) == p2);
      50                 :            :         }
      51                 :          4 : }
      52                 :            : 
      53                 :          4 : static void test_max(void) {
      54                 :            :         static const struct {
      55                 :            :                 int a;
      56                 :            :                 int b[CONST_MAX(10, 100)];
      57                 :            :         } val1 = {
      58                 :            :                 .a = CONST_MAX(10, 100),
      59                 :            :         };
      60                 :          4 :         int d = 0;
      61                 :          4 :         unsigned long x = 12345;
      62                 :          4 :         unsigned long y = 54321;
      63                 :          4 :         const char str[] = "a_string_constant";
      64                 :          4 :         const unsigned long long arr[] = {9999ULL, 10ULL, 0ULL, 3000ULL, 2000ULL, 1000ULL, 100ULL, 9999999ULL};
      65                 :          4 :         void *p = (void *)str;
      66                 :          4 :         void *q = (void *)&str[16];
      67                 :            : 
      68         [ +  - ]:          4 :         log_info("/* %s */", __func__);
      69                 :            : 
      70                 :            :         assert_cc(sizeof(val1.b) == sizeof(int) * 100);
      71                 :            : 
      72                 :            :         /* CONST_MAX returns (void) instead of a value if the passed arguments
      73                 :            :          * are not of the same type or not constant expressions. */
      74                 :            :         assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 10)), int));
      75                 :            :         assert_cc(__builtin_types_compatible_p(typeof(CONST_MAX(1, 1U)), void));
      76                 :            : 
      77         [ -  + ]:          4 :         assert_se(val1.a == 100);
      78         [ -  + ]:          4 :         assert_se(MAX(++d, 0) == 1);
      79         [ -  + ]:          4 :         assert_se(d == 1);
      80                 :            : 
      81                 :            :         assert_cc(MAXSIZE(char[3], uint16_t) == 3);
      82                 :            :         assert_cc(MAXSIZE(char[3], uint32_t) == 4);
      83                 :            :         assert_cc(MAXSIZE(char, long) == sizeof(long));
      84                 :            : 
      85         [ -  + ]:          4 :         assert_se(MAX(-5, 5) == 5);
      86         [ -  + ]:          4 :         assert_se(MAX(5, 5) == 5);
      87         [ -  + ]:          4 :         assert_se(MAX(MAX(1, MAX(2, MAX(3, 4))), 5) == 5);
      88         [ -  + ]:          4 :         assert_se(MAX(MAX(1, MAX(2, MAX(3, 2))), 1) == 3);
      89         [ -  + ]:          4 :         assert_se(MAX(MIN(1, MIN(2, MIN(3, 4))), 5) == 5);
      90         [ -  + ]:          4 :         assert_se(MAX(MAX(1, MIN(2, MIN(3, 2))), 1) == 2);
      91   [ +  -  -  + ]:          4 :         assert_se(LESS_BY(8, 4) == 4);
      92   [ -  +  -  + ]:          4 :         assert_se(LESS_BY(8, 8) == 0);
      93   [ -  +  -  + ]:          4 :         assert_se(LESS_BY(4, 8) == 0);
      94   [ +  -  +  -  :          4 :         assert_se(LESS_BY(16, LESS_BY(8, 4)) == 12);
                   -  + ]
      95   [ +  -  -  +  :          4 :         assert_se(LESS_BY(4, LESS_BY(8, 4)) == 0);
                   -  + ]
      96   [ -  +  -  + ]:          4 :         assert_se(CMP(3, 5) == -1);
      97   [ +  -  -  + ]:          4 :         assert_se(CMP(5, 3) == 1);
      98   [ +  -  -  + ]:          4 :         assert_se(CMP(5, 5) == 0);
      99   [ -  +  -  + ]:          4 :         assert_se(CMP(x, y) == -1);
     100   [ +  -  -  + ]:          4 :         assert_se(CMP(y, x) == 1);
     101   [ +  -  -  + ]:          4 :         assert_se(CMP(x, x) == 0);
     102   [ +  -  -  + ]:          4 :         assert_se(CMP(y, y) == 0);
     103   [ +  -  -  + ]:          4 :         assert_se(CMP(UINT64_MAX, (uint64_t) 0) == 1);
     104   [ -  +  -  + ]:          4 :         assert_se(CMP((uint64_t) 0, UINT64_MAX) == -1);
     105   [ +  -  -  + ]:          4 :         assert_se(CMP(UINT64_MAX, UINT64_MAX) == 0);
     106   [ -  +  -  + ]:          4 :         assert_se(CMP(INT64_MIN, INT64_MAX) == -1);
     107   [ +  -  -  + ]:          4 :         assert_se(CMP(INT64_MAX, INT64_MIN) == 1);
     108   [ +  -  -  + ]:          4 :         assert_se(CMP(INT64_MAX, INT64_MAX) == 0);
     109   [ +  -  -  + ]:          4 :         assert_se(CMP(INT64_MIN, INT64_MIN) == 0);
     110   [ +  -  -  + ]:          4 :         assert_se(CMP(INT64_MAX, (int64_t) 0) == 1);
     111   [ +  -  -  + ]:          4 :         assert_se(CMP((int64_t) 0, INT64_MIN) == 1);
     112   [ -  +  -  + ]:          4 :         assert_se(CMP(INT64_MIN, (int64_t) 0) == -1);
     113   [ -  +  -  + ]:          4 :         assert_se(CMP((int64_t) 0, INT64_MAX) == -1);
     114   [ -  +  -  + ]:          4 :         assert_se(CMP(&str[2], &str[7]) == -1);
     115   [ +  -  -  + ]:          4 :         assert_se(CMP(&str[2], &str[2]) == 0);
     116   [ +  -  -  + ]:          4 :         assert_se(CMP(&str[7], (const char *)str) == 1);
     117   [ +  -  -  + ]:          4 :         assert_se(CMP(str[2], str[7]) == 1);
     118   [ +  -  -  + ]:          4 :         assert_se(CMP(str[7], *str) == 1);
     119   [ -  +  -  + ]:          4 :         assert_se(CMP((const unsigned long long *)arr, &arr[3]) == -1);
     120   [ +  -  -  + ]:          4 :         assert_se(CMP(*arr, arr[3]) == 1);
     121   [ -  +  -  + ]:          4 :         assert_se(CMP(p, q) == -1);
     122   [ +  -  -  + ]:          4 :         assert_se(CMP(q, p) == 1);
     123   [ +  -  -  + ]:          4 :         assert_se(CMP(p, p) == 0);
     124   [ +  -  -  + ]:          4 :         assert_se(CMP(q, q) == 0);
     125   [ +  -  -  + ]:          4 :         assert_se(CLAMP(-5, 0, 1) == 0);
     126   [ -  +  -  + ]:          4 :         assert_se(CLAMP(5, 0, 1) == 1);
     127   [ -  +  -  + ]:          4 :         assert_se(CLAMP(5, -10, 1) == 1);
     128   [ +  -  -  + ]:          4 :         assert_se(CLAMP(5, -10, 10) == 5);
     129   [ +  -  +  -  :          4 :         assert_se(CLAMP(CLAMP(0, -10, 10), CLAMP(-5, 10, 20), CLAMP(100, -5, 20)) == 10);
          -  +  +  -  -  
                      + ]
     130                 :          4 : }
     131                 :            : 
     132                 :            : #pragma GCC diagnostic push
     133                 :            : #ifdef __clang__
     134                 :            : #  pragma GCC diagnostic ignored "-Waddress-of-packed-member"
     135                 :            : #endif
     136                 :            : 
     137                 :          4 : static void test_container_of(void) {
     138                 :            :         struct mytype {
     139                 :            :                 uint8_t pad1[3];
     140                 :            :                 uint64_t v1;
     141                 :            :                 uint8_t pad2[2];
     142                 :            :                 uint32_t v2;
     143                 :          4 :         } myval = { };
     144                 :            : 
     145         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     146                 :            : 
     147                 :            :         assert_cc(sizeof(myval) >= 17);
     148         [ -  + ]:          4 :         assert_se(container_of(&myval.v1, struct mytype, v1) == &myval);
     149         [ -  + ]:          4 :         assert_se(container_of(&myval.v2, struct mytype, v2) == &myval);
     150         [ -  + ]:          4 :         assert_se(container_of(&container_of(&myval.v2,
     151                 :            :                                              struct mytype,
     152                 :            :                                              v2)->v1,
     153                 :            :                                struct mytype,
     154                 :            :                                v1) == &myval);
     155                 :          4 : }
     156                 :            : 
     157                 :            : #pragma GCC diagnostic pop
     158                 :            : 
     159                 :          4 : static void test_div_round_up(void) {
     160                 :            :         int div;
     161                 :            : 
     162         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     163                 :            : 
     164                 :            :         /* basic tests */
     165         [ -  + ]:          4 :         assert_se(DIV_ROUND_UP(0, 8) == 0);
     166         [ -  + ]:          4 :         assert_se(DIV_ROUND_UP(1, 8) == 1);
     167         [ -  + ]:          4 :         assert_se(DIV_ROUND_UP(8, 8) == 1);
     168         [ -  + ]:          4 :         assert_se(DIV_ROUND_UP(12, 8) == 2);
     169         [ -  + ]:          4 :         assert_se(DIV_ROUND_UP(16, 8) == 2);
     170                 :            : 
     171                 :            :         /* test multiple evaluation */
     172                 :          4 :         div = 0;
     173   [ +  -  -  + ]:          4 :         assert_se(DIV_ROUND_UP(div++, 8) == 0 && div == 1);
     174   [ +  -  -  + ]:          4 :         assert_se(DIV_ROUND_UP(++div, 8) == 1 && div == 2);
     175   [ +  -  -  + ]:          4 :         assert_se(DIV_ROUND_UP(8, div++) == 4 && div == 3);
     176   [ +  -  -  + ]:          4 :         assert_se(DIV_ROUND_UP(8, ++div) == 2 && div == 4);
     177                 :            : 
     178                 :            :         /* overflow test with exact division */
     179                 :            :         assert_se(sizeof(0U) == 4);
     180                 :            :         assert_se(0xfffffffaU % 10U == 0U);
     181                 :            :         assert_se(0xfffffffaU / 10U == 429496729U);
     182         [ -  + ]:          4 :         assert_se(DIV_ROUND_UP(0xfffffffaU, 10U) == 429496729U);
     183                 :            :         assert_se((0xfffffffaU + 10U - 1U) / 10U == 0U);
     184                 :            :         assert_se(0xfffffffaU / 10U + !!(0xfffffffaU % 10U) == 429496729U);
     185                 :            : 
     186                 :            :         /* overflow test with rounded division */
     187                 :            :         assert_se(0xfffffffdU % 10U == 3U);
     188                 :            :         assert_se(0xfffffffdU / 10U == 429496729U);
     189         [ -  + ]:          4 :         assert_se(DIV_ROUND_UP(0xfffffffdU, 10U) == 429496730U);
     190                 :            :         assert_se((0xfffffffdU + 10U - 1U) / 10U == 0U);
     191                 :            :         assert_se(0xfffffffdU / 10U + !!(0xfffffffdU % 10U) == 429496730U);
     192                 :          4 : }
     193                 :            : 
     194                 :          4 : static void test_u64log2(void) {
     195         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     196                 :            : 
     197         [ -  + ]:          4 :         assert_se(u64log2(0) == 0);
     198         [ -  + ]:          4 :         assert_se(u64log2(8) == 3);
     199         [ -  + ]:          4 :         assert_se(u64log2(9) == 3);
     200         [ -  + ]:          4 :         assert_se(u64log2(15) == 3);
     201         [ -  + ]:          4 :         assert_se(u64log2(16) == 4);
     202         [ -  + ]:          4 :         assert_se(u64log2(1024*1024) == 20);
     203         [ -  + ]:          4 :         assert_se(u64log2(1024*1024+5) == 20);
     204                 :          4 : }
     205                 :            : 
     206                 :          4 : static void test_protect_errno(void) {
     207         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     208                 :            : 
     209                 :          4 :         errno = 12;
     210                 :            :         {
     211                 :          8 :                 PROTECT_ERRNO;
     212                 :          4 :                 errno = 11;
     213                 :            :         }
     214         [ -  + ]:          4 :         assert_se(errno == 12);
     215                 :          4 : }
     216                 :            : 
     217                 :          4 : static void test_unprotect_errno_inner_function(void) {
     218                 :          8 :         PROTECT_ERRNO;
     219                 :            : 
     220                 :          4 :         errno = 2222;
     221                 :          4 : }
     222                 :            : 
     223                 :          4 : static void test_unprotect_errno(void) {
     224         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     225                 :            : 
     226                 :          4 :         errno = 4711;
     227                 :            : 
     228                 :          4 :         PROTECT_ERRNO;
     229                 :            : 
     230                 :          4 :         errno = 815;
     231                 :            : 
     232                 :          4 :         UNPROTECT_ERRNO;
     233                 :            : 
     234         [ -  + ]:          4 :         assert_se(errno == 4711);
     235                 :            : 
     236                 :          4 :         test_unprotect_errno_inner_function();
     237                 :            : 
     238         [ -  + ]:          4 :         assert_se(errno == 4711);
     239                 :          4 : }
     240                 :            : 
     241                 :          4 : static void test_in_set(void) {
     242         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     243                 :            : 
     244         [ -  + ]:          4 :         assert_se(IN_SET(1, 1));
     245         [ -  + ]:          4 :         assert_se(IN_SET(1, 1, 2, 3, 4));
     246         [ -  + ]:          4 :         assert_se(IN_SET(2, 1, 2, 3, 4));
     247         [ -  + ]:          4 :         assert_se(IN_SET(3, 1, 2, 3, 4));
     248         [ -  + ]:          4 :         assert_se(IN_SET(4, 1, 2, 3, 4));
     249         [ -  + ]:          4 :         assert_se(!IN_SET(0, 1));
     250         [ -  + ]:          4 :         assert_se(!IN_SET(0, 1, 2, 3, 4));
     251                 :          4 : }
     252                 :            : 
     253                 :          4 : static void test_log2i(void) {
     254         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     255                 :            : 
     256         [ -  + ]:          4 :         assert_se(log2i(1) == 0);
     257         [ -  + ]:          4 :         assert_se(log2i(2) == 1);
     258         [ -  + ]:          4 :         assert_se(log2i(3) == 1);
     259         [ -  + ]:          4 :         assert_se(log2i(4) == 2);
     260         [ -  + ]:          4 :         assert_se(log2i(32) == 5);
     261         [ -  + ]:          4 :         assert_se(log2i(33) == 5);
     262         [ -  + ]:          4 :         assert_se(log2i(63) == 5);
     263         [ -  + ]:          4 :         assert_se(log2i(INT_MAX) == sizeof(int)*8-2);
     264                 :          4 : }
     265                 :            : 
     266                 :          4 : static void test_eqzero(void) {
     267                 :          4 :         const uint32_t zeros[] = {0, 0, 0};
     268                 :          4 :         const uint32_t ones[] = {1, 1};
     269                 :          4 :         const uint32_t mixed[] = {0, 1, 0, 0, 0};
     270                 :          4 :         const uint8_t longer[] = {[55] = 255};
     271                 :            : 
     272         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     273                 :            : 
     274         [ -  + ]:          4 :         assert_se(eqzero(zeros));
     275         [ -  + ]:          4 :         assert_se(!eqzero(ones));
     276         [ -  + ]:          4 :         assert_se(!eqzero(mixed));
     277         [ -  + ]:          4 :         assert_se(!eqzero(longer));
     278                 :          4 : }
     279                 :            : 
     280                 :          4 : static void test_raw_clone(void) {
     281                 :            :         pid_t parent, pid, pid2;
     282                 :            : 
     283         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     284                 :            : 
     285                 :          4 :         parent = getpid();
     286         [ +  - ]:          4 :         log_info("before clone: getpid()→"PID_FMT, parent);
     287         [ -  + ]:          4 :         assert_se(raw_getpid() == parent);
     288                 :            : 
     289                 :          4 :         pid = raw_clone(0);
     290         [ -  + ]:          4 :         assert_se(pid >= 0);
     291                 :            : 
     292                 :          4 :         pid2 = raw_getpid();
     293         [ +  - ]:          4 :         log_info("raw_clone: "PID_FMT" getpid()→"PID_FMT" raw_getpid()→"PID_FMT,
     294                 :            :                  pid, getpid(), pid2);
     295         [ -  + ]:          4 :         if (pid == 0) {
     296         [ #  # ]:          0 :                 assert_se(pid2 != parent);
     297                 :          0 :                 _exit(EXIT_SUCCESS);
     298                 :            :         } else {
     299                 :            :                 int status;
     300                 :            : 
     301         [ -  + ]:          4 :                 assert_se(pid2 == parent);
     302                 :          4 :                 waitpid(pid, &status, __WCLONE);
     303   [ +  -  -  + ]:          4 :                 assert_se(WIFEXITED(status) && WEXITSTATUS(status) == EXIT_SUCCESS);
     304                 :            :         }
     305                 :            : 
     306                 :          4 :         errno = 0;
     307         [ -  + ]:          4 :         assert_se(raw_clone(CLONE_FS|CLONE_NEWNS) == -1);
     308         [ -  + ]:          4 :         assert_se(errno == EINVAL);
     309                 :          4 : }
     310                 :            : 
     311                 :          4 : static void test_physical_memory(void) {
     312                 :            :         uint64_t p;
     313                 :            :         char buf[FORMAT_BYTES_MAX];
     314                 :            : 
     315         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     316                 :            : 
     317                 :          4 :         p = physical_memory();
     318         [ -  + ]:          4 :         assert_se(p > 0);
     319         [ -  + ]:          4 :         assert_se(p < UINT64_MAX);
     320         [ -  + ]:          4 :         assert_se(p % page_size() == 0);
     321                 :            : 
     322         [ +  - ]:          4 :         log_info("Memory: %s (%" PRIu64 ")", format_bytes(buf, sizeof(buf), p), p);
     323                 :          4 : }
     324                 :            : 
     325                 :          4 : static void test_physical_memory_scale(void) {
     326                 :            :         uint64_t p;
     327                 :            : 
     328         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     329                 :            : 
     330                 :          4 :         p = physical_memory();
     331                 :            : 
     332         [ -  + ]:          4 :         assert_se(physical_memory_scale(0, 100) == 0);
     333         [ -  + ]:          4 :         assert_se(physical_memory_scale(100, 100) == p);
     334                 :            : 
     335         [ +  - ]:          4 :         log_info("Memory original: %" PRIu64, physical_memory());
     336         [ +  - ]:          4 :         log_info("Memory scaled by 50%%: %" PRIu64, physical_memory_scale(50, 100));
     337         [ +  - ]:          4 :         log_info("Memory divided by 2: %" PRIu64, physical_memory() / 2);
     338         [ +  - ]:          4 :         log_info("Page size: %zu", page_size());
     339                 :            : 
     340                 :            :         /* There might be an uneven number of pages, hence permit these calculations to be half a page off... */
     341         [ -  + ]:          4 :         assert_se(page_size()/2 + physical_memory_scale(50, 100) - p/2 <= page_size());
     342         [ -  + ]:          4 :         assert_se(physical_memory_scale(200, 100) == p*2);
     343                 :            : 
     344         [ -  + ]:          4 :         assert_se(physical_memory_scale(0, 1) == 0);
     345         [ -  + ]:          4 :         assert_se(physical_memory_scale(1, 1) == p);
     346         [ -  + ]:          4 :         assert_se(physical_memory_scale(2, 1) == p*2);
     347                 :            : 
     348         [ -  + ]:          4 :         assert_se(physical_memory_scale(0, 2) == 0);
     349                 :            : 
     350         [ -  + ]:          4 :         assert_se(page_size()/2 + physical_memory_scale(1, 2) - p/2 <= page_size());
     351         [ -  + ]:          4 :         assert_se(physical_memory_scale(2, 2) == p);
     352         [ -  + ]:          4 :         assert_se(physical_memory_scale(4, 2) == p*2);
     353                 :            : 
     354         [ -  + ]:          4 :         assert_se(physical_memory_scale(0, UINT32_MAX) == 0);
     355         [ -  + ]:          4 :         assert_se(physical_memory_scale(UINT32_MAX, UINT32_MAX) == p);
     356                 :            : 
     357                 :            :         /* overflow */
     358         [ -  + ]:          4 :         assert_se(physical_memory_scale(UINT64_MAX/4, UINT64_MAX) == UINT64_MAX);
     359                 :          4 : }
     360                 :            : 
     361                 :          4 : static void test_system_tasks_max(void) {
     362                 :            :         uint64_t t;
     363                 :            : 
     364         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     365                 :            : 
     366                 :          4 :         t = system_tasks_max();
     367         [ -  + ]:          4 :         assert_se(t > 0);
     368         [ -  + ]:          4 :         assert_se(t < UINT64_MAX);
     369                 :            : 
     370         [ +  - ]:          4 :         log_info("Max tasks: %" PRIu64, t);
     371                 :          4 : }
     372                 :            : 
     373                 :          4 : static void test_system_tasks_max_scale(void) {
     374                 :            :         uint64_t t;
     375                 :            : 
     376         [ +  - ]:          4 :         log_info("/* %s */", __func__);
     377                 :            : 
     378                 :          4 :         t = system_tasks_max();
     379                 :            : 
     380         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(0, 100) == 0);
     381         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(100, 100) == t);
     382                 :            : 
     383         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(0, 1) == 0);
     384         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(1, 1) == t);
     385         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(2, 1) == 2*t);
     386                 :            : 
     387         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(0, 2) == 0);
     388         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(1, 2) == t/2);
     389         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(2, 2) == t);
     390         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(3, 2) == (3*t)/2);
     391         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(4, 2) == t*2);
     392                 :            : 
     393         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(0, UINT32_MAX) == 0);
     394         [ -  + ]:          4 :         assert_se(system_tasks_max_scale((UINT32_MAX-1)/2, UINT32_MAX-1) == t/2);
     395         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(UINT32_MAX, UINT32_MAX) == t);
     396                 :            : 
     397                 :            :         /* overflow */
     398                 :            : 
     399         [ -  + ]:          4 :         assert_se(system_tasks_max_scale(UINT64_MAX/4, UINT64_MAX) == UINT64_MAX);
     400                 :          4 : }
     401                 :            : 
     402                 :          4 : int main(int argc, char *argv[]) {
     403                 :          4 :         test_setup_logging(LOG_INFO);
     404                 :            : 
     405                 :          4 :         test_align_power2();
     406                 :          4 :         test_max();
     407                 :          4 :         test_container_of();
     408                 :          4 :         test_div_round_up();
     409                 :          4 :         test_u64log2();
     410                 :          4 :         test_protect_errno();
     411                 :          4 :         test_unprotect_errno();
     412                 :          4 :         test_in_set();
     413                 :          4 :         test_log2i();
     414                 :          4 :         test_eqzero();
     415                 :          4 :         test_raw_clone();
     416                 :          4 :         test_physical_memory();
     417                 :          4 :         test_physical_memory_scale();
     418                 :          4 :         test_system_tasks_max();
     419                 :          4 :         test_system_tasks_max_scale();
     420                 :            : 
     421                 :          4 :         return 0;
     422                 :            : }

Generated by: LCOV version 1.14