2
2
3
3
import org .junit .jupiter .api .Test ;
4
4
import edu .umd .cs .findbugs .AbstractIntegrationTest ;
5
- import edu .umd .cs .findbugs .test .matcher .BugInstanceMatcher ;
6
- import edu .umd .cs .findbugs .test .matcher .BugInstanceMatcherBuilder ;
7
-
8
- import static edu .umd .cs .findbugs .test .CountMatcher .containsExactly ;
9
- import static org .hamcrest .MatcherAssert .assertThat ;
10
- import static org .hamcrest .Matchers .hasItem ;
11
5
12
6
class AtomicOperationsCombinedDetectorTest extends AbstractIntegrationTest {
13
7
14
- public static final String OPERATIONS_ARE_NOT_ATOMIC = "AT_COMBINED_ATOMIC_OPERATIONS_ARE_NOT_ATOMIC" ;
15
- public static final String NEEDS_SYNCHRONIZATION = "AT_ATOMIC_OPERATION_NEEDS_SYNCHRONIZATION" ;
8
+ private static final String OPERATIONS_ARE_NOT_ATOMIC = "AT_COMBINED_ATOMIC_OPERATIONS_ARE_NOT_ATOMIC" ;
9
+ private static final String NEEDS_SYNCHRONIZATION = "AT_ATOMIC_OPERATION_NEEDS_SYNCHRONIZATION" ;
16
10
17
11
@ Test
18
12
void testSafeSynchronizedList () {
@@ -31,26 +25,26 @@ void testSafeSynchronizedList() {
31
25
@ Test
32
26
void testUnsafeSynchronizedList () {
33
27
performAnalysis ("atomicMethods/UnsafeSynchronizedList.class" );
34
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
35
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
36
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedList" , "addAndPrintNumbers" , 13 );
28
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
29
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
30
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedList" , "addAndPrintNumbers" , 13 );
37
31
}
38
32
39
33
@ Test
40
34
void testUnsafeSynchronizedListWithMultipleSync () {
41
35
performAnalysis ("atomicMethods/UnsafeSynchronizedListWithMultipleSync.class" );
42
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
43
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
44
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListWithMultipleSync" , "addAndPrintNumbers" , 32 );
36
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
37
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
38
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListWithMultipleSync" , "addAndPrintNumbers" , 32 );
45
39
}
46
40
47
41
@ Test
48
42
void testUnsafeSynchronizedListWithMethodInit () {
49
43
performAnalysis ("atomicMethods/UnsafeSynchronizedListWithMethodInit.class" );
50
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 1 );
51
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
52
- assertBug (NEEDS_SYNCHRONIZATION , "UnsafeSynchronizedListWithMethodInit" , "init" , 12 );
53
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListWithMethodInit" , "addAndPrintNumbers" , 17 );
44
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 1 );
45
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
46
+ assertBugInMethodAtLine (NEEDS_SYNCHRONIZATION , "UnsafeSynchronizedListWithMethodInit" , "init" , 12 );
47
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListWithMethodInit" , "addAndPrintNumbers" , 17 );
54
48
}
55
49
56
50
@ Test
@@ -68,19 +62,19 @@ void testUnsafeSynchronizedSet() {
68
62
"atomicMethods/UnsafeSynchronizedSet.class" ,
69
63
"atomicMethods/UnsafeSynchronizedSortedSet.class" ,
70
64
"atomicMethods/UnsafeSynchronizedNavigableSet.class" );
71
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 3 );
72
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
73
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSet" , "addAndPrintNumbers" , 13 );
74
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSortedSet" , "addAndPrintNumbers" , 12 );
75
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedNavigableSet" , "addAndPrintNumbers" , 12 );
65
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 3 );
66
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
67
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSet" , "addAndPrintNumbers" , 13 );
68
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSortedSet" , "addAndPrintNumbers" , 12 );
69
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedNavigableSet" , "addAndPrintNumbers" , 12 );
76
70
}
77
71
78
72
@ Test
79
73
void testUnsafeSynchronizedCollection () {
80
74
performAnalysis ("atomicMethods/UnsafeSynchronizedCollection.class" );
81
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
82
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
83
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedCollection" , "addAndPrintNumbers" , 12 );
75
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
76
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
77
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedCollection" , "addAndPrintNumbers" , 12 );
84
78
}
85
79
86
80
@ Test
@@ -89,11 +83,11 @@ void testUnsafeSynchronizedMap() {
89
83
"atomicMethods/UnsafeSynchronizedMap.class" ,
90
84
"atomicMethods/UnsafeSynchronizedNavigableMap.class" ,
91
85
"atomicMethods/UnsafeSynchronizedSortedMap.class" );
92
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 3 );
93
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
94
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedMap" , "addAndPrintNumbers" , 13 );
95
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedNavigableMap" , "addAndPrintNumbers" , 12 );
96
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSortedMap" , "addAndPrintNumbers" , 12 );
86
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 3 );
87
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
88
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedMap" , "addAndPrintNumbers" , 13 );
89
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedNavigableMap" , "addAndPrintNumbers" , 12 );
90
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSortedMap" , "addAndPrintNumbers" , 12 );
97
91
}
98
92
99
93
@ Test
@@ -108,36 +102,36 @@ void testSynchronizedListInSynchronizedMethod() {
108
102
@ Test
109
103
void testUnsafeSynchronizedListAndSet () {
110
104
performAnalysis ("atomicMethods/UnsafeSynchronizedListAndSet.class" );
111
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 2 );
112
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
113
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListAndSet" , "addAndPrintNumbers" , 16 );
114
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListAndSet" , "addAndPrintNumbers" , 20 );
105
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 2 );
106
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
107
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListAndSet" , "addAndPrintNumbers" , 16 );
108
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListAndSet" , "addAndPrintNumbers" , 20 );
115
109
}
116
110
117
111
@ Test
118
112
void testPartialSynchronizedListAndSet () {
119
113
performAnalysis ("atomicMethods/PartialSynchronizedListAndSet.class" , "atomicMethods/PartialSynchronizedListAndSet2.class" );
120
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 2 );
121
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
122
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "PartialSynchronizedListAndSet" , "addAndPrintNumbers" , 16 );
123
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "PartialSynchronizedListAndSet2" , "addAndPrintNumbers" , 22 );
114
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 2 );
115
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
116
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "PartialSynchronizedListAndSet" , "addAndPrintNumbers" , 16 );
117
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "PartialSynchronizedListAndSet2" , "addAndPrintNumbers" , 22 );
124
118
}
125
119
126
120
@ Test
127
121
void testUnsafeSynchronizedListWithPrivateMethods () {
128
122
performAnalysis ("atomicMethods/UnsafeSynchronizedListWithPrivateMethods.class" );
129
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
130
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
131
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListWithPrivateMethods" , "addAndPrintNumbers" , 13 );
123
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
124
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
125
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedListWithPrivateMethods" , "addAndPrintNumbers" , 13 );
132
126
}
133
127
134
128
@ Test
135
129
void testUnsafeSynchronizedSetInMultipleMethods () {
136
130
performAnalysis ("atomicMethods/UnsafeSynchronizedSetInMultipleMethods.class" );
137
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 2 );
138
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
139
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSetInMultipleMethods" , "addAndPrintNumbers" , 13 );
140
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSetInMultipleMethods" , "removeAndPrintNumbers" , 19 );
131
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 2 );
132
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
133
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSetInMultipleMethods" , "addAndPrintNumbers" , 13 );
134
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedSetInMultipleMethods" , "removeAndPrintNumbers" , 19 );
141
135
}
142
136
143
137
@ Test
@@ -149,10 +143,10 @@ void testSafeSynchronizedMapIncrement() {
149
143
@ Test
150
144
void testUnsafeSynchronizedMapIncrement () {
151
145
performAnalysis ("atomicMethods/UnsafeSynchronizedMapIncrement.class" );
152
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
153
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 1 );
154
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedMapIncrement" , "increment" , 17 );
155
- assertBug (NEEDS_SYNCHRONIZATION , "UnsafeSynchronizedMapIncrement" , "getCount" , 21 );
146
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
147
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 1 );
148
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeSynchronizedMapIncrement" , "increment" , 17 );
149
+ assertBugInMethodAtLine (NEEDS_SYNCHRONIZATION , "UnsafeSynchronizedMapIncrement" , "getCount" , 21 );
156
150
}
157
151
158
152
@ Test
@@ -170,29 +164,29 @@ void testUnsafeAtomicReference() {
170
164
"atomicMethods/UnsafeAtomicReference4.class" ,
171
165
"atomicMethods/UnsafeAtomicReference4$Inner.class" ,
172
166
"atomicMethods/UnsafeAtomicReference5.class" );
173
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 11 );
174
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 3 );
175
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference" , "update" , 17 );
176
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference" , "add" , 22 );
177
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger" , 18 );
178
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger" , 18 );
179
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger2" , 26 );
180
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger2" , 26 );
181
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference3" , "preparation" , 11 );
182
- assertBug (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReference3" , "run" , 15 );
183
- assertBug (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReference3" , "after" , 19 );
184
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference4" , "initProcessing" , 22 );
185
- assertBug (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReference4" , "finishProcessing" , 33 );
186
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference5" , "lambda$incrementAtomicInteger$0" , 15 );
167
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 11 );
168
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 3 );
169
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference" , "update" , 17 );
170
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference" , "add" , 22 );
171
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger" , 18 );
172
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger" , 18 );
173
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger2" , 26 );
174
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference2" , "incrementAtomicInteger2" , 26 );
175
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference3" , "preparation" , 11 );
176
+ assertBugInMethodAtLine (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReference3" , "run" , 15 );
177
+ assertBugInMethodAtLine (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReference3" , "after" , 19 );
178
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference4" , "initProcessing" , 22 );
179
+ assertBugInMethodAtLine (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReference4" , "finishProcessing" , 33 );
180
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReference5" , "lambda$incrementAtomicInteger$0" , 15 );
187
181
}
188
182
189
183
@ Test
190
184
void testUnsafeAtomicReferenceValueSet () {
191
185
performAnalysis ("atomicMethods/UnsafeAtomicReferenceValueSet.class" );
192
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 1 );
193
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
194
- assertBug (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReferenceValueSet" , "init" , 10 );
195
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReferenceValueSet" , "update" , 15 );
186
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 1 );
187
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
188
+ assertBugInMethodAtLine (NEEDS_SYNCHRONIZATION , "UnsafeAtomicReferenceValueSet" , "init" , 10 );
189
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeAtomicReferenceValueSet" , "update" , 15 );
196
190
}
197
191
198
192
@ Test
@@ -204,9 +198,9 @@ void testSafeLocalAtomicInteger() {
204
198
@ Test
205
199
void testUnsafeLocalAtomicInteger () {
206
200
performAnalysis ("atomicMethods/UnsafeLocalAtomicInteger.class" );
207
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 1 );
208
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
209
- assertBug (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeLocalAtomicInteger" , "increment" , 23 );
201
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 1 );
202
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
203
+ assertBugInMethodAtLine (OPERATIONS_ARE_NOT_ATOMIC , "UnsafeLocalAtomicInteger" , "increment" , 23 );
210
204
}
211
205
212
206
@ Test
@@ -234,23 +228,7 @@ void testSafeAtomicCallsWithLambda() {
234
228
}
235
229
236
230
private void assertZeroBugs () {
237
- assertNumOfBugs (OPERATIONS_ARE_NOT_ATOMIC , 0 );
238
- assertNumOfBugs (NEEDS_SYNCHRONIZATION , 0 );
239
- }
240
-
241
- private void assertNumOfBugs (String bugType , int num ) {
242
- final BugInstanceMatcher bugTypeMatcher = new BugInstanceMatcherBuilder ()
243
- .bugType (bugType ).build ();
244
- assertThat (getBugCollection (), containsExactly (num , bugTypeMatcher ));
245
- }
246
-
247
- private void assertBug (String bugType , String className , String methodName , int line ) {
248
- final BugInstanceMatcher bugInstanceMatcher = new BugInstanceMatcherBuilder ()
249
- .bugType (bugType )
250
- .inClass (className )
251
- .inMethod (methodName )
252
- .atLine (line )
253
- .build ();
254
- assertThat (getBugCollection (), hasItem (bugInstanceMatcher ));
231
+ assertBugTypeCount (OPERATIONS_ARE_NOT_ATOMIC , 0 );
232
+ assertBugTypeCount (NEEDS_SYNCHRONIZATION , 0 );
255
233
}
256
234
}
0 commit comments