|
6 | 6 | import static org.junit.jupiter.api.Assertions.assertEquals; |
7 | 7 | import static org.junit.jupiter.api.Assertions.assertThrows; |
8 | 8 |
|
9 | | -import java.io.File; |
10 | 9 | import java.io.IOException; |
11 | | -import java.io.RandomAccessFile; |
12 | 10 | import java.math.BigInteger; |
13 | 11 | import java.nio.ByteBuffer; |
14 | | -import java.nio.MappedByteBuffer; |
15 | | -import java.nio.channels.FileChannel; |
16 | | -import java.nio.channels.FileChannel.MapMode; |
17 | 12 | import java.nio.charset.StandardCharsets; |
18 | 13 | import java.util.ArrayList; |
19 | 14 | import java.util.HashMap; |
20 | 15 | import java.util.List; |
21 | 16 | import java.util.Map; |
22 | | -import java.util.UUID; |
23 | 17 | import org.junit.jupiter.api.Test; |
24 | 18 |
|
25 | 19 | @SuppressWarnings({"boxing", "static-method"}) |
@@ -404,103 +398,82 @@ public void testArrays() throws IOException { |
404 | 398 | } |
405 | 399 |
|
406 | 400 | @Test |
407 | | - public void testInvalidControlByte() throws IOException { |
408 | | - try (FileChannel fc = DecoderTest.getFileChannel(new byte[] {0x0, 0xF})) { |
409 | | - MappedByteBuffer mmap = fc.map(MapMode.READ_ONLY, 0, fc.size()); |
| 401 | + public void testInvalidControlByte() { |
| 402 | + ByteBuffer buffer = ByteBuffer.wrap(new byte[] {0x0, 0xF}); |
410 | 403 |
|
411 | | - Decoder decoder = new Decoder(new CHMCache(), mmap, 0); |
412 | | - InvalidDatabaseException ex = assertThrows( |
| 404 | + Decoder decoder = new Decoder(new CHMCache(), buffer, 0); |
| 405 | + InvalidDatabaseException ex = assertThrows( |
413 | 406 | InvalidDatabaseException.class, |
414 | 407 | () -> decoder.decode(0, String.class)); |
415 | | - assertThat(ex.getMessage(), |
| 408 | + assertThat(ex.getMessage(), |
416 | 409 | containsString("The MaxMind DB file's data section contains bad data")); |
417 | | - } |
418 | 410 | } |
419 | 411 |
|
420 | 412 | private static <T> void testTypeDecoding(Type type, Map<T, byte[]> tests) |
421 | | - throws IOException { |
| 413 | + throws IOException { |
422 | 414 | NodeCache cache = new CHMCache(); |
423 | 415 |
|
424 | 416 | for (Map.Entry<T, byte[]> entry : tests.entrySet()) { |
425 | 417 | T expect = entry.getKey(); |
426 | 418 | byte[] input = entry.getValue(); |
427 | 419 |
|
428 | 420 | String desc = "decoded " + type.name() + " - " + expect; |
429 | | - try (FileChannel fc = DecoderTest.getFileChannel(input)) { |
430 | | - MappedByteBuffer mmap = fc.map(MapMode.READ_ONLY, 0, fc.size()); |
431 | | - |
432 | | - Decoder decoder = new TestDecoder(cache, mmap, 0); |
433 | | - |
434 | | - switch (type) { |
435 | | - case BYTES: |
436 | | - assertArrayEquals((byte[]) expect, decoder.decode(0, byte[].class), desc); |
437 | | - break; |
438 | | - case ARRAY: |
439 | | - assertEquals(expect, decoder.decode(0, List.class), desc); |
440 | | - break; |
441 | | - case UINT16: |
442 | | - case INT32: |
443 | | - assertEquals(expect, decoder.decode(0, Integer.class), desc); |
444 | | - break; |
445 | | - case UINT32: |
446 | | - case POINTER: |
447 | | - assertEquals(expect, decoder.decode(0, Long.class), desc); |
448 | | - break; |
449 | | - case UINT64: |
450 | | - case UINT128: |
451 | | - assertEquals(expect, decoder.decode(0, BigInteger.class), desc); |
452 | | - break; |
453 | | - case DOUBLE: |
454 | | - assertEquals(expect, decoder.decode(0, Double.class), desc); |
455 | | - break; |
456 | | - case FLOAT: |
457 | | - assertEquals(expect, decoder.decode(0, Float.class), desc); |
458 | | - break; |
459 | | - case UTF8_STRING: |
460 | | - assertEquals(expect, decoder.decode(0, String.class), desc); |
461 | | - break; |
462 | | - case BOOLEAN: |
463 | | - assertEquals(expect, decoder.decode(0, Boolean.class), desc); |
464 | | - break; |
465 | | - default: { |
466 | | - // We hit this for Type.MAP. |
467 | | - |
468 | | - Map<?, ?> got = decoder.decode(0, Map.class); |
469 | | - Map<?, ?> expectMap = (Map<?, ?>) expect; |
470 | | - |
471 | | - assertEquals(expectMap.size(), got.size(), desc); |
472 | | - |
473 | | - for (Object keyObject : expectMap.keySet()) { |
474 | | - String key = (String) keyObject; |
475 | | - Object value = expectMap.get(key); |
476 | | - |
477 | | - if (value instanceof Object[]) { |
478 | | - assertArrayEquals((Object[]) value, (Object[]) got.get(key), desc); |
479 | | - } else { |
480 | | - assertEquals(value, got.get(key), desc); |
481 | | - } |
| 421 | + ByteBuffer buffer = ByteBuffer.wrap(input); |
| 422 | + |
| 423 | + Decoder decoder = new TestDecoder(cache, buffer, 0); |
| 424 | + |
| 425 | + switch (type) { |
| 426 | + case BYTES: |
| 427 | + assertArrayEquals((byte[]) expect, decoder.decode(0, byte[].class), desc); |
| 428 | + break; |
| 429 | + case ARRAY: |
| 430 | + assertEquals(expect, decoder.decode(0, List.class), desc); |
| 431 | + break; |
| 432 | + case UINT16: |
| 433 | + case INT32: |
| 434 | + assertEquals(expect, decoder.decode(0, Integer.class), desc); |
| 435 | + break; |
| 436 | + case UINT32: |
| 437 | + case POINTER: |
| 438 | + assertEquals(expect, decoder.decode(0, Long.class), desc); |
| 439 | + break; |
| 440 | + case UINT64: |
| 441 | + case UINT128: |
| 442 | + assertEquals(expect, decoder.decode(0, BigInteger.class), desc); |
| 443 | + break; |
| 444 | + case DOUBLE: |
| 445 | + assertEquals(expect, decoder.decode(0, Double.class), desc); |
| 446 | + break; |
| 447 | + case FLOAT: |
| 448 | + assertEquals(expect, decoder.decode(0, Float.class), desc); |
| 449 | + break; |
| 450 | + case UTF8_STRING: |
| 451 | + assertEquals(expect, decoder.decode(0, String.class), desc); |
| 452 | + break; |
| 453 | + case BOOLEAN: |
| 454 | + assertEquals(expect, decoder.decode(0, Boolean.class), desc); |
| 455 | + break; |
| 456 | + default: { |
| 457 | + // We hit this for Type.MAP. |
| 458 | + |
| 459 | + Map<?, ?> got = decoder.decode(0, Map.class); |
| 460 | + Map<?, ?> expectMap = (Map<?, ?>) expect; |
| 461 | + |
| 462 | + assertEquals(expectMap.size(), got.size(), desc); |
| 463 | + |
| 464 | + for (Object keyObject : expectMap.keySet()) { |
| 465 | + String key = (String) keyObject; |
| 466 | + Object value = expectMap.get(key); |
| 467 | + |
| 468 | + if (value instanceof Object[]) { |
| 469 | + assertArrayEquals((Object[]) value, (Object[]) got.get(key), desc); |
| 470 | + } else { |
| 471 | + assertEquals(value, got.get(key), desc); |
482 | 472 | } |
483 | 473 | } |
484 | 474 | } |
485 | 475 | } |
486 | 476 | } |
487 | 477 | } |
488 | 478 |
|
489 | | - /* |
490 | | - * I really didn't want to create temporary files for these tests, but it is |
491 | | - * pretty hard to abstract away from the file io system in a way that is |
492 | | - * Java 6 compatible |
493 | | - */ |
494 | | - private static FileChannel getFileChannel(byte[] data) throws IOException { |
495 | | - File file = File.createTempFile(UUID.randomUUID().toString(), "tmp"); |
496 | | - file.deleteOnExit(); |
497 | | - RandomAccessFile raf = new RandomAccessFile(file, "rw"); |
498 | | - FileChannel fc = raf.getChannel(); |
499 | | - fc.write(ByteBuffer.wrap(data)); |
500 | | - raf.close(); |
501 | | - fc.close(); |
502 | | - raf = new RandomAccessFile(file, "r"); |
503 | | - return raf.getChannel(); |
504 | | - } |
505 | | - |
506 | 479 | } |
0 commit comments