3838#include "utils/memutils.h"
3939
4040
41+ #define EXPECT_TRUE (expr )\
42+ do { \
43+ if (!(expr)) \
44+ elog(ERROR, \
45+ "%s was unexpectedly false in file \"%s\" line %u", \
46+ #expr, __FILE__, __LINE__); \
47+ } while (0)
48+
49+ #define EXPECT_EQ_U32 (result_expr ,expected_expr )\
50+ do { \
51+ uint32result = (result_expr); \
52+ uint32expected = (expected_expr); \
53+ if (result != expected) \
54+ elog(ERROR, \
55+ "%s yielded %u, expected %s in file \"%s\" line %u", \
56+ #result_expr, result, #expected_expr, __FILE__, __LINE__); \
57+ } while (0)
58+
59+ #define EXPECT_EQ_U64 (result_expr ,expected_expr )\
60+ do { \
61+ uint64result = (result_expr); \
62+ uint64expected = (expected_expr); \
63+ if (result != expected) \
64+ elog(ERROR, \
65+ "%s yielded " UINT64_FORMAT ", expected %s in file \"%s\" line %u", \
66+ #result_expr, result, #expected_expr, __FILE__, __LINE__); \
67+ } while (0)
68+
4169#define LDELIM '('
4270#define RDELIM ')'
4371#define DELIM ','
@@ -638,27 +666,13 @@ test_atomic_flag(void)
638666pg_atomic_flag flag ;
639667
640668pg_atomic_init_flag (& flag );
641-
642- if (!pg_atomic_unlocked_test_flag (& flag ))
643- elog (ERROR ,"flag: unexpectedly set" );
644-
645- if (!pg_atomic_test_set_flag (& flag ))
646- elog (ERROR ,"flag: couldn't set" );
647-
648- if (pg_atomic_unlocked_test_flag (& flag ))
649- elog (ERROR ,"flag: unexpectedly unset" );
650-
651- if (pg_atomic_test_set_flag (& flag ))
652- elog (ERROR ,"flag: set spuriously #2" );
653-
669+ EXPECT_TRUE (pg_atomic_unlocked_test_flag (& flag ));
670+ EXPECT_TRUE (pg_atomic_test_set_flag (& flag ));
671+ EXPECT_TRUE (!pg_atomic_unlocked_test_flag (& flag ));
672+ EXPECT_TRUE (!pg_atomic_test_set_flag (& flag ));
654673pg_atomic_clear_flag (& flag );
655-
656- if (!pg_atomic_unlocked_test_flag (& flag ))
657- elog (ERROR ,"flag: unexpectedly set #2" );
658-
659- if (!pg_atomic_test_set_flag (& flag ))
660- elog (ERROR ,"flag: couldn't set" );
661-
674+ EXPECT_TRUE (pg_atomic_unlocked_test_flag (& flag ));
675+ EXPECT_TRUE (pg_atomic_test_set_flag (& flag ));
662676pg_atomic_clear_flag (& flag );
663677}
664678
@@ -670,75 +684,38 @@ test_atomic_uint32(void)
670684int i ;
671685
672686pg_atomic_init_u32 (& var ,0 );
673-
674- if (pg_atomic_read_u32 (& var )!= 0 )
675- elog (ERROR ,"atomic_read_u32() #1 wrong" );
676-
687+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ),0 );
677688pg_atomic_write_u32 (& var ,3 );
678-
679- if (pg_atomic_read_u32 (& var )!= 3 )
680- elog (ERROR ,"atomic_read_u32() #2 wrong" );
681-
682- if (pg_atomic_fetch_add_u32 (& var ,pg_atomic_read_u32 (& var )- 2 )!= 3 )
683- elog (ERROR ,"atomic_fetch_add_u32() #1 wrong" );
684-
685- if (pg_atomic_fetch_sub_u32 (& var ,1 )!= 4 )
686- elog (ERROR ,"atomic_fetch_sub_u32() #1 wrong" );
687-
688- if (pg_atomic_sub_fetch_u32 (& var ,3 )!= 0 )
689- elog (ERROR ,"atomic_sub_fetch_u32() #1 wrong" );
690-
691- if (pg_atomic_add_fetch_u32 (& var ,10 )!= 10 )
692- elog (ERROR ,"atomic_add_fetch_u32() #1 wrong" );
693-
694- if (pg_atomic_exchange_u32 (& var ,5 )!= 10 )
695- elog (ERROR ,"pg_atomic_exchange_u32() #1 wrong" );
696-
697- if (pg_atomic_exchange_u32 (& var ,0 )!= 5 )
698- elog (ERROR ,"pg_atomic_exchange_u32() #0 wrong" );
689+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ),3 );
690+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var ,pg_atomic_read_u32 (& var )- 2 ),
691+ 3 );
692+ EXPECT_EQ_U32 (pg_atomic_fetch_sub_u32 (& var ,1 ),4 );
693+ EXPECT_EQ_U32 (pg_atomic_sub_fetch_u32 (& var ,3 ),0 );
694+ EXPECT_EQ_U32 (pg_atomic_add_fetch_u32 (& var ,10 ),10 );
695+ EXPECT_EQ_U32 (pg_atomic_exchange_u32 (& var ,5 ),10 );
696+ EXPECT_EQ_U32 (pg_atomic_exchange_u32 (& var ,0 ),5 );
699697
700698/* test around numerical limits */
701- if (pg_atomic_fetch_add_u32 (& var ,INT_MAX )!= 0 )
702- elog (ERROR ,"pg_atomic_fetch_add_u32() #2 wrong" );
703-
704- if (pg_atomic_fetch_add_u32 (& var ,INT_MAX )!= INT_MAX )
705- elog (ERROR ,"pg_atomic_add_fetch_u32() #3 wrong" );
706-
699+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var ,INT_MAX ),0 );
700+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var ,INT_MAX ),INT_MAX );
707701pg_atomic_fetch_add_u32 (& var ,2 );/* wrap to 0 */
708-
709- if (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MAX )!= 0 )
710- elog (ERROR ,"pg_atomic_fetch_add_u32() #3 wrong" );
711-
712- if (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MAX + 1 )!= PG_INT16_MAX )
713- elog (ERROR ,"pg_atomic_fetch_add_u32() #4 wrong" );
714-
715- if (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MIN )!= 2 * PG_INT16_MAX + 1 )
716- elog (ERROR ,"pg_atomic_fetch_add_u32() #5 wrong" );
717-
718- if (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MIN - 1 )!= PG_INT16_MAX )
719- elog (ERROR ,"pg_atomic_fetch_add_u32() #6 wrong" );
720-
702+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MAX ),0 );
703+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MAX + 1 ),
704+ PG_INT16_MAX );
705+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MIN ),
706+ 2 * PG_INT16_MAX + 1 );
707+ EXPECT_EQ_U32 (pg_atomic_fetch_add_u32 (& var ,PG_INT16_MIN - 1 ),
708+ PG_INT16_MAX );
721709pg_atomic_fetch_add_u32 (& var ,1 );/* top up to UINT_MAX */
722-
723- if (pg_atomic_read_u32 (& var )!= UINT_MAX )
724- elog (ERROR ,"atomic_read_u32() #2 wrong" );
725-
726- if (pg_atomic_fetch_sub_u32 (& var ,INT_MAX )!= UINT_MAX )
727- elog (ERROR ,"pg_atomic_fetch_sub_u32() #2 wrong" );
728-
729- if (pg_atomic_read_u32 (& var )!= (uint32 )INT_MAX + 1 )
730- elog (ERROR ,"atomic_read_u32() #3 wrong: %u" ,pg_atomic_read_u32 (& var ));
731-
732- expected = pg_atomic_sub_fetch_u32 (& var ,INT_MAX );
733- if (expected != 1 )
734- elog (ERROR ,"pg_atomic_sub_fetch_u32() #3 wrong: %u" ,expected );
735-
710+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ),UINT_MAX );
711+ EXPECT_EQ_U32 (pg_atomic_fetch_sub_u32 (& var ,INT_MAX ),UINT_MAX );
712+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ), (uint32 )INT_MAX + 1 );
713+ EXPECT_EQ_U32 (pg_atomic_sub_fetch_u32 (& var ,INT_MAX ),1 );
736714pg_atomic_sub_fetch_u32 (& var ,1 );
737715
738716/* fail exchange because of old expected */
739717expected = 10 ;
740- if (pg_atomic_compare_exchange_u32 (& var ,& expected ,1 ))
741- elog (ERROR ,"atomic_compare_exchange_u32() changed value spuriously" );
718+ EXPECT_TRUE (!pg_atomic_compare_exchange_u32 (& var ,& expected ,1 ));
742719
743720/* CAS is allowed to fail due to interrupts, try a couple of times */
744721for (i = 0 ;i < 1000 ;i ++ )
@@ -749,31 +726,18 @@ test_atomic_uint32(void)
749726}
750727if (i == 1000 )
751728elog (ERROR ,"atomic_compare_exchange_u32() never succeeded" );
752- if (pg_atomic_read_u32 (& var )!= 1 )
753- elog (ERROR ,"atomic_compare_exchange_u32() didn't set value properly" );
754-
729+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ),1 );
755730pg_atomic_write_u32 (& var ,0 );
756731
757732/* try setting flagbits */
758- if (pg_atomic_fetch_or_u32 (& var ,1 )& 1 )
759- elog (ERROR ,"pg_atomic_fetch_or_u32() #1 wrong" );
760-
761- if (!(pg_atomic_fetch_or_u32 (& var ,2 )& 1 ))
762- elog (ERROR ,"pg_atomic_fetch_or_u32() #2 wrong" );
763-
764- if (pg_atomic_read_u32 (& var )!= 3 )
765- elog (ERROR ,"invalid result after pg_atomic_fetch_or_u32()" );
766-
733+ EXPECT_TRUE (!(pg_atomic_fetch_or_u32 (& var ,1 )& 1 ));
734+ EXPECT_TRUE (pg_atomic_fetch_or_u32 (& var ,2 )& 1 );
735+ EXPECT_EQ_U32 (pg_atomic_read_u32 (& var ),3 );
767736/* try clearing flagbits */
768- if ((pg_atomic_fetch_and_u32 (& var , ~2 )& 3 )!= 3 )
769- elog (ERROR ,"pg_atomic_fetch_and_u32() #1 wrong" );
770-
771- if (pg_atomic_fetch_and_u32 (& var , ~1 )!= 1 )
772- elog (ERROR ,"pg_atomic_fetch_and_u32() #2 wrong: is %u" ,
773- pg_atomic_read_u32 (& var ));
737+ EXPECT_EQ_U32 (pg_atomic_fetch_and_u32 (& var , ~2 )& 3 ,3 );
738+ EXPECT_EQ_U32 (pg_atomic_fetch_and_u32 (& var , ~1 ),1 );
774739/* no bits set anymore */
775- if (pg_atomic_fetch_and_u32 (& var , ~0 )!= 0 )
776- elog (ERROR ,"pg_atomic_fetch_and_u32() #3 wrong" );
740+ EXPECT_EQ_U32 (pg_atomic_fetch_and_u32 (& var , ~0 ),0 );
777741}
778742
779743static void
@@ -784,37 +748,20 @@ test_atomic_uint64(void)
784748int i ;
785749
786750pg_atomic_init_u64 (& var ,0 );
787-
788- if (pg_atomic_read_u64 (& var )!= 0 )
789- elog (ERROR ,"atomic_read_u64() #1 wrong" );
790-
751+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ),0 );
791752pg_atomic_write_u64 (& var ,3 );
792-
793- if (pg_atomic_read_u64 (& var )!= 3 )
794- elog (ERROR ,"atomic_read_u64() #2 wrong" );
795-
796- if (pg_atomic_fetch_add_u64 (& var ,pg_atomic_read_u64 (& var )- 2 )!= 3 )
797- elog (ERROR ,"atomic_fetch_add_u64() #1 wrong" );
798-
799- if (pg_atomic_fetch_sub_u64 (& var ,1 )!= 4 )
800- elog (ERROR ,"atomic_fetch_sub_u64() #1 wrong" );
801-
802- if (pg_atomic_sub_fetch_u64 (& var ,3 )!= 0 )
803- elog (ERROR ,"atomic_sub_fetch_u64() #1 wrong" );
804-
805- if (pg_atomic_add_fetch_u64 (& var ,10 )!= 10 )
806- elog (ERROR ,"atomic_add_fetch_u64() #1 wrong" );
807-
808- if (pg_atomic_exchange_u64 (& var ,5 )!= 10 )
809- elog (ERROR ,"pg_atomic_exchange_u64() #1 wrong" );
810-
811- if (pg_atomic_exchange_u64 (& var ,0 )!= 5 )
812- elog (ERROR ,"pg_atomic_exchange_u64() #0 wrong" );
753+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ),3 );
754+ EXPECT_EQ_U64 (pg_atomic_fetch_add_u64 (& var ,pg_atomic_read_u64 (& var )- 2 ),
755+ 3 );
756+ EXPECT_EQ_U64 (pg_atomic_fetch_sub_u64 (& var ,1 ),4 );
757+ EXPECT_EQ_U64 (pg_atomic_sub_fetch_u64 (& var ,3 ),0 );
758+ EXPECT_EQ_U64 (pg_atomic_add_fetch_u64 (& var ,10 ),10 );
759+ EXPECT_EQ_U64 (pg_atomic_exchange_u64 (& var ,5 ),10 );
760+ EXPECT_EQ_U64 (pg_atomic_exchange_u64 (& var ,0 ),5 );
813761
814762/* fail exchange because of old expected */
815763expected = 10 ;
816- if (pg_atomic_compare_exchange_u64 (& var ,& expected ,1 ))
817- elog (ERROR ,"atomic_compare_exchange_u64() changed value spuriously" );
764+ EXPECT_TRUE (!pg_atomic_compare_exchange_u64 (& var ,& expected ,1 ));
818765
819766/* CAS is allowed to fail due to interrupts, try a couple of times */
820767for (i = 0 ;i < 100 ;i ++ )
@@ -825,31 +772,19 @@ test_atomic_uint64(void)
825772}
826773if (i == 100 )
827774elog (ERROR ,"atomic_compare_exchange_u64() never succeeded" );
828- if (pg_atomic_read_u64 (& var )!= 1 )
829- elog (ERROR ,"atomic_compare_exchange_u64() didn't set value properly" );
775+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ),1 );
830776
831777pg_atomic_write_u64 (& var ,0 );
832778
833779/* try setting flagbits */
834- if (pg_atomic_fetch_or_u64 (& var ,1 )& 1 )
835- elog (ERROR ,"pg_atomic_fetch_or_u64() #1 wrong" );
836-
837- if (!(pg_atomic_fetch_or_u64 (& var ,2 )& 1 ))
838- elog (ERROR ,"pg_atomic_fetch_or_u64() #2 wrong" );
839-
840- if (pg_atomic_read_u64 (& var )!= 3 )
841- elog (ERROR ,"invalid result after pg_atomic_fetch_or_u64()" );
842-
780+ EXPECT_TRUE (!(pg_atomic_fetch_or_u64 (& var ,1 )& 1 ));
781+ EXPECT_TRUE (pg_atomic_fetch_or_u64 (& var ,2 )& 1 );
782+ EXPECT_EQ_U64 (pg_atomic_read_u64 (& var ),3 );
843783/* try clearing flagbits */
844- if ((pg_atomic_fetch_and_u64 (& var , ~2 )& 3 )!= 3 )
845- elog (ERROR ,"pg_atomic_fetch_and_u64() #1 wrong" );
846-
847- if (pg_atomic_fetch_and_u64 (& var , ~1 )!= 1 )
848- elog (ERROR ,"pg_atomic_fetch_and_u64() #2 wrong: is " UINT64_FORMAT ,
849- pg_atomic_read_u64 (& var ));
784+ EXPECT_EQ_U64 ((pg_atomic_fetch_and_u64 (& var , ~2 )& 3 ),3 );
785+ EXPECT_EQ_U64 (pg_atomic_fetch_and_u64 (& var , ~1 ),1 );
850786/* no bits set anymore */
851- if (pg_atomic_fetch_and_u64 (& var , ~0 )!= 0 )
852- elog (ERROR ,"pg_atomic_fetch_and_u64() #3 wrong" );
787+ EXPECT_EQ_U64 (pg_atomic_fetch_and_u64 (& var , ~0 ),0 );
853788}
854789
855790