You are here

public function FileMetadataExifTest::testJpegExifSaveToFile in File metadata manager 8.2

Same name and namespace in other branches
  1. 8 file_mdm_exif/tests/src/Kernel/FileMetadataExifTest.php \Drupal\Tests\file_mdm_exif\Kernel\FileMetadataExifTest::testJpegExifSaveToFile()

Test writing metadata to JPEG file.

File

file_mdm_exif/tests/src/Kernel/FileMetadataExifTest.php, line 170

Class

FileMetadataExifTest
Tests that File Metadata EXIF plugin works properly.

Namespace

Drupal\Tests\file_mdm_exif\Kernel

Code

public function testJpegExifSaveToFile() {
  $fmdm = $this->container
    ->get('file_metadata_manager');

  // Copy test file to public://.
  $this->fileSystem
    ->copy(drupal_get_path('module', 'image_effects') . '/tests/images/portrait-painting.jpg', 'public://', FileSystemInterface::EXISTS_REPLACE);
  $file_uri = 'public://portrait-painting.jpg';
  $file_metadata = $fmdm
    ->uri($file_uri);

  // Check values via exif_read_data before operations.
  $data = @exif_read_data($file_uri);
  $this
    ->assertEquals(8, $data['Orientation']);
  $this
    ->assertFalse(isset($data['Artist']));
  $this
    ->assertEquals('Canon', $data['Make']);
  $this
    ->assertEquals(800, $data['ISOSpeedRatings']);

  // Change the Orientation tag from IFD0.
  $this
    ->assertEquals(8, $file_metadata
    ->getMetadata('exif', 'orientation')['value']);
  $data['Orientation'] = 4;
  $this
    ->assertTrue($file_metadata
    ->setMetadata('exif', 'orientation', $data['Orientation']));
  $this
    ->assertEquals($data['Orientation'], $file_metadata
    ->getMetadata('exif', 'orientation')['value']);

  // Add the Artist tag to IFD0.
  $data['Artist'] = 'shot by foo!';
  $this
    ->assertEquals(47, $this
    ->countMetadataKeys($file_metadata, 'exif'));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', 'artist'));
  $artist_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag('artist');
  $artist = new PelEntryAscii($artist_tag['tag'], $data['Artist']);
  $file_metadata
    ->setMetadata('exif', 'artist', $artist);
  $this
    ->assertEquals($data['Artist'], $file_metadata
    ->getMetadata('exif', 'artist')['value']);
  $this
    ->assertEquals(48, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Setting an unknown tag leads to failure.
  $this
    ->assertFalse($file_metadata
    ->setMetadata('exif', 'bar', 'qux'));

  // Remove the ResolutionUnit tag from IFD0.
  unset($data['ResolutionUnit']);
  $this
    ->assertEquals(2, $file_metadata
    ->getMetadata('exif', 'ResolutionUnit')['value']);
  $this
    ->assertTrue($file_metadata
    ->removeMetadata('exif', 'ResolutionUnit'));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', 'ResolutionUnit'));
  $this
    ->assertEquals(47, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Add the ImageDescription tag to IFD1.
  $data['THUMBNAIL']['ImageDescription'] = 'awesome!';
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', [
    1,
    'imagedescription',
  ]));
  $desc_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag([
    1,
    'imagedescription',
  ]);
  $desc = new PelEntryAscii($desc_tag['tag'], $data['THUMBNAIL']['ImageDescription']);
  $file_metadata
    ->setMetadata('exif', [
    1,
    'imagedescription',
  ], $desc);
  $this
    ->assertEquals($data['THUMBNAIL']['ImageDescription'], $file_metadata
    ->getMetadata('exif', [
    1,
    'imagedescription',
  ])['value']);
  $this
    ->assertEquals(48, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Remove the Compression tag from IFD1.
  unset($data['THUMBNAIL']['Compression']);
  $this
    ->assertEquals(6, $file_metadata
    ->getMetadata('exif', [
    1,
    'compression',
  ])['value']);
  $this
    ->assertTrue($file_metadata
    ->removeMetadata('exif', [
    1,
    'compression',
  ]));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', [
    1,
    'compression',
  ]));
  $this
    ->assertEquals(47, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Add the BrightnessValue tag to EXIF.
  $data['BrightnessValue'] = '12/4';
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', [
    'exif',
    'brightnessvalue',
  ]));
  $brightness_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag([
    'exif',
    'brightnessvalue',
  ]);
  $brightness = new PelEntrySRational($brightness_tag['tag'], [
    12,
    4,
  ]);
  $file_metadata
    ->setMetadata('exif', [
    'exif',
    'brightnessvalue',
  ], $brightness);
  $this
    ->assertEquals($data['BrightnessValue'], $file_metadata
    ->getMetadata('exif', [
    'exif',
    'brightnessvalue',
  ])['text']);
  $this
    ->assertEquals(48, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Remove the ISOSpeedRatings tag from EXIF.
  unset($data['ISOSpeedRatings']);
  $this
    ->assertEquals(800, $file_metadata
    ->getMetadata('exif', [
    'exif',
    'isospeedratings',
  ])['value']);
  $this
    ->assertTrue($file_metadata
    ->removeMetadata('exif', [
    'exif',
    'isospeedratings',
  ]));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', [
    'exif',
    'isospeedratings',
  ]));
  $this
    ->assertEquals(47, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Add the RelatedImageFileFormat tag to INTEROP.
  $data['RelatedFileFormat'] = 'qux';
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', [
    'interop',
    'RelatedImageFileFormat',
  ]));
  $ff_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag([
    'interop',
    'RelatedImageFileFormat',
  ]);
  $ff = new PelEntryAscii($ff_tag['tag'], $data['RelatedFileFormat']);
  $file_metadata
    ->setMetadata('exif', [
    'interop',
    'RelatedImageFileFormat',
  ], $ff);
  $this
    ->assertEquals($data['RelatedFileFormat'], $file_metadata
    ->getMetadata('exif', [
    'interop',
    'RelatedImageFileFormat',
  ])['text']);
  $this
    ->assertEquals(48, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Remove the InteroperabilityIndex tag from INTEROP.
  unset($data['InterOperabilityIndex']);
  $this
    ->assertEquals('R98', $file_metadata
    ->getMetadata('exif', [
    'interop',
    'InteroperabilityIndex',
  ])['value']);
  $this
    ->assertTrue($file_metadata
    ->removeMetadata('exif', [
    'interop',
    'InteroperabilityIndex',
  ]));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', [
    'interop',
    'InteroperabilityIndex',
  ]));
  $this
    ->assertEquals(47, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Add Longitude/Latitude tags to GPS.
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', 'GPSLatitudeRef'));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', 'GPSLatitude'));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', 'GPSLongitudeRef'));
  $this
    ->assertNull($file_metadata
    ->getMetadata('exif', 'GPSLongitude'));
  $atr_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag('GPSLatitudeRef');
  $at_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag('GPSLatitude');
  $otr_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag('GPSLongitudeRef');
  $ot_tag = $this->container
    ->get('file_mdm_exif.tag_mapper')
    ->resolveKeyToIfdAndTag('GPSLongitude');
  $data['GPSLatitudeRef'] = 'N';
  $atr = new PelEntryAscii($atr_tag['tag'], $data['GPSLatitudeRef']);
  $data['GPSLatitude'] = [
    '46/1',
    '37/1',
    '59448/10000',
  ];
  $at = new PelEntryRational($at_tag['tag'], [
    46,
    1,
  ], [
    37,
    1,
  ], [
    59448,
    10000,
  ]);
  $data['GPSLongitudeRef'] = 'E';
  $otr = new PelEntryAscii($otr_tag['tag'], $data['GPSLongitudeRef']);
  $data['GPSLongitude'] = [
    '12/1',
    '17/1',
    '488112/10000',
  ];
  $ot = new PelEntryRational($ot_tag['tag'], [
    12,
    1,
  ], [
    17,
    1,
  ], [
    488112,
    10000,
  ]);
  $file_metadata
    ->setMetadata('exif', 'GPSLatitudeRef', $atr);
  $file_metadata
    ->setMetadata('exif', 'GPSLatitude', $at);
  $file_metadata
    ->setMetadata('exif', 'GPSLongitudeRef', $otr);
  $file_metadata
    ->setMetadata('exif', 'GPSLongitude', $ot);
  $this
    ->assertEquals($data['GPSLatitudeRef'], $file_metadata
    ->getMetadata('exif', 'GPSLatitudeRef')['text']);
  $this
    ->assertEquals('46° 37\' 5.9448" (46.62°)', $file_metadata
    ->getMetadata('exif', 'GPSLatitude')['text']);
  $this
    ->assertEquals($data['GPSLongitudeRef'], $file_metadata
    ->getMetadata('exif', 'GPSLongitudeRef')['text']);
  $this
    ->assertEquals('12° 17\' 48.8112" (12.30°)', $file_metadata
    ->getMetadata('exif', 'GPSLongitude')['text']);
  $this
    ->assertEquals(51, $this
    ->countMetadataKeys($file_metadata, 'exif'));

  // Save metadata to file.
  $this
    ->assertTrue($file_metadata
    ->saveMetadataToFile('exif'));

  // Check results via exif_read_data. A complete check would be through
  // $this->assertEquals($data, $data_reloaded).
  $data_reloaded = @exif_read_data($file_uri);
  $this
    ->assertEquals($data['Orientation'], $data_reloaded['Orientation']);
  $this
    ->assertEquals($data['Artist'], $data_reloaded['Artist']);
  $this
    ->assertFalse(isset($data_reloaded['ResolutionUnit']));
  $this
    ->assertEquals($data['THUMBNAIL']['ImageDescription'], $data_reloaded['THUMBNAIL']['ImageDescription']);
  $this
    ->assertFalse(isset($data_reloaded['THUMBNAIL']['Compression']));
  $this
    ->assertEquals($data['BrightnessValue'], $data_reloaded['BrightnessValue']);
  $this
    ->assertFalse(isset($data_reloaded['ISOSpeedRatings']));
  $this
    ->assertEquals($data['RelatedFileFormat'], $data_reloaded['RelatedFileFormat']);
  $this
    ->assertFalse(isset($data_reloaded['InterOperabilityIndex']));
  $this
    ->assertEquals($data['GPSLatitudeRef'], $data_reloaded['GPSLatitudeRef']);
  $this
    ->assertEquals($data['GPSLatitude'], $data_reloaded['GPSLatitude']);
  $this
    ->assertEquals($data['GPSLongitudeRef'], $data_reloaded['GPSLongitudeRef']);
  $this
    ->assertEquals($data['GPSLongitude'], $data_reloaded['GPSLongitude']);

  // Test writing metadata to a file that has no EXIF info.
  $this->fileSystem
    ->copy('core/tests/fixtures/files/image-2.jpg', 'public://', FileSystemInterface::EXISTS_REPLACE);
  $test_2 = $fmdm
    ->uri('public://image-2.jpg');
  $this
    ->assertEquals(0, $this
    ->countMetadataKeys($test_2, 'exif'));

  // Load EXIF metadata from previous file processed.
  $test_2
    ->loadMetadata('exif', $file_metadata
    ->getMetadata('exif'));

  // Save metadata to file.
  $this
    ->assertTrue($test_2
    ->saveMetadataToFile('exif'));
  $this
    ->assertEquals(51, $this
    ->countMetadataKeys($test_2, 'exif'));

  // Check results via exif_read_data. A complete check would be through
  // $this->assertEquals($data, $data_reloaded).
  $data_reloaded = @exif_read_data('public://image-2.jpg');
  $this
    ->assertEquals($data['Orientation'], $data_reloaded['Orientation']);
  $this
    ->assertEquals($data['Artist'], $data_reloaded['Artist']);
  $this
    ->assertEquals($data['THUMBNAIL']['ImageDescription'], $data_reloaded['THUMBNAIL']['ImageDescription']);
  $this
    ->assertEquals($data['BrightnessValue'], $data_reloaded['BrightnessValue']);
  $this
    ->assertEquals($data['RelatedFileFormat'], $data_reloaded['RelatedFileFormat']);
  $this
    ->assertEquals($data['GPSLatitudeRef'], $data_reloaded['GPSLatitudeRef']);
  $this
    ->assertEquals($data['GPSLatitude'], $data_reloaded['GPSLatitude']);
  $this
    ->assertEquals($data['GPSLongitudeRef'], $data_reloaded['GPSLongitudeRef']);
  $this
    ->assertEquals($data['GPSLongitude'], $data_reloaded['GPSLongitude']);

  // Check that after save, file metadata is retrieved from file first time,
  // then from cache in further requests.
  $file_metadata = NULL;
  $this
    ->assertTrue($fmdm
    ->release($file_uri));
  $file_metadata = $fmdm
    ->uri($file_uri);
  $this
    ->assertEquals(51, $this
    ->countMetadataKeys($file_metadata, 'exif'));
  $this
    ->assertSame(FileMetadataInterface::LOADED_FROM_FILE, $file_metadata
    ->isMetadataLoaded('exif'));
  $file_metadata = NULL;
  $this
    ->assertTrue($fmdm
    ->release($file_uri));
  $file_metadata = $fmdm
    ->uri($file_uri);
  $this
    ->assertEquals(51, $this
    ->countMetadataKeys($file_metadata, 'exif'));
  $this
    ->assertSame(FileMetadataInterface::LOADED_FROM_CACHE, $file_metadata
    ->isMetadataLoaded('exif'));
}