1
+ package com .antkorwin .xsync ;
2
+
3
+ import org .assertj .core .api .Assertions ;
4
+ import org .hamcrest .Matchers ;
5
+ import org .junit .Test ;
6
+
7
+ import java .util .Collections ;
8
+ import java .util .List ;
9
+ import java .util .Set ;
10
+ import java .util .UUID ;
11
+ import java .util .concurrent .ConcurrentHashMap ;
12
+ import java .util .concurrent .TimeUnit ;
13
+ import java .util .stream .Collectors ;
14
+ import java .util .stream .IntStream ;
15
+
16
+ import static org .awaitility .Awaitility .await ;
17
+
18
+ /**
19
+ * Created by Korovin Anatolii on 17.06.2018.
20
+ *
21
+ * @author Korovin Anatolii
22
+ * @version 1.0
23
+ */
24
+ public class XMutexFactoryTest {
25
+
26
+
27
+ @ Test
28
+ public void testFirst () {
29
+ // Arrange
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" );
33
+ // Check precondition
34
+ Assertions .assertThat (firstId != secondId ).isTrue ();
35
+ Assertions .assertThat (firstId ).isEqualTo (secondId );
36
+
37
+ // Act
38
+ XMutex <UUID > firstMutex = mutexFactory .getMutex (firstId );
39
+ XMutex <UUID > secondMutex = mutexFactory .getMutex (secondId );
40
+
41
+ // Asserts
42
+ Assertions .assertThat (firstMutex ).isNotNull ();
43
+ Assertions .assertThat (secondMutex ).isNotNull ();
44
+ Assertions .assertThat (firstMutex ).isEqualTo (secondMutex );
45
+ Assertions .assertThat (firstMutex == secondMutex ).isTrue ();
46
+ }
47
+
48
+ @ Test
49
+ public void testSize () {
50
+ // Arrange
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 ();
55
+
56
+ // Act
57
+ XMutex <UUID > firstMutex = mutexFactory .getMutex (firstId );
58
+ XMutex <UUID > secondMutex = mutexFactory .getMutex (secondId );
59
+ XMutex <UUID > thirdMutex = mutexFactory .getMutex (thirdId );
60
+
61
+ // Asserts
62
+ Assertions .assertThat (mutexFactory .size ()).isEqualTo (2 );
63
+ Assertions .assertThat (firstMutex ).isEqualTo (secondMutex );
64
+ Assertions .assertThat (firstMutex ).isNotEqualTo (thirdMutex );
65
+ }
66
+
67
+ @ Test
68
+ public void testWithGC () throws InterruptedException {
69
+ // Arrange
70
+ 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" );
73
+
74
+ // Act
75
+ 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
+ XMutex <UUID > secondMutex = mutexFactory .getMutex (secondId );
83
+ int secondHashCode = System .identityHashCode (secondMutex );
84
+
85
+ // Asserts
86
+ System .out .println (fisrtHashCode + " " + secondHashCode );
87
+ Assertions .assertThat (mutexFactory .size ()).isEqualTo (1L );
88
+ Assertions .assertThat (fisrtHashCode ).isNotEqualTo (secondHashCode );
89
+ }
90
+
91
+ @ Test
92
+ public void testHashCode () {
93
+ // Arrange
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" );
98
+
99
+ // Act
100
+ XMutex <UUID > firstMutex = mutexFactory .getMutex (firstId );
101
+ XMutex <UUID > secondMutex = mutexFactory .getMutex (secondId );
102
+ XMutex <UUID > thirdMutex = mutexFactory .getMutex (thirdId );
103
+
104
+ // Assert
105
+ Assertions .assertThat (System .identityHashCode (firstMutex ))
106
+ .isEqualTo (System .identityHashCode (secondMutex ));
107
+
108
+ Assertions .assertThat (System .identityHashCode (firstMutex ))
109
+ .isEqualTo (System .identityHashCode (thirdMutex ));
110
+ }
111
+
112
+
113
+ @ Test
114
+ public void testALotOfHashCodes () {
115
+ // Arrange
116
+ XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
117
+ UUID id = UUID .fromString ("c117c526-606e-41b6-8197-1a6ba779f69b" );
118
+
119
+ // 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 ));
124
+ }
125
+
126
+ Assertions .assertThat (hashs .size ()).isEqualTo (1 );
127
+ }
128
+
129
+ @ Test (timeout = 11000 )
130
+ public void testConcurrency () throws InterruptedException {
131
+ // Arrange
132
+ XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
133
+
134
+ int endExclusive = 1000 ;
135
+
136
+ List <UUID > ids = IntStream .range (0 , endExclusive )
137
+ .boxed ()
138
+ .map (i -> UUID .randomUUID ())
139
+ .collect (Collectors .toList ());
140
+ System .out .println ("idsSize = " + ids .size ());
141
+
142
+ Set <XMutex <UUID >> results = Collections
143
+ .newSetFromMap (new ConcurrentHashMap <XMutex <UUID >, Boolean >());
144
+
145
+ // 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 )
159
+ .boxed ()
160
+ .parallel ()
161
+ .forEach (i -> {
162
+ UUID uuid = ids .get (i % endExclusive );
163
+ XMutex <UUID > mutex = mutexFactory .getMutex (uuid );
164
+ Assertions .assertThat (mutex ).isNotNull ();
165
+ results .add (mutex );
166
+ });
167
+
168
+ 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 ());
173
+
174
+ // Asserts
175
+ Assertions .assertThat (results ).hasSize (endExclusive );
176
+ Assertions .assertThat (mutexFactory .size ()).isEqualTo (endExclusive );
177
+ }
178
+
179
+ @ Test
180
+ public void testWithNullKey () {
181
+ // Arrange
182
+ XMutexFactory <UUID > mutexFactory = new XMutexFactory <>();
183
+ // Act
184
+ try {
185
+ mutexFactory .getMutex (null );
186
+ } catch (Exception e ) {
187
+ // Asserts
188
+ Assertions .assertThat (e )
189
+ .isInstanceOf (IllegalArgumentException .class )
190
+ .hasMessage ("The KEY of mutex must not be null." );
191
+ }
192
+ }
193
+ }
0 commit comments