4141#include "utils/memutils.h"
4242
4343
44+ #define EXPECT_TRUE (expr ) \
45+ do { \
46+ if (!(expr)) \
47+ elog(ERROR, \
48+ "%s was unexpectedly false in file \"%s\" line %u", \
49+ #expr, __FILE__, __LINE__); \
50+ } while (0)
51+
52+ #define EXPECT_EQ_U32 (result_expr , expected_expr ) \
53+ do { \
54+ uint32 result = (result_expr); \
55+ uint32 expected = (expected_expr); \
56+ if (result != expected) \
57+ elog(ERROR, \
58+ "%s yielded %u, expected %s in file \"%s\" line %u", \
59+ #result_expr, result, #expected_expr, __FILE__, __LINE__); \
60+ } while (0)
61+
62+ #define EXPECT_EQ_U64 (result_expr , expected_expr ) \
63+ do { \
64+ uint64 result = (result_expr); \
65+ uint64 expected = (expected_expr); \
66+ if (result != expected) \
67+ elog(ERROR, \
68+ "%s yielded " UINT64_FORMAT ", expected %s in file \"%s\" line %u", \
69+ #result_expr, result, #expected_expr, __FILE__, __LINE__); \
70+ } while (0)
71+
4472#define LDELIM '('
4573#define RDELIM ')'
4674#define DELIM ','
@@ -646,27 +674,13 @@ test_atomic_flag(void)
646674 pg_atomic_flag flag ;
647675
648676 pg_atomic_init_flag (& flag );
649-
650- if (!pg_atomic_unlocked_test_flag (& flag ))
651- elog (ERROR , "flag: unexpectedly set" );
652-
653- if (!pg_atomic_test_set_flag (& flag ))
654- elog (ERROR , "flag: couldn't set" );
655-
656- if (pg_atomic_unlocked_test_flag (& flag ))
657- elog (ERROR , "flag: unexpectedly unset" );
658-
659- if (pg_atomic_test_set_flag (& flag ))
660- elog (ERROR , "flag: set spuriously #2" );
661-
677+ EXPECT_TRUE (pg_atomic_unlocked_test_flag (& flag ));
678+ EXPECT_TRUE (pg_atomic_test_set_flag (& flag ));
679+ EXPECT_TRUE (!pg_atomic_unlocked_test_flag (& flag ));
680+ EXPECT_TRUE (!pg_atomic_test_set_flag (& flag ));
662681 pg_atomic_clear_flag (& flag );
663-
664- if (!pg_atomic_unlocked_test_flag (& flag ))
665- elog (ERROR , "flag: unexpectedly set #2" );
666-
667- if (!pg_atomic_test_set_flag (& flag ))
668- elog (ERROR , "flag: couldn't set" );
669-
682+ EXPECT_TRUE (pg_atomic_unlocked_test_flag (& flag ));
683+ EXPECT_TRUE (pg_atomic_test_set_flag (& flag ));
670684 pg_atomic_clear_flag (& flag );
671685}
672686
@@ -678,75 +692,38 @@ test_atomic_uint32(void)
678692 int i ;
679693
680694 pg_atomic_init_u32 (& var , 0 );
681-
682- if (pg_atomic_read_u32 (& var ) != 0 )
683- elog (ERROR , "atomic_read_u32() #1 wrong" );
684-
695+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ), 0 );
685696 pg_atomic_write_u32 (& var , 3 );
686-
687- if (pg_atomic_read_u32 (& var ) != 3 )
688- elog (ERROR , "atomic_read_u32() #2 wrong" );
689-
690- if (pg_atomic_fetch_add_u32 (& var , pg_atomic_read_u32 (& var ) - 2 ) != 3 )
691- elog (ERROR , "atomic_fetch_add_u32() #1 wrong" );
692-
693- if (pg_atomic_fetch_sub_u32 (& var , 1 ) != 4 )
694- elog (ERROR , "atomic_fetch_sub_u32() #1 wrong" );
695-
696- if (pg_atomic_sub_fetch_u32 (& var , 3 ) != 0 )
697- elog (ERROR , "atomic_sub_fetch_u32() #1 wrong" );
698-
699- if (pg_atomic_add_fetch_u32 (& var , 10 ) != 10 )
700- elog (ERROR , "atomic_add_fetch_u32() #1 wrong" );
701-
702- if (pg_atomic_exchange_u32 (& var , 5 ) != 10 )
703- elog (ERROR , "pg_atomic_exchange_u32() #1 wrong" );
704-
705- if (pg_atomic_exchange_u32 (& var , 0 ) != 5 )
706- elog (ERROR , "pg_atomic_exchange_u32() #0 wrong" );
697+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ), 3 );
698+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var , pg_atomic_read_u32 (& var ) - 2 ),
699+ 3 );
700+ EXPECT_EQ_U32 (pg_atomic_fetch_sub_u32 (& var , 1 ), 4 );
701+ EXPECT_EQ_U32 (pg_atomic_sub_fetch_u32 (& var , 3 ), 0 );
702+ EXPECT_EQ_U32 (pg_atomic_add_fetch_u32 (& var , 10 ), 10 );
703+ EXPECT_EQ_U32 (pg_atomic_exchange_u32 (& var , 5 ), 10 );
704+ EXPECT_EQ_U32 (pg_atomic_exchange_u32 (& var , 0 ), 5 );
707705
708706 /* test around numerical limits */
709- if (pg_atomic_fetch_add_u32 (& var , INT_MAX ) != 0 )
710- elog (ERROR , "pg_atomic_fetch_add_u32() #2 wrong" );
711-
712- if (pg_atomic_fetch_add_u32 (& var , INT_MAX ) != INT_MAX )
713- elog (ERROR , "pg_atomic_add_fetch_u32() #3 wrong" );
714-
707+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var , INT_MAX ), 0 );
708+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var , INT_MAX ), INT_MAX );
715709 pg_atomic_fetch_add_u32 (& var , 2 ); /* wrap to 0 */
716-
717- if (pg_atomic_fetch_add_u32 (& var , PG_INT16_MAX ) != 0 )
718- elog (ERROR , "pg_atomic_fetch_add_u32() #3 wrong" );
719-
720- if (pg_atomic_fetch_add_u32 (& var , PG_INT16_MAX + 1 ) != PG_INT16_MAX )
721- elog (ERROR , "pg_atomic_fetch_add_u32() #4 wrong" );
722-
723- if (pg_atomic_fetch_add_u32 (& var , PG_INT16_MIN ) != 2 * PG_INT16_MAX + 1 )
724- elog (ERROR , "pg_atomic_fetch_add_u32() #5 wrong" );
725-
726- if (pg_atomic_fetch_add_u32 (& var , PG_INT16_MIN - 1 ) != PG_INT16_MAX )
727- elog (ERROR , "pg_atomic_fetch_add_u32() #6 wrong" );
728-
710+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var , PG_INT16_MAX ), 0 );
711+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var , PG_INT16_MAX + 1 ),
712+ PG_INT16_MAX );
713+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var , PG_INT16_MIN ),
714+ 2 * PG_INT16_MAX + 1 );
715+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var , PG_INT16_MIN - 1 ),
716+ PG_INT16_MAX );
729717 pg_atomic_fetch_add_u32 (& var , 1 ); /* top up to UINT_MAX */
730-
731- if (pg_atomic_read_u32 (& var ) != UINT_MAX )
732- elog (ERROR , "atomic_read_u32() #2 wrong" );
733-
734- if (pg_atomic_fetch_sub_u32 (& var , INT_MAX ) != UINT_MAX )
735- elog (ERROR , "pg_atomic_fetch_sub_u32() #2 wrong" );
736-
737- if (pg_atomic_read_u32 (& var ) != (uint32 ) INT_MAX + 1 )
738- elog (ERROR , "atomic_read_u32() #3 wrong: %u" , pg_atomic_read_u32 (& var ));
739-
740- expected = pg_atomic_sub_fetch_u32 (& var , INT_MAX );
741- if (expected != 1 )
742- elog (ERROR , "pg_atomic_sub_fetch_u32() #3 wrong: %u" , expected );
743-
718+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ), UINT_MAX );
719+ EXPECT_EQ_U32 (pg_atomic_fetch_sub_u32 (& var , INT_MAX ), UINT_MAX );
720+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ), (uint32 ) INT_MAX + 1 );
721+ EXPECT_EQ_U32 (pg_atomic_sub_fetch_u32 (& var , INT_MAX ), 1 );
744722 pg_atomic_sub_fetch_u32 (& var , 1 );
745723
746724 /* fail exchange because of old expected */
747725 expected = 10 ;
748- if (pg_atomic_compare_exchange_u32 (& var , & expected , 1 ))
749- elog (ERROR , "atomic_compare_exchange_u32() changed value spuriously" );
726+ EXPECT_TRUE (!pg_atomic_compare_exchange_u32 (& var , & expected , 1 ));
750727
751728 /* CAS is allowed to fail due to interrupts, try a couple of times */
752729 for (i = 0 ; i < 1000 ; i ++ )
@@ -757,31 +734,18 @@ test_atomic_uint32(void)
757734 }
758735 if (i == 1000 )
759736 elog (ERROR , "atomic_compare_exchange_u32() never succeeded" );
760- if (pg_atomic_read_u32 (& var ) != 1 )
761- elog (ERROR , "atomic_compare_exchange_u32() didn't set value properly" );
762-
737+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ), 1 );
763738 pg_atomic_write_u32 (& var , 0 );
764739
765740 /* try setting flagbits */
766- if (pg_atomic_fetch_or_u32 (& var , 1 ) & 1 )
767- elog (ERROR , "pg_atomic_fetch_or_u32() #1 wrong" );
768-
769- if (!(pg_atomic_fetch_or_u32 (& var , 2 ) & 1 ))
770- elog (ERROR , "pg_atomic_fetch_or_u32() #2 wrong" );
771-
772- if (pg_atomic_read_u32 (& var ) != 3 )
773- elog (ERROR , "invalid result after pg_atomic_fetch_or_u32()" );
774-
741+ EXPECT_TRUE (!(pg_atomic_fetch_or_u32 (& var , 1 ) & 1 ));
742+ EXPECT_TRUE (pg_atomic_fetch_or_u32 (& var , 2 ) & 1 );
743+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ), 3 );
775744 /* try clearing flagbits */
776- if ((pg_atomic_fetch_and_u32 (& var , ~2 ) & 3 ) != 3 )
777- elog (ERROR , "pg_atomic_fetch_and_u32() #1 wrong" );
778-
779- if (pg_atomic_fetch_and_u32 (& var , ~1 ) != 1 )
780- elog (ERROR , "pg_atomic_fetch_and_u32() #2 wrong: is %u" ,
781- pg_atomic_read_u32 (& var ));
745+ EXPECT_EQ_U32 (pg_atomic_fetch_and_u32 (& var , ~2 ) & 3 , 3 );
746+ EXPECT_EQ_U32 (pg_atomic_fetch_and_u32 (& var , ~1 ), 1 );
782747 /* no bits set anymore */
783- if (pg_atomic_fetch_and_u32 (& var , ~0 ) != 0 )
784- elog (ERROR , "pg_atomic_fetch_and_u32() #3 wrong" );
748+ EXPECT_EQ_U32 (pg_atomic_fetch_and_u32 (& var , ~0 ), 0 );
785749}
786750
787751static void
@@ -792,37 +756,20 @@ test_atomic_uint64(void)
792756 int i ;
793757
794758 pg_atomic_init_u64 (& var , 0 );
795-
796- if (pg_atomic_read_u64 (& var ) != 0 )
797- elog (ERROR , "atomic_read_u64() #1 wrong" );
798-
759+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ), 0 );
799760 pg_atomic_write_u64 (& var , 3 );
800-
801- if (pg_atomic_read_u64 (& var ) != 3 )
802- elog (ERROR , "atomic_read_u64() #2 wrong" );
803-
804- if (pg_atomic_fetch_add_u64 (& var , pg_atomic_read_u64 (& var ) - 2 ) != 3 )
805- elog (ERROR , "atomic_fetch_add_u64() #1 wrong" );
806-
807- if (pg_atomic_fetch_sub_u64 (& var , 1 ) != 4 )
808- elog (ERROR , "atomic_fetch_sub_u64() #1 wrong" );
809-
810- if (pg_atomic_sub_fetch_u64 (& var , 3 ) != 0 )
811- elog (ERROR , "atomic_sub_fetch_u64() #1 wrong" );
812-
813- if (pg_atomic_add_fetch_u64 (& var , 10 ) != 10 )
814- elog (ERROR , "atomic_add_fetch_u64() #1 wrong" );
815-
816- if (pg_atomic_exchange_u64 (& var , 5 ) != 10 )
817- elog (ERROR , "pg_atomic_exchange_u64() #1 wrong" );
818-
819- if (pg_atomic_exchange_u64 (& var , 0 ) != 5 )
820- elog (ERROR , "pg_atomic_exchange_u64() #0 wrong" );
761+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ), 3 );
762+ EXPECT_EQ_U64 (pg_atomic_fetch_add_u64 (& var , pg_atomic_read_u64 (& var ) - 2 ),
763+ 3 );
764+ EXPECT_EQ_U64 (pg_atomic_fetch_sub_u64 (& var , 1 ), 4 );
765+ EXPECT_EQ_U64 (pg_atomic_sub_fetch_u64 (& var , 3 ), 0 );
766+ EXPECT_EQ_U64 (pg_atomic_add_fetch_u64 (& var , 10 ), 10 );
767+ EXPECT_EQ_U64 (pg_atomic_exchange_u64 (& var , 5 ), 10 );
768+ EXPECT_EQ_U64 (pg_atomic_exchange_u64 (& var , 0 ), 5 );
821769
822770 /* fail exchange because of old expected */
823771 expected = 10 ;
824- if (pg_atomic_compare_exchange_u64 (& var , & expected , 1 ))
825- elog (ERROR , "atomic_compare_exchange_u64() changed value spuriously" );
772+ EXPECT_TRUE (!pg_atomic_compare_exchange_u64 (& var , & expected , 1 ));
826773
827774 /* CAS is allowed to fail due to interrupts, try a couple of times */
828775 for (i = 0 ; i < 100 ; i ++ )
@@ -833,31 +780,19 @@ test_atomic_uint64(void)
833780 }
834781 if (i == 100 )
835782 elog (ERROR , "atomic_compare_exchange_u64() never succeeded" );
836- if (pg_atomic_read_u64 (& var ) != 1 )
837- elog (ERROR , "atomic_compare_exchange_u64() didn't set value properly" );
783+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ), 1 );
838784
839785 pg_atomic_write_u64 (& var , 0 );
840786
841787 /* try setting flagbits */
842- if (pg_atomic_fetch_or_u64 (& var , 1 ) & 1 )
843- elog (ERROR , "pg_atomic_fetch_or_u64() #1 wrong" );
844-
845- if (!(pg_atomic_fetch_or_u64 (& var , 2 ) & 1 ))
846- elog (ERROR , "pg_atomic_fetch_or_u64() #2 wrong" );
847-
848- if (pg_atomic_read_u64 (& var ) != 3 )
849- elog (ERROR , "invalid result after pg_atomic_fetch_or_u64()" );
850-
788+ EXPECT_TRUE (!(pg_atomic_fetch_or_u64 (& var , 1 ) & 1 ));
789+ EXPECT_TRUE (pg_atomic_fetch_or_u64 (& var , 2 ) & 1 );
790+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ), 3 );
851791 /* try clearing flagbits */
852- if ((pg_atomic_fetch_and_u64 (& var , ~2 ) & 3 ) != 3 )
853- elog (ERROR , "pg_atomic_fetch_and_u64() #1 wrong" );
854-
855- if (pg_atomic_fetch_and_u64 (& var , ~1 ) != 1 )
856- elog (ERROR , "pg_atomic_fetch_and_u64() #2 wrong: is " UINT64_FORMAT ,
857- pg_atomic_read_u64 (& var ));
792+ EXPECT_EQ_U64 ((pg_atomic_fetch_and_u64 (& var , ~2 ) & 3 ), 3 );
793+ EXPECT_EQ_U64 (pg_atomic_fetch_and_u64 (& var , ~1 ), 1 );
858794 /* no bits set anymore */
859- if (pg_atomic_fetch_and_u64 (& var , ~0 ) != 0 )
860- elog (ERROR , "pg_atomic_fetch_and_u64() #3 wrong" );
795+ EXPECT_EQ_U64 (pg_atomic_fetch_and_u64 (& var , ~0 ), 0 );
861796}
862797
863798
0 commit comments