@@ -42,7 +42,8 @@ const {
42
42
DI_DEBUG_ERROR_PREFIX ,
43
43
DI_DEBUG_ERROR_FILE_SUFFIX ,
44
44
DI_DEBUG_ERROR_SNAPSHOT_ID_SUFFIX ,
45
- DI_DEBUG_ERROR_LINE_SUFFIX
45
+ DI_DEBUG_ERROR_LINE_SUFFIX ,
46
+ TEST_RETRY_REASON
46
47
} = require ( '../../packages/dd-trace/src/plugins/util/test' )
47
48
const { DD_HOST_CPU_COUNT } = require ( '../../packages/dd-trace/src/plugins/util/env' )
48
49
@@ -844,15 +845,13 @@ versions.forEach(version => {
844
845
it ( 'retries new tests' , ( done ) => {
845
846
const NUM_RETRIES_EFD = 3
846
847
receiver . setSettings ( {
847
- itr_enabled : false ,
848
- code_coverage : false ,
849
- tests_skipping : false ,
850
848
early_flake_detection : {
851
849
enabled : true ,
852
850
slow_test_retries : {
853
851
'5s' : NUM_RETRIES_EFD
854
852
}
855
- }
853
+ } ,
854
+ known_tests_enabled : true
856
855
} )
857
856
// cucumber.ci-visibility/features/farewell.feature.Say whatever will be considered new
858
857
receiver . setKnownTests (
@@ -884,6 +883,9 @@ versions.forEach(version => {
884
883
retriedTests . length
885
884
)
886
885
assert . equal ( retriedTests . length , NUM_RETRIES_EFD )
886
+ retriedTests . forEach ( test => {
887
+ assert . propertyVal ( test . meta , TEST_RETRY_REASON , 'efd' )
888
+ } )
887
889
// Test name does not change
888
890
newTests . forEach ( test => {
889
891
assert . equal ( test . meta [ TEST_NAME ] , 'Say whatever' )
@@ -907,15 +909,13 @@ versions.forEach(version => {
907
909
it ( 'is disabled if DD_CIVISIBILITY_EARLY_FLAKE_DETECTION_ENABLED is false' , ( done ) => {
908
910
const NUM_RETRIES_EFD = 3
909
911
receiver . setSettings ( {
910
- itr_enabled : false ,
911
- code_coverage : false ,
912
- tests_skipping : false ,
913
912
early_flake_detection : {
914
913
enabled : true ,
915
914
slow_test_retries : {
916
915
'5s' : NUM_RETRIES_EFD
917
916
}
918
- }
917
+ } ,
918
+ known_tests_enabled : true
919
919
} )
920
920
921
921
const eventsPromise = receiver
@@ -928,8 +928,12 @@ versions.forEach(version => {
928
928
const newTests = tests . filter ( test =>
929
929
test . meta [ TEST_IS_NEW ] === 'true'
930
930
)
931
- // new tests are not detected
932
- assert . equal ( newTests . length , 0 )
931
+ // new tests are detected but not retried
932
+ assert . equal ( newTests . length , 1 )
933
+ const retriedTests = tests . filter ( test =>
934
+ test . meta [ TEST_IS_RETRY ] === 'true'
935
+ )
936
+ assert . equal ( retriedTests . length , 0 )
933
937
} )
934
938
// cucumber.ci-visibility/features/farewell.feature.Say whatever will be considered new
935
939
receiver . setKnownTests ( {
@@ -957,15 +961,13 @@ versions.forEach(version => {
957
961
it ( 'retries flaky tests and sets exit code to 0 as long as one attempt passes' , ( done ) => {
958
962
const NUM_RETRIES_EFD = 3
959
963
receiver . setSettings ( {
960
- itr_enabled : false ,
961
- code_coverage : false ,
962
- tests_skipping : false ,
963
964
early_flake_detection : {
964
965
enabled : true ,
965
966
slow_test_retries : {
966
967
'5s' : NUM_RETRIES_EFD
967
968
}
968
- }
969
+ } ,
970
+ known_tests_enabled : true
969
971
} )
970
972
// Tests in "cucumber.ci-visibility/features-flaky/flaky.feature" will be considered new
971
973
receiver . setKnownTests ( { } )
@@ -1014,15 +1016,13 @@ versions.forEach(version => {
1014
1016
it ( 'does not retry tests that are skipped' , ( done ) => {
1015
1017
const NUM_RETRIES_EFD = 3
1016
1018
receiver . setSettings ( {
1017
- itr_enabled : false ,
1018
- code_coverage : false ,
1019
- tests_skipping : false ,
1020
1019
early_flake_detection : {
1021
1020
enabled : true ,
1022
1021
slow_test_retries : {
1023
1022
'5s' : NUM_RETRIES_EFD
1024
1023
}
1025
- }
1024
+ } ,
1025
+ known_tests_enabled : true
1026
1026
} )
1027
1027
// "cucumber.ci-visibility/features/farewell.feature.Say whatever" will be considered new
1028
1028
// "cucumber.ci-visibility/features/greetings.feature.Say skip" will be considered new
@@ -1066,15 +1066,13 @@ versions.forEach(version => {
1066
1066
it ( 'does not run EFD if the known tests request fails' , ( done ) => {
1067
1067
const NUM_RETRIES_EFD = 3
1068
1068
receiver . setSettings ( {
1069
- itr_enabled : false ,
1070
- code_coverage : false ,
1071
- tests_skipping : false ,
1072
1069
early_flake_detection : {
1073
1070
enabled : true ,
1074
1071
slow_test_retries : {
1075
1072
'5s' : NUM_RETRIES_EFD
1076
1073
}
1077
- }
1074
+ } ,
1075
+ known_tests_enabled : true
1078
1076
} )
1079
1077
receiver . setKnownTestsResponseCode ( 500 )
1080
1078
receiver . setKnownTests ( { } )
@@ -1108,16 +1106,14 @@ versions.forEach(version => {
1108
1106
it ( 'bails out of EFD if the percentage of new tests is too high' , ( done ) => {
1109
1107
const NUM_RETRIES_EFD = 3
1110
1108
receiver . setSettings ( {
1111
- itr_enabled : false ,
1112
- code_coverage : false ,
1113
- tests_skipping : false ,
1114
1109
early_flake_detection : {
1115
1110
enabled : true ,
1116
1111
slow_test_retries : {
1117
1112
'5s' : NUM_RETRIES_EFD
1118
1113
} ,
1119
1114
faulty_session_threshold : 0
1120
- }
1115
+ } ,
1116
+ known_tests_enabled : true
1121
1117
} )
1122
1118
// tests in cucumber.ci-visibility/features/farewell.feature will be considered new
1123
1119
receiver . setKnownTests (
@@ -1160,20 +1156,70 @@ versions.forEach(version => {
1160
1156
} )
1161
1157
} )
1162
1158
1159
+ it ( 'disables early flake detection if known tests should not be requested' , ( done ) => {
1160
+ const NUM_RETRIES_EFD = 3
1161
+ receiver . setSettings ( {
1162
+ early_flake_detection : {
1163
+ enabled : true ,
1164
+ slow_test_retries : {
1165
+ '5s' : NUM_RETRIES_EFD
1166
+ }
1167
+ } ,
1168
+ known_tests_enabled : false
1169
+ } )
1170
+ // cucumber.ci-visibility/features/farewell.feature.Say whatever will be considered new
1171
+ receiver . setKnownTests (
1172
+ {
1173
+ cucumber : {
1174
+ 'ci-visibility/features/farewell.feature' : [ 'Say farewell' ] ,
1175
+ 'ci-visibility/features/greetings.feature' : [ 'Say greetings' , 'Say yeah' , 'Say yo' , 'Say skip' ]
1176
+ }
1177
+ }
1178
+ )
1179
+ const eventsPromise = receiver
1180
+ . gatherPayloadsMaxTimeout ( ( { url } ) => url . endsWith ( '/api/v2/citestcycle' ) , ( payloads ) => {
1181
+ const events = payloads . flatMap ( ( { payload } ) => payload . events )
1182
+
1183
+ const testSession = events . find ( event => event . type === 'test_session_end' ) . content
1184
+ assert . notProperty ( testSession . meta , TEST_EARLY_FLAKE_ENABLED )
1185
+ const tests = events . filter ( event => event . type === 'test' ) . map ( event => event . content )
1186
+
1187
+ // no new tests detected
1188
+ const newTests = tests . filter ( test => test . meta [ TEST_IS_NEW ] === 'true' )
1189
+ assert . equal ( newTests . length , 0 )
1190
+ // no retries
1191
+ const retriedTests = newTests . filter ( test => test . meta [ TEST_IS_RETRY ] === 'true' )
1192
+ assert . equal ( retriedTests . length , 0 )
1193
+ } )
1194
+
1195
+ childProcess = exec (
1196
+ runTestsCommand ,
1197
+ {
1198
+ cwd,
1199
+ env : envVars ,
1200
+ stdio : 'pipe'
1201
+ }
1202
+ )
1203
+
1204
+ childProcess . on ( 'exit' , ( ) => {
1205
+ eventsPromise . then ( ( ) => {
1206
+ done ( )
1207
+ } ) . catch ( done )
1208
+ } )
1209
+ } )
1210
+
1163
1211
if ( version !== '7.0.0' ) { // EFD in parallel mode only supported from cucumber>=11
1164
1212
context ( 'parallel mode' , ( ) => {
1165
1213
it ( 'retries new tests' , ( done ) => {
1166
1214
const NUM_RETRIES_EFD = 3
1167
1215
receiver . setSettings ( {
1168
- itr_enabled : false ,
1169
- code_coverage : false ,
1170
- tests_skipping : false ,
1171
1216
early_flake_detection : {
1172
1217
enabled : true ,
1173
1218
slow_test_retries : {
1174
1219
'5s' : NUM_RETRIES_EFD
1175
1220
}
1176
- }
1221
+ } ,
1222
+ known_tests_enabled : true
1177
1223
} )
1178
1224
// cucumber.ci-visibility/features/farewell.feature.Say whatever will be considered new
1179
1225
receiver . setKnownTests (
@@ -1231,15 +1277,13 @@ versions.forEach(version => {
1231
1277
it ( 'retries flaky tests and sets exit code to 0 as long as one attempt passes' , ( done ) => {
1232
1278
const NUM_RETRIES_EFD = 3
1233
1279
receiver . setSettings ( {
1234
- itr_enabled : false ,
1235
- code_coverage : false ,
1236
- tests_skipping : false ,
1237
1280
early_flake_detection : {
1238
1281
enabled : true ,
1239
1282
slow_test_retries : {
1240
1283
'5s' : NUM_RETRIES_EFD
1241
1284
}
1242
- }
1285
+ } ,
1286
+ known_tests_enabled : true
1243
1287
} )
1244
1288
// Tests in "cucumber.ci-visibility/features-flaky/flaky.feature" will be considered new
1245
1289
receiver . setKnownTests ( { } )
@@ -1293,16 +1337,14 @@ versions.forEach(version => {
1293
1337
it ( 'bails out of EFD if the percentage of new tests is too high' , ( done ) => {
1294
1338
const NUM_RETRIES_EFD = 3
1295
1339
receiver . setSettings ( {
1296
- itr_enabled : false ,
1297
- code_coverage : false ,
1298
- tests_skipping : false ,
1299
1340
early_flake_detection : {
1300
1341
enabled : true ,
1301
1342
slow_test_retries : {
1302
1343
'5s' : NUM_RETRIES_EFD
1303
1344
} ,
1304
1345
faulty_session_threshold : 0
1305
- }
1346
+ } ,
1347
+ known_tests_enabled : true
1306
1348
} )
1307
1349
// tests in cucumber.ci-visibility/features/farewell.feature will be considered new
1308
1350
receiver . setKnownTests (
@@ -1350,15 +1392,13 @@ versions.forEach(version => {
1350
1392
it ( 'does not retry tests that are skipped' , ( done ) => {
1351
1393
const NUM_RETRIES_EFD = 3
1352
1394
receiver . setSettings ( {
1353
- itr_enabled : false ,
1354
- code_coverage : false ,
1355
- tests_skipping : false ,
1356
1395
early_flake_detection : {
1357
1396
enabled : true ,
1358
1397
slow_test_retries : {
1359
1398
'5s' : NUM_RETRIES_EFD
1360
1399
}
1361
- }
1400
+ } ,
1401
+ known_tests_enabled : true
1362
1402
} )
1363
1403
// "cucumber.ci-visibility/features/farewell.feature.Say whatever" will be considered new
1364
1404
// "cucumber.ci-visibility/features/greetings.feature.Say skip" will be considered new
@@ -1909,5 +1949,54 @@ versions.forEach(version => {
1909
1949
} )
1910
1950
} )
1911
1951
} )
1952
+
1953
+ context ( 'known tests without early flake detection' , ( ) => {
1954
+ it ( 'detects new tests without retrying them' , ( done ) => {
1955
+ receiver . setSettings ( {
1956
+ early_flake_detection : {
1957
+ enabled : false
1958
+ } ,
1959
+ known_tests_enabled : true
1960
+ } )
1961
+ // cucumber.ci-visibility/features/farewell.feature.Say whatever will be considered new
1962
+ receiver . setKnownTests (
1963
+ {
1964
+ cucumber : {
1965
+ 'ci-visibility/features/farewell.feature' : [ 'Say farewell' ] ,
1966
+ 'ci-visibility/features/greetings.feature' : [ 'Say greetings' , 'Say yeah' , 'Say yo' , 'Say skip' ]
1967
+ }
1968
+ }
1969
+ )
1970
+ const eventsPromise = receiver
1971
+ . gatherPayloadsMaxTimeout ( ( { url } ) => url . endsWith ( '/api/v2/citestcycle' ) , ( payloads ) => {
1972
+ const events = payloads . flatMap ( ( { payload } ) => payload . events )
1973
+
1974
+ const testSession = events . find ( event => event . type === 'test_session_end' ) . content
1975
+ assert . notProperty ( testSession . meta , TEST_EARLY_FLAKE_ENABLED )
1976
+ const tests = events . filter ( event => event . type === 'test' ) . map ( event => event . content )
1977
+
1978
+ // new tests detected but not retried
1979
+ const newTests = tests . filter ( test => test . meta [ TEST_IS_NEW ] === 'true' )
1980
+ assert . equal ( newTests . length , 1 )
1981
+ const retriedTests = newTests . filter ( test => test . meta [ TEST_IS_RETRY ] === 'true' )
1982
+ assert . equal ( retriedTests . length , 0 )
1983
+ } )
1984
+
1985
+ childProcess = exec (
1986
+ runTestsCommand ,
1987
+ {
1988
+ cwd,
1989
+ env : getCiVisAgentlessConfig ( receiver . port ) ,
1990
+ stdio : 'pipe'
1991
+ }
1992
+ )
1993
+
1994
+ childProcess . on ( 'exit' , ( ) => {
1995
+ eventsPromise . then ( ( ) => {
1996
+ done ( )
1997
+ } ) . catch ( done )
1998
+ } )
1999
+ } )
2000
+ } )
1912
2001
} )
1913
2002
} )
0 commit comments