+ /**
+ * Test legacy arguments handling.
+ *
+ * @todo remove in 8.x-3.0.
+ *
+ * @group legacy
+ */
+ public function testArgumentsLegacy() {
+ $this->setUpToolkit('imagemagick');
+
+ // Prepare a copy of test files.
+ $this->getTestFiles('image');
+
+ $image_uri = "public://image-test.png";
+ $image = $this->imageFactory->get($image_uri);
+ if (!$image->isValid()) {
+ $this->fail("Could not load image $image_uri.");
+ }
+
+ // Setup a list of arguments.
+ $image->getToolkit()->addArgument("-resize 100x75!");
+ // Internal argument.
+ $image->getToolkit()->addArgument(">!>INTERNAL");
+ $image->getToolkit()->addArgument("-quality 75");
+ $image->getToolkit()->prependArgument("-hoxi 76");
+
+ // Use methods introduced in 8.x-2.3.
+ $image->getToolkit()->arguments()
+ // Pre source argument.
+ ->add("-density 25", ImagemagickExecArguments::PRE_SOURCE)
+ // Another internal argument.
+ ->add("GATEAU", ImagemagickExecArguments::INTERNAL)
+ // Another pre source argument.
+ ->add("-auchocolat 90", ImagemagickExecArguments::PRE_SOURCE)
+ // Add two arguments with additional info.
+ ->add(
+ "-addz 150",
+ ImagemagickExecArguments::POST_SOURCE,
+ ImagemagickExecArguments::APPEND,
+ [
+ 'foo' => 'bar',
+ 'qux' => 'der',
+ ]
+ )
+ ->add(
+ "-addz 200",
+ ImagemagickExecArguments::POST_SOURCE,
+ ImagemagickExecArguments::APPEND,
+ [
+ 'wey' => 'lod',
+ 'foo' => 'bar',
+ ]
+ );
+
+ // Test find arguments skipping identifiers.
+ $this->assertSame([
+ 0 => '-hoxi 76',
+ 1 => '-resize 100x75!',
+ 2 => '>!>INTERNAL',
+ 3 => '-quality 75',
+ 5 => '>!>GATEAU',
+ 7 => '-addz 150',
+ 8 => '-addz 200',
+ ], $image->getToolkit()->getArguments());
+ $this->assertSame([2], array_keys($image->getToolkit()->arguments()->find('/^INTERNAL/')));
+ $this->assertSame([5], array_keys($image->getToolkit()->arguments()->find('/^GATEAU/')));
+ $this->assertSame([6], array_keys($image->getToolkit()->arguments()->find('/^\-auchocolat/')));
+ $this->assertSame([7, 8], array_keys($image->getToolkit()->arguments()->find('/^\-addz/')));
+ $this->assertSame([7, 8], array_keys($image->getToolkit()->arguments()->find('/.*/', NULL, ['foo' => 'bar'])));
+ $this->assertSame([], $image->getToolkit()->arguments()->find('/.*/', NULL, ['arw' => 'moo']));
+ $this->assertSame(2, $image->getToolkit()->findArgument('>!>INTERNAL'));
+ $this->assertSame(5, $image->getToolkit()->findArgument('>!>GATEAU'));
+ $this->assertFalse($image->getToolkit()->findArgument('-auchocolat'));
+
+ // Check resulting command line strings.
+ $this->assertSame('-density 25 -auchocolat 90', $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::PRE_SOURCE));
+ $this->assertSame("-hoxi 76 -resize 100x75! -quality 75 -addz 150 -addz 200", $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::POST_SOURCE));
+ $this->assertSame("-hoxi 76 -resize 100x75! -quality 75 -addz 150 -addz 200", $image->getToolkit()->getStringForBinary());
+ }
+
+ /**
+ * Test arguments handling.
+ */
+ public function testArguments() {
+ $this->setUpToolkit('imagemagick');
+
+ // Prepare a copy of test files.
+ $this->getTestFiles('image');
+
+ $image_uri = "public://image-test.png";
+ $image = $this->imageFactory->get($image_uri);
+ if (!$image->isValid()) {
+ $this->fail("Could not load image $image_uri.");
+ }
+
+ // Setup a list of arguments.
+ $image->getToolkit()->arguments()
+ ->add("-resize 100x75!")
+ // Internal argument.
+ ->add("INTERNAL", ImagemagickExecArguments::INTERNAL)
+ ->add("-quality 75")
+ // Prepend argument.
+ ->add("-hoxi 76", ImagemagickExecArguments::POST_SOURCE, 0)
+ // Pre source argument.
+ ->add("-density 25", ImagemagickExecArguments::PRE_SOURCE)
+ // Another internal argument.
+ ->add("GATEAU", ImagemagickExecArguments::INTERNAL)
+ // Another pre source argument.
+ ->add("-auchocolat 90", ImagemagickExecArguments::PRE_SOURCE)
+ // Add two arguments with additional info.
+ ->add(
+ "-addz 150",
+ ImagemagickExecArguments::POST_SOURCE,
+ ImagemagickExecArguments::APPEND,
+ [
+ 'foo' => 'bar',
+ 'qux' => 'der',
+ ]
+ )
+ ->add(
+ "-addz 200",
+ ImagemagickExecArguments::POST_SOURCE,
+ ImagemagickExecArguments::APPEND,
+ [
+ 'wey' => 'lod',
+ 'foo' => 'bar',
+ ]
+ );
+
+ // Test find arguments skipping identifiers.
+ $this->assertSame([2], array_keys($image->getToolkit()->arguments()->find('/^INTERNAL/')));
+ $this->assertSame([5], array_keys($image->getToolkit()->arguments()->find('/^GATEAU/')));
+ $this->assertSame([6], array_keys($image->getToolkit()->arguments()->find('/^\-auchocolat/')));
+ $this->assertSame([7, 8], array_keys($image->getToolkit()->arguments()->find('/^\-addz/')));
+ $this->assertSame([7, 8], array_keys($image->getToolkit()->arguments()->find('/.*/', NULL, ['foo' => 'bar'])));
+ $this->assertSame([], $image->getToolkit()->arguments()->find('/.*/', NULL, ['arw' => 'moo']));
+
+ // Check resulting command line strings.
+ $this->assertSame('-density 25 -auchocolat 90', $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::PRE_SOURCE));
+ $this->assertSame("-hoxi 76 -resize 100x75! -quality 75 -addz 150 -addz 200", $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::POST_SOURCE));
+
+ // Add arguments with a specific index.
+ $image->getToolkit()->arguments()
+ ->add("-ix aa", ImagemagickExecArguments::POST_SOURCE, 4)
+ ->add("-ix bb", ImagemagickExecArguments::POST_SOURCE, 4);
+ $this->assertSame([4, 5], array_keys($image->getToolkit()->arguments()->find('/^\-ix/')));
+ $this->assertSame("-hoxi 76 -resize 100x75! -quality 75 -ix bb -ix aa -addz 150 -addz 200", $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::POST_SOURCE));
+
+ // Create a new image and inspect the arguments.
+ $image->createNew(100, 200);
+ $this->assertSame([0], array_keys($image->getToolkit()->arguments()->find('/^./', NULL, ['image_toolkit_operation' => 'create_new'])));
+ $this->assertSame([0], array_keys($image->getToolkit()->arguments()->find('/^./', NULL, ['image_toolkit_operation_plugin_id' => 'imagemagick_create_new'])));
+ $this->assertSame("-size 100x200 xc:transparent", $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::POST_SOURCE));
+ }
+
+ /**
+ * Test module arguments alter hook.
+ */
+ public function testArgumentsAlterHook() {
+ $this->setUpToolkit('imagemagick');
+
+ $fmdm = $this->container->get('file_metadata_manager');
+
+ // Change the Advanced Colorspace setting, must be included in the command
+ // line.
+ \Drupal::configFactory()->getEditable('imagemagick.settings')
+ ->set('advanced.colorspace', 'GRAY')
+ ->save();
+
+ // Prepare a copy of test files.
+ $this->getTestFiles('image');
+ $image_uri = "public://image-test.png";
+ $image = $this->imageFactory->get($image_uri);
+ if (!$image->isValid()) {
+ $this->fail("Could not load image $image_uri.");
+ }
+
+ // Check the source colorspace.
+ $this->assertSame('SRGB', $image->getToolkit()->getColorspace());
+
+ // Setup a list of arguments.
+ $image->getToolkit()->arguments()
+ ->add("-resize 100x75!")
+ ->add("-quality 75");
+
+ // Save the derived image.
+ $image->save($image_uri . '.derived');
+
+ // Check expected command line.
+ if (substr(PHP_OS, 0, 3) === 'WIN') {
+ $expected = "-resize 100x75! -quality 75 -colorspace \"GRAY\"";
+ }
+ else {
+ $expected = "-resize 100x75! -quality 75 -colorspace 'GRAY'";
+ }
+ $this->assertSame($expected, $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::POST_SOURCE));
+
+ // Check that the colorspace has been actually changed in the file.
+ Cache::InvalidateTags([
+ 'config:imagemagick.file_metadata_plugin.imagemagick_identify',
+ ]);
+ $fmdm->release($image_uri . '.derived');
+ $image_md = $fmdm->uri($image_uri . '.derived');
+ $image = $this->imageFactory->get($image_uri . '.derived');
+ $this->assertIdentical(FileMetadataInterface::LOADED_FROM_FILE, $image_md->isMetadataLoaded('imagemagick_identify'));
+ $this->assertSame('GRAY', $image->getToolkit()->getColorspace());
+
+ // Change the Prepend settings, must be included in the command line.
+ // Once before the source image.
+ \Drupal::configFactory()->getEditable('imagemagick.settings')
+ ->set('prepend', '-debug All')
+ ->set('prepend_pre_source', TRUE)
+ ->save();
+ $image = $this->imageFactory->get($image_uri);
+ $image->getToolkit()->arguments()
+ ->add("-resize 100x75!")
+ ->add("-quality 75");
+ $image->save($image_uri . '.derived');
+ if (substr(PHP_OS, 0, 3) === 'WIN') {
+ $expected = "-resize 100x75! -quality 75 -colorspace \"GRAY\"";
+ }
+ else {
+ $expected = "-resize 100x75! -quality 75 -colorspace 'GRAY'";
+ }
+ $this->assertSame('-debug All', $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::PRE_SOURCE));
+ $this->assertSame($expected, $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::POST_SOURCE));
+ // Then after the source image.
+ \Drupal::configFactory()->getEditable('imagemagick.settings')
+ ->set('prepend_pre_source', FALSE)
+ ->save();
+ $image = $this->imageFactory->get($image_uri);
+ $image->getToolkit()->arguments()
+ ->add("-resize 100x75!")
+ ->add("-quality 75");
+ $image->save($image_uri . '.derived');
+ if (substr(PHP_OS, 0, 3) === 'WIN') {
+ $expected = "-debug All -resize 100x75! -quality 75 -colorspace \"GRAY\"";
+ }
+ else {
+ $expected = "-debug All -resize 100x75! -quality 75 -colorspace 'GRAY'";
+ }
+ $this->assertSame('', $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::PRE_SOURCE));
+ $this->assertSame($expected, $image->getToolkit()->arguments()->toString(ImagemagickExecArguments::POST_SOURCE));
+ }
+
+ /**
+ * Test missing command on ExecManager.
+ */
+ public function testExecManagerCommandNotFound() {
+ $exec_manager = \Drupal::service('imagemagick.exec_manager');
+ $output = '';
+ $error = '';
+ $expected = substr(PHP_OS, 0, 3) !== 'WIN' ? 127 : 1;
+ $ret = $exec_manager->runOsShell('pinkpanther', '-inspector Clouseau', 'blake', $output, $error);
+ $this->assertEquals($expected, $ret, $error);
+ }
+
+ /**
+ * Test timeout on ExecManager.
+ */
+ public function testExecManagerTimeout() {
+ $exec_manager = \Drupal::service('imagemagick.exec_manager');
+ $output = '';
+ $error = '';
+ $expected = substr(PHP_OS, 0, 3) !== 'WIN' ? 143 : 1;
+ // Set a short timeout (1 sec.) and run a process that is expected to last
+ // longer (10 secs.). Should return a 'terminate' exit code.
+ $exec_manager->setTimeout(1);
+ $ret = $exec_manager->runOsShell('sleep', '10', 'sleep', $output, $error);
+ $this->assertEquals($expected, $ret, $error);
+ }
+