LCOV - code coverage report
Current view: directory - src/trusted/service_runtime - sel_mem_test.cc (source / functions) Found Hit Coverage
Test: coverage.lcov Lines: 84 84 100.0 %
Date: 2014-06-18 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                 : void SelMemTest::SetUp() {
      21               4 :   NaClLogModuleInit();
      22               4 : }
      23                 : 
      24                 : void SelMemTest::TearDown() {
      25               4 :   NaClLogModuleFini();
      26               4 : }
      27                 : 
      28               8 : TEST_F(SelMemTest, AddTest) {
      29               1 :   struct NaClVmmap mem_map;
      30               1 :   int start_page_num = 32;
      31               1 :   int ret_code;
      32                 : 
      33               1 :   ret_code = NaClVmmapCtor(&mem_map);
      34               4 :   EXPECT_EQ(1, ret_code);
      35                 : 
      36              12 :   for (int i = 1; i <= 5; ++i) {
      37               5 :     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                 :                  0);
      45              20 :     EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
      46              20 :     EXPECT_EQ(5, static_cast<int>(mem_map.size));
      47               5 :   }
      48                 : 
      49                 :   // no checks for start_page_num ..
      50               1 :   NaClVmmapAdd(&mem_map,
      51                 :                start_page_num,
      52                 :                2,
      53                 :                NACL_ABI_PROT_READ,
      54                 :                NACL_ABI_MAP_PRIVATE,
      55                 :                NULL,
      56                 :                0,
      57                 :                0);
      58               4 :   EXPECT_EQ(6, static_cast<int>(mem_map.nvalid));
      59               4 :   EXPECT_EQ(10, static_cast<int>(mem_map.size));
      60                 : 
      61               1 :   NaClVmmapDtor(&mem_map);
      62               1 : }
      63                 : 
      64               8 : TEST_F(SelMemTest, UpdateTest) {
      65               1 :   struct NaClVmmap mem_map;
      66                 : 
      67               4 :   EXPECT_EQ(1, NaClVmmapCtor(&mem_map));
      68                 : 
      69                 :   // 1st region
      70               1 :   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                 :                             0);
      78               4 :   EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
      79                 : 
      80                 :   // no overlap
      81               1 :   NaClVmmapAddWithOverwrite(&mem_map,
      82                 :                             64,
      83                 :                             10,
      84                 :                             NACL_ABI_PROT_READ,
      85                 :                             NACL_ABI_MAP_PRIVATE,
      86                 :                             NULL,
      87                 :                             0,
      88                 :                             0);
      89                 :   // vmmap is [32, 44], [64, 74]
      90               4 :   EXPECT_EQ(2, static_cast<int>(mem_map.nvalid));
      91                 : 
      92                 :   // new mapping overlaps end and start of existing mappings
      93               1 :   NaClVmmapAddWithOverwrite(&mem_map,
      94                 :                             42,
      95                 :                             24,
      96                 :                             NACL_ABI_PROT_READ,
      97                 :                             NACL_ABI_MAP_PRIVATE,
      98                 :                             NULL,
      99                 :                             0,
     100                 :                             0);
     101                 :   // vmmap is [32, 41], [42, 66], [67, 74]
     102               4 :   EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
     103                 : 
     104                 :   // new mapping is in the middle of existing mapping
     105               1 :   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                 :                             0);
     113                 :   // vmmap is [32, 35], [34, 36], [37, 41], [42, 66], [67, 74]
     114               4 :   EXPECT_EQ(5, static_cast<int>(mem_map.nvalid));
     115                 : 
     116                 :   // new mapping covers all of the existing mapping
     117               1 :   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                 :                             0);
     125                 :   // vmmap is [32, 36], [37, 41], [42, 66], [67, 74]
     126               4 :   EXPECT_EQ(4, static_cast<int>(mem_map.nvalid));
     127                 : 
     128                 :   // remove existing mappings
     129               1 :   NaClVmmapRemove(&mem_map,
     130                 :                   40,
     131                 :                   30);
     132                 :   // vmmap is [32, 36], [37, 39], [71, 74]
     133               4 :   EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
     134                 : 
     135               1 :   NaClVmmapDtor(&mem_map);
     136               1 : }
     137                 : 
     138               8 : TEST_F(SelMemTest, FindPageTest) {
     139               1 :   struct NaClVmmap mem_map;
     140               1 :   int ret_code;
     141                 : 
     142               1 :   ret_code = NaClVmmapCtor(&mem_map);
     143               4 :   EXPECT_EQ(1, ret_code);
     144                 : 
     145               1 :   struct NaClVmmapEntry const *entry;
     146               1 :   entry = NaClVmmapFindPage(&mem_map, 32);
     147               4 :   EXPECT_TRUE(NULL == entry);
     148                 : 
     149               1 :   int start_page_num = 32;
     150              14 :   for (int i = 1; i <= 6; ++i) {
     151               6 :     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                 :                  0);
     159              24 :     EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
     160               6 :   }
     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               4 :   EXPECT_TRUE(NULL == entry);
     166                 : 
     167               1 :   entry = NaClVmmapFindPage(&mem_map, 32);
     168               4 :   EXPECT_TRUE(NULL != entry);
     169                 : 
     170               1 :   entry = NaClVmmapFindPage(&mem_map, 34);
     171               4 :   EXPECT_TRUE(NULL == entry);
     172                 : 
     173               1 :   entry = NaClVmmapFindPage(&mem_map, 202);
     174               4 :   EXPECT_TRUE(NULL != entry);
     175                 : 
     176               1 :   NaClVmmapDtor(&mem_map);
     177               1 : }
     178                 : 
     179               8 : TEST_F(SelMemTest, FindSpaceTest) {
     180               1 :   struct NaClVmmap mem_map;
     181               1 :   uintptr_t ret_code;
     182                 : 
     183               1 :   ret_code = NaClVmmapCtor(&mem_map);
     184               4 :   EXPECT_EQ(1U, ret_code);
     185                 : 
     186                 :   // no entry
     187               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 32);
     188               4 :   EXPECT_EQ(0U, ret_code);
     189                 : 
     190               1 :   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                 :                0);
     198               4 :   EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
     199                 :   // one entry only
     200               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 2);
     201               4 :   EXPECT_EQ(0U, ret_code);
     202                 : 
     203               1 :   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                 :                0);
     211               4 :   EXPECT_EQ(2U, mem_map.nvalid);
     212                 : 
     213                 :   // the space is [32, 42], [64, 74]
     214               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 32);
     215               4 :   EXPECT_EQ(0U, ret_code);
     216                 : 
     217               1 :   ret_code = NaClVmmapFindSpace(&mem_map, 2);
     218               4 :   EXPECT_EQ(62U, ret_code);
     219                 : 
     220               1 :   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                 :                0);
     228               4 :   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               4 :   EXPECT_EQ(74U, ret_code);
     234                 : 
     235               1 :   NaClVmmapDtor(&mem_map);
     236               1 : }

Generated by: LCOV version 1.7