Skip to content

Commit e800bd7

Browse files
committed
Report test_atomic_ops() failures consistently, via macros.
This prints the unexpected value in more failure cases, and it removes forty-eight hand-maintained error messages. Back-patch to 9.5, which introduced these tests. Reviewed (in an earlier version) by Andres Freund. Discussion: https://postgr.es/m/20190915160021.GA24376@alvherre.pgsql
1 parent d82f390 commit e800bd7

File tree

1 file changed

+81
-146
lines changed

1 file changed

+81
-146
lines changed

src/test/regress/regress.c

Lines changed: 81 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,34 @@
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

787751
static 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

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy