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