00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "fennel/common/CommonPreamble.h"
00025 #include "fennel/segment/SegPageIter.h"
00026 #include "fennel/test/SegStorageTestBase.h"
00027 #include "fennel/segment/Segment.h"
00028 #include "fennel/segment/SegPageLock.h"
00029
00030 #include <boost/test/test_tools.hpp>
00031
00032 using namespace fennel;
00033
00034 class SegPageIterTest : virtual public SegStorageTestBase
00035 {
00036 public:
00037 explicit SegPageIterTest()
00038 {
00039 FENNEL_UNIT_TEST_CASE(SegPageIterTest,testUnboundedIter);
00040 FENNEL_UNIT_TEST_CASE(SegPageIterTest,testBoundedIter);
00041 FENNEL_UNIT_TEST_CASE(SegPageIterTest,testWithLock);
00042 FENNEL_UNIT_TEST_CASE(SegPageIterTest,testHighPrefetchRejects);
00043 FENNEL_UNIT_TEST_CASE(SegPageIterTest,testLowPrefetchRejects);
00044 }
00045
00046 void testUnboundedIter()
00047 {
00048 testIter(FIRST_LINEAR_PAGE_ID,NULL_PAGE_ID,false,0);
00049 }
00050
00051 void testBoundedIter()
00052 {
00053 testIter(
00054 Segment::getLinearPageId(3),
00055 Segment::getLinearPageId(51),
00056 false,
00057 0);
00058 }
00059
00060 void testWithLock()
00061 {
00062 testIter(FIRST_LINEAR_PAGE_ID,NULL_PAGE_ID,true,0);
00063 }
00064
00065 void testHighPrefetchRejects()
00066 {
00067
00068
00069 testIter(FIRST_LINEAR_PAGE_ID,NULL_PAGE_ID,false,3);
00070 }
00071
00072 void testLowPrefetchRejects()
00073 {
00074
00075
00076 testIter(FIRST_LINEAR_PAGE_ID,NULL_PAGE_ID,false,123);
00077 }
00078
00079 void testIter(PageId beginPageId,PageId endPageId,bool bLock,int rejectRate)
00080 {
00081 openStorage(DeviceMode::createNew);
00082
00083
00084 closeStorage();
00085 openStorage(DeviceMode::load);
00086
00087 SegmentAccessor segmentAccessor(pLinearSegment,pCache);
00088 SegPageLock pageLock(segmentAccessor);
00089 SegPageIter iter;
00090 iter.mapRange(segmentAccessor,beginPageId,endPageId);
00091 PageId pageId = beginPageId;
00092 for (uint i = 0; ; i++) {
00093 BOOST_CHECK_EQUAL(pageId,*iter);
00094 if (pageId == endPageId) {
00095 break;
00096 }
00097 if (rejectRate > 0 && !(i % rejectRate)) {
00098 iter.forcePrefetchReject();
00099 }
00100 if (bLock) {
00101 pageLock.lockShared(pageId);
00102 }
00103 BOOST_CHECK(pageId != NULL_PAGE_ID);
00104 ++iter;
00105 pageId = pLinearSegment->getPageSuccessor(pageId);
00106 }
00107 iter.makeSingular();
00108 pageLock.unlock();
00109 }
00110 };
00111
00112 FENNEL_UNIT_TEST_SUITE(SegPageIterTest);
00113
00114