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+ uint32result = (result_expr); \
55+ uint32expected = (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+ uint64result = (result_expr); \
65+ uint64expected = (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)
646674pg_atomic_flag flag ;
647675
648676pg_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 ));
662681pg_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 ));
670684pg_atomic_clear_flag (& flag );
671685}
672686
@@ -678,75 +692,38 @@ test_atomic_uint32(void)
678692int i ;
679693
680694pg_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 );
685696pg_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 );
715709pg_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 );
729717pg_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 );
744722pg_atomic_sub_fetch_u32 (& var ,1 );
745723
746724/* fail exchange because of old expected */
747725expected = 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 */
752729for (i = 0 ;i < 1000 ;i ++ )
@@ -757,31 +734,18 @@ test_atomic_uint32(void)
757734}
758735if (i == 1000 )
759736elog (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 );
763738pg_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)
792756int i ;
793757
794758pg_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 );
799760pg_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 */
823771expected = 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 */
828775for (i = 0 ;i < 100 ;i ++ )
@@ -833,31 +780,19 @@ test_atomic_uint64(void)
833780}
834781if (i == 100 )
835782elog (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
839785pg_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