| //===- MemoryAreaTest.cpp -------------------------------------------------===// |
| // |
| // The MCLinker Project |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| #include <mcld/Support/FileHandle.h> |
| #include <mcld/Support/FileSystem.h> |
| #include <mcld/Support/MemoryArea.h> |
| #include <mcld/Support/MemoryRegion.h> |
| #include <mcld/Support/MemoryAreaFactory.h> |
| #include <mcld/Support/Path.h> |
| |
| #include "MemoryAreaTest.h" |
| #include <fcntl.h> |
| #include <cstdio> |
| |
| using namespace mcld; |
| using namespace mcld::sys::fs; |
| using namespace mcldtest; |
| |
| |
| // Constructor can do set-up work for all test here. |
| MemoryAreaTest::MemoryAreaTest() |
| { |
| } |
| |
| // Destructor can do clean-up work that doesn't throw exceptions here. |
| MemoryAreaTest::~MemoryAreaTest() |
| { |
| } |
| |
| // SetUp() will be called immediately before each test. |
| void MemoryAreaTest::SetUp() |
| { |
| } |
| |
| // TearDown() will be called immediately after each test. |
| void MemoryAreaTest::TearDown() |
| { |
| } |
| |
| //==========================================================================// |
| // Testcases |
| // |
| TEST_F( MemoryAreaTest, read_by_malloc ) |
| { |
| Path path(TOPDIR); |
| path.append("unittests/test3.txt"); |
| |
| MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1); |
| MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly); |
| MemoryRegion* region = area->request(3, 2); |
| ASSERT_EQ('L', region->getBuffer()[0]); |
| ASSERT_EQ('O', region->getBuffer()[1]); |
| area->release(region); |
| AreaFactory->destruct(area); |
| //delete AreaFactory;; |
| } |
| |
| TEST_F( MemoryAreaTest, write_by_malloc ) |
| { |
| Path path(TOPDIR); |
| path.append("unittests/test2.txt"); |
| MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1); |
| MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly); |
| ASSERT_TRUE(area->handler()->isOpened()); |
| ASSERT_TRUE(area->handler()->isGood()); |
| MemoryRegion* region = area->request(3, 4); |
| region->getBuffer()[0] = 'L'; |
| region->getBuffer()[1] = 'i'; |
| region->getBuffer()[2] = 'n'; |
| region->getBuffer()[3] = 'k'; |
| area->release(region); |
| area->clear(); |
| area->handler()->close(); |
| |
| area->handler()->open(path, FileHandle::ReadOnly); |
| ASSERT_TRUE(area->handler()->isOpened()); |
| ASSERT_TRUE(area->handler()->isGood()); |
| region = area->request(5, 2); |
| ASSERT_EQ('n', region->getBuffer()[0]); |
| ASSERT_EQ('k', region->getBuffer()[1]); |
| area->release(region); |
| AreaFactory->destruct(area); |
| //delete AreaFactory;; |
| } |
| |
| TEST_F( MemoryAreaTest, read_one_page ) |
| { |
| Path path(TOPDIR) ; |
| path.append("unittests/test3.txt") ; |
| MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ; |
| MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadOnly) ; |
| ASSERT_TRUE(area->handler()->isOpened()) ; |
| ASSERT_TRUE(area->handler()->isGood()) ; |
| MemoryRegion* region = area->request(0, 4096); |
| ASSERT_EQ('H', region->getBuffer()[0]); |
| ASSERT_EQ('E', region->getBuffer()[1]); |
| area->release(region); |
| AreaFactory->destruct(area); |
| //delete AreaFactory; ; |
| } |
| |
| TEST_F( MemoryAreaTest, write_one_page ) |
| { |
| Path path(TOPDIR) ; |
| path.append("unittests/test2.txt") ; |
| MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ; |
| MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadWrite); |
| ASSERT_TRUE(area->handler()->isOpened()) ; |
| ASSERT_TRUE(area->handler()->isGood()) ; |
| MemoryRegion* region = area->request(0, 4096) ; |
| region->getBuffer()[4000] = 'K' ; |
| region->getBuffer()[4001] = 'R' ; |
| ASSERT_EQ('K', region->getBuffer()[4000]); |
| ASSERT_EQ('R', region->getBuffer()[4001]); |
| area->release(region); |
| area->clear() ; |
| area->handler()->close(); |
| |
| area->handler()->open(path, FileHandle::ReadOnly); |
| region = area->request(4000, 4); |
| ASSERT_EQ('K', region->getBuffer()[0]); |
| ASSERT_EQ('R', region->getBuffer()[1]); |
| region->getBuffer()[0] = 'O' ; |
| region->getBuffer()[1] = 'H' ; |
| area->clear() ; |
| AreaFactory->destruct(area); |
| //delete AreaFactory; ; |
| } |
| |
| TEST_F( MemoryAreaTest, write_sync ) |
| { |
| Path path(TOPDIR) ; |
| path.append("unittests/test2.txt") ; |
| MemoryAreaFactory *AreaFactory = new MemoryAreaFactory(1) ; |
| MemoryArea* area = AreaFactory->produce(path, FileHandle::ReadWrite) ; |
| ASSERT_TRUE(area->handler()->isOpened()) ; |
| ASSERT_TRUE(area->handler()->isGood()) ; |
| MemoryRegion* region1 = area->request(0, 4096) ; |
| MemoryRegion* region2 = area->request(512, 1024) ; |
| region1->getBuffer()[1000] = 'L' ; |
| region1->getBuffer()[1001] = 'L' ; |
| region2->getBuffer()[488] = 'V' ; |
| region2->getBuffer()[489] = 'M' ; |
| area->release(region1); |
| area->release(region2); |
| area->clear(); |
| area->handler()->close(); |
| area->handler()->open(path, FileHandle::ReadWrite); |
| region1 = area->request(0, 1024) ; |
| EXPECT_EQ('V', region1->getBuffer()[1000]) ; |
| EXPECT_EQ('M', region1->getBuffer()[1001]) ; |
| region1->getBuffer()[1000] = '@' ; |
| region1->getBuffer()[1001] = '@' ; |
| area->release(region1); |
| area->clear(); |
| AreaFactory->destruct(area); |
| //delete AreaFactory; ; |
| } |
| |
| |