LCOV - code coverage report
Current view: directory - src/trusted/service_runtime - sel_mem_test.cc (source / functions) Found Hit Coverage
Test: coverage.lcov Lines: 76 76 100.0 %
Date: 2014-07-02 Functions: 0 0 -

       1                 : /*
       2                 :  * Copyright 2008 The Native Client Authors. All rights reserved.
       3                 :  * Use of this source code is governed by a BSD-style license that can
       4                 :  * be found in the LICENSE file.
       5                 :  */
       6                 : 
       7                 : #include "native_client/src/include/nacl_platform.h"
       8                 : #include "native_client/src/trusted/service_runtime/sel_mem.h"
       9                 : #include "native_client/src/shared/platform/nacl_log.h"
      10                 : #include "gtest/gtest.h"
      11                 : 
      12                 : #include "native_client/src/trusted/service_runtime/include/bits/mman.h"
      13                 : 
      14               8 : class SelMemTest : public testing::Test {
      15                 :  protected:
      16                 :   virtual void SetUp();
      17                 :   virtual void TearDown();
      18                 : };
      19                 : 
      20               4 : void SelMemTest::SetUp() {
      21               4 :   NaClLogModuleInit();
      22               4 : }
      23                 : 
      24               4 : void SelMemTest::TearDown() {
      25               4 :   NaClLogModuleFini();
      26               4 : }
      27                 : 
      28               5 : TEST_F(SelMemTest, AddTest) {
      29                 :   struct NaClVmmap mem_map;
      30               1 :   int start_page_num = 32;
      31                 :   int ret_code;
      32                 : 
      33               1 :   ret_code = NaClVmmapCtor(&mem_map);
      34               1 :   EXPECT_EQ(1, ret_code);
      35                 : 
      36               6 :   for (int i = 1; i <= 5; ++i) {
      37                 :     NaClVmmapAdd(&mem_map,
      38                 :                  start_page_num*i,
      39                 :                  i,
      40                 :                  NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
      41                 :                  NACL_ABI_MAP_PRIVATE,
      42                 :                  NULL,
      43                 :                  0,
      44               5 :                  0);
      45               5 :     EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
      46               5 :     EXPECT_EQ(5, static_cast<int>(mem_map.size));
      47                 :   }
      48                 : 
      49                 :   // no checks for start_page_num ..
      50                 :   NaClVmmapAdd(&mem_map,
      51                 :                start_page_num,
      52                 :                2,
      53                 :                NACL_ABI_PROT_READ,
      54                 :                NACL_ABI_MAP_PRIVATE,
      55                 :                NULL,
      56                 :                0,
      57               1 :                0);
      58               1 :   EXPECT_EQ(6, static_cast<int>(mem_map.nvalid));
      59               1 :   EXPECT_EQ(10, static_cast<int>(mem_map.size));
      60                 : 
      61               1 :   NaClVmmapDtor(&mem_map);
      62               1 : }
      63                 : 
      64               5 : TEST_F(SelMemTest, UpdateTest) {
      65                 :   struct NaClVmmap mem_map;
      66                 : 
      67               1 :   EXPECT_EQ(1, NaClVmmapCtor(&mem_map));
      68                 : 
      69                 :   // 1st region
      70                 :   NaClVmmapAddWithOverwrite(&mem_map,
      71                 :                             32,
      72                 :                             12,
      73                 :                             NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
      74                 :                             NACL_ABI_MAP_PRIVATE,
      75                 :                             NULL,
      76                 :                             0,
      77               1 :                             0);
      78               1 :   EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
      79                 : 
      80                 :   // no overlap
      81                 :   NaClVmmapAddWithOverwrite(&mem_map,
      82                 :                             64,
      83                 :                             10,
      84                 :                             NACL_ABI_PROT_READ,
      85                 :                             NACL_ABI_MAP_PRIVATE,
      86                 :                             NULL,
      87                 :                             0,
      88               1 :                             0);
      89                 :   // vmmap is [32, 44], [64, 74]
      90               1 :   EXPECT_EQ(2, static_cast<int>(mem_map.nvalid));
      91                 : 
      92                 :   // new mapping overlaps end and start of existing mappings
      93                 :   NaClVmmapAddWithOverwrite(&mem_map,
      94                 :                             42,
      95                 :                             24,
      96                 :                             NACL_ABI_PROT_READ,
      97                 :                             NACL_ABI_MAP_PRIVATE,
      98                 :                             NULL,
      99                 :                             0,
     100               1 :                             0);
     101                 :   // vmmap is [32, 41], [42, 66], [67, 74]
     102               1 :   EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
     103                 : 
     104                 :   // new mapping is in the middle of existing mapping
     105                 :   NaClVmmapAddWithOverwrite(&mem_map,
     106                 :                             36,
     107                 :                             2,
     108                 :                             NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
     109                 :                             NACL_ABI_MAP_PRIVATE,
     110                 :                             NULL,
     111                 :                             0,
     112               1 :                             0);
     113                 :   // vmmap is [32, 35], [34, 36], [37, 41], [42, 66], [67, 74]
     114               1 :   EXPECT_EQ(5, static_cast<int>(mem_map.nvalid));
     115                 : 
     116                 :   // new mapping covers all of the existing mapping
     117                 :   NaClVmmapAddWithOverwrite(&mem_map,
     118                 :                             32,
     119                 :                             6,
     120                 :                             NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
     121                 :                             NACL_ABI_MAP_PRIVATE,
     122                 :                             NULL,
     123                 :                             0,
     124               1 :                             0);
     125                 :   // vmmap is [32, 36], [37, 41], [42, 66], [67, 74]
     126               1 :   EXPECT_EQ(4, static_cast<int>(mem_map.nvalid));
     127                 : 
     128                 :   // remove existing mappings
     129                 :   NaClVmmapRemove(&mem_map,
     130                 :                   40,
     131               1 :                   30);
     132                 :   // vmmap is [32, 36], [37, 39], [71, 74]
     133               1 :   EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
     134                 : 
     135               1 :   NaClVmmapDtor(&mem_map);
     136               1 : }
     137                 : 
     138               5 : TEST_F(SelMemTest, FindPageTest) {
     139                 :   struct NaClVmmap mem_map;
     140                 :   int ret_code;
     141                 : 
     142               1 :   ret_code = NaClVmmapCtor(&mem_map);
     143               1 :   EXPECT_EQ(1, ret_code);
     144                 : 
     145                 :   struct NaClVmmapEntry const *entry;
     146               1 :   entry = NaClVmmapFindPage(&mem_map, 32);
     147               1 :   EXPECT_TRUE(NULL == entry);
     148                 : 
     149               1 :   int start_page_num = 32;
     150               7 :   for (int i = 1; i <= 6; ++i) {
     151                 :     NaClVmmapAdd(&mem_map,
     152                 :                  start_page_num*i,
     153                 :                  2*i,
     154                 :                  NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
     155                 :                  NACL_ABI_MAP_PRIVATE,
     156                 :                  NULL,
     157                 :                  0,
     158               6 :                  0);
     159               6 :     EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
     160                 :   }
     161                 :   // vmmap is [32, 34], [64, 68], [96, 102], [128, 136],
     162                 :   //          [160, 170], [192, 204]
     163                 : 
     164               1 :   entry = NaClVmmapFindPage(&mem_map, 16);
     165               1 :   EXPECT_TRUE(NULL == entry);
     166                 : 
     167               1 :   entry = NaClVmmapFindPage(&mem_map, 32);
     168               1 :   EXPECT_TRUE(NULL != entry);
     169                 : 
     170               1 :   entry = NaClVmmapFindPage(&mem_map, 34);
     171               1 :   EXPECT_TRUE(NULL == entry);
     172                 : 
     173               1 :   entry = NaClVmmapFindPage(&mem_map, 202);
     174               1 :   EXPECT_TRUE(NULL != entry);
     175                 : 
     176               1 :   NaClVmmapDtor(&mem_map);
     177               1 : }
     178                 : 
     179               5 : TEST_F(SelMemTest, FindSpaceTest) {
     180                 :   struct NaClVmmap mem_map;
     181                 :   uintptr_t ret_code;
     182                 : 
     183               1 :   ret_code = NaClVmmapCtor(&mem_map);
     184               1 :   EXPECT_EQ(1U, ret_code);
     185                 : 
     186                 :   // no entry
     187               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 32);
     188               1 :   EXPECT_EQ(0U, ret_code);
     189                 : 
     190                 :   NaClVmmapAdd(&mem_map,
     191                 :                32,
     192                 :                10,
     193                 :                NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
     194                 :                NACL_ABI_MAP_PRIVATE,
     195                 :                NULL,
     196                 :                0,
     197               1 :                0);
     198               1 :   EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
     199                 :   // one entry only
     200               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 2);
     201               1 :   EXPECT_EQ(0U, ret_code);
     202                 : 
     203                 :   NaClVmmapAdd(&mem_map,
     204                 :                64,
     205                 :                10,
     206                 :                NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
     207                 :                NACL_ABI_MAP_PRIVATE,
     208                 :                NULL,
     209                 :                0,
     210               1 :                0);
     211               1 :   EXPECT_EQ(2U, mem_map.nvalid);
     212                 : 
     213                 :   // the space is [32, 42], [64, 74]
     214               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 32);
     215               1 :   EXPECT_EQ(0U, ret_code);
     216                 : 
     217               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 2);
     218               1 :   EXPECT_EQ(62U, ret_code);
     219                 : 
     220                 :   NaClVmmapAdd(&mem_map,
     221                 :                96,
     222                 :                10,
     223                 :                NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
     224                 :                NACL_ABI_MAP_PRIVATE,
     225                 :                NULL,
     226                 :                0,
     227               1 :                0);
     228               1 :   EXPECT_EQ(3U, mem_map.nvalid);
     229                 : 
     230                 :   // vmmap is [32, 42], [64, 74], [96, 106]
     231                 :   // the search is from high address down
     232               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 22);
     233               1 :   EXPECT_EQ(74U, ret_code);
     234                 : 
     235               1 :   NaClVmmapDtor(&mem_map);
     236               4 : }

Generated by: LCOV version 1.7