@Test
public void testGetNitfBinaryContent()
    throws MimeTypeParseException, NitfFormatException, IOException, NoSuchMethodException,
        IllegalAccessException, InvocationTargetException, InstantiationException,
        InterruptedException {

  // 200000N0200000E 200000N0400000E
  // 000000N0200000E 000000N0400000E
  int originalWidth = 200;
  int originalHeight = 100;
  int chipX = 20;
  int chipY = 10;
  int chipWidth = 160;
  int chipHeight = 80;
  // assume original image is 200x100, chip is 20x10/160x80
  BufferedImage chipImage =
      new BufferedImage(chipWidth, chipHeight, BufferedImage.TYPE_3BYTE_BGR);
  FileSecurityMetadata fileSecurityMetadata = createFileSecurityMetadata();
  DateTime dateTime = DateTimeImpl.getNitfDateTimeForNow();
  NitfHeader nitfHeader = getNitfHeader(fileSecurityMetadata, dateTime);
  ImageCoordinates imageCoordinates = getImageCoordinates();
  SecurityMetadata imageSecurityMetadata = getImageSecurityMetadata();
  ImageSegment imageSegment =
      getImageSegment(
          originalWidth, originalHeight, dateTime, imageCoordinates, imageSecurityMetadata);
  DataSource dataSource = getDataSource(nitfHeader, Collections.singletonList(imageSegment));
  Constructor<NitfSegmentsFlowImpl> constructor;
  constructor =
      NitfSegmentsFlowImpl.class.getDeclaredConstructor(DataSource.class, Runnable.class);
  constructor.setAccessible(true);
  NitfSegmentsFlow nitfSegmentsFlow = constructor.newInstance(dataSource, (Runnable) () -> {});
  BinaryContent binaryContent =
      catalogOutputAdapter.getNitfBinaryContent(chipImage, nitfSegmentsFlow, chipX, chipY);
  NitfSegmentsFlow chipNitfSegmentFlow =
      new NitfParserInputFlowImpl().inputStream(binaryContent.getInputStream()).allData();
  assertThat(chipNitfSegmentFlow, notNullValue());
  chipNitfSegmentFlow.fileHeader(
      nh -> {
        assertThat(nh.getFileType(), is(FileType.NITF_TWO_ONE));
        assertThat(nh.getFileTitle(), is("FileTitle"));
        assertThat(nh.getStandardType(), is("BF01"));
        assertThat(nh.getOriginatingStationId(), is("U21SOO90"));
        assertThat(nh.getFileBackgroundColour().getRed(), is((byte) 0));
        assertThat(nh.getFileBackgroundColour().getGreen(), is((byte) 0));
        assertThat(nh.getFileBackgroundColour().getBlue(), is((byte) 0));
        assertThat(nh.getFileDateTime(), notNullValue());
        assertThat(nh.getOriginatorsName(), is("W.TEMPEL"));
        assertThat(nh.getOriginatorsPhoneNumber(), is("44 1480 84 5611"));
        assertThat(
            nh.getFileSecurityMetadata().getSecurityClassification(),
            is(SecurityClassification.UNCLASSIFIED));
        assertThat(nh.getFileSecurityMetadata().getSecurityClassificationSystem(), is("AB"));
        assertThat(nh.getFileSecurityMetadata().getCodewords(), is("ABCDEFGHIJK"));
        assertThat(nh.getFileSecurityMetadata().getControlAndHandling(), is("AB"));
        assertThat(
            nh.getFileSecurityMetadata().getReleaseInstructions(), is("01234567890123456789"));
        assertThat(nh.getFileSecurityMetadata().getDeclassificationType(), is("DD"));
        assertThat(nh.getFileSecurityMetadata().getDeclassificationDate(), is("20160101"));
        assertThat(nh.getFileSecurityMetadata().getDeclassificationExemption(), is("abcd"));
        assertThat(nh.getFileSecurityMetadata().getDowngrade(), is("S"));
        assertThat(nh.getFileSecurityMetadata().getDowngradeDate(), is("20160202"));
        assertThat(nh.getFileSecurityMetadata().getClassificationText(), is("classtext"));
        assertThat(nh.getFileSecurityMetadata().getClassificationAuthorityType(), is("O"));
        assertThat(nh.getFileSecurityMetadata().getClassificationAuthority(), is("MyAuthority"));
        assertThat(nh.getFileSecurityMetadata().getClassificationReason(), is("A"));
        assertThat(nh.getFileSecurityMetadata().getSecuritySourceDate(), is("20160303"));
        assertThat(
            nh.getFileSecurityMetadata().getSecurityControlNumber(), is("012345678901234"));
        assertThat(nh.getFileSecurityMetadata().getFileCopyNumber(), is("99999"));
        assertThat(nh.getFileSecurityMetadata().getFileNumberOfCopies(), is("99999"));
      });
  chipNitfSegmentFlow.forEachImageSegment(
      imageSegment1 -> {
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinate00().getLongitude(),
            closeTo(22, 0.01));
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinate00().getLatitude(),
            closeTo(18, 0.01));
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinate0MaxCol().getLongitude(),
            closeTo(38, 0.01));
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinate0MaxCol().getLatitude(),
            closeTo(18, 0.01));
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinateMaxRowMaxCol().getLongitude(),
            closeTo(38, 0.01));
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinateMaxRowMaxCol().getLatitude(),
            closeTo(2, 0.01));
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinateMaxRow0().getLongitude(),
            closeTo(22, 0.01));
        assertThat(
            imageSegment1.getImageCoordinates().getCoordinateMaxRow0().getLatitude(),
            closeTo(2, 0.01));
        assertThat(imageSegment1.getNumberOfColumns(), is((long) chipWidth));
        assertThat(imageSegment1.getNumberOfRows(), is((long) chipHeight));
        assertThat(imageSegment1.getImageCategory(), is(ImageCategory.UNKNOWN));
        assertThat(imageSegment1.getImageComments(), is(Collections.singletonList("MyComment")));
        assertThat(imageSegment1.getIdentifier(), is("0123456789"));
        assertThat(imageSegment1.getImageIdentifier2(), is("abc"));
        assertThat(imageSegment1.getImageMagnification(), is("1.0 "));
        try {
          assertThat(
              imageSegment1.getImageTargetId().textValue(),
              is(new TargetIdImpl("                 ").textValue()));
        } catch (NitfFormatException e) {
          fail(e.getMessage());
        }
        assertThat(imageSegment1.getImageSource(), is(""));
        assertThat(
            imageSegment1.getImageDateTime().getSourceString(), is(dateTime.getSourceString()));
        assertThat(imageSegment1.getImageRepresentation(), is(ImageRepresentation.RGBTRUECOLOUR));
      });
  verify(lock).acquire();
  verify(lock).release();
}