1919 */
2020package org .neo4j .gds .core .utils .paged ;
2121
22- import org .junit .jupiter .api .Test ;
2322import org .junit .jupiter .params .ParameterizedTest ;
2423import org .junit .jupiter .params .provider .Arguments ;
2524import org .junit .jupiter .params .provider .MethodSource ;
3938
4039class HugeAtomicPagedBitSetTest {
4140
42- public static Stream <Arguments > bitsets () {
41+ static Stream <Arguments > bitsets () {
4342 return Stream .of (
4443 // empty bit set
4544 Arguments .of (HugeAtomicPagedBitSet .create (0 )),
@@ -50,106 +49,105 @@ public static Stream<Arguments> bitsets() {
5049
5150 @ ParameterizedTest
5251 @ MethodSource ("bitsets" )
53- void testSet (HugeAtomicPagedBitSet atomicBitSet ) {
52+ void testSet (HugeAtomicPagedBitSet bitSet ) {
5453 // page 0
5554 long index = 23 ;
56- assertThat (atomicBitSet .get (index )).isFalse ();
57- atomicBitSet .set (index );
58- assertThat (atomicBitSet .get (index )).isTrue ();
55+ assertThat (bitSet .get (index )).isFalse ();
56+ bitSet .set (index );
57+ assertThat (bitSet .get (index )).isTrue ();
5958 // page 1
6059 index = (1L << PAGE_SHIFT_BITS ) + 23 ;
61- assertThat (atomicBitSet .get (index )).isFalse ();
62- atomicBitSet .set (index );
63- assertThat (atomicBitSet .get (index )).isTrue ();
60+ assertThat (bitSet .get (index )).isFalse ();
61+ bitSet .set (index );
62+ assertThat (bitSet .get (index )).isTrue ();
6463 // page 2
6564 index = 2 * (1L << PAGE_SHIFT_BITS ) + 23 ;
66- assertThat (atomicBitSet .get (index )).isFalse ();
67- atomicBitSet .set (index );
68- assertThat (atomicBitSet .get (index )).isTrue ();
65+ assertThat (bitSet .get (index )).isFalse ();
66+ bitSet .set (index );
67+ assertThat (bitSet .get (index )).isTrue ();
6968 }
7069
7170 @ ParameterizedTest
7271 @ MethodSource ("bitsets" )
73- void testGetAndSet (HugeAtomicPagedBitSet atomicBitSet ) {
72+ void testGetAndSet (HugeAtomicPagedBitSet bitSet ) {
7473 // page 0
7574 // getAndSet a bit that is currently false
7675 long index = 23 ;
77- assertThat (atomicBitSet .get (index )).isFalse ();
78- assertThat (atomicBitSet .getAndSet (index )).isFalse ();
79- assertThat (atomicBitSet .get (index )).isTrue ();
76+ assertThat (bitSet .get (index )).isFalse ();
77+ assertThat (bitSet .getAndSet (index )).isFalse ();
78+ assertThat (bitSet .get (index )).isTrue ();
8079 // getAndSet a bit that is currently true
8180 index = 42 ;
82- atomicBitSet .set (index );
83- assertThat (atomicBitSet .get (index )).isTrue ();
84- assertThat (atomicBitSet .getAndSet (index )).isTrue ();
85- assertThat (atomicBitSet .get (index )).isTrue ();
81+ bitSet .set (index );
82+ assertThat (bitSet .get (index )).isTrue ();
83+ assertThat (bitSet .getAndSet (index )).isTrue ();
84+ assertThat (bitSet .get (index )).isTrue ();
8685 // page 1
8786 // getAndSet a bit that is currently false
8887 index = (1L << PAGE_SHIFT_BITS ) + 23 ;
89- assertThat (atomicBitSet .get (index )).isFalse ();
90- assertThat (atomicBitSet .getAndSet (index )).isFalse ();
91- assertThat (atomicBitSet .get (index )).isTrue ();
88+ assertThat (bitSet .get (index )).isFalse ();
89+ assertThat (bitSet .getAndSet (index )).isFalse ();
90+ assertThat (bitSet .get (index )).isTrue ();
9291 // getAndSet a bit that is currently true
9392 index = (1L << PAGE_SHIFT_BITS ) + 42 ;
94- atomicBitSet .set (index );
95- assertThat (atomicBitSet .get (index )).isTrue ();
96- assertThat (atomicBitSet .getAndSet (index )).isTrue ();
97- assertThat (atomicBitSet .get (index )).isTrue ();
93+ bitSet .set (index );
94+ assertThat (bitSet .get (index )).isTrue ();
95+ assertThat (bitSet .getAndSet (index )).isTrue ();
96+ assertThat (bitSet .get (index )).isTrue ();
9897 // page 2
9998 // getAndSet a bit that is currently false
10099 index = 2 * (1L << PAGE_SHIFT_BITS ) + 23 ;
101- assertThat (atomicBitSet .get (index )).isFalse ();
102- assertThat (atomicBitSet .getAndSet (index )).isFalse ();
103- assertThat (atomicBitSet .get (index )).isTrue ();
100+ assertThat (bitSet .get (index )).isFalse ();
101+ assertThat (bitSet .getAndSet (index )).isFalse ();
102+ assertThat (bitSet .get (index )).isTrue ();
104103 // getAndSet a bit that is currently true
105104 index = 2 * (1L << PAGE_SHIFT_BITS ) + 42 ;
106- atomicBitSet .set (index );
107- assertThat (atomicBitSet .get (index )).isTrue ();
108- assertThat (atomicBitSet .getAndSet (index )).isTrue ();
109- assertThat (atomicBitSet .get (index )).isTrue ();
105+ bitSet .set (index );
106+ assertThat (bitSet .get (index )).isTrue ();
107+ assertThat (bitSet .getAndSet (index )).isTrue ();
108+ assertThat (bitSet .get (index )).isTrue ();
110109 }
111110
112111 @ ParameterizedTest
113112 @ MethodSource ("bitsets" )
114- void testCardinality (HugeAtomicPagedBitSet atomicBitSet ) {
115- assertThat (atomicBitSet .cardinality ()).isEqualTo (0 );
113+ void testCardinality (HugeAtomicPagedBitSet bitSet ) {
114+ assertThat (bitSet .cardinality ()).isEqualTo (0 );
116115 // page 0
117- atomicBitSet .set (23 );
118- assertThat (atomicBitSet .cardinality ()).isEqualTo (1 );
116+ bitSet .set (23 );
117+ assertThat (bitSet .cardinality ()).isEqualTo (1 );
119118 // page 1
120- atomicBitSet .set ((1L << PAGE_SHIFT_BITS ) + 23 );
121- assertThat (atomicBitSet .cardinality ()).isEqualTo (2 );
119+ bitSet .set ((1L << PAGE_SHIFT_BITS ) + 23 );
120+ assertThat (bitSet .cardinality ()).isEqualTo (2 );
122121 // page 2
123- atomicBitSet .set (2 * (1L << PAGE_SHIFT_BITS ) + 23 );
124- assertThat (atomicBitSet .cardinality ()).isEqualTo (3 );
122+ bitSet .set (2 * (1L << PAGE_SHIFT_BITS ) + 23 );
123+ assertThat (bitSet .cardinality ()).isEqualTo (3 );
125124 }
126125
127126 @ ParameterizedTest
128127 @ MethodSource ("bitsets" )
129- void testForEachSetBit (HugeAtomicPagedBitSet atomicBitSet ) {
128+ void testForEachSetBit (HugeAtomicPagedBitSet bitSet ) {
130129 var rng = ThreadLocalRandom .current ();
131130 long bound = 42 * (1L << PAGE_SHIFT_BITS ) + 42 ;
132131
133132 var expected = IntStream
134133 .range (0 , 10_000 )
135134 .mapToLong (__ -> rng .nextLong (0 , bound ))
136135 .boxed ()
137- .peek (atomicBitSet ::set )
136+ .peek (bitSet ::set )
138137 .collect (Collectors .toSet ());
139138
140139 var actual = new HashSet <Long >();
141- atomicBitSet .forEachSetBit (actual ::add );
140+ bitSet .forEachSetBit (actual ::add );
142141
143142 assertThat (actual ).isEqualTo (expected );
144143 }
145144
146- @ Test
147- void writingAndGrowingShouldBeThreadSafe () {
145+ @ ParameterizedTest
146+ @ MethodSource ("bitsets" )
147+ void testSetParallel (HugeAtomicPagedBitSet bitSet ) {
148148 int concurrency = 8 ;
149149 int nodeCount = 1_000_000 ;
150150
151- var bitSet = HugeAtomicPagedBitSet .create (0 );
152-
153151 List <Runnable > tasks = PartitionUtils .rangePartition (concurrency , nodeCount , (partition ) -> () -> {
154152 long startNode = partition .startNode ();
155153 long endNode = partition .startNode () + partition .nodeCount ();
0 commit comments