1
1
package com .antkorwin .xsync ;
2
2
3
3
import org .assertj .core .api .Assertions ;
4
- import org .hamcrest .Matchers ;
5
4
import org .junit .Test ;
6
5
7
- import java .util .Collections ;
8
- import java .util .List ;
9
- import java .util .Set ;
10
- import java .util .UUID ;
6
+ import java .util .*;
11
7
import java .util .concurrent .ConcurrentHashMap ;
12
8
import java .util .concurrent .TimeUnit ;
13
9
import java .util .stream .Collectors ;
14
10
import java .util .stream .IntStream ;
15
11
16
12
import static org .awaitility .Awaitility .await ;
13
+ import static org .hamcrest .Matchers .equalTo ;
17
14
18
15
/**
19
- * Created by Korovin Anatolii on 17.06.2018.
16
+ * Created on 17.06.2018.
20
17
*
21
- * @author Korovin Anatolii
22
- * @version 1.0
18
+ * @author Korovin Anatoliy
23
19
*/
24
20
public class XMutexFactoryTest {
25
21
26
22
23
+ private static final String ID_STRING = "c117c526-606e-41b6-8197-1a6ba779f69b" ;
24
+ private static final int NUMBER_OF_MUTEXES = 1000 ;
25
+ private static final int NUMBER_OF_ITERATIONS = NUMBER_OF_MUTEXES * 100 ;
26
+
27
27
@ Test
28
- public void testFirst () {
28
+ public void testGetSameMutexFromTwoDifferentInstanceOfEqualsKeys () {
29
29
// Arrange
30
30
XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
31
- UUID firstId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
32
- UUID secondId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
31
+ UUID firstId = UUID .fromString (ID_STRING );
32
+ UUID secondId = UUID .fromString (ID_STRING );
33
33
// Check precondition
34
34
Assertions .assertThat (firstId != secondId ).isTrue ();
35
35
Assertions .assertThat (firstId ).isEqualTo (secondId );
@@ -46,55 +46,55 @@ public void testFirst() {
46
46
}
47
47
48
48
@ Test
49
- public void testSize () {
49
+ public void testWithRunGCAfterReleaseFirstMutex () throws InterruptedException {
50
50
// Arrange
51
51
XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
52
- UUID firstId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
53
- UUID secondId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
54
- UUID thirdId = UUID .randomUUID ();
52
+ UUID firstId = UUID .fromString (ID_STRING );
53
+ UUID secondId = UUID .fromString (ID_STRING );
55
54
56
55
// Act
57
56
XMutex <UUID > firstMutex = mutexFactory .getMutex (firstId );
57
+ int fisrtHashCode = System .identityHashCode (firstMutex );
58
+ firstMutex = null ;
59
+ System .gc ();
60
+ await ().atMost (5 , TimeUnit .SECONDS )
61
+ .until (mutexFactory ::size , equalTo (0L ));
62
+ // Now, the weak-map of mutex factory is empty,
63
+ // because all of the mutex references released
64
+ Assertions .assertThat (mutexFactory .size ()).isEqualTo (0 );
65
+
58
66
XMutex <UUID > secondMutex = mutexFactory .getMutex (secondId );
59
- XMutex < UUID > thirdMutex = mutexFactory . getMutex ( thirdId );
67
+ int secondHashCode = System . identityHashCode ( secondMutex );
60
68
61
69
// Asserts
62
- Assertions .assertThat (mutexFactory .size ()).isEqualTo (2 );
63
- Assertions .assertThat (firstMutex ).isEqualTo (secondMutex );
64
- Assertions .assertThat (firstMutex ).isNotEqualTo (thirdMutex );
70
+ Assertions .assertThat (mutexFactory .size ()).isEqualTo (1L );
71
+ Assertions .assertThat (fisrtHashCode ).isNotEqualTo (secondHashCode );
65
72
}
66
73
67
74
@ Test
68
- public void testWithGC () throws InterruptedException {
75
+ public void testSizeOfMutexFactoryMap () {
69
76
// Arrange
70
77
XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
71
- UUID firstId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
72
- UUID secondId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
78
+ UUID firstId = UUID .fromString (ID_STRING );
79
+ UUID secondId = UUID .fromString (ID_STRING );
80
+ UUID thirdId = UUID .randomUUID ();
73
81
74
82
// Act
75
83
XMutex <UUID > firstMutex = mutexFactory .getMutex (firstId );
76
- int fisrtHashCode = System .identityHashCode (firstMutex );
77
- firstMutex = null ;
78
- System .gc ();
79
- await ().atMost (5 , TimeUnit .SECONDS )
80
- .until (mutexFactory ::size , Matchers .equalTo (0L ));
81
-
82
84
XMutex <UUID > secondMutex = mutexFactory .getMutex (secondId );
83
- int secondHashCode = System . identityHashCode ( secondMutex );
85
+ XMutex < UUID > thirdMutex = mutexFactory . getMutex ( thirdId );
84
86
85
87
// Asserts
86
- System .out .println (fisrtHashCode + " " + secondHashCode );
87
- Assertions .assertThat (mutexFactory .size ()).isEqualTo (1L );
88
- Assertions .assertThat (fisrtHashCode ).isNotEqualTo (secondHashCode );
88
+ Assertions .assertThat (mutexFactory .size ()).isEqualTo (2 );
89
89
}
90
90
91
91
@ Test
92
- public void testHashCode () {
92
+ public void testEqualityOfReturnedMutexesBySystemIdentityHashCode () {
93
93
// Arrange
94
94
XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
95
- UUID firstId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
96
- UUID secondId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
97
- UUID thirdId = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
95
+ UUID firstId = UUID .fromString (ID_STRING );
96
+ UUID secondId = UUID .fromString (ID_STRING );
97
+ UUID thirdId = UUID .fromString (ID_STRING );
98
98
99
99
// Act
100
100
XMutex <UUID > firstMutex = mutexFactory .getMutex (firstId );
@@ -114,70 +114,62 @@ public void testHashCode() {
114
114
public void testALotOfHashCodes () {
115
115
// Arrange
116
116
XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
117
- UUID id = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
117
+ Set <Integer > setOfHash = createConcurrentSet ();
118
+ List <XMutex <UUID >> resultReferences = new ArrayList <>();
118
119
119
120
// Act
120
- Set <Integer > hashs = Collections .newSetFromMap (new ConcurrentHashMap <Integer , Boolean >());
121
- for (int i = 0 ; i < 1000 ; i ++) {
122
- XMutex <UUID > mutex = mutexFactory .getMutex (id );
123
- hashs .add (System .identityHashCode (mutex ));
121
+ for (int i = 0 ; i < NUMBER_OF_ITERATIONS ; i ++) {
122
+ XMutex <UUID > mutex = mutexFactory .getMutex (UUID .fromString (ID_STRING ));
123
+ setOfHash .add (System .identityHashCode (mutex ));
124
+ // and now, we save reference in the list,
125
+ // because the GC can delete a unused references:
126
+ resultReferences .add (mutex );
124
127
}
125
128
126
- Assertions .assertThat (hashs .size ()).isEqualTo (1 );
129
+ // Assertions
130
+ Assertions .assertThat (setOfHash .size ()).isEqualTo (1 );
131
+ Assertions .assertThat (resultReferences ).hasSize (NUMBER_OF_ITERATIONS );
127
132
}
128
133
129
- @ Test (timeout = 11000 )
130
- public void testConcurrency () throws InterruptedException {
134
+ private <TypeT > Set <TypeT > createConcurrentSet () {
135
+ return Collections .newSetFromMap (new ConcurrentHashMap <TypeT , Boolean >());
136
+ }
137
+
138
+ @ Test (timeout = 15000 )
139
+ public void testConcurrency () {
131
140
// Arrange
132
141
XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
133
142
134
- int endExclusive = 1000 ;
135
-
136
- List <UUID > ids = IntStream .range (0 , endExclusive )
143
+ List <UUID > ids = IntStream .range (0 , NUMBER_OF_MUTEXES )
137
144
.boxed ()
138
145
.map (i -> UUID .randomUUID ())
139
146
.collect (Collectors .toList ());
140
- System .out .println ("idsSize = " + ids .size ());
141
147
142
- Set <XMutex <UUID >> results = Collections
143
- . newSetFromMap ( new ConcurrentHashMap < XMutex < UUID >, Boolean >() );
148
+ Set <XMutex <UUID >> results = createConcurrentSet ();
149
+ Set < Integer > setOfHash = createConcurrentSet ( );
144
150
145
151
// Act
146
- // ExecutorService executorService = Executors.newFixedThreadPool(10);
147
- // IntStream.range(0, 10000)
148
- // .boxed()
149
- // .forEach(i -> {
150
- // executorService.submit(() -> {
151
- // UUID uuid = ids.get(i % endExclusive);
152
- // XMutex<UUID> mutex = mutexFactory.getMutex(uuid);
153
- // Assertions.assertThat(mutex).isNotNull();
154
- // results.add(mutex);
155
- // });
156
- // });
157
-
158
- IntStream .range (0 , 10000 )
152
+ IntStream .range (0 , NUMBER_OF_ITERATIONS )
159
153
.boxed ()
160
154
.parallel ()
161
155
.forEach (i -> {
162
- UUID uuid = ids .get (i % endExclusive );
156
+ UUID uuid = ids .get (i % NUMBER_OF_MUTEXES );
163
157
XMutex <UUID > mutex = mutexFactory .getMutex (uuid );
164
- Assertions .assertThat (mutex ).isNotNull ();
165
158
results .add (mutex );
159
+ setOfHash .add (System .identityHashCode (mutex ));
166
160
});
167
161
168
162
await ().atMost (10 , TimeUnit .SECONDS )
169
- .until (results ::size , Matchers .equalTo (endExclusive ));
170
-
171
- System .out .println ("res= " + results .size ());
172
- System .out .println ("mf= " + mutexFactory .size ());
163
+ .until (results ::size , equalTo (NUMBER_OF_MUTEXES ));
173
164
174
165
// Asserts
175
- Assertions .assertThat (results ).hasSize (endExclusive );
176
- Assertions .assertThat (mutexFactory .size ()).isEqualTo (endExclusive );
166
+ Assertions .assertThat (results ).hasSize (NUMBER_OF_MUTEXES );
167
+ Assertions .assertThat (setOfHash ).hasSize (NUMBER_OF_MUTEXES );
168
+ Assertions .assertThat (mutexFactory .size ()).isEqualTo (NUMBER_OF_MUTEXES );
177
169
}
178
170
179
171
@ Test
180
- public void testWithNullKey () {
172
+ public void testExceptionThrownWhenTryToGetMutexWithNullKey () {
181
173
// Arrange
182
174
XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
183
175
// Act
0 commit comments