Skip to content

Commit 3d905f9

Browse files
HADOOP-19610. S3A: ITests to run under JUnit5 (#7814)
hadoop-aws tests which need to be parameterized on a class level are configured to do so through the @ParameterizedClass tag. Filesystem contract test suites in hadoop-common have also been parameterized as appropriate. There are custom JUnit tags declared in org.apache.hadoop.test.tags, which add tag strings to test suites/cases declaring them. They can be used on the command line and in IDEs to control which tests are/are not executed. @FlakyTest "flaky" @loadtest "load" @RootFilesystemTest "rootfilesystem" @scaletest "scale" For anyone migrating tests to JUnit 5 * Methods which subclass an existing test case MUST declare the @test tag again -it is no longer inherited. * All overridden setup/teardown methods MUST be located and @BeforeEach/@AfterEach attribute added respectively * Subclasses of a parameterized test suite MUST redeclare themselves as a @ParameterizedClass, and the binding mechanism again. * Parameterized test suites SHOULD declare a pattern to generate an informative parameter value string for logs, IDEs and stack traces, e.g. @ParameterizedClass(name="performance-{0}") * Test suites SHOULD add a org.apache.hadoop.test.tags tag to declare what kind of test it is. These tags are inherited, so it may be that only shared superclasses of test suites need to be tagged. The abstract filesystem contract tests are NOT declared as integration tests -implementations MUST do so if they are integration tests. Contributed by Steve Loughran
1 parent 9d5e111 commit 3d905f9

File tree

92 files changed

+1038
-834
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

92 files changed

+1038
-834
lines changed

hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractMultipartUploaderTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import java.util.concurrent.CompletableFuture;
3131

3232
import org.assertj.core.api.Assertions;
33+
import org.junit.jupiter.api.AfterEach;
3334
import org.junit.jupiter.api.BeforeEach;
3435
import org.junit.jupiter.api.Test;
3536
import org.slf4j.Logger;
@@ -99,6 +100,7 @@ public void setup() throws Exception {
99100
}
100101

101102
@Override
103+
@AfterEach
102104
public void teardown() throws Exception {
103105
MultipartUploader uploader = getUploader(1);
104106
if (uploader != null) {

hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractRootDirectoryTest.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import org.apache.hadoop.fs.FileStatus;
3737
import org.apache.hadoop.fs.RemoteIterator;
3838
import org.apache.hadoop.test.LambdaTestUtils;
39+
import org.apache.hadoop.test.tags.RootFilesystemTest;
3940

4041
import static org.apache.commons.lang3.StringUtils.join;
4142
import static org.apache.hadoop.fs.contract.ContractTestUtils.createFile;
@@ -52,6 +53,7 @@
5253
* Only subclass this for tests against transient filesystems where
5354
* you don't care about the data.
5455
*/
56+
@RootFilesystemTest
5557
public abstract class AbstractContractRootDirectoryTest extends AbstractFSContractTestBase {
5658
private static final Logger LOG =
5759
LoggerFactory.getLogger(AbstractContractRootDirectoryTest.class);

hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractUnbufferTest.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,13 +26,19 @@
2626

2727
import org.apache.hadoop.fs.FSDataInputStream;
2828
import org.apache.hadoop.fs.Path;
29+
import org.apache.hadoop.test.tags.FlakyTest;
2930

3031
import static org.apache.hadoop.fs.contract.ContractTestUtils.createFile;
3132
import static org.apache.hadoop.fs.contract.ContractTestUtils.dataset;
3233

3334
/**
3435
* Contract tests for {@link org.apache.hadoop.fs.CanUnbuffer#unbuffer}.
36+
* Some of these test cases can fail if the FS read() call returns less
37+
* than requested, which is a valid (possibly correct) implementation
38+
* of {@code InputStream.read(buffer[])} which may return only those bytes
39+
* which can be returned without blocking for more data.
3540
*/
41+
@FlakyTest("buffer underflow")
3642
public abstract class AbstractContractUnbufferTest extends AbstractFSContractTestBase {
3743

3844
private Path file;
@@ -105,6 +111,7 @@ public void testMultipleUnbuffers() throws IOException {
105111
}
106112
}
107113

114+
108115
@Test
109116
public void testUnbufferMultipleReads() throws IOException {
110117
describe("unbuffer a file multiple times");

hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/AbstractContractVectoredReadTest.java

Lines changed: 59 additions & 96 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,10 @@
3434
import java.util.function.IntFunction;
3535

3636
import org.assertj.core.api.Assertions;
37+
import org.junit.jupiter.api.AfterEach;
3738
import org.junit.jupiter.api.BeforeEach;
38-
import org.junit.jupiter.params.ParameterizedTest;
39+
import org.junit.jupiter.api.Test;
40+
import org.junit.jupiter.params.ParameterizedClass;
3941
import org.junit.jupiter.params.provider.MethodSource;
4042
import org.slf4j.Logger;
4143
import org.slf4j.LoggerFactory;
@@ -68,6 +70,8 @@
6870
* Both the original readVectored(allocator) and the readVectored(allocator, release)
6971
* operations are tested.
7072
*/
73+
@ParameterizedClass(name="buffer-{0}")
74+
@MethodSource("params")
7175
public abstract class AbstractContractVectoredReadTest extends AbstractFSContractTestBase {
7276

7377
private static final Logger LOG =
@@ -80,15 +84,15 @@ public abstract class AbstractContractVectoredReadTest extends AbstractFSContrac
8084
/**
8185
* Buffer allocator for vector IO.
8286
*/
83-
protected IntFunction<ByteBuffer> allocate;
87+
private final IntFunction<ByteBuffer> allocate;
8488

8589
/**
8690
* Buffer pool for vector IO.
8791
*/
88-
protected final ElasticByteBufferPool pool =
92+
private final ElasticByteBufferPool pool =
8993
new WeakReferencedElasticByteBufferPool();
9094

91-
protected String bufferType;
95+
private final String bufferType;
9296

9397
/**
9498
* Path to the vector file.
@@ -106,8 +110,8 @@ public static List<String> params() {
106110
return Arrays.asList("direct", "array");
107111
}
108112

109-
public void initAbstractContractVectoredReadTest(String pBufferType) {
110-
this.bufferType = pBufferType;
113+
protected AbstractContractVectoredReadTest(String bufferType) {
114+
this.bufferType = bufferType;
111115
final boolean isDirect = !"array".equals(bufferType);
112116
this.allocate = size -> pool.getBuffer(isDirect, size);
113117
}
@@ -147,6 +151,7 @@ public void setup() throws Exception {
147151
createFile(fs, vectorPath, true, DATASET);
148152
}
149153

154+
@AfterEach
150155
@Override
151156
public void teardown() throws Exception {
152157
pool.release();
@@ -177,10 +182,8 @@ protected FSDataInputStream openVectorFile(final FileSystem fs) throws IOExcepti
177182
.build());
178183
}
179184

180-
@MethodSource("params")
181-
@ParameterizedTest(name = "Buffer type : {0}")
182-
public void testVectoredReadMultipleRanges(String pBufferType) throws Exception {
183-
initAbstractContractVectoredReadTest(pBufferType);
185+
@Test
186+
public void testVectoredReadMultipleRanges() throws Exception {
184187
List<FileRange> fileRanges = new ArrayList<>();
185188
for (int i = 0; i < 10; i++) {
186189
FileRange fileRange = FileRange.createFileRange(i * 100, 100);
@@ -201,10 +204,8 @@ public void testVectoredReadMultipleRanges(String pBufferType) throws Exception
201204
}
202205
}
203206

204-
@MethodSource("params")
205-
@ParameterizedTest(name = "Buffer type : {0}")
206-
public void testVectoredReadAndReadFully(String pBufferType) throws Exception {
207-
initAbstractContractVectoredReadTest(pBufferType);
207+
@Test
208+
public void testVectoredReadAndReadFully() throws Exception {
208209
List<FileRange> fileRanges = new ArrayList<>();
209210
range(fileRanges, 100, 100);
210211
try (FSDataInputStream in = openVectorFile()) {
@@ -219,10 +220,8 @@ public void testVectoredReadAndReadFully(String pBufferType) throws Exception {
219220
}
220221
}
221222

222-
@MethodSource("params")
223-
@ParameterizedTest(name = "Buffer type : {0}")
224-
public void testVectoredReadWholeFile(String pBufferType) throws Exception {
225-
initAbstractContractVectoredReadTest(pBufferType);
223+
@Test
224+
public void testVectoredReadWholeFile() throws Exception {
226225
describe("Read the whole file in one single vectored read");
227226
List<FileRange> fileRanges = new ArrayList<>();
228227
range(fileRanges, 0, DATASET_LEN);
@@ -240,10 +239,8 @@ public void testVectoredReadWholeFile(String pBufferType) throws Exception {
240239
* As the minimum seek value is 4*1024,none of the below ranges
241240
* will get merged.
242241
*/
243-
@MethodSource("params")
244-
@ParameterizedTest(name = "Buffer type : {0}")
245-
public void testDisjointRanges(String pBufferType) throws Exception {
246-
initAbstractContractVectoredReadTest(pBufferType);
242+
@Test
243+
public void testDisjointRanges() throws Exception {
247244
List<FileRange> fileRanges = new ArrayList<>();
248245
range(fileRanges, 0, 100);
249246
range(fileRanges, 4_000 + 101, 100);
@@ -259,10 +256,8 @@ public void testDisjointRanges(String pBufferType) throws Exception {
259256
* As the minimum seek value is 4*1024, all the below ranges
260257
* will get merged into one.
261258
*/
262-
@MethodSource("params")
263-
@ParameterizedTest(name = "Buffer type : {0}")
264-
public void testAllRangesMergedIntoOne(String pBufferType) throws Exception {
265-
initAbstractContractVectoredReadTest(pBufferType);
259+
@Test
260+
public void testAllRangesMergedIntoOne() throws Exception {
266261
List<FileRange> fileRanges = new ArrayList<>();
267262
final int length = 100;
268263
range(fileRanges, 0, length);
@@ -279,10 +274,8 @@ public void testAllRangesMergedIntoOne(String pBufferType) throws Exception {
279274
* As the minimum seek value is 4*1024, the first three ranges will be
280275
* merged into and other two will remain as it is.
281276
*/
282-
@MethodSource("params")
283-
@ParameterizedTest(name = "Buffer type : {0}")
284-
public void testSomeRangesMergedSomeUnmerged(String pBufferType) throws Exception {
285-
initAbstractContractVectoredReadTest(pBufferType);
277+
@Test
278+
public void testSomeRangesMergedSomeUnmerged() throws Exception {
286279
FileSystem fs = getFileSystem();
287280
List<FileRange> fileRanges = new ArrayList<>();
288281
range(fileRanges, 8 * 1024, 100);
@@ -306,10 +299,8 @@ public void testSomeRangesMergedSomeUnmerged(String pBufferType) throws Exceptio
306299
* Most file systems won't support overlapping ranges.
307300
* Currently, only Raw Local supports it.
308301
*/
309-
@MethodSource("params")
310-
@ParameterizedTest(name = "Buffer type : {0}")
311-
public void testOverlappingRanges(String pBufferType) throws Exception {
312-
initAbstractContractVectoredReadTest(pBufferType);
302+
@Test
303+
public void testOverlappingRanges() throws Exception {
313304
if (!isSupported(VECTOR_IO_OVERLAPPING_RANGES)) {
314305
verifyExceptionalVectoredRead(
315306
getSampleOverlappingRanges(),
@@ -327,10 +318,8 @@ public void testOverlappingRanges(String pBufferType) throws Exception {
327318
/**
328319
* Same ranges are special case of overlapping.
329320
*/
330-
@MethodSource("params")
331-
@ParameterizedTest(name = "Buffer type : {0}")
332-
public void testSameRanges(String pBufferType) throws Exception {
333-
initAbstractContractVectoredReadTest(pBufferType);
321+
@Test
322+
public void testSameRanges() throws Exception {
334323
if (!isSupported(VECTOR_IO_OVERLAPPING_RANGES)) {
335324
verifyExceptionalVectoredRead(
336325
getSampleSameRanges(),
@@ -348,10 +337,8 @@ public void testSameRanges(String pBufferType) throws Exception {
348337
/**
349338
* A null range is not permitted.
350339
*/
351-
@MethodSource("params")
352-
@ParameterizedTest(name = "Buffer type : {0}")
353-
public void testNullRange(String pBufferType) throws Exception {
354-
initAbstractContractVectoredReadTest(pBufferType);
340+
@Test
341+
public void testNullRange() throws Exception {
355342
List<FileRange> fileRanges = new ArrayList<>();
356343
range(fileRanges, 500, 100);
357344
fileRanges.add(null);
@@ -362,19 +349,15 @@ public void testNullRange(String pBufferType) throws Exception {
362349
/**
363350
* A null range is not permitted.
364351
*/
365-
@MethodSource("params")
366-
@ParameterizedTest(name = "Buffer type : {0}")
367-
public void testNullRangeList(String pBufferType) throws Exception {
368-
initAbstractContractVectoredReadTest(pBufferType);
352+
@Test
353+
public void testNullRangeList() throws Exception {
369354
verifyExceptionalVectoredRead(
370355
null,
371356
NullPointerException.class);
372357
}
373358

374-
@MethodSource("params")
375-
@ParameterizedTest(name = "Buffer type : {0}")
376-
public void testSomeRandomNonOverlappingRanges(String pBufferType) throws Exception {
377-
initAbstractContractVectoredReadTest(pBufferType);
359+
@Test
360+
public void testSomeRandomNonOverlappingRanges() throws Exception {
378361
List<FileRange> fileRanges = new ArrayList<>();
379362
range(fileRanges, 500, 100);
380363
range(fileRanges, 1000, 200);
@@ -387,10 +370,8 @@ public void testSomeRandomNonOverlappingRanges(String pBufferType) throws Except
387370
}
388371
}
389372

390-
@MethodSource("params")
391-
@ParameterizedTest(name = "Buffer type : {0}")
392-
public void testConsecutiveRanges(String pBufferType) throws Exception {
393-
initAbstractContractVectoredReadTest(pBufferType);
373+
@Test
374+
public void testConsecutiveRanges() throws Exception {
394375
List<FileRange> fileRanges = new ArrayList<>();
395376
final int offset = 500;
396377
final int length = 2011;
@@ -403,10 +384,8 @@ public void testConsecutiveRanges(String pBufferType) throws Exception {
403384
}
404385
}
405386

406-
@MethodSource("params")
407-
@ParameterizedTest(name = "Buffer type : {0}")
408-
public void testEmptyRanges(String pBufferType) throws Exception {
409-
initAbstractContractVectoredReadTest(pBufferType);
387+
@Test
388+
public void testEmptyRanges() throws Exception {
410389
List<FileRange> fileRanges = new ArrayList<>();
411390
try (FSDataInputStream in = openVectorFile()) {
412391
in.readVectored(fileRanges, allocate);
@@ -425,10 +404,8 @@ public void testEmptyRanges(String pBufferType) throws Exception {
425404
* The contract option {@link ContractOptions#VECTOR_IO_EARLY_EOF_CHECK} is used
426405
* to determine which check to perform.
427406
*/
428-
@MethodSource("params")
429-
@ParameterizedTest(name = "Buffer type : {0}")
430-
public void testEOFRanges(String pBufferType) throws Exception {
431-
initAbstractContractVectoredReadTest(pBufferType);
407+
@Test
408+
public void testEOFRanges() throws Exception {
432409
describe("Testing reading with an offset past the end of the file");
433410
List<FileRange> fileRanges = range(DATASET_LEN + 1, 100);
434411

@@ -441,10 +418,8 @@ public void testEOFRanges(String pBufferType) throws Exception {
441418
}
442419

443420

444-
@MethodSource("params")
445-
@ParameterizedTest(name = "Buffer type : {0}")
446-
public void testVectoredReadWholeFilePlusOne(String pBufferType) throws Exception {
447-
initAbstractContractVectoredReadTest(pBufferType);
421+
@Test
422+
public void testVectoredReadWholeFilePlusOne() throws Exception {
448423
describe("Try to read whole file plus 1 byte");
449424
List<FileRange> fileRanges = range(0, DATASET_LEN + 1);
450425

@@ -471,35 +446,29 @@ private void expectEOFinRead(final List<FileRange> fileRanges) throws Exception
471446
}
472447
}
473448

474-
@MethodSource("params")
475-
@ParameterizedTest(name = "Buffer type : {0}")
476-
public void testNegativeLengthRange(String pBufferType) throws Exception {
477-
initAbstractContractVectoredReadTest(pBufferType);
449+
@Test
450+
public void testNegativeLengthRange() throws Exception {
451+
478452
verifyExceptionalVectoredRead(range(0, -50), IllegalArgumentException.class);
479453
}
480454

481-
@MethodSource("params")
482-
@ParameterizedTest(name = "Buffer type : {0}")
483-
public void testNegativeOffsetRange(String pBufferType) throws Exception {
484-
initAbstractContractVectoredReadTest(pBufferType);
455+
@Test
456+
public void testNegativeOffsetRange() throws Exception {
485457
verifyExceptionalVectoredRead(range(-1, 50), EOFException.class);
486458
}
487459

488-
@MethodSource("params")
489-
@ParameterizedTest(name = "Buffer type : {0}")
490-
public void testNullReleaseOperation(String pBufferType) throws Exception {
491-
initAbstractContractVectoredReadTest(pBufferType);
460+
@Test
461+
public void testNullReleaseOperation() throws Exception {
462+
492463
final List<FileRange> range = range(0, 10);
493464
try (FSDataInputStream in = openVectorFile()) {
494-
intercept(NullPointerException.class, () ->
495-
in.readVectored(range, allocate, null));
465+
intercept(NullPointerException.class, () ->
466+
in.readVectored(range, allocate, null));
496467
}
497468
}
498469

499-
@MethodSource("params")
500-
@ParameterizedTest(name = "Buffer type : {0}")
501-
public void testNormalReadAfterVectoredRead(String pBufferType) throws Exception {
502-
initAbstractContractVectoredReadTest(pBufferType);
470+
@Test
471+
public void testNormalReadAfterVectoredRead() throws Exception {
503472
List<FileRange> fileRanges = createSampleNonOverlappingRanges();
504473
try (FSDataInputStream in = openVectorFile()) {
505474
in.readVectored(fileRanges, allocate);
@@ -514,10 +483,8 @@ public void testNormalReadAfterVectoredRead(String pBufferType) throws Exception
514483
}
515484
}
516485

517-
@MethodSource("params")
518-
@ParameterizedTest(name = "Buffer type : {0}")
519-
public void testVectoredReadAfterNormalRead(String pBufferType) throws Exception {
520-
initAbstractContractVectoredReadTest(pBufferType);
486+
@Test
487+
public void testVectoredReadAfterNormalRead() throws Exception {
521488
List<FileRange> fileRanges = createSampleNonOverlappingRanges();
522489
try (FSDataInputStream in = openVectorFile()) {
523490
// read starting 200 bytes
@@ -532,10 +499,8 @@ public void testVectoredReadAfterNormalRead(String pBufferType) throws Exception
532499
}
533500
}
534501

535-
@MethodSource("params")
536-
@ParameterizedTest(name = "Buffer type : {0}")
537-
public void testMultipleVectoredReads(String pBufferType) throws Exception {
538-
initAbstractContractVectoredReadTest(pBufferType);
502+
@Test
503+
public void testMultipleVectoredReads() throws Exception {
539504
List<FileRange> fileRanges1 = createSampleNonOverlappingRanges();
540505
List<FileRange> fileRanges2 = createSampleNonOverlappingRanges();
541506
try (FSDataInputStream in = openVectorFile()) {
@@ -553,10 +518,8 @@ public void testMultipleVectoredReads(String pBufferType) throws Exception {
553518
* operation and then uses a separate thread pool to process the
554519
* results asynchronously.
555520
*/
556-
@MethodSource("params")
557-
@ParameterizedTest(name = "Buffer type : {0}")
558-
public void testVectoredIOEndToEnd(String pBufferType) throws Exception {
559-
initAbstractContractVectoredReadTest(pBufferType);
521+
@Test
522+
public void testVectoredIOEndToEnd() throws Exception {
560523
List<FileRange> fileRanges = new ArrayList<>();
561524
range(fileRanges, 8 * 1024, 100);
562525
range(fileRanges, 14 * 1024, 100);

0 commit comments

Comments
 (0)