@@ -12,7 +12,7 @@ license that can be found in the LICENSE file or at
1212#include "reftable/constants.h"
1313#include "reftable/reftable-error.h"
1414
15- static void t_block_read_write (void )
15+ static void t_ref_block_read_write (void )
1616{
1717 const int header_off = 21 ; /* random */
1818 struct reftable_record recs [30 ];
@@ -103,9 +103,98 @@ static void t_block_read_write(void)
103103 reftable_record_release (& recs [i ]);
104104}
105105
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+
106194int cmd_main (int argc , const char * argv [])
107195{
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" );
109198
110199 return test_done ();
111200}
0 commit comments