1 #include <gtest/gtest.h>
2 #include <gmock/gmock.h>
4 #include "../data_container.h"
#include "GeneralTestDefine.hpp"
5 #define FILENAME_BASE "dc_unit_test.tmp"
7 # define FILENAME "/tmp/"FILENAME_BASE
9 # define FILENAME FILENAME_BASE
12 namespace Netspecters
{
13 namespace KernelPlus
{
14 namespace DataContainer
{
18 __dc_helper( void ) : container_ptr( NULL
)
23 container_ptr
= new CDataContainer( FILENAME
, dc_size
);
24 EXPECT_EQ( 0, dc_size
); /* 此前,文件不应该存在 */
29 container_ptr
->releaseReference();
33 EXPECT_EQ( 4096, container_ptr
->resetDataSize( 4096 ) ); //初始化文件长度为4096字节
37 container_ptr
->releaseReference();
40 CDataContainer
*container_ptr
;
43 static bool enable_continue
= true;
46 ASSERT_TRUE(enable_continue);\
47 __dc_helper dc_helper;\
48 CDataContainer &container = *(dc_helper.container_ptr);\
49 enable_continue = false
51 enable_continue = true
53 TEST( DataContainer
, DataContainer_CreateAndDestroy
)
58 ASSERT_EQ( 1, container
.m_reference_count
);
59 ASSERT_EQ( 4096, container
.m_data_file
.get_file_size() );
60 ASSERT_EQ( 0, container
.m_segment_ptrs
.size() );
65 TEST( DataContainer
, DataContainer_AddAndDeleteSegment_Base
)
70 ISegment::ST_SegmentInfor error_segment_infor
;
71 error_segment_infor
.segment_base_offset
= 0;
72 error_segment_infor
.segment_border
= 1024;
73 ASSERT_EQ( 0, ( uintptr_t )container
.addSegment( IDataContainer::otCustom
, error_segment_infor
) );
76 ISegment
*segment_ptrs
[5];
80 } segment_offsetes
[5] = {{27, 52}, {0, 16}, {17, 26}, {53, 1000}, {1001, 1023}};
83 for( int i
= 0; i
< 5; i
++ )
85 ISegment::ST_SegmentInfor segment_infor
;
86 memset( &segment_infor
, 0, sizeof( segment_infor
) );
87 segment_infor
.segment_type
= ISegment::ST_SegmentInfor::stNULL
;
88 segment_infor
.segment_base_offset
= segment_offsetes
[i
].base
;
89 segment_infor
.segment_border
= segment_offsetes
[i
].border
;
90 segment_ptrs
[i
] = container
.addSegment( IDataContainer::otCustom
, segment_infor
);
91 ASSERT_NE( 0, ( uintptr_t )segment_ptrs
[i
] );
94 /* 测试 container 对象成员 */
95 ASSERT_EQ( 5, container
.m_segment_ptrs
.size() );
99 off_t last_border
= -1;
101 for( auto itr
= container
.m_segment_ptrs
.begin(); itr
!= container
.m_segment_ptrs
.end(); ++itr
)
103 ISegment::ST_SegmentInfor segment_infor
;
104 ( *itr
)->getSegmentInformation( segment_infor
);
105 EXPECT_EQ( last_border
+ 1, segment_infor
.segment_base_offset
) << "In the segment " << index
;
106 last_border
= segment_infor
.segment_border
;
109 EXPECT_EQ( 1024, last_border
+ 1 );
113 for( int i
= 0; i
< 5; i
++ )
114 container
.deleteSegment( segment_ptrs
[i
] );
116 /* 测试 container 对象成员 */
117 ASSERT_EQ( 0, container
.m_segment_ptrs
.size() );
118 ASSERT_EQ( 1, container
.m_reference_count
);
123 /* 测试 otMiddleOfLastOne 和 otMiddleOfBiggest */
124 TEST( DataContainer
, DataContainer_AddSegment_MiddleOfLastOne_MiddleOfBiggest
)
128 ISegment
*segment_ptrs
[2];
130 /* 首先添加占位段,占据全部容器空间 */
131 ISegment::ST_SegmentInfor segment_infor
;
132 memset( &segment_infor
, 0, sizeof( segment_infor
) );
133 segment_infor
.segment_type
= ISegment::ST_SegmentInfor::stNULL
;
134 segment_ptrs
[0] = container
.addSegment( IDataContainer::otMiddleOfLastOne
, segment_infor
);
135 ASSERT_NE( 0, ( uintptr_t )( segment_ptrs
[0] ) );
138 ASSERT_EQ( 0, segment_infor
.segment_base_offset
);
139 ASSERT_EQ( container
.get_container_border(), segment_infor
.segment_border
);
141 /* 然后再添加一个占位段,位置在 MiddleOfLastOne */
142 segment_ptrs
[1] = container
.addSegment( IDataContainer::otMiddleOfLastOne
, segment_infor
);
143 ASSERT_NE( 0, ( uintptr_t )( segment_ptrs
[0] ) );
146 ASSERT_EQ( container
.get_container_border() / 2 + 1, segment_infor
.segment_base_offset
);
147 ASSERT_EQ( container
.get_container_border(), segment_infor
.segment_border
);
149 /* 测试 container 对象成员 */
150 ASSERT_EQ( 2, container
.m_segment_ptrs
.size() );
152 /* 测试刚才插入的两个段是否在正确位置 */
156 } segment_offsetes
[2] = { {0, container
.get_container_border() / 2}, {container
.get_container_border() / 2 + 1, container
.get_container_border()} };
157 for( int i
= 0; i
< 2; i
++ )
159 ISegment::ST_SegmentInfor segment_infor
;
160 segment_ptrs
[i
]->getSegmentInformation( segment_infor
);
161 EXPECT_EQ( segment_offsetes
[i
].base
, segment_infor
.segment_base_offset
) << "In the segment " << i
;
162 EXPECT_EQ( segment_offsetes
[i
].border
, segment_infor
.segment_border
) << "In the segment " << i
;
166 for( int i
= 0; i
< 2; i
++ )
167 container
.deleteSegment( segment_ptrs
[i
] );
169 /* 测试 container 对象成员 */
170 ASSERT_EQ( 0, container
.m_segment_ptrs
.size() );
175 }/* DataContainer **/