41
41
#include "utils/memutils.h"
42
42
43
43
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
+
44
72
#define LDELIM '('
45
73
#define RDELIM ')'
46
74
#define DELIM ','
@@ -646,27 +674,13 @@ test_atomic_flag(void)
646
674
pg_atomic_flag flag ;
647
675
648
676
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 ));
662
681
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 ));
670
684
pg_atomic_clear_flag (& flag );
671
685
}
672
686
@@ -678,75 +692,38 @@ test_atomic_uint32(void)
678
692
int i ;
679
693
680
694
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 );
685
696
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 );
707
705
708
706
/* 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 );
715
709
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 );
729
717
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 );
744
722
pg_atomic_sub_fetch_u32 (& var , 1 );
745
723
746
724
/* fail exchange because of old expected */
747
725
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 ));
750
727
751
728
/* CAS is allowed to fail due to interrupts, try a couple of times */
752
729
for (i = 0 ; i < 1000 ; i ++ )
@@ -757,31 +734,18 @@ test_atomic_uint32(void)
757
734
}
758
735
if (i == 1000 )
759
736
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 );
763
738
pg_atomic_write_u32 (& var , 0 );
764
739
765
740
/* 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 );
775
744
/* 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 );
782
747
/* 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 );
785
749
}
786
750
787
751
static void
@@ -792,37 +756,20 @@ test_atomic_uint64(void)
792
756
int i ;
793
757
794
758
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 );
799
760
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 );
821
769
822
770
/* fail exchange because of old expected */
823
771
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 ));
826
773
827
774
/* CAS is allowed to fail due to interrupts, try a couple of times */
828
775
for (i = 0 ; i < 100 ; i ++ )
@@ -833,31 +780,19 @@ test_atomic_uint64(void)
833
780
}
834
781
if (i == 100 )
835
782
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 );
838
784
839
785
pg_atomic_write_u64 (& var , 0 );
840
786
841
787
/* 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 );
851
791
/* 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 );
858
794
/* 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 );
861
796
}
862
797
863
798
0 commit comments