LCOV - code coverage report
Current view: top level - home/fsumsal/repos/systemd/build/src/test - test-hashmap-ordered.c (source / functions) Hit Total Coverage
Test: systemd_full.info Lines: 720 723 99.6 %
Date: 2019-08-23 13:36:53 Functions: 39 39 100.0 %
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed Branches: 387 732 52.9 %

           Branch data     Line data    Source code
       1                 :            : /* GENERATED FILE */
       2                 :            : #define ORDERED
       3                 :            : /* SPDX-License-Identifier: LGPL-2.1+ */
       4                 :            : 
       5                 :            : #include "alloc-util.h"
       6                 :            : #include "hashmap.h"
       7                 :            : #include "log.h"
       8                 :            : #include "nulstr-util.h"
       9                 :            : #include "stdio-util.h"
      10                 :            : #include "string-util.h"
      11                 :            : #include "strv.h"
      12                 :            : #include "time-util.h"
      13                 :            : #include "tests.h"
      14                 :            : 
      15                 :            : void test_ordered_hashmap_funcs(void);
      16                 :            : 
      17                 :          3 : static void test_ordered_hashmap_replace(void) {
      18                 :            :         OrderedHashmap *m;
      19                 :            :         char *val1, *val2, *val3, *val4, *val5, *r;
      20                 :            : 
      21         [ +  - ]:          3 :         log_info("/* %s */", __func__);
      22                 :            : 
      23                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
      24                 :            : 
      25                 :          3 :         val1 = strdup("val1");
      26         [ -  + ]:          3 :         assert_se(val1);
      27                 :          3 :         val2 = strdup("val2");
      28         [ -  + ]:          3 :         assert_se(val2);
      29                 :          3 :         val3 = strdup("val3");
      30         [ -  + ]:          3 :         assert_se(val3);
      31                 :          3 :         val4 = strdup("val4");
      32         [ -  + ]:          3 :         assert_se(val4);
      33                 :          3 :         val5 = strdup("val5");
      34         [ -  + ]:          3 :         assert_se(val5);
      35                 :            : 
      36                 :          3 :         ordered_hashmap_put(m, "key 1", val1);
      37                 :          3 :         ordered_hashmap_put(m, "key 2", val2);
      38                 :          3 :         ordered_hashmap_put(m, "key 3", val3);
      39                 :          3 :         ordered_hashmap_put(m, "key 4", val4);
      40                 :            : 
      41                 :          3 :         ordered_hashmap_replace(m, "key 3", val1);
      42                 :          3 :         r = ordered_hashmap_get(m, "key 3");
      43         [ -  + ]:          3 :         assert_se(streq(r, "val1"));
      44                 :            : 
      45                 :          3 :         ordered_hashmap_replace(m, "key 5", val5);
      46                 :          3 :         r = ordered_hashmap_get(m, "key 5");
      47         [ -  + ]:          3 :         assert_se(streq(r, "val5"));
      48                 :            : 
      49                 :          3 :         free(val1);
      50                 :          3 :         free(val2);
      51                 :          3 :         free(val3);
      52                 :          3 :         free(val4);
      53                 :          3 :         free(val5);
      54                 :          3 :         ordered_hashmap_free(m);
      55                 :          3 : }
      56                 :            : 
      57                 :          3 : static void test_ordered_hashmap_copy(void) {
      58                 :            :         OrderedHashmap *m, *copy;
      59                 :            :         char *val1, *val2, *val3, *val4, *r;
      60                 :            : 
      61         [ +  - ]:          3 :         log_info("/* %s */", __func__);
      62                 :            : 
      63                 :          3 :         val1 = strdup("val1");
      64         [ -  + ]:          3 :         assert_se(val1);
      65                 :          3 :         val2 = strdup("val2");
      66         [ -  + ]:          3 :         assert_se(val2);
      67                 :          3 :         val3 = strdup("val3");
      68         [ -  + ]:          3 :         assert_se(val3);
      69                 :          3 :         val4 = strdup("val4");
      70         [ -  + ]:          3 :         assert_se(val4);
      71                 :            : 
      72                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
      73                 :            : 
      74                 :          3 :         ordered_hashmap_put(m, "key 1", val1);
      75                 :          3 :         ordered_hashmap_put(m, "key 2", val2);
      76                 :          3 :         ordered_hashmap_put(m, "key 3", val3);
      77                 :          3 :         ordered_hashmap_put(m, "key 4", val4);
      78                 :            : 
      79                 :          3 :         copy = ordered_hashmap_copy(m);
      80                 :            : 
      81                 :          3 :         r = ordered_hashmap_get(copy, "key 1");
      82         [ -  + ]:          3 :         assert_se(streq(r, "val1"));
      83                 :          3 :         r = ordered_hashmap_get(copy, "key 2");
      84         [ -  + ]:          3 :         assert_se(streq(r, "val2"));
      85                 :          3 :         r = ordered_hashmap_get(copy, "key 3");
      86         [ -  + ]:          3 :         assert_se(streq(r, "val3"));
      87                 :          3 :         r = ordered_hashmap_get(copy, "key 4");
      88         [ -  + ]:          3 :         assert_se(streq(r, "val4"));
      89                 :            : 
      90                 :          3 :         ordered_hashmap_free_free(copy);
      91                 :          3 :         ordered_hashmap_free(m);
      92                 :          3 : }
      93                 :            : 
      94                 :          3 : static void test_ordered_hashmap_get_strv(void) {
      95                 :            :         OrderedHashmap *m;
      96                 :            :         char **strv;
      97                 :            :         char *val1, *val2, *val3, *val4;
      98                 :            : 
      99         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     100                 :            : 
     101                 :          3 :         val1 = strdup("val1");
     102         [ -  + ]:          3 :         assert_se(val1);
     103                 :          3 :         val2 = strdup("val2");
     104         [ -  + ]:          3 :         assert_se(val2);
     105                 :          3 :         val3 = strdup("val3");
     106         [ -  + ]:          3 :         assert_se(val3);
     107                 :          3 :         val4 = strdup("val4");
     108         [ -  + ]:          3 :         assert_se(val4);
     109                 :            : 
     110                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     111                 :            : 
     112                 :          3 :         ordered_hashmap_put(m, "key 1", val1);
     113                 :          3 :         ordered_hashmap_put(m, "key 2", val2);
     114                 :          3 :         ordered_hashmap_put(m, "key 3", val3);
     115                 :          3 :         ordered_hashmap_put(m, "key 4", val4);
     116                 :            : 
     117                 :          3 :         strv = ordered_hashmap_get_strv(m);
     118                 :            : 
     119                 :            : #ifndef ORDERED
     120                 :            :         strv = strv_sort(strv);
     121                 :            : #endif
     122                 :            : 
     123         [ -  + ]:          3 :         assert_se(streq(strv[0], "val1"));
     124         [ -  + ]:          3 :         assert_se(streq(strv[1], "val2"));
     125         [ -  + ]:          3 :         assert_se(streq(strv[2], "val3"));
     126         [ -  + ]:          3 :         assert_se(streq(strv[3], "val4"));
     127                 :            : 
     128                 :          3 :         strv_free(strv);
     129                 :            : 
     130                 :          3 :         ordered_hashmap_free(m);
     131                 :          3 : }
     132                 :            : 
     133                 :          3 : static void test_ordered_hashmap_move_one(void) {
     134                 :            :         OrderedHashmap *m, *n;
     135                 :            :         char *val1, *val2, *val3, *val4, *r;
     136                 :            : 
     137         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     138                 :            : 
     139                 :          3 :         val1 = strdup("val1");
     140         [ -  + ]:          3 :         assert_se(val1);
     141                 :          3 :         val2 = strdup("val2");
     142         [ -  + ]:          3 :         assert_se(val2);
     143                 :          3 :         val3 = strdup("val3");
     144         [ -  + ]:          3 :         assert_se(val3);
     145                 :          3 :         val4 = strdup("val4");
     146         [ -  + ]:          3 :         assert_se(val4);
     147                 :            : 
     148                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     149                 :          3 :         n = ordered_hashmap_new(&string_hash_ops);
     150                 :            : 
     151                 :          3 :         ordered_hashmap_put(m, "key 1", val1);
     152                 :          3 :         ordered_hashmap_put(m, "key 2", val2);
     153                 :          3 :         ordered_hashmap_put(m, "key 3", val3);
     154                 :          3 :         ordered_hashmap_put(m, "key 4", val4);
     155                 :            : 
     156         [ -  + ]:          3 :         assert_se(ordered_hashmap_move_one(n, NULL, "key 3") == -ENOENT);
     157         [ -  + ]:          3 :         assert_se(ordered_hashmap_move_one(n, m, "key 5") == -ENOENT);
     158         [ -  + ]:          3 :         assert_se(ordered_hashmap_move_one(n, m, "key 3") == 0);
     159         [ -  + ]:          3 :         assert_se(ordered_hashmap_move_one(n, m, "key 4") == 0);
     160                 :            : 
     161                 :          3 :         r = ordered_hashmap_get(n, "key 3");
     162   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "val3"));
     163                 :          3 :         r = ordered_hashmap_get(n, "key 4");
     164   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "val4"));
     165                 :          3 :         r = ordered_hashmap_get(m, "key 3");
     166         [ -  + ]:          3 :         assert_se(!r);
     167                 :            : 
     168         [ -  + ]:          3 :         assert_se(ordered_hashmap_move_one(n, m, "key 3") == -EEXIST);
     169                 :            : 
     170                 :          3 :         ordered_hashmap_free_free(m);
     171                 :          3 :         ordered_hashmap_free_free(n);
     172                 :          3 : }
     173                 :            : 
     174                 :          3 : static void test_ordered_hashmap_move(void) {
     175                 :            :         OrderedHashmap *m, *n;
     176                 :            :         char *val1, *val2, *val3, *val4, *r;
     177                 :            : 
     178         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     179                 :            : 
     180                 :          3 :         val1 = strdup("val1");
     181         [ -  + ]:          3 :         assert_se(val1);
     182                 :          3 :         val2 = strdup("val2");
     183         [ -  + ]:          3 :         assert_se(val2);
     184                 :          3 :         val3 = strdup("val3");
     185         [ -  + ]:          3 :         assert_se(val3);
     186                 :          3 :         val4 = strdup("val4");
     187         [ -  + ]:          3 :         assert_se(val4);
     188                 :            : 
     189                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     190                 :          3 :         n = ordered_hashmap_new(&string_hash_ops);
     191                 :            : 
     192                 :          3 :         ordered_hashmap_put(n, "key 1", strdup(val1));
     193                 :          3 :         ordered_hashmap_put(m, "key 1", val1);
     194                 :          3 :         ordered_hashmap_put(m, "key 2", val2);
     195                 :          3 :         ordered_hashmap_put(m, "key 3", val3);
     196                 :          3 :         ordered_hashmap_put(m, "key 4", val4);
     197                 :            : 
     198         [ -  + ]:          3 :         assert_se(ordered_hashmap_move(n, NULL) == 0);
     199         [ -  + ]:          3 :         assert_se(ordered_hashmap_move(n, m) == 0);
     200                 :            : 
     201         [ -  + ]:          3 :         assert_se(ordered_hashmap_size(m) == 1);
     202                 :          3 :         r = ordered_hashmap_get(m, "key 1");
     203   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "val1"));
     204                 :            : 
     205                 :          3 :         r = ordered_hashmap_get(n, "key 1");
     206   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "val1"));
     207                 :          3 :         r = ordered_hashmap_get(n, "key 2");
     208   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "val2"));
     209                 :          3 :         r = ordered_hashmap_get(n, "key 3");
     210   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "val3"));
     211                 :          3 :         r = ordered_hashmap_get(n, "key 4");
     212   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "val4"));
     213                 :            : 
     214                 :          3 :         ordered_hashmap_free_free(m);
     215                 :          3 :         ordered_hashmap_free_free(n);
     216                 :          3 : }
     217                 :            : 
     218                 :          3 : static void test_ordered_hashmap_update(void) {
     219                 :            :         OrderedHashmap *m;
     220                 :            :         char *val1, *val2, *r;
     221                 :            : 
     222         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     223                 :            : 
     224                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     225                 :          3 :         val1 = strdup("old_value");
     226         [ -  + ]:          3 :         assert_se(val1);
     227                 :          3 :         val2 = strdup("new_value");
     228         [ -  + ]:          3 :         assert_se(val2);
     229                 :            : 
     230                 :          3 :         ordered_hashmap_put(m, "key 1", val1);
     231                 :          3 :         r = ordered_hashmap_get(m, "key 1");
     232         [ -  + ]:          3 :         assert_se(streq(r, "old_value"));
     233                 :            : 
     234         [ -  + ]:          3 :         assert_se(ordered_hashmap_update(m, "key 2", val2) == -ENOENT);
     235                 :          3 :         r = ordered_hashmap_get(m, "key 1");
     236         [ -  + ]:          3 :         assert_se(streq(r, "old_value"));
     237                 :            : 
     238         [ -  + ]:          3 :         assert_se(ordered_hashmap_update(m, "key 1", val2) == 0);
     239                 :          3 :         r = ordered_hashmap_get(m, "key 1");
     240         [ -  + ]:          3 :         assert_se(streq(r, "new_value"));
     241                 :            : 
     242                 :          3 :         free(val1);
     243                 :          3 :         free(val2);
     244                 :          3 :         ordered_hashmap_free(m);
     245                 :          3 : }
     246                 :            : 
     247                 :          3 : static void test_ordered_hashmap_put(void) {
     248                 :          3 :         OrderedHashmap *m = NULL;
     249                 :            :         int valid_ordered_hashmap_put;
     250                 :          3 :         void *val1 = (void*) "val 1";
     251                 :          3 :         void *val2 = (void*) "val 2";
     252                 :          3 :         _cleanup_free_ char* key1 = NULL;
     253                 :            : 
     254         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     255                 :            : 
     256         [ -  + ]:          3 :         assert_se(ordered_hashmap_ensure_allocated(&m, &string_hash_ops) >= 0);
     257         [ -  + ]:          3 :         assert_se(m);
     258                 :            : 
     259                 :          3 :         valid_ordered_hashmap_put = ordered_hashmap_put(m, "key 1", val1);
     260         [ -  + ]:          3 :         assert_se(valid_ordered_hashmap_put == 1);
     261         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 1", val1) == 0);
     262         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 1", val2) == -EEXIST);
     263                 :          3 :         key1 = strdup("key 1");
     264         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, key1, val1) == 0);
     265         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, key1, val2) == -EEXIST);
     266                 :            : 
     267                 :          3 :         ordered_hashmap_free(m);
     268                 :          3 : }
     269                 :            : 
     270                 :          3 : static void test_ordered_hashmap_remove(void) {
     271                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     272                 :            :         char *r;
     273                 :            : 
     274         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     275                 :            : 
     276                 :          3 :         r = ordered_hashmap_remove(NULL, "key 1");
     277         [ -  + ]:          3 :         assert_se(r == NULL);
     278                 :            : 
     279                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     280         [ -  + ]:          3 :         assert_se(m);
     281                 :            : 
     282                 :          3 :         r = ordered_hashmap_remove(m, "no such key");
     283         [ -  + ]:          3 :         assert_se(r == NULL);
     284                 :            : 
     285                 :          3 :         ordered_hashmap_put(m, "key 1", (void*) "val 1");
     286                 :          3 :         ordered_hashmap_put(m, "key 2", (void*) "val 2");
     287                 :            : 
     288                 :          3 :         r = ordered_hashmap_remove(m, "key 1");
     289         [ -  + ]:          3 :         assert_se(streq(r, "val 1"));
     290                 :            : 
     291                 :          3 :         r = ordered_hashmap_get(m, "key 2");
     292         [ -  + ]:          3 :         assert_se(streq(r, "val 2"));
     293         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(m, "key 1"));
     294                 :          3 : }
     295                 :            : 
     296                 :          3 : static void test_ordered_hashmap_remove2(void) {
     297                 :          3 :         _cleanup_ordered_hashmap_free_free_free_ OrderedHashmap *m = NULL;
     298                 :          3 :         char key1[] = "key 1";
     299                 :          3 :         char key2[] = "key 2";
     300                 :          3 :         char val1[] = "val 1";
     301                 :          3 :         char val2[] = "val 2";
     302                 :            :         void *r, *r2;
     303                 :            : 
     304         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     305                 :            : 
     306                 :          3 :         r = ordered_hashmap_remove2(NULL, "key 1", &r2);
     307         [ -  + ]:          3 :         assert_se(r == NULL);
     308                 :            : 
     309                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     310         [ -  + ]:          3 :         assert_se(m);
     311                 :            : 
     312                 :          3 :         r = ordered_hashmap_remove2(m, "no such key", &r2);
     313         [ -  + ]:          3 :         assert_se(r == NULL);
     314                 :            : 
     315                 :          3 :         ordered_hashmap_put(m, strdup(key1), strdup(val1));
     316                 :          3 :         ordered_hashmap_put(m, strdup(key2), strdup(val2));
     317                 :            : 
     318                 :          3 :         r = ordered_hashmap_remove2(m, key1, &r2);
     319         [ -  + ]:          3 :         assert_se(streq(r, val1));
     320         [ -  + ]:          3 :         assert_se(streq(r2, key1));
     321                 :          3 :         free(r);
     322                 :          3 :         free(r2);
     323                 :            : 
     324                 :          3 :         r = ordered_hashmap_get(m, key2);
     325         [ -  + ]:          3 :         assert_se(streq(r, val2));
     326         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(m, key1));
     327                 :          3 : }
     328                 :            : 
     329                 :          3 : static void test_ordered_hashmap_remove_value(void) {
     330                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     331                 :            :         char *r;
     332                 :            : 
     333                 :          3 :         char val1[] = "val 1";
     334                 :          3 :         char val2[] = "val 2";
     335                 :            : 
     336         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     337                 :            : 
     338                 :          3 :         r = ordered_hashmap_remove_value(NULL, "key 1", val1);
     339         [ -  + ]:          3 :         assert_se(r == NULL);
     340                 :            : 
     341                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     342         [ -  + ]:          3 :         assert_se(m);
     343                 :            : 
     344                 :          3 :         r = ordered_hashmap_remove_value(m, "key 1", val1);
     345         [ -  + ]:          3 :         assert_se(r == NULL);
     346                 :            : 
     347                 :          3 :         ordered_hashmap_put(m, "key 1", val1);
     348                 :          3 :         ordered_hashmap_put(m, "key 2", val2);
     349                 :            : 
     350                 :          3 :         r = ordered_hashmap_remove_value(m, "key 1", val1);
     351         [ -  + ]:          3 :         assert_se(streq(r, "val 1"));
     352                 :            : 
     353                 :          3 :         r = ordered_hashmap_get(m, "key 2");
     354         [ -  + ]:          3 :         assert_se(streq(r, "val 2"));
     355         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(m, "key 1"));
     356                 :            : 
     357                 :          3 :         r = ordered_hashmap_remove_value(m, "key 2", val1);
     358         [ -  + ]:          3 :         assert_se(r == NULL);
     359                 :            : 
     360                 :          3 :         r = ordered_hashmap_get(m, "key 2");
     361         [ -  + ]:          3 :         assert_se(streq(r, "val 2"));
     362         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(m, "key 1"));
     363                 :          3 : }
     364                 :            : 
     365                 :          3 : static void test_ordered_hashmap_remove_and_put(void) {
     366                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     367                 :            :         int valid;
     368                 :            :         char *r;
     369                 :            : 
     370         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     371                 :            : 
     372                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     373         [ -  + ]:          3 :         assert_se(m);
     374                 :            : 
     375                 :          3 :         valid = ordered_hashmap_remove_and_put(m, "invalid key", "new key", NULL);
     376         [ -  + ]:          3 :         assert_se(valid == -ENOENT);
     377                 :            : 
     378                 :          3 :         valid = ordered_hashmap_put(m, "key 1", (void*) (const char *) "val 1");
     379         [ -  + ]:          3 :         assert_se(valid == 1);
     380                 :            : 
     381                 :          3 :         valid = ordered_hashmap_remove_and_put(NULL, "key 1", "key 2", (void*) (const char *) "val 2");
     382         [ -  + ]:          3 :         assert_se(valid == -ENOENT);
     383                 :            : 
     384                 :          3 :         valid = ordered_hashmap_remove_and_put(m, "key 1", "key 2", (void*) (const char *) "val 2");
     385         [ -  + ]:          3 :         assert_se(valid == 0);
     386                 :            : 
     387                 :          3 :         r = ordered_hashmap_get(m, "key 2");
     388         [ -  + ]:          3 :         assert_se(streq(r, "val 2"));
     389         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(m, "key 1"));
     390                 :            : 
     391                 :          3 :         valid = ordered_hashmap_put(m, "key 3", (void*) (const char *) "val 3");
     392         [ -  + ]:          3 :         assert_se(valid == 1);
     393                 :          3 :         valid = ordered_hashmap_remove_and_put(m, "key 3", "key 2", (void*) (const char *) "val 2");
     394         [ -  + ]:          3 :         assert_se(valid == -EEXIST);
     395                 :          3 : }
     396                 :            : 
     397                 :          3 : static void test_ordered_hashmap_remove_and_replace(void) {
     398                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     399                 :            :         int valid;
     400                 :          3 :         void *key1 = UINT_TO_PTR(1);
     401                 :          3 :         void *key2 = UINT_TO_PTR(2);
     402                 :          3 :         void *key3 = UINT_TO_PTR(3);
     403                 :            :         void *r;
     404                 :            :         int i, j;
     405                 :            : 
     406         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     407                 :            : 
     408                 :          3 :         m = ordered_hashmap_new(&trivial_hash_ops);
     409         [ -  + ]:          3 :         assert_se(m);
     410                 :            : 
     411                 :          3 :         valid = ordered_hashmap_remove_and_replace(m, key1, key2, NULL);
     412         [ -  + ]:          3 :         assert_se(valid == -ENOENT);
     413                 :            : 
     414                 :          3 :         valid = ordered_hashmap_put(m, key1, key1);
     415         [ -  + ]:          3 :         assert_se(valid == 1);
     416                 :            : 
     417                 :          3 :         valid = ordered_hashmap_remove_and_replace(NULL, key1, key2, key2);
     418         [ -  + ]:          3 :         assert_se(valid == -ENOENT);
     419                 :            : 
     420                 :          3 :         valid = ordered_hashmap_remove_and_replace(m, key1, key2, key2);
     421         [ -  + ]:          3 :         assert_se(valid == 0);
     422                 :            : 
     423                 :          3 :         r = ordered_hashmap_get(m, key2);
     424         [ -  + ]:          3 :         assert_se(r == key2);
     425         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(m, key1));
     426                 :            : 
     427                 :          3 :         valid = ordered_hashmap_put(m, key3, key3);
     428         [ -  + ]:          3 :         assert_se(valid == 1);
     429                 :          3 :         valid = ordered_hashmap_remove_and_replace(m, key3, key2, key2);
     430         [ -  + ]:          3 :         assert_se(valid == 0);
     431                 :          3 :         r = ordered_hashmap_get(m, key2);
     432         [ -  + ]:          3 :         assert_se(r == key2);
     433         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(m, key3));
     434                 :            : 
     435                 :            :         /* Repeat this test several times to increase the chance of hitting
     436                 :            :          * the less likely case in ordered_hashmap_remove_and_replace where it
     437                 :            :          * compensates for the backward shift. */
     438         [ +  + ]:         63 :         for (i = 0; i < 20; i++) {
     439                 :         60 :                 ordered_hashmap_clear(m);
     440                 :            : 
     441         [ +  + ]:        420 :                 for (j = 1; j < 7; j++)
     442                 :        360 :                         ordered_hashmap_put(m, UINT_TO_PTR(10*i + j), UINT_TO_PTR(10*i + j));
     443                 :        120 :                 valid = ordered_hashmap_remove_and_replace(m, UINT_TO_PTR(10*i + 1),
     444                 :         60 :                                                    UINT_TO_PTR(10*i + 2),
     445                 :         60 :                                                    UINT_TO_PTR(10*i + 2));
     446         [ -  + ]:         60 :                 assert_se(valid == 0);
     447         [ -  + ]:         60 :                 assert_se(!ordered_hashmap_get(m, UINT_TO_PTR(10*i + 1)));
     448         [ +  + ]:        360 :                 for (j = 2; j < 7; j++) {
     449                 :        300 :                         r = ordered_hashmap_get(m, UINT_TO_PTR(10*i + j));
     450         [ -  + ]:        300 :                         assert_se(r == UINT_TO_PTR(10*i + j));
     451                 :            :                 }
     452                 :            :         }
     453                 :          3 : }
     454                 :            : 
     455                 :          3 : static void test_ordered_hashmap_ensure_allocated(void) {
     456                 :            :         OrderedHashmap *m;
     457                 :            :         int valid_ordered_hashmap;
     458                 :            : 
     459         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     460                 :            : 
     461                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     462                 :            : 
     463                 :          3 :         valid_ordered_hashmap = ordered_hashmap_ensure_allocated(&m, &string_hash_ops);
     464         [ -  + ]:          3 :         assert_se(valid_ordered_hashmap == 0);
     465                 :            : 
     466         [ -  + ]:          3 :         assert_se(m);
     467                 :          3 :         ordered_hashmap_free(m);
     468                 :          3 : }
     469                 :            : 
     470                 :          3 : static void test_ordered_hashmap_foreach_key(void) {
     471                 :            :         OrderedHashmap *m;
     472                 :            :         Iterator i;
     473                 :          3 :         bool key_found[] = { false, false, false, false };
     474                 :            :         const char *s;
     475                 :            :         const char *key;
     476                 :            :         static const char key_table[] =
     477                 :            :                 "key 1\0"
     478                 :            :                 "key 2\0"
     479                 :            :                 "key 3\0"
     480                 :            :                 "key 4\0";
     481                 :            : 
     482         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     483                 :            : 
     484                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     485                 :            : 
     486   [ +  -  +  + ]:         15 :         NULSTR_FOREACH(key, key_table)
     487                 :         12 :                 ordered_hashmap_put(m, key, (void*) (const char*) "my dummy val");
     488                 :            : 
     489         [ +  + ]:         15 :         ORDERED_HASHMAP_FOREACH_KEY(s, key, m, i) {
     490         [ -  + ]:         12 :                 assert(s);
     491   [ +  +  +  - ]:         12 :                 if (!key_found[0] && streq(key, "key 1"))
     492                 :          3 :                         key_found[0] = true;
     493   [ +  +  +  - ]:          9 :                 else if (!key_found[1] && streq(key, "key 2"))
     494                 :          3 :                         key_found[1] = true;
     495   [ +  +  +  - ]:          6 :                 else if (!key_found[2] && streq(key, "key 3"))
     496                 :          3 :                         key_found[2] = true;
     497   [ +  -  -  + ]:          3 :                 else if (!key_found[3] && streq(key, "fail"))
     498                 :          0 :                         key_found[3] = true;
     499                 :            :         }
     500                 :            : 
     501         [ -  + ]:          3 :         assert_se(m);
     502   [ +  -  -  +  :          3 :         assert_se(key_found[0] && key_found[1] && key_found[2] && !key_found[3]);
          +  -  -  +  +  
                -  -  + ]
     503                 :            : 
     504                 :          3 :         ordered_hashmap_free(m);
     505                 :          3 : }
     506                 :            : 
     507                 :          3 : static void test_ordered_hashmap_foreach(void) {
     508                 :            :         OrderedHashmap *m;
     509                 :            :         Iterator i;
     510                 :          3 :         bool value_found[] = { false, false, false, false };
     511                 :            :         char *val1, *val2, *val3, *val4, *s;
     512                 :            :         unsigned count;
     513                 :            : 
     514         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     515                 :            : 
     516                 :          3 :         val1 = strdup("my val1");
     517         [ -  + ]:          3 :         assert_se(val1);
     518                 :          3 :         val2 = strdup("my val2");
     519         [ -  + ]:          3 :         assert_se(val2);
     520                 :          3 :         val3 = strdup("my val3");
     521         [ -  + ]:          3 :         assert_se(val3);
     522                 :          3 :         val4 = strdup("my val4");
     523         [ -  + ]:          3 :         assert_se(val4);
     524                 :            : 
     525                 :          3 :         m = NULL;
     526                 :            : 
     527                 :          3 :         count = 0;
     528         [ -  + ]:          3 :         ORDERED_HASHMAP_FOREACH(s, m, i)
     529                 :          0 :                 count++;
     530         [ -  + ]:          3 :         assert_se(count == 0);
     531                 :            : 
     532                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     533                 :            : 
     534                 :          3 :         count = 0;
     535         [ -  + ]:          3 :         ORDERED_HASHMAP_FOREACH(s, m, i)
     536                 :          0 :                 count++;
     537         [ -  + ]:          3 :         assert_se(count == 0);
     538                 :            : 
     539                 :          3 :         ordered_hashmap_put(m, "Key 1", val1);
     540                 :          3 :         ordered_hashmap_put(m, "Key 2", val2);
     541                 :          3 :         ordered_hashmap_put(m, "Key 3", val3);
     542                 :          3 :         ordered_hashmap_put(m, "Key 4", val4);
     543                 :            : 
     544         [ +  + ]:         15 :         ORDERED_HASHMAP_FOREACH(s, m, i) {
     545   [ +  +  +  - ]:         12 :                 if (!value_found[0] && streq(s, val1))
     546                 :          3 :                         value_found[0] = true;
     547   [ +  +  +  - ]:          9 :                 else if (!value_found[1] && streq(s, val2))
     548                 :          3 :                         value_found[1] = true;
     549   [ +  +  +  - ]:          6 :                 else if (!value_found[2] && streq(s, val3))
     550                 :          3 :                         value_found[2] = true;
     551   [ +  -  +  - ]:          3 :                 else if (!value_found[3] && streq(s, val4))
     552                 :          3 :                         value_found[3] = true;
     553                 :            :         }
     554                 :            : 
     555         [ -  + ]:          3 :         assert_se(m);
     556   [ +  -  -  +  :          3 :         assert_se(value_found[0] && value_found[1] && value_found[2] && value_found[3]);
          +  -  -  +  +  
                -  -  + ]
     557                 :            : 
     558                 :          3 :         ordered_hashmap_free_free(m);
     559                 :          3 : }
     560                 :            : 
     561                 :          3 : static void test_ordered_hashmap_merge(void) {
     562                 :            :         OrderedHashmap *m;
     563                 :            :         OrderedHashmap *n;
     564                 :            :         char *val1, *val2, *val3, *val4, *r;
     565                 :            : 
     566         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     567                 :            : 
     568                 :          3 :         val1 = strdup("my val1");
     569         [ -  + ]:          3 :         assert_se(val1);
     570                 :          3 :         val2 = strdup("my val2");
     571         [ -  + ]:          3 :         assert_se(val2);
     572                 :          3 :         val3 = strdup("my val3");
     573         [ -  + ]:          3 :         assert_se(val3);
     574                 :          3 :         val4 = strdup("my val4");
     575         [ -  + ]:          3 :         assert_se(val4);
     576                 :            : 
     577                 :          3 :         n = ordered_hashmap_new(&string_hash_ops);
     578                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     579                 :            : 
     580                 :          3 :         ordered_hashmap_put(m, "Key 1", val1);
     581                 :          3 :         ordered_hashmap_put(m, "Key 2", val2);
     582                 :          3 :         ordered_hashmap_put(n, "Key 3", val3);
     583                 :          3 :         ordered_hashmap_put(n, "Key 4", val4);
     584                 :            : 
     585         [ -  + ]:          3 :         assert_se(ordered_hashmap_merge(m, n) == 0);
     586                 :          3 :         r = ordered_hashmap_get(m, "Key 3");
     587   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "my val3"));
     588                 :          3 :         r = ordered_hashmap_get(m, "Key 4");
     589   [ +  -  -  + ]:          3 :         assert_se(r && streq(r, "my val4"));
     590                 :            : 
     591         [ -  + ]:          3 :         assert_se(n);
     592         [ -  + ]:          3 :         assert_se(m);
     593                 :          3 :         ordered_hashmap_free(n);
     594                 :          3 :         ordered_hashmap_free_free(m);
     595                 :          3 : }
     596                 :            : 
     597                 :          3 : static void test_ordered_hashmap_contains(void) {
     598                 :            :         OrderedHashmap *m;
     599                 :            :         char *val1;
     600                 :            : 
     601         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     602                 :            : 
     603                 :          3 :         val1 = strdup("my val");
     604         [ -  + ]:          3 :         assert_se(val1);
     605                 :            : 
     606                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     607                 :            : 
     608         [ -  + ]:          3 :         assert_se(!ordered_hashmap_contains(m, "Key 1"));
     609                 :          3 :         ordered_hashmap_put(m, "Key 1", val1);
     610         [ -  + ]:          3 :         assert_se(ordered_hashmap_contains(m, "Key 1"));
     611         [ -  + ]:          3 :         assert_se(!ordered_hashmap_contains(m, "Key 2"));
     612                 :            : 
     613         [ -  + ]:          3 :         assert_se(!ordered_hashmap_contains(NULL, "Key 1"));
     614                 :            : 
     615         [ -  + ]:          3 :         assert_se(m);
     616                 :          3 :         ordered_hashmap_free_free(m);
     617                 :          3 : }
     618                 :            : 
     619                 :          3 : static void test_ordered_hashmap_isempty(void) {
     620                 :            :         OrderedHashmap *m;
     621                 :            :         char *val1;
     622                 :            : 
     623         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     624                 :            : 
     625                 :          3 :         val1 = strdup("my val");
     626         [ -  + ]:          3 :         assert_se(val1);
     627                 :            : 
     628                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     629                 :            : 
     630         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
     631                 :          3 :         ordered_hashmap_put(m, "Key 1", val1);
     632         [ -  + ]:          3 :         assert_se(!ordered_hashmap_isempty(m));
     633                 :            : 
     634         [ -  + ]:          3 :         assert_se(m);
     635                 :          3 :         ordered_hashmap_free_free(m);
     636                 :          3 : }
     637                 :            : 
     638                 :          3 : static void test_ordered_hashmap_size(void) {
     639                 :            :         OrderedHashmap *m;
     640                 :            :         char *val1, *val2, *val3, *val4;
     641                 :            : 
     642         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     643                 :            : 
     644                 :          3 :         val1 = strdup("my val");
     645         [ -  + ]:          3 :         assert_se(val1);
     646                 :          3 :         val2 = strdup("my val");
     647         [ -  + ]:          3 :         assert_se(val2);
     648                 :          3 :         val3 = strdup("my val");
     649         [ -  + ]:          3 :         assert_se(val3);
     650                 :          3 :         val4 = strdup("my val");
     651         [ -  + ]:          3 :         assert_se(val4);
     652                 :            : 
     653         [ -  + ]:          3 :         assert_se(ordered_hashmap_size(NULL) == 0);
     654         [ -  + ]:          3 :         assert_se(ordered_hashmap_buckets(NULL) == 0);
     655                 :            : 
     656                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     657                 :            : 
     658                 :          3 :         ordered_hashmap_put(m, "Key 1", val1);
     659                 :          3 :         ordered_hashmap_put(m, "Key 2", val2);
     660                 :          3 :         ordered_hashmap_put(m, "Key 3", val3);
     661                 :          3 :         ordered_hashmap_put(m, "Key 4", val4);
     662                 :            : 
     663         [ -  + ]:          3 :         assert_se(m);
     664         [ -  + ]:          3 :         assert_se(ordered_hashmap_size(m) == 4);
     665         [ -  + ]:          3 :         assert_se(ordered_hashmap_buckets(m) >= 4);
     666                 :          3 :         ordered_hashmap_free_free(m);
     667                 :          3 : }
     668                 :            : 
     669                 :          3 : static void test_ordered_hashmap_get(void) {
     670                 :            :         OrderedHashmap *m;
     671                 :            :         char *r;
     672                 :            :         char *val;
     673                 :            : 
     674         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     675                 :            : 
     676                 :          3 :         val = strdup("my val");
     677         [ -  + ]:          3 :         assert_se(val);
     678                 :            : 
     679                 :          3 :         r = ordered_hashmap_get(NULL, "Key 1");
     680         [ -  + ]:          3 :         assert_se(r == NULL);
     681                 :            : 
     682                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     683                 :            : 
     684                 :          3 :         ordered_hashmap_put(m, "Key 1", val);
     685                 :            : 
     686                 :          3 :         r = ordered_hashmap_get(m, "Key 1");
     687         [ -  + ]:          3 :         assert_se(streq(r, val));
     688                 :            : 
     689                 :          3 :         r = ordered_hashmap_get(m, "no such key");
     690         [ -  + ]:          3 :         assert_se(r == NULL);
     691                 :            : 
     692         [ -  + ]:          3 :         assert_se(m);
     693                 :          3 :         ordered_hashmap_free_free(m);
     694                 :          3 : }
     695                 :            : 
     696                 :          3 : static void test_ordered_hashmap_get2(void) {
     697                 :            :         OrderedHashmap *m;
     698                 :            :         char *r;
     699                 :            :         char *val;
     700                 :          3 :         char key_orig[] = "Key 1";
     701                 :            :         void *key_copy;
     702                 :            : 
     703         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     704                 :            : 
     705                 :          3 :         val = strdup("my val");
     706         [ -  + ]:          3 :         assert_se(val);
     707                 :            : 
     708                 :          3 :         key_copy = strdup(key_orig);
     709         [ -  + ]:          3 :         assert_se(key_copy);
     710                 :            : 
     711                 :          3 :         r = ordered_hashmap_get2(NULL, key_orig, &key_copy);
     712         [ -  + ]:          3 :         assert_se(r == NULL);
     713                 :            : 
     714                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     715                 :            : 
     716                 :          3 :         ordered_hashmap_put(m, key_copy, val);
     717                 :          3 :         key_copy = NULL;
     718                 :            : 
     719                 :          3 :         r = ordered_hashmap_get2(m, key_orig, &key_copy);
     720         [ -  + ]:          3 :         assert_se(streq(r, val));
     721         [ -  + ]:          3 :         assert_se(key_orig != key_copy);
     722         [ -  + ]:          3 :         assert_se(streq(key_orig, key_copy));
     723                 :            : 
     724                 :          3 :         r = ordered_hashmap_get2(m, "no such key", NULL);
     725         [ -  + ]:          3 :         assert_se(r == NULL);
     726                 :            : 
     727         [ -  + ]:          3 :         assert_se(m);
     728                 :          3 :         ordered_hashmap_free_free_free(m);
     729                 :          3 : }
     730                 :            : 
     731                 :   17219690 : static void crippled_ordered_hashmap_func(const void *p, struct siphash *state) {
     732                 :   17219690 :         return trivial_hash_func(INT_TO_PTR(PTR_TO_INT(p) & 0xff), state);
     733                 :            : }
     734                 :            : 
     735                 :            : static const struct hash_ops crippled_ordered_hashmap_ops = {
     736                 :            :         .hash = crippled_ordered_hashmap_func,
     737                 :            :         .compare = trivial_compare_func,
     738                 :            : };
     739                 :            : 
     740                 :          3 : static void test_ordered_hashmap_many(void) {
     741                 :            :         OrderedHashmap *h;
     742                 :            :         unsigned i, j;
     743                 :            :         void *v, *k;
     744                 :          3 :         bool slow = slow_tests_enabled();
     745                 :            :         const struct {
     746                 :            :                 const char *title;
     747                 :            :                 const struct hash_ops *ops;
     748                 :            :                 unsigned n_entries;
     749                 :          9 :         } tests[] = {
     750         [ +  - ]:          3 :                 { "trivial_ordered_hashmap_ops",  NULL,                  slow ? 1 << 20 : 240 },
     751         [ +  - ]:          3 :                 { "crippled_ordered_hashmap_ops", &crippled_ordered_hashmap_ops, slow ? 1 << 14 : 140 },
     752                 :            :         };
     753                 :            : 
     754   [ +  -  +  - ]:          3 :         log_info("/* %s (%s) */", __func__, slow ? "slow" : "fast");
     755                 :            : 
     756         [ +  + ]:          9 :         for (j = 0; j < ELEMENTSOF(tests); j++) {
     757                 :          6 :                 usec_t ts = now(CLOCK_MONOTONIC), n;
     758                 :            :                 char b[FORMAT_TIMESPAN_MAX];
     759                 :            : 
     760         [ -  + ]:          6 :                 assert_se(h = ordered_hashmap_new(tests[j].ops));
     761                 :            : 
     762         [ +  + ]:    3194886 :                 for (i = 1; i < tests[j].n_entries*3; i+=3) {
     763         [ -  + ]:    3194880 :                         assert_se(ordered_hashmap_put(h, UINT_TO_PTR(i), UINT_TO_PTR(i)) >= 0);
     764         [ -  + ]:    3194880 :                         assert_se(PTR_TO_UINT(ordered_hashmap_get(h, UINT_TO_PTR(i))) == i);
     765                 :            :                 }
     766                 :            : 
     767         [ +  + ]:    9584640 :                 for (i = 1; i < tests[j].n_entries*3; i++)
     768         [ -  + ]:    9584634 :                         assert_se(ordered_hashmap_contains(h, UINT_TO_PTR(i)) == (i % 3 == 1));
     769                 :            : 
     770         [ +  - ]:          6 :                 log_info("%s %u <= %u * 0.8 = %g",
     771                 :            :                          tests[j].title, ordered_hashmap_size(h), ordered_hashmap_buckets(h), ordered_hashmap_buckets(h) * 0.8);
     772                 :            : 
     773         [ -  + ]:          6 :                 assert_se(ordered_hashmap_size(h) <= ordered_hashmap_buckets(h) * 0.8);
     774         [ -  + ]:          6 :                 assert_se(ordered_hashmap_size(h) == tests[j].n_entries);
     775                 :            : 
     776         [ +  + ]:    3194886 :                 while (!ordered_hashmap_isempty(h)) {
     777                 :    3194880 :                         k = ordered_hashmap_first_key(h);
     778                 :    3194880 :                         v = ordered_hashmap_remove(h, k);
     779         [ -  + ]:    3194880 :                         assert_se(v == k);
     780                 :            :                 }
     781                 :            : 
     782                 :          6 :                 ordered_hashmap_free(h);
     783                 :            : 
     784                 :          6 :                 n = now(CLOCK_MONOTONIC);
     785         [ +  - ]:          6 :                 log_info("test took %s", format_timespan(b, sizeof b, n - ts, 0));
     786                 :            :         }
     787                 :          3 : }
     788                 :            : 
     789                 :            : extern unsigned custom_counter;
     790                 :            : extern const struct hash_ops boring_hash_ops, custom_hash_ops;
     791                 :            : 
     792                 :          3 : static void test_ordered_hashmap_free(void) {
     793                 :            :         OrderedHashmap *h;
     794                 :          3 :         bool slow = slow_tests_enabled();
     795                 :            :         usec_t ts, n;
     796                 :            :         char b[FORMAT_TIMESPAN_MAX];
     797         [ +  - ]:          3 :         unsigned n_entries = slow ? 1 << 20 : 240;
     798                 :            : 
     799                 :            :         const struct {
     800                 :            :                 const char *title;
     801                 :            :                 const struct hash_ops *ops;
     802                 :            :                 unsigned expect_counter;
     803                 :          6 :         } tests[] = {
     804                 :          3 :                 { "string_hash_ops",      &boring_hash_ops, 2 * n_entries},
     805                 :            :                 { "custom_free_hash_ops", &custom_hash_ops, 0 },
     806                 :            :         };
     807                 :            : 
     808   [ +  -  +  - ]:          3 :         log_info("/* %s (%s, %u entries) */", __func__, slow ? "slow" : "fast", n_entries);
     809                 :            : 
     810         [ +  + ]:          9 :         for (unsigned j = 0; j < ELEMENTSOF(tests); j++) {
     811                 :          6 :                 ts = now(CLOCK_MONOTONIC);
     812         [ -  + ]:          6 :                 assert_se(h = ordered_hashmap_new(tests[j].ops));
     813                 :            : 
     814                 :          6 :                 custom_counter = 0;
     815         [ +  + ]:    6291462 :                 for (unsigned i = 0; i < n_entries; i++) {
     816                 :            :                         char s[DECIMAL_STR_MAX(unsigned)];
     817                 :            :                         char *k, *v;
     818                 :            : 
     819         [ -  + ]:    6291456 :                         xsprintf(s, "%u", i);
     820         [ -  + ]:    6291456 :                         assert_se(k = strdup(s));
     821         [ -  + ]:    6291456 :                         assert_se(v = strdup(s));
     822                 :    6291456 :                         custom_counter += 2;
     823                 :            : 
     824         [ -  + ]:    6291456 :                         assert_se(ordered_hashmap_put(h, k, v) >= 0);
     825                 :            :                 }
     826                 :            : 
     827                 :          6 :                 ordered_hashmap_free(h);
     828                 :            : 
     829                 :          6 :                 n = now(CLOCK_MONOTONIC);
     830         [ +  - ]:          6 :                 log_info("%s test took %s", tests[j].title, format_timespan(b, sizeof b, n - ts, 0));
     831                 :            : 
     832         [ -  + ]:          6 :                 assert_se(custom_counter == tests[j].expect_counter);
     833                 :            :         }
     834                 :          3 : }
     835                 :            : 
     836                 :            : typedef struct Item {
     837                 :            :         int seen;
     838                 :            : } Item;
     839                 :          9 : static void item_seen(Item *item) {
     840                 :          9 :         item->seen++;
     841                 :          9 : }
     842                 :            : 
     843                 :          3 : static void test_ordered_hashmap_free_with_destructor(void) {
     844                 :            :         OrderedHashmap *m;
     845                 :          3 :         struct Item items[4] = {};
     846                 :            :         unsigned i;
     847                 :            : 
     848         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     849                 :            : 
     850         [ -  + ]:          3 :         assert_se(m = ordered_hashmap_new(NULL));
     851         [ +  + ]:         12 :         for (i = 0; i < ELEMENTSOF(items) - 1; i++)
     852         [ -  + ]:          9 :                 assert_se(ordered_hashmap_put(m, INT_TO_PTR(i), items + i) == 1);
     853                 :            : 
     854         [ +  + ]:         12 :         m = ordered_hashmap_free_with_destructor(m, item_seen);
     855         [ -  + ]:          3 :         assert_se(items[0].seen == 1);
     856         [ -  + ]:          3 :         assert_se(items[1].seen == 1);
     857         [ -  + ]:          3 :         assert_se(items[2].seen == 1);
     858         [ -  + ]:          3 :         assert_se(items[3].seen == 0);
     859                 :          3 : }
     860                 :            : 
     861                 :          3 : static void test_ordered_hashmap_first(void) {
     862                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     863                 :            : 
     864         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     865                 :            : 
     866                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     867         [ -  + ]:          3 :         assert_se(m);
     868                 :            : 
     869         [ -  + ]:          3 :         assert_se(!ordered_hashmap_first(m));
     870         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 1", (void*) "val 1") == 1);
     871         [ -  + ]:          3 :         assert_se(streq(ordered_hashmap_first(m), "val 1"));
     872         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 2", (void*) "val 2") == 1);
     873                 :            : #ifdef ORDERED
     874         [ -  + ]:          3 :         assert_se(streq(ordered_hashmap_first(m), "val 1"));
     875         [ -  + ]:          3 :         assert_se(ordered_hashmap_remove(m, "key 1"));
     876         [ -  + ]:          3 :         assert_se(streq(ordered_hashmap_first(m), "val 2"));
     877                 :            : #endif
     878                 :          3 : }
     879                 :            : 
     880                 :          3 : static void test_ordered_hashmap_first_key(void) {
     881                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     882                 :            : 
     883         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     884                 :            : 
     885                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     886         [ -  + ]:          3 :         assert_se(m);
     887                 :            : 
     888         [ -  + ]:          3 :         assert_se(!ordered_hashmap_first_key(m));
     889         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 1", NULL) == 1);
     890         [ -  + ]:          3 :         assert_se(streq(ordered_hashmap_first_key(m), "key 1"));
     891         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 2", NULL) == 1);
     892                 :            : #ifdef ORDERED
     893         [ -  + ]:          3 :         assert_se(streq(ordered_hashmap_first_key(m), "key 1"));
     894         [ -  + ]:          3 :         assert_se(ordered_hashmap_remove(m, "key 1") == NULL);
     895         [ -  + ]:          3 :         assert_se(streq(ordered_hashmap_first_key(m), "key 2"));
     896                 :            : #endif
     897                 :          3 : }
     898                 :            : 
     899                 :          3 : static void test_ordered_hashmap_steal_first_key(void) {
     900                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     901                 :            : 
     902         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     903                 :            : 
     904                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     905         [ -  + ]:          3 :         assert_se(m);
     906                 :            : 
     907         [ -  + ]:          3 :         assert_se(!ordered_hashmap_steal_first_key(m));
     908         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 1", NULL) == 1);
     909         [ -  + ]:          3 :         assert_se(streq(ordered_hashmap_steal_first_key(m), "key 1"));
     910                 :            : 
     911         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
     912                 :          3 : }
     913                 :            : 
     914                 :          3 : static void test_ordered_hashmap_steal_first(void) {
     915                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     916                 :          3 :         int seen[3] = {};
     917                 :            :         char *val;
     918                 :            : 
     919         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     920                 :            : 
     921                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     922         [ -  + ]:          3 :         assert_se(m);
     923                 :            : 
     924         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 1", (void*) "1") == 1);
     925         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 2", (void*) "22") == 1);
     926         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 3", (void*) "333") == 1);
     927                 :            : 
     928         [ +  + ]:         12 :         while ((val = ordered_hashmap_steal_first(m)))
     929                 :          9 :                 seen[strlen(val) - 1]++;
     930                 :            : 
     931   [ +  -  -  +  :          3 :         assert_se(seen[0] == 1 && seen[1] == 1 && seen[2] == 1);
             +  -  -  + ]
     932                 :            : 
     933         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
     934                 :          3 : }
     935                 :            : 
     936                 :          3 : static void test_ordered_hashmap_clear_free_free(void) {
     937                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     938                 :            : 
     939         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     940                 :            : 
     941                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     942         [ -  + ]:          3 :         assert_se(m);
     943                 :            : 
     944         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 1"), NULL) == 1);
     945         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 2"), NULL) == 1);
     946         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 3"), NULL) == 1);
     947                 :            : 
     948                 :          3 :         ordered_hashmap_clear_free_free(m);
     949         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
     950                 :            : 
     951         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 1"), strdup("value 1")) == 1);
     952         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 2"), strdup("value 2")) == 1);
     953         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 3"), strdup("value 3")) == 1);
     954                 :            : 
     955                 :          3 :         ordered_hashmap_clear_free_free(m);
     956         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
     957                 :          3 : }
     958                 :            : 
     959                 :          9 : DEFINE_PRIVATE_HASH_OPS_WITH_KEY_DESTRUCTOR(test_hash_ops_key, char, string_hash_func, string_compare_func, free);
     960                 :         18 : DEFINE_PRIVATE_HASH_OPS_FULL(test_hash_ops_full, char, string_hash_func, string_compare_func, free, char, free);
     961                 :            : 
     962                 :          3 : static void test_ordered_hashmap_clear_free_with_destructor(void) {
     963                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     964                 :            : 
     965         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     966                 :            : 
     967                 :          3 :         m = ordered_hashmap_new(&test_hash_ops_key);
     968         [ -  + ]:          3 :         assert_se(m);
     969                 :            : 
     970         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 1"), NULL) == 1);
     971         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 2"), NULL) == 1);
     972         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 3"), NULL) == 1);
     973                 :            : 
     974                 :          3 :         ordered_hashmap_clear_free(m);
     975         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
     976                 :          3 :         m = ordered_hashmap_free(m);
     977                 :            : 
     978                 :          3 :         m = ordered_hashmap_new(&test_hash_ops_full);
     979         [ -  + ]:          3 :         assert_se(m);
     980                 :            : 
     981         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 1"), strdup("value 1")) == 1);
     982         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 2"), strdup("value 2")) == 1);
     983         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, strdup("key 3"), strdup("value 3")) == 1);
     984                 :            : 
     985                 :          3 :         ordered_hashmap_clear_free(m);
     986         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
     987                 :          3 : }
     988                 :            : 
     989                 :          3 : static void test_ordered_hashmap_reserve(void) {
     990                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
     991                 :            : 
     992         [ +  - ]:          3 :         log_info("/* %s */", __func__);
     993                 :            : 
     994                 :          3 :         m = ordered_hashmap_new(&string_hash_ops);
     995                 :            : 
     996         [ -  + ]:          3 :         assert_se(ordered_hashmap_reserve(m, 1) == 0);
     997         [ -  + ]:          3 :         assert_se(ordered_hashmap_buckets(m) < 1000);
     998         [ -  + ]:          3 :         assert_se(ordered_hashmap_reserve(m, 1000) == 0);
     999         [ -  + ]:          3 :         assert_se(ordered_hashmap_buckets(m) >= 1000);
    1000         [ -  + ]:          3 :         assert_se(ordered_hashmap_isempty(m));
    1001                 :            : 
    1002         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(m, "key 1", (void*) "val 1") == 1);
    1003                 :            : 
    1004         [ -  + ]:          3 :         assert_se(ordered_hashmap_reserve(m, UINT_MAX) == -ENOMEM);
    1005         [ -  + ]:          3 :         assert_se(ordered_hashmap_reserve(m, UINT_MAX - 1) == -ENOMEM);
    1006                 :          3 : }
    1007                 :            : 
    1008                 :          3 : static void test_path_ordered_hashmap(void) {
    1009                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *h = NULL;
    1010                 :            : 
    1011         [ +  - ]:          3 :         log_info("/* %s */", __func__);
    1012                 :            : 
    1013         [ -  + ]:          3 :         assert_se(h = ordered_hashmap_new(&path_hash_ops));
    1014                 :            : 
    1015         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(h, "foo", INT_TO_PTR(1)) >= 0);
    1016         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(h, "/foo", INT_TO_PTR(2)) >= 0);
    1017         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(h, "//foo", INT_TO_PTR(3)) == -EEXIST);
    1018         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(h, "//foox/", INT_TO_PTR(4)) >= 0);
    1019         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(h, "/foox////", INT_TO_PTR(5)) == -EEXIST);
    1020         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(h, "foo//////bar/quux//", INT_TO_PTR(6)) >= 0);
    1021         [ -  + ]:          3 :         assert_se(ordered_hashmap_put(h, "foo/bar//quux/", INT_TO_PTR(8)) == -EEXIST);
    1022                 :            : 
    1023         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "foo") == INT_TO_PTR(1));
    1024         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "foo/") == INT_TO_PTR(1));
    1025         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "foo////") == INT_TO_PTR(1));
    1026         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "/foo") == INT_TO_PTR(2));
    1027         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "//foo") == INT_TO_PTR(2));
    1028         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "/////foo////") == INT_TO_PTR(2));
    1029         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "/////foox////") == INT_TO_PTR(4));
    1030         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "/foox/") == INT_TO_PTR(4));
    1031         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "/foox") == INT_TO_PTR(4));
    1032         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(h, "foox"));
    1033         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "foo/bar/quux") == INT_TO_PTR(6));
    1034         [ -  + ]:          3 :         assert_se(ordered_hashmap_get(h, "foo////bar////quux/////") == INT_TO_PTR(6));
    1035         [ -  + ]:          3 :         assert_se(!ordered_hashmap_get(h, "/foo////bar////quux/////"));
    1036                 :          3 : }
    1037                 :            : 
    1038                 :          3 : static void test_string_strv_ordered_hashmap(void) {
    1039                 :          3 :         _cleanup_ordered_hashmap_free_ OrderedHashmap *m = NULL;
    1040                 :            :         char **s;
    1041                 :            : 
    1042         [ +  - ]:          3 :         log_info("/* %s */", __func__);
    1043                 :            : 
    1044         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "foo", "bar") == 1);
    1045         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "foo", "bar") == 0);
    1046         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "foo", "BAR") == 1);
    1047         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "foo", "BAR") == 0);
    1048         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "foo", "bar") == 0);
    1049         [ -  + ]:          3 :         assert_se(ordered_hashmap_contains(m, "foo"));
    1050                 :            : 
    1051                 :          3 :         s = ordered_hashmap_get(m, "foo");
    1052         [ -  + ]:          3 :         assert_se(strv_equal(s, STRV_MAKE("bar", "BAR")));
    1053                 :            : 
    1054         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "xxx", "bar") == 1);
    1055         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "xxx", "bar") == 0);
    1056         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "xxx", "BAR") == 1);
    1057         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "xxx", "BAR") == 0);
    1058         [ -  + ]:          3 :         assert_se(string_strv_ordered_hashmap_put(&m, "xxx", "bar") == 0);
    1059         [ -  + ]:          3 :         assert_se(ordered_hashmap_contains(m, "xxx"));
    1060                 :            : 
    1061                 :          3 :         s = ordered_hashmap_get(m, "xxx");
    1062         [ -  + ]:          3 :         assert_se(strv_equal(s, STRV_MAKE("bar", "BAR")));
    1063                 :          3 : }
    1064                 :            : 
    1065                 :          3 : void test_ordered_hashmap_funcs(void) {
    1066         [ +  - ]:          3 :         log_info("/************ %s ************/", __func__);
    1067                 :            : 
    1068                 :          3 :         test_ordered_hashmap_copy();
    1069                 :          3 :         test_ordered_hashmap_get_strv();
    1070                 :          3 :         test_ordered_hashmap_move_one();
    1071                 :          3 :         test_ordered_hashmap_move();
    1072                 :          3 :         test_ordered_hashmap_replace();
    1073                 :          3 :         test_ordered_hashmap_update();
    1074                 :          3 :         test_ordered_hashmap_put();
    1075                 :          3 :         test_ordered_hashmap_remove();
    1076                 :          3 :         test_ordered_hashmap_remove2();
    1077                 :          3 :         test_ordered_hashmap_remove_value();
    1078                 :          3 :         test_ordered_hashmap_remove_and_put();
    1079                 :          3 :         test_ordered_hashmap_remove_and_replace();
    1080                 :          3 :         test_ordered_hashmap_ensure_allocated();
    1081                 :          3 :         test_ordered_hashmap_foreach();
    1082                 :          3 :         test_ordered_hashmap_foreach_key();
    1083                 :          3 :         test_ordered_hashmap_contains();
    1084                 :          3 :         test_ordered_hashmap_merge();
    1085                 :          3 :         test_ordered_hashmap_isempty();
    1086                 :          3 :         test_ordered_hashmap_get();
    1087                 :          3 :         test_ordered_hashmap_get2();
    1088                 :          3 :         test_ordered_hashmap_size();
    1089                 :          3 :         test_ordered_hashmap_many();
    1090                 :          3 :         test_ordered_hashmap_free();
    1091                 :          3 :         test_ordered_hashmap_free_with_destructor();
    1092                 :          3 :         test_ordered_hashmap_first();
    1093                 :          3 :         test_ordered_hashmap_first_key();
    1094                 :          3 :         test_ordered_hashmap_steal_first_key();
    1095                 :          3 :         test_ordered_hashmap_steal_first();
    1096                 :          3 :         test_ordered_hashmap_clear_free_free();
    1097                 :          3 :         test_ordered_hashmap_clear_free_with_destructor();
    1098                 :          3 :         test_ordered_hashmap_reserve();
    1099                 :          3 :         test_path_ordered_hashmap();
    1100                 :          3 :         test_string_strv_ordered_hashmap();
    1101                 :          3 : }

Generated by: LCOV version 1.14