38
38
#include "utils/memutils.h"
39
39
40
40
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
+
41
69
#define LDELIM '('
42
70
#define RDELIM ')'
43
71
#define DELIM ','
@@ -638,27 +666,13 @@ test_atomic_flag(void)
638
666
pg_atomic_flag flag ;
639
667
640
668
pg_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 ));
654
673
pg_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 ));
662
676
pg_atomic_clear_flag (& flag );
663
677
}
664
678
@@ -670,75 +684,38 @@ test_atomic_uint32(void)
670
684
int i ;
671
685
672
686
pg_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 );
677
688
pg_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 );
699
697
700
698
/* 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 );
707
701
pg_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 );
721
709
pg_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 );
736
714
pg_atomic_sub_fetch_u32 (& var ,1 );
737
715
738
716
/* fail exchange because of old expected */
739
717
expected = 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 ));
742
719
743
720
/* CAS is allowed to fail due to interrupts, try a couple of times */
744
721
for (i = 0 ;i < 1000 ;i ++ )
@@ -749,31 +726,18 @@ test_atomic_uint32(void)
749
726
}
750
727
if (i == 1000 )
751
728
elog (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 );
755
730
pg_atomic_write_u32 (& var ,0 );
756
731
757
732
/* 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 );
767
736
/* 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 );
774
739
/* 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 );
777
741
}
778
742
779
743
static void
@@ -784,37 +748,20 @@ test_atomic_uint64(void)
784
748
int i ;
785
749
786
750
pg_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 );
791
752
pg_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 );
813
761
814
762
/* fail exchange because of old expected */
815
763
expected = 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 ));
818
765
819
766
/* CAS is allowed to fail due to interrupts, try a couple of times */
820
767
for (i = 0 ;i < 100 ;i ++ )
@@ -825,31 +772,19 @@ test_atomic_uint64(void)
825
772
}
826
773
if (i == 100 )
827
774
elog (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 );
830
776
831
777
pg_atomic_write_u64 (& var ,0 );
832
778
833
779
/* 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 );
843
783
/* 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 );
850
786
/* 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 );
853
788
}
854
789
855
790