15460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===- MemoryAreaTest.cpp -------------------------------------------------===// 25460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 35460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// The MCLinker Project 45460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 55460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// This file is distributed under the University of Illinois Open Source 65460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// License. See LICENSE.TXT for details. 75460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 85460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//===----------------------------------------------------------------------===// 9affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileHandle.h> 10affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/FileSystem.h> 11affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryArea.h> 12affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryRegion.h> 13affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/MemoryAreaFactory.h> 14affc150dc44fab1911775a49636d0ce85333b634Zonr Chang#include <mcld/Support/Path.h> 155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include "MemoryAreaTest.h" 175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <fcntl.h> 185460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao#include <cstdio> 195460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 205460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld; 215460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcld::sys::fs; 225460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaousing namespace mcldtest; 235460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 245460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 255460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Constructor can do set-up work for all test here. 265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMemoryAreaTest::MemoryAreaTest() 275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 305460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Destructor can do clean-up work that doesn't throw exceptions here. 315460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoMemoryAreaTest::~MemoryAreaTest() 325460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// SetUp() will be called immediately before each test. 365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid MemoryAreaTest::SetUp() 375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 405460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// TearDown() will be called immediately after each test. 415460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liaovoid MemoryAreaTest::TearDown() 425460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao//==========================================================================// 465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// Testcases 475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao// 485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( MemoryAreaTest, read_by_malloc ) 495460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 505460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path path(TOPDIR); 515460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao path.append("unittests/test3.txt"); 52affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 535460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1); 54affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly); 555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryRegion* region = area->request(3, 2); 565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('L', region->getBuffer()[0]); 575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('O', region->getBuffer()[1]); 58affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region); 59affc150dc44fab1911775a49636d0ce85333b634Zonr Chang AreaFactory->destruct(area); 60affc150dc44fab1911775a49636d0ce85333b634Zonr Chang //delete AreaFactory;; 615460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 625460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( MemoryAreaTest, write_by_malloc ) 645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path path(TOPDIR); 665460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao path.append("unittests/test2.txt"); 675460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1); 68affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly); 69affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isOpened()); 70affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isGood()); 715460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryRegion* region = area->request(3, 4); 725460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[0] = 'L'; 735460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[1] = 'i'; 745460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[2] = 'n'; 755460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[3] = 'k'; 76affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region); 77affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->clear(); 78affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->handler()->close(); 79affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 80affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->handler()->open(path, FileHandle::ReadOnly); 81affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isOpened()); 82affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isGood()); 835460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region = area->request(5, 2); 845460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('n', region->getBuffer()[0]); 855460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('k', region->getBuffer()[1]); 86affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region); 87affc150dc44fab1911775a49636d0ce85333b634Zonr Chang AreaFactory->destruct(area); 88affc150dc44fab1911775a49636d0ce85333b634Zonr Chang //delete AreaFactory;; 895460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 905460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 915460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( MemoryAreaTest, read_one_page ) 925460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 935460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path path(TOPDIR) ; 945460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao path.append("unittests/test3.txt") ; 955460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ; 96affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly) ; 97affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isOpened()) ; 98affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isGood()) ; 99affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryRegion* region = area->request(0, 4096); 1005460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('H', region->getBuffer()[0]); 1015460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('E', region->getBuffer()[1]); 102affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region); 103affc150dc44fab1911775a49636d0ce85333b634Zonr Chang AreaFactory->destruct(area); 104affc150dc44fab1911775a49636d0ce85333b634Zonr Chang //delete AreaFactory; ; 1055460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1065460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1075460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( MemoryAreaTest, write_one_page ) 1085460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1095460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path path(TOPDIR) ; 1105460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao path.append("unittests/test2.txt") ; 1115460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ; 112affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadWrite); 113affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isOpened()) ; 114affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isGood()) ; 1155460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryRegion* region = area->request(0, 4096) ; 1165460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[4000] = 'K' ; 1175460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[4001] = 'R' ; 118affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_EQ('K', region->getBuffer()[4000]); 119affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_EQ('R', region->getBuffer()[4001]); 120affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region); 121affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->clear() ; 122affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->handler()->close(); 123affc150dc44fab1911775a49636d0ce85333b634Zonr Chang 124affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->handler()->open(path, FileHandle::ReadOnly); 125affc150dc44fab1911775a49636d0ce85333b634Zonr Chang region = area->request(4000, 4); 1265460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('K', region->getBuffer()[0]); 1275460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao ASSERT_EQ('R', region->getBuffer()[1]); 1285460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[0] = 'O' ; 1295460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region->getBuffer()[1] = 'H' ; 130affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->clear() ; 131affc150dc44fab1911775a49636d0ce85333b634Zonr Chang AreaFactory->destruct(area); 132affc150dc44fab1911775a49636d0ce85333b634Zonr Chang //delete AreaFactory; ; 1335460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1345460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1355460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei LiaoTEST_F( MemoryAreaTest, write_sync ) 1365460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao{ 1375460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao Path path(TOPDIR) ; 1385460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao path.append("unittests/test2.txt") ; 1395460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ; 140affc150dc44fab1911775a49636d0ce85333b634Zonr Chang MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadWrite) ; 141affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isOpened()) ; 142affc150dc44fab1911775a49636d0ce85333b634Zonr Chang ASSERT_TRUE(area->handler()->isGood()) ; 1435460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryRegion* region1 = area->request(0, 4096) ; 1445460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao MemoryRegion* region2 = area->request(512, 1024) ; 1455460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region1->getBuffer()[1000] = 'L' ; 1465460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region1->getBuffer()[1001] = 'L' ; 1475460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region2->getBuffer()[488] = 'V' ; 1485460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region2->getBuffer()[489] = 'M' ; 149affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region1); 150affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region2); 151affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->clear(); 152affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->handler()->close(); 153affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->handler()->open(path, FileHandle::ReadWrite); 1545460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region1 = area->request(0, 1024) ; 1555460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_EQ('V', region1->getBuffer()[1000]) ; 1565460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao EXPECT_EQ('M', region1->getBuffer()[1001]) ; 1575460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region1->getBuffer()[1000] = '@' ; 1585460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao region1->getBuffer()[1001] = '@' ; 159affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->release(region1); 160affc150dc44fab1911775a49636d0ce85333b634Zonr Chang area->clear(); 161affc150dc44fab1911775a49636d0ce85333b634Zonr Chang AreaFactory->destruct(area); 162affc150dc44fab1911775a49636d0ce85333b634Zonr Chang //delete AreaFactory; ; 1635460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao} 1645460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 1655460a1f25d9ddecb5c70667267d66d51af177a99Shih-wei Liao 166