LCOV - code coverage report
Current view: top level - test - test_namemap.c (source / functions) Hit Total Coverage
Test: lcov.info Lines: 110 110 100.0 %
Date: 2021-11-24 03:28:48 Functions: 5 5 100.0 %

          Line data    Source code
       1             : /* Copyright (c) 2018-2021, The Tor Project, Inc. */
       2             : /* See LICENSE for licensing information */
       3             : 
       4             : #include "test/test.h"
       5             : 
       6             : #include "lib/cc/torint.h"
       7             : #include "lib/container/namemap.h"
       8             : #include "lib/container/namemap_st.h"
       9             : #include "lib/malloc/malloc.h"
      10             : 
      11             : #include <stdio.h>
      12             : #include <string.h>
      13             : 
      14             : static void
      15           1 : test_namemap_empty(void *arg)
      16             : {
      17           1 :   (void)arg;
      18             : 
      19           1 :   namemap_t m;
      20           1 :   namemap_init(&m);
      21           1 :   namemap_t m2 = NAMEMAP_INIT();
      22             : 
      23           1 :   tt_uint_op(0, OP_EQ, namemap_get_size(&m));
      24           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, "hello"));
      25           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, "hello"));
      26           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, "hello128"));
      27           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, ""));
      28           1 :   tt_uint_op(0, OP_EQ, namemap_get_size(&m));
      29             : 
      30           1 :   tt_uint_op(0, OP_EQ, namemap_get_size(&m2));
      31           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello"));
      32           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello"));
      33           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello128"));
      34           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, ""));
      35           1 :   tt_uint_op(0, OP_EQ, namemap_get_size(&m));
      36             : 
      37           1 :  done:
      38           1 :   namemap_clear(&m);
      39           1 :   namemap_clear(&m2);
      40           1 : }
      41             : 
      42             : static void
      43           1 : test_namemap_toolong(void *arg)
      44             : {
      45           1 :   (void)arg;
      46           1 :   namemap_t m;
      47           1 :   char *ok = NULL;
      48           1 :   char *toolong = NULL;
      49           1 :   namemap_init(&m);
      50             : 
      51           1 :   ok = tor_malloc_zero(MAX_NAMEMAP_NAME_LEN+1);
      52           1 :   memset(ok, 'x', MAX_NAMEMAP_NAME_LEN);
      53             : 
      54           1 :   toolong = tor_malloc_zero(MAX_NAMEMAP_NAME_LEN+2);
      55           1 :   memset(toolong, 'x', MAX_NAMEMAP_NAME_LEN+1);
      56             : 
      57           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, ok));
      58           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, toolong));
      59           1 :   unsigned u1 = namemap_get_or_create_id(&m, toolong);
      60           1 :   unsigned u2 = namemap_get_or_create_id(&m, ok);
      61           1 :   tt_uint_op(u1, OP_EQ, NAMEMAP_ERR);
      62           1 :   tt_uint_op(u2, OP_NE, NAMEMAP_ERR);
      63           1 :   tt_uint_op(u2, OP_EQ, namemap_get_id(&m, ok));
      64           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m, toolong));
      65             : 
      66           1 :   tt_str_op(ok, OP_EQ, namemap_get_name(&m, u2));
      67           1 :   tt_ptr_op(NULL, OP_EQ, namemap_get_name(&m, u1));
      68             : 
      69           1 :  done:
      70           1 :   tor_free(ok);
      71           1 :   tor_free(toolong);
      72           1 :   namemap_clear(&m);
      73           1 : }
      74             : 
      75             : static void
      76           1 : test_namemap_blackbox(void *arg)
      77             : {
      78           1 :   (void)arg;
      79             : 
      80           1 :   namemap_t m1, m2;
      81           1 :   namemap_init(&m1);
      82           1 :   namemap_init(&m2);
      83             : 
      84           1 :   unsigned u1 = namemap_get_or_create_id(&m1, "hello");
      85           1 :   unsigned u2 = namemap_get_or_create_id(&m1, "world");
      86           1 :   tt_uint_op(u1, OP_NE, NAMEMAP_ERR);
      87           1 :   tt_uint_op(u2, OP_NE, NAMEMAP_ERR);
      88           1 :   tt_uint_op(u1, OP_NE, u2);
      89             : 
      90           1 :   tt_uint_op(u1, OP_EQ, namemap_get_id(&m1, "hello"));
      91           1 :   tt_uint_op(u1, OP_EQ, namemap_get_or_create_id(&m1, "hello"));
      92           1 :   tt_uint_op(u2, OP_EQ, namemap_get_id(&m1, "world"));
      93           1 :   tt_uint_op(u2, OP_EQ, namemap_get_or_create_id(&m1, "world"));
      94             : 
      95           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m1, "HELLO"));
      96           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m2, "hello"));
      97             : 
      98           1 :   unsigned u3 = namemap_get_or_create_id(&m2, "hola");
      99           1 :   tt_uint_op(u3, OP_NE, NAMEMAP_ERR);
     100           1 :   tt_uint_op(NAMEMAP_ERR, OP_EQ, namemap_get_id(&m1, "hola"));
     101           1 :   tt_uint_op(u3, OP_EQ, namemap_get_or_create_id(&m2, "hola"));
     102           1 :   tt_uint_op(u3, OP_EQ, namemap_get_id(&m2, "hola"));
     103             : 
     104           1 :   unsigned int u4 = namemap_get_or_create_id(&m1, "hola");
     105           1 :   tt_uint_op(u4, OP_NE, NAMEMAP_ERR);
     106           1 :   tt_uint_op(u4, OP_EQ, namemap_get_id(&m1, "hola"));
     107           1 :   tt_uint_op(u3, OP_EQ, namemap_get_id(&m2, "hola"));
     108             : 
     109           1 :   tt_str_op("hello", OP_EQ, namemap_get_name(&m1, u1));
     110           1 :   tt_str_op("world", OP_EQ, namemap_get_name(&m1, u2));
     111           1 :   tt_str_op("hola", OP_EQ, namemap_get_name(&m2, u3));
     112           1 :   tt_str_op("hola", OP_EQ, namemap_get_name(&m1, u4));
     113             : 
     114           1 :   tt_ptr_op(NULL, OP_EQ, namemap_get_name(&m2, u3 + 10));
     115             : 
     116           1 :  done:
     117           1 :   namemap_clear(&m1);
     118           1 :   namemap_clear(&m2);
     119           1 : }
     120             : 
     121             : static void
     122           1 : test_namemap_internals(void *arg)
     123             : {
     124           1 :   (void)arg;
     125             :   // This test actually assumes know something about the identity layout.
     126           1 :   namemap_t m;
     127           1 :   namemap_init(&m);
     128             : 
     129           1 :   tt_uint_op(0, OP_EQ, namemap_get_or_create_id(&m, "that"));
     130           1 :   tt_uint_op(0, OP_EQ, namemap_get_or_create_id(&m, "that"));
     131           1 :   tt_uint_op(1, OP_EQ, namemap_get_or_create_id(&m, "is"));
     132           1 :   tt_uint_op(1, OP_EQ, namemap_get_or_create_id(&m, "is"));
     133             : 
     134           1 :   tt_uint_op(0, OP_EQ, namemap_get_id(&m, "that"));
     135           1 :   tt_uint_op(0, OP_EQ, namemap_get_id(&m, "that"));
     136           1 :   tt_uint_op(1, OP_EQ, namemap_get_id(&m, "is"));
     137           1 :   tt_uint_op(2, OP_EQ, namemap_get_or_create_id(&m, "not"));
     138           1 :   tt_uint_op(1, OP_EQ, namemap_get_or_create_id(&m, "is"));
     139           1 :   tt_uint_op(2, OP_EQ, namemap_get_or_create_id(&m, "not"));
     140             : 
     141           1 :  done:
     142           1 :   namemap_clear(&m);
     143           1 : }
     144             : 
     145             : static void
     146           1 : test_namemap_fmt(void *arg)
     147             : {
     148           1 :   (void)arg;
     149           1 :   namemap_t m = NAMEMAP_INIT();
     150             : 
     151           1 :   unsigned a = namemap_get_or_create_id(&m, "greetings");
     152           1 :   unsigned b = namemap_get_or_create_id(&m, "earthlings");
     153             : 
     154           1 :   tt_str_op(namemap_fmt_name(&m, a), OP_EQ, "greetings");
     155           1 :   tt_str_op(namemap_fmt_name(&m, b), OP_EQ, "earthlings");
     156           1 :   tt_int_op(a, OP_NE, 100);
     157           1 :   tt_int_op(b, OP_NE, 100);
     158           1 :   tt_str_op(namemap_fmt_name(&m, 100), OP_EQ, "{100}");
     159             : 
     160           1 :  done:
     161           1 :   namemap_clear(&m);
     162           1 : }
     163             : 
     164             : #define T(name) \
     165             :   { #name, test_namemap_ ## name , 0, NULL, NULL }
     166             : 
     167             : struct testcase_t namemap_tests[] = {
     168             :   T(empty),
     169             :   T(toolong),
     170             :   T(blackbox),
     171             :   T(internals),
     172             :   T(fmt),
     173             :   END_OF_TESTCASES
     174             : };

Generated by: LCOV version 1.14