LCOV - code coverage report
Current view: top level - ccache/test - test_util.c (source / functions) Hit Total Coverage
Test: ccache.lcov.info Lines: 90 90 100.0 %
Date: 2015-06-29 Functions: 1 1 100.0 %
Branches: 79 156 50.6 %

           Branch data     Line data    Source code
       1                 :            : /*
       2                 :            :  * Copyright (C) 2010-2014 Joel Rosdahl
       3                 :            :  *
       4                 :            :  * This program is free software; you can redistribute it and/or modify it
       5                 :            :  * under the terms of the GNU General Public License as published by the Free
       6                 :            :  * Software Foundation; either version 3 of the License, or (at your option)
       7                 :            :  * any later version.
       8                 :            :  *
       9                 :            :  * This program is distributed in the hope that it will be useful, but WITHOUT
      10                 :            :  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
      11                 :            :  * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
      12                 :            :  * more details.
      13                 :            :  *
      14                 :            :  * You should have received a copy of the GNU General Public License along with
      15                 :            :  * this program; if not, write to the Free Software Foundation, Inc., 51
      16                 :            :  * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
      17                 :            :  */
      18                 :            : 
      19                 :            : /*
      20                 :            :  * This file contains tests for functions in util.c.
      21                 :            :  */
      22                 :            : 
      23                 :            : #include "ccache.h"
      24                 :            : #include "test/framework.h"
      25                 :            : 
      26                 :          1 : TEST_SUITE(util)
      27                 :            : 
      28         [ +  - ]:          1 : TEST(basename)
      29                 :            : {
      30         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("foo.c", basename("foo.c"));
      31         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("foo.c", basename("dir1/dir2/foo.c"));
      32         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("foo.c", basename("/dir/foo.c"));
      33         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("", basename("dir1/dir2/"));
      34                 :            : }
      35                 :            : 
      36         [ +  - ]:          1 : TEST(dirname)
      37                 :            : {
      38         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2(".", dirname("foo.c"));
      39         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2(".", dirname(""));
      40         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("/", dirname("/"));
      41         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("/", dirname("/foo.c"));
      42         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/foo.c"));
      43         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("/dir", dirname("/dir/foo.c"));
      44         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("dir1/dir2", dirname("dir1/dir2/"));
      45                 :            : }
      46                 :            : 
      47         [ +  - ]:          1 : TEST(common_dir_prefix_length)
      48                 :            : {
      49         [ -  + ]:          1 :         CHECK_INT_EQ(0, common_dir_prefix_length("", ""));
      50         [ -  + ]:          1 :         CHECK_INT_EQ(0, common_dir_prefix_length("/", "/"));
      51         [ -  + ]:          1 :         CHECK_INT_EQ(0, common_dir_prefix_length("/", "/b"));
      52         [ -  + ]:          1 :         CHECK_INT_EQ(0, common_dir_prefix_length("/a", "/b"));
      53         [ -  + ]:          1 :         CHECK_INT_EQ(2, common_dir_prefix_length("/a", "/a"));
      54         [ -  + ]:          1 :         CHECK_INT_EQ(2, common_dir_prefix_length("/a", "/a/b"));
      55         [ -  + ]:          1 :         CHECK_INT_EQ(2, common_dir_prefix_length("/a/b", "/a/c"));
      56         [ -  + ]:          1 :         CHECK_INT_EQ(4, common_dir_prefix_length("/a/b", "/a/b"));
      57         [ -  + ]:          1 :         CHECK_INT_EQ(2, common_dir_prefix_length("/a/bc", "/a/b"));
      58         [ -  + ]:          1 :         CHECK_INT_EQ(2, common_dir_prefix_length("/a/b", "/a/bc"));
      59                 :            : }
      60                 :            : 
      61         [ +  - ]:          1 : TEST(get_relative_path)
      62                 :            : {
      63         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("a", get_relative_path("/doesn't matter", "a"));
      64         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("a/b", get_relative_path("/doesn't matter", "a/b"));
      65         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2(".", get_relative_path("/a", "/a"));
      66         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("..", get_relative_path("/a/b", "/a"));
      67         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("b", get_relative_path("/a", "/a/b"));
      68         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("b/c", get_relative_path("/a", "/a/b/c"));
      69         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("../c", get_relative_path("/a/b", "/a/c"));
      70         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("../c/d", get_relative_path("/a/b", "/a/c/d"));
      71         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("../../c/d", get_relative_path("/a/b/c", "/a/c/d"));
      72         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("../..", get_relative_path("/a/b", "/"));
      73         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("../../c", get_relative_path("/a/b", "/c"));
      74         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("a/b", get_relative_path("/", "/a/b"));
      75                 :            : }
      76                 :            : 
      77         [ +  - ]:          1 : TEST(format_hash_as_string)
      78                 :            : {
      79                 :            :         unsigned char hash[16] = {
      80                 :          1 :                 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"};
      81                 :            : 
      82         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("00000000000000000000000000000000",
      83                 :            :                            format_hash_as_string(hash, -1));
      84         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("00000000000000000000000000000000-0",
      85                 :            :                            format_hash_as_string(hash, 0));
      86                 :          1 :         hash[0] = 17;
      87                 :          1 :         hash[15] = 42;
      88         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("1100000000000000000000000000002a-12345",
      89                 :            :                            format_hash_as_string(hash, 12345));
      90                 :            : }
      91                 :            : 
      92         [ +  - ]:          1 : TEST(subst_env_in_string)
      93                 :            : {
      94                 :            :         char *errmsg;
      95                 :          1 :         const char *shell = getenv("SHELL");
      96                 :            : 
      97                 :          1 :         errmsg = "";
      98         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2(shell,
      99                 :            :                            subst_env_in_string("$SHELL", &errmsg));
     100         [ +  - ]:          1 :         CHECK(!errmsg);
     101                 :            : 
     102                 :          1 :         errmsg = "";
     103         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("$",
     104                 :            :                            subst_env_in_string("$", &errmsg));
     105         [ +  - ]:          1 :         CHECK(!errmsg);
     106                 :            : 
     107                 :          1 :         errmsg = "";
     108         [ -  + ]:          1 :         CHECK_STR_EQ_FREE12(format("%s %s:%s", shell, shell, shell),
     109                 :            :                             subst_env_in_string("$SHELL $SHELL:$SHELL", &errmsg));
     110         [ +  - ]:          1 :         CHECK(!errmsg);
     111                 :            : 
     112                 :          1 :         errmsg = "";
     113         [ -  + ]:          1 :         CHECK_STR_EQ_FREE12(format("x%s", shell),
     114                 :            :                             subst_env_in_string("x$SHELL", &errmsg));
     115         [ +  - ]:          1 :         CHECK(!errmsg);
     116                 :            : 
     117                 :          1 :         errmsg = "";
     118         [ -  + ]:          1 :         CHECK_STR_EQ_FREE12(format("%sx", shell),
     119                 :            :                             subst_env_in_string("${SHELL}x", &errmsg));
     120         [ +  - ]:          1 :         CHECK(!errmsg);
     121                 :            : 
     122         [ +  - ]:          1 :         CHECK(!subst_env_in_string("$surelydoesntexist", &errmsg));
     123         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("environment variable \"surelydoesntexist\" not set",
     124                 :            :                            errmsg);
     125                 :            : 
     126         [ +  - ]:          1 :         CHECK(!subst_env_in_string("${SHELL", &errmsg));
     127         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("syntax error: missing '}' after \"SHELL\"", errmsg);
     128                 :            : }
     129                 :            : 
     130         [ +  - ]:          1 : TEST(format_human_readable_size)
     131                 :            : {
     132         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("0.0 kB", format_human_readable_size(0));
     133         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("0.0 kB", format_human_readable_size(49));
     134         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("0.1 kB", format_human_readable_size(50));
     135         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("42.0 kB", format_human_readable_size(42 * 1000));
     136         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("1.0 MB", format_human_readable_size(1000 * 1000));
     137         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("1.2 MB", format_human_readable_size(1234 * 1000));
     138         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("438.5 MB",
     139                 :            :                            format_human_readable_size(438.5 * 1000 * 1000));
     140         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("1.0 GB",
     141                 :            :                            format_human_readable_size(1000 * 1000 * 1000));
     142         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("17.1 GB",
     143                 :            :                            format_human_readable_size(17.11 * 1000 * 1000 * 1000));
     144                 :            : }
     145                 :            : 
     146         [ +  - ]:          1 : TEST(format_parsable_size_with_suffix)
     147                 :            : {
     148         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("0", format_parsable_size_with_suffix(0));
     149         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("42.0k", format_parsable_size_with_suffix(42 * 1000));
     150         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("1.0M", format_parsable_size_with_suffix(1000 * 1000));
     151         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("1.2M", format_parsable_size_with_suffix(1234 * 1000));
     152         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("438.5M",
     153                 :            :                            format_parsable_size_with_suffix(438.5 * 1000 * 1000));
     154         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2("1.0G",
     155                 :            :                            format_parsable_size_with_suffix(1000 * 1000 * 1000));
     156         [ -  + ]:          1 :         CHECK_STR_EQ_FREE2(
     157                 :            :                 "17.1G",
     158                 :            :                 format_parsable_size_with_suffix(17.11 * 1000 * 1000 * 1000));
     159                 :            : }
     160                 :            : 
     161         [ +  - ]:          1 : TEST(parse_size_with_suffix)
     162                 :            : {
     163                 :            :         uint64_t size;
     164                 :            :         size_t i;
     165                 :            :         struct { const char *size; int64_t expected; } sizes[] = {
     166                 :            :                 {"0", 0},
     167                 :            :                 {"42", (int64_t)42 * 1000 * 1000 * 1000}, /* Default suffix: G */
     168                 :            : 
     169                 :            :                 {"78k",       78 * 1000},
     170                 :            :                 {"78K",       78 * 1000},
     171                 :            :                 {"1.1 M",     1.1 * 1000 * 1000},
     172                 :            :                 {"438.55M",   438.55 * 1000 * 1000},
     173                 :            :                 {"1 G",       1 * 1000 * 1000 * 1000},
     174                 :            :                 {"2T",        (int64_t)2 * 1000 * 1000 * 1000 * 1000},
     175                 :            : 
     176                 :            :                 {"78 Ki",     78 * 1024},
     177                 :            :                 {"1.1Mi",     1.1 * 1024 * 1024},
     178                 :            :                 {"438.55 Mi", 438.55 * 1024 * 1024},
     179                 :            :                 {"1Gi",       1 * 1024 * 1024 * 1024},
     180                 :            :                 {"2 Ti",      (int64_t)2 * 1024 * 1024 * 1024 * 1024},
     181                 :            : 
     182                 :          1 :         };
     183                 :            : 
     184         [ +  + ]:         14 :         for (i = 0; i < sizeof(sizes) / sizeof(sizes[0]); ++i) {
     185         [ +  - ]:         13 :                 CHECKM(parse_size_with_suffix(sizes[i].size, &size), sizes[i].size);
     186         [ -  + ]:         13 :                 CHECK_INT_EQ(sizes[i].expected, size);
     187                 :            :         }
     188                 :            : }
     189                 :            : 
     190                 :          1 : TEST_SUITE_END

Generated by: LCOV version 1.9