@@ -12,7 +12,7 @@ license that can be found in the LICENSE file or at
12
12
#include "reftable/constants.h"
13
13
#include "reftable/reftable-error.h"
14
14
15
- static void t_block_read_write (void )
15
+ static void t_ref_block_read_write (void )
16
16
{
17
17
const int header_off = 21 ; /* random */
18
18
struct reftable_record recs [30 ];
@@ -103,9 +103,98 @@ static void t_block_read_write(void)
103
103
reftable_record_release (& recs [i ]);
104
104
}
105
105
106
+ static void t_log_block_read_write (void )
107
+ {
108
+ const int header_off = 21 ;
109
+ struct reftable_record recs [30 ];
110
+ const size_t N = ARRAY_SIZE (recs );
111
+ const size_t block_size = 2048 ;
112
+ struct reftable_block block = { 0 };
113
+ struct block_writer bw = {
114
+ .last_key = STRBUF_INIT ,
115
+ };
116
+ struct reftable_record rec = {
117
+ .type = BLOCK_TYPE_LOG ,
118
+ };
119
+ size_t i = 0 ;
120
+ int ret ;
121
+ struct block_reader br = { 0 };
122
+ struct block_iter it = BLOCK_ITER_INIT ;
123
+ struct strbuf want = STRBUF_INIT , buf = STRBUF_INIT ;
124
+
125
+ REFTABLE_CALLOC_ARRAY (block .data , block_size );
126
+ block .len = block_size ;
127
+ block_source_from_strbuf (& block .source ,& buf );
128
+ block_writer_init (& bw , BLOCK_TYPE_LOG , block .data , block_size ,
129
+ header_off , hash_size (GIT_SHA1_FORMAT_ID ));
130
+
131
+ for (i = 0 ; i < N ; i ++ ) {
132
+ rec .u .log .refname = xstrfmt ("branch%02" PRIuMAX , (uintmax_t )i );
133
+ rec .u .log .update_index = i ;
134
+ rec .u .log .value_type = REFTABLE_LOG_UPDATE ;
135
+
136
+ recs [i ] = rec ;
137
+ ret = block_writer_add (& bw , & rec );
138
+ rec .u .log .refname = NULL ;
139
+ rec .u .log .value_type = REFTABLE_LOG_DELETION ;
140
+ check_int (ret , = = , 0 );
141
+ }
142
+
143
+ ret = block_writer_finish (& bw );
144
+ check_int (ret , > , 0 );
145
+
146
+ block_writer_release (& bw );
147
+
148
+ block_reader_init (& br , & block , header_off , block_size , GIT_SHA1_RAWSZ );
149
+
150
+ block_iter_seek_start (& it , & br );
151
+
152
+ for (i = 0 ; ; i ++ ) {
153
+ ret = block_iter_next (& it , & rec );
154
+ check_int (ret , >=, 0 );
155
+ if (ret > 0 ) {
156
+ check_int (i , = = , N );
157
+ break ;
158
+ }
159
+ check (reftable_record_equal (& recs [i ], & rec , GIT_SHA1_RAWSZ ));
160
+ }
161
+
162
+ for (i = 0 ; i < N ; i ++ ) {
163
+ block_iter_reset (& it );
164
+ strbuf_reset (& want );
165
+ strbuf_addstr (& want , recs [i ].u .log .refname );
166
+
167
+ ret = block_iter_seek_key (& it , & br , & want );
168
+ check_int (ret , = = , 0 );
169
+
170
+ ret = block_iter_next (& it , & rec );
171
+ check_int (ret , = = , 0 );
172
+
173
+ check (reftable_record_equal (& recs [i ], & rec , GIT_SHA1_RAWSZ ));
174
+
175
+ want .len -- ;
176
+ ret = block_iter_seek_key (& it , & br , & want );
177
+ check_int (ret , = = , 0 );
178
+
179
+ ret = block_iter_next (& it , & rec );
180
+ check_int (ret , = = , 0 );
181
+ check (reftable_record_equal (& recs [10 * (i / 10 )], & rec , GIT_SHA1_RAWSZ ));
182
+ }
183
+
184
+ block_reader_release (& br );
185
+ block_iter_close (& it );
186
+ reftable_record_release (& rec );
187
+ reftable_block_done (& br .block );
188
+ strbuf_release (& want );
189
+ strbuf_release (& buf );
190
+ for (i = 0 ; i < N ; i ++ )
191
+ reftable_record_release (& recs [i ]);
192
+ }
193
+
106
194
int cmd_main (int argc , const char * argv [])
107
195
{
108
- TEST (t_block_read_write (), "read-write operations on blocks work" );
196
+ TEST (t_log_block_read_write (), "read-write operations on log blocks work" );
197
+ TEST (t_ref_block_read_write (), "read-write operations on ref blocks work" );
109
198
110
199
return test_done ();
111
200
}
0 commit comments