correct some logic error
[netspecters.git] / source / KernelLibrary / DataContainer / unit_test / data_container.cpp
bloba2cb2e8fe233f8657d5a709935cb30ae1bb16dc5
1 #include <gtest/gtest.h>
2 #include <gmock/gmock.h>
3 #include <stdio.h>
4 #include "../data_container.h" #include "GeneralTestDefine.hpp"
5 #define FILENAME_BASE "dc_unit_test.tmp"
6 #ifdef __linux
7 # define FILENAME "/tmp/"FILENAME_BASE
8 #else
9 # define FILENAME FILENAME_BASE
10 #endif
12 namespace Netspecters {
13 namespace KernelPlus {
14 namespace DataContainer {
16 struct __dc_helper
18 __dc_helper( void ) : container_ptr( NULL )
20 while( 1 )
22 off_t dc_size = 0;
23 container_ptr = new CDataContainer( FILENAME, dc_size );
24 EXPECT_EQ( 0, dc_size ); /* 此前,文件不应该存在 */
25 if( 0 == dc_size )
26 break;
27 else
29 container_ptr->releaseReference();
30 remove( FILENAME );
33 EXPECT_EQ( 4096, container_ptr->resetDataSize( 4096 ) ); //初始化文件长度为4096字节
35 ~__dc_helper( void )
37 container_ptr->releaseReference();
38 remove( FILENAME );
40 CDataContainer *container_ptr;
43 static bool enable_continue = true;
45 #define TEST_BEGIN()\
46 ASSERT_TRUE(enable_continue);\
47 __dc_helper dc_helper;\
48 CDataContainer &container = *(dc_helper.container_ptr);\
49 enable_continue = false
50 #define TEST_END()\
51 enable_continue = true
53 TEST( DataContainer, DataContainer_CreateAndDestroy )
55 TEST_BEGIN();
57 /* 测试对象成员 */
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() );
62 TEST_END();
65 TEST( DataContainer, DataContainer_AddAndDeleteSegment_Base )
67 TEST_BEGIN();
69 /* 使用错误参数插入段 */
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];
77 struct {
78 off_t base;
79 off_t border;
80 } segment_offsetes[5] = {{27, 52}, {0, 16}, {17, 26}, {53, 1000}, {1001, 1023}};
82 /* 插入打乱顺序的 5 个段 */
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() );
97 /* 段应该按序排列 */
99 off_t last_border = -1;
100 int index = 0;
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;
107 index++;
109 EXPECT_EQ( 1024, last_border + 1 );
112 /* 删除段 */
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 );
120 TEST_END();
123 /* 测试 otMiddleOfLastOne 和 otMiddleOfBiggest */
124 TEST( DataContainer, DataContainer_AddSegment_MiddleOfLastOne_MiddleOfBiggest )
126 TEST_BEGIN();
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] ) );
137 /* 测试段位置 */
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] ) );
145 /* 测试段位置 */
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 /* 测试刚才插入的两个段是否在正确位置 */
153 struct {
154 off_t base;
155 off_t border;
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;
165 /* 释放段 */
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() );
172 TEST_END();
175 }/* DataContainer **/
176 }/*KernelPlus**/
177 }/* Netspecters **/