@@ -100,7 +100,7 @@ static void write_table(char ***names, struct strbuf *buf, int N,
100100 n = reftable_writer_close (w );
101101 EXPECT (n == 0 );
102102
103- stats = writer_stats (w );
103+ stats = reftable_writer_stats (w );
104104 for (i = 0 ; i < stats -> ref_stats .blocks ; i ++ ) {
105105 int off = i * opts .block_size ;
106106 if (off == 0 ) {
@@ -239,7 +239,7 @@ static void test_log_write_read(void)
239239 n = reftable_writer_close (w );
240240 EXPECT (n == 0 );
241241
242- stats = writer_stats (w );
242+ stats = reftable_writer_stats (w );
243243 EXPECT (stats -> log_stats .blocks > 0 );
244244 reftable_writer_free (w );
245245 w = NULL ;
@@ -330,7 +330,7 @@ static void test_log_zlib_corruption(void)
330330 n = reftable_writer_close (w );
331331 EXPECT (n == 0 );
332332
333- stats = writer_stats (w );
333+ stats = reftable_writer_stats (w );
334334 EXPECT (stats -> log_stats .blocks > 0 );
335335 reftable_writer_free (w );
336336 w = NULL ;
@@ -667,6 +667,102 @@ static void test_write_empty_table(void)
667667 strbuf_release (& buf );
668668}
669669
670+ static void test_write_object_id_min_length (void )
671+ {
672+ struct reftable_write_options opts = {
673+ .block_size = 75 ,
674+ };
675+ struct strbuf buf = STRBUF_INIT ;
676+ struct reftable_writer * w =
677+ reftable_new_writer (& strbuf_add_void , & buf , & opts );
678+ uint8_t hash [GIT_SHA1_RAWSZ ] = {42 };
679+ struct reftable_ref_record ref = {
680+ .update_index = 1 ,
681+ .value_type = REFTABLE_REF_VAL1 ,
682+ .value .val1 = hash ,
683+ };
684+ int err ;
685+ int i ;
686+
687+ reftable_writer_set_limits (w , 1 , 1 );
688+
689+ /* Write the same hash in many refs. If there is only 1 hash, the
690+ * disambiguating prefix is length 0 */
691+ for (i = 0 ; i < 256 ; i ++ ) {
692+ char name [256 ];
693+ snprintf (name , sizeof (name ), "ref%05d" , i );
694+ ref .refname = name ;
695+ err = reftable_writer_add_ref (w , & ref );
696+ EXPECT_ERR (err );
697+ }
698+
699+ err = reftable_writer_close (w );
700+ EXPECT_ERR (err );
701+ EXPECT (reftable_writer_stats (w )-> object_id_len == 2 );
702+ reftable_writer_free (w );
703+ strbuf_release (& buf );
704+ }
705+
706+ static void test_write_object_id_length (void )
707+ {
708+ struct reftable_write_options opts = {
709+ .block_size = 75 ,
710+ };
711+ struct strbuf buf = STRBUF_INIT ;
712+ struct reftable_writer * w =
713+ reftable_new_writer (& strbuf_add_void , & buf , & opts );
714+ uint8_t hash [GIT_SHA1_RAWSZ ] = {42 };
715+ struct reftable_ref_record ref = {
716+ .update_index = 1 ,
717+ .value_type = REFTABLE_REF_VAL1 ,
718+ .value .val1 = hash ,
719+ };
720+ int err ;
721+ int i ;
722+
723+ reftable_writer_set_limits (w , 1 , 1 );
724+
725+ /* Write the same hash in many refs. If there is only 1 hash, the
726+ * disambiguating prefix is length 0 */
727+ for (i = 0 ; i < 256 ; i ++ ) {
728+ char name [256 ];
729+ snprintf (name , sizeof (name ), "ref%05d" , i );
730+ ref .refname = name ;
731+ ref .value .val1 [15 ] = i ;
732+ err = reftable_writer_add_ref (w , & ref );
733+ EXPECT_ERR (err );
734+ }
735+
736+ err = reftable_writer_close (w );
737+ EXPECT_ERR (err );
738+ EXPECT (reftable_writer_stats (w )-> object_id_len == 16 );
739+ reftable_writer_free (w );
740+ strbuf_release (& buf );
741+ }
742+
743+ static void test_write_empty_key (void )
744+ {
745+ struct reftable_write_options opts = { 0 };
746+ struct strbuf buf = STRBUF_INIT ;
747+ struct reftable_writer * w =
748+ reftable_new_writer (& strbuf_add_void , & buf , & opts );
749+ struct reftable_ref_record ref = {
750+ .refname = "" ,
751+ .update_index = 1 ,
752+ .value_type = REFTABLE_REF_DELETION ,
753+ };
754+ int err ;
755+
756+ reftable_writer_set_limits (w , 1 , 1 );
757+ err = reftable_writer_add_ref (w , & ref );
758+ EXPECT (err == REFTABLE_API_ERROR );
759+
760+ err = reftable_writer_close (w );
761+ EXPECT (err == REFTABLE_EMPTY_TABLE_ERROR );
762+ reftable_writer_free (w );
763+ strbuf_release (& buf );
764+ }
765+
670766static void test_write_key_order (void )
671767{
672768 struct reftable_write_options opts = { 0 };
@@ -746,7 +842,10 @@ int readwrite_test_main(int argc, const char *argv[])
746842 RUN_TEST (test_table_read_write_seek_index );
747843 RUN_TEST (test_table_refs_for_no_index );
748844 RUN_TEST (test_table_refs_for_obj_index );
845+ RUN_TEST (test_write_empty_key );
749846 RUN_TEST (test_write_empty_table );
750847 RUN_TEST (test_log_overflow );
848+ RUN_TEST (test_write_object_id_length );
849+ RUN_TEST (test_write_object_id_min_length );
751850 return 0 ;
752851}
0 commit comments