Unverified Commit 07c059ca authored by Alex Pott's avatar Alex Pott
Browse files

fix: #3575096 Remove callable type from BatchBuilder ::addOperation and ::setFinishCallback

By: acbramley
By: nicxvan
By: berdir
By: sivaji_ganesh_jojodae
By: longwave
(cherry picked from commit bec4e5ca)
parent 5c02b602
Loading
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -162,12 +162,12 @@ public function setTitle($title) {
   *
   * This callback will be executed if the batch process is done.
   *
   * @param callable $callback
   * @param callable|string $callback
   *   The callback.
   *
   * @return $this
   */
  public function setFinishCallback(callable $callback) {
  public function setFinishCallback(callable|string $callback) {
    $this->finished = $callback;
    return $this;
  }
@@ -329,14 +329,14 @@ public function setQueue($name, $class) {
  /**
   * Adds a batch operation.
   *
   * @param callable $callback
   * @param callable|string $callback
   *   The name of the callback function.
   * @param array $arguments
   *   An array of arguments to pass to the callback function.
   *
   * @return $this
   */
  public function addOperation(callable $callback, array $arguments = []) {
  public function addOperation(callable|string $callback, array $arguments = []) {
    $this->operations[] = [$callback, $arguments];
    return $this;
  }
+18 −25
Original line number Diff line number Diff line
@@ -27,16 +27,15 @@ public function batch0(): array {
   * Operations: op 1 from 1 to 10.
   */
  public function batch1(): array {
    $batch_test_callbacks = new BatchTestCallbacks();
    // Ensure the batch takes at least two iterations.
    $total = 10;
    $sleep = (int) (1000000 / $total) * 2;

    $batch_builder = (new BatchBuilder())
      ->setFinishCallback([$batch_test_callbacks, 'finished1']);
      ->setFinishCallback(BatchTestCallbacks::class . ':finished1');

    for ($i = 1; $i <= $total; $i++) {
      $batch_builder->addOperation([$batch_test_callbacks, 'callback1'], [$i, $sleep]);
      $batch_builder->addOperation(BatchTestCallbacks::class . ':callback1', [$i, $sleep]);
    }

    return $batch_builder->toArray() + ['batch_test_id' => 'batch1'];
@@ -48,14 +47,13 @@ public function batch1(): array {
   * Operations: op 2 from 1 to 10.
   */
  public function batch2(): array {
    $batch_test_callbacks = new BatchTestCallbacks();
    // Ensure the batch takes at least two iterations.
    $total = 10;
    $sleep = (1000000 / $total) * 2;

    $batch_builder = (new BatchBuilder())
      ->addOperation([$batch_test_callbacks, 'callback2'], [1, $total, $sleep])
      ->setFinishCallback([$batch_test_callbacks, 'finished2']);
      ->addOperation(BatchTestCallbacks::class . ':callback2', [1, $total, $sleep])
      ->setFinishCallback(BatchTestCallbacks::class . ':finished2');

    return $batch_builder->toArray() + ['batch_test_id' => 'batch2'];
  }
@@ -98,19 +96,18 @@ public function batch3(): array {
   * - op 1 from 6 to 10,
   */
  public function batch4(): array {
    $batch_test_callbacks = new BatchTestCallbacks();
    // Ensure the batch takes at least two iterations.
    $total = 10;
    $sleep = (1000000 / $total) * 2;

    $batch_builder = (new BatchBuilder())
      ->setFinishCallback([$batch_test_callbacks, 'finished4']);
      ->setFinishCallback(BatchTestCallbacks::class . ':finished4');
    for ($i = 1; $i <= round($total / 2); $i++) {
      $batch_builder->addOperation([$batch_test_callbacks, 'callback1'], [$i, $sleep]);
      $batch_builder->addOperation(BatchTestCallbacks::class . ':callback1', [$i, $sleep]);
    }
    $batch_builder->addOperation([$batch_test_callbacks, 'nestedBatchCallback'], [[2]]);
    $batch_builder->addOperation(BatchTestCallbacks::class . ':nestedBatchCallback', [[2]]);
    for ($i = round($total / 2) + 1; $i <= $total; $i++) {
      $batch_builder->addOperation([$batch_test_callbacks, 'callback1'], [$i, $sleep]);
      $batch_builder->addOperation(BatchTestCallbacks::class . ':callback1', [$i, $sleep]);
    }

    return $batch_builder->toArray() + ['batch_test_id' => 'batch4'];
@@ -122,15 +119,14 @@ public function batch4(): array {
   * Operations: op 1 from 1 to 10.
   */
  public function batch5(): array {
    $batch_test_callbacks = new BatchTestCallbacks();
    // Ensure the batch takes at least two iterations.
    $total = 10;
    $sleep = (1000000 / $total) * 2;

    $batch_builder = (new BatchBuilder())
      ->setFinishCallback([$batch_test_callbacks, 'finished5']);
      ->setFinishCallback(BatchTestCallbacks::class . ':finished5');
    for ($i = 1; $i <= $total; $i++) {
      $batch_builder->addOperation([$batch_test_callbacks, 'callback5'], [$i, $sleep]);
      $batch_builder->addOperation(BatchTestCallbacks::class . ':callback5', [$i, $sleep]);
    }

    return $batch_builder->toArray() + ['batch_test_id' => 'batch5'];
@@ -142,15 +138,14 @@ public function batch5(): array {
   * Operations: op 6 from 1 to 10.
   */
  public function batch6(): array {
    $batch_test_callbacks = new BatchTestCallbacks();
    // Ensure the batch takes at least two iterations.
    $total = 10;
    $sleep = (1000000 / $total) * 2;

    $batch_builder = (new BatchBuilder())
      ->setFinishCallback([$batch_test_callbacks, 'finished6']);
      ->setFinishCallback(BatchTestCallbacks::class . ':finished6');
    for ($i = 1; $i <= $total; $i++) {
      $batch_builder->addOperation([$batch_test_callbacks, 'callback6'], [$i, $sleep]);
      $batch_builder->addOperation(BatchTestCallbacks::class . ':callback6', [$i, $sleep]);
    }

    return $batch_builder->toArray() + ['batch_test_id' => 'batch6'];
@@ -166,19 +161,18 @@ public function batch6(): array {
   * - op 7 from 6 to 10,
   */
  public function batch7(): array {
    $batch_test_callbacks = new BatchTestCallbacks();
    // Ensure the batch takes at least two iterations.
    $total = 10;
    $sleep = (1000000 / $total) * 2;

    $batch_builder = (new BatchBuilder())
      ->setFinishCallback([$batch_test_callbacks, 'finished7']);
      ->setFinishCallback(BatchTestCallbacks::class . ':finished7');
    for ($i = 1; $i <= $total / 2; $i++) {
      $batch_builder->addOperation([$batch_test_callbacks, 'callback7'], [$i, $sleep]);
      $batch_builder->addOperation(BatchTestCallbacks::class . ':callback7', [$i, $sleep]);
    }
    $batch_builder->addOperation([$batch_test_callbacks, 'nestedBatchCallback'], [[6, 5]]);
    $batch_builder->addOperation(BatchTestCallbacks::class . ':nestedBatchCallback', [[6, 5]]);
    for ($i = ($total / 2) + 1; $i <= $total; $i++) {
      $batch_builder->addOperation([$batch_test_callbacks, 'callback7'], [$i, $sleep]);
      $batch_builder->addOperation(BatchTestCallbacks::class . ':callback7', [$i, $sleep]);
    }

    return $batch_builder->toArray() + ['batch_test_id' => 'batch7'];
@@ -188,10 +182,9 @@ public function batch7(): array {
   * Batch 8: Throws an exception.
   */
  public function batch8(): array {
    $batch_test_callbacks = new BatchTestCallbacks();
    $batch_builder = (new BatchBuilder())
      ->addOperation([$batch_test_callbacks, 'callback8'], [FALSE])
      ->addOperation([$batch_test_callbacks, 'callback8'], [TRUE]);
      ->addOperation(BatchTestCallbacks::class . ':callback8', [FALSE])
      ->addOperation(BatchTestCallbacks::class . ':callback8', [TRUE]);
    return $batch_builder->toArray() + ['batch_test_id' => 'batch8'];
  }

+44 −7
Original line number Diff line number Diff line
@@ -60,12 +60,45 @@ public function testSetTitle(): void {
  /**
   * Tests setFinishCallback().
   */
  public function testSetFinishCallback(): void {
  public function testSetFinishCallbackStaticSingle(): void {
    $batch = (new BatchBuilder())
      ->setFinishCallback('\Drupal\Tests\Core\Batch\BatchBuilderTest::finishedCallback')
      ->setFinishCallback(static::class . ':finishedCallback')
      ->toArray();

    $this->assertEquals('\Drupal\Tests\Core\Batch\BatchBuilderTest::finishedCallback', $batch['finished']);
    $this->assertEquals('Drupal\Tests\Core\Batch\BatchBuilderTest:finishedCallback', $batch['finished']);
  }

  /**
   * Tests setFinishCallback().
   */
  public function testSetFinishCallbackStaticDouble(): void {
    $batch = (new BatchBuilder())
      ->setFinishCallback(static::class . '::finishedCallback')
      ->toArray();

    $this->assertEquals('Drupal\Tests\Core\Batch\BatchBuilderTest::finishedCallback', $batch['finished']);
  }

  /**
   * Tests setFinishCallback().
   */
  public function testSetFinishCallbackString(): void {
    $batch = (new BatchBuilder())
      ->setFinishCallback('Drupal\Tests\Core\Batch\BatchBuilderTest:finishedCallback')
      ->toArray();

    $this->assertEquals('Drupal\Tests\Core\Batch\BatchBuilderTest:finishedCallback', $batch['finished']);
  }

  /**
   * Tests setFinishCallback().
   */
  public function testSetFinishCallbackArray(): void {
    $batch = (new BatchBuilder())
      ->setFinishCallback([static::class, 'finishedCallback'])
      ->toArray();

    $this->assertEquals(['Drupal\Tests\Core\Batch\BatchBuilderTest', 'finishedCallback'], $batch['finished']);
  }

  /**
@@ -219,14 +252,18 @@ public function testAddOperation(): void {
    ], $batch['operations']);

    $batch = $batch_builder
      ->addOperation('\Drupal\Tests\Core\Batch\BatchBuilderTest::operationCallback', [2])
      ->addOperation('\Drupal\Tests\Core\Batch\BatchBuilderTest::operationCallback', [3])
      ->addOperation(static::class . ':operationCallback', [2])
      ->addOperation(static::class . ':operationCallback', [3])
      ->addOperation('Drupal\Tests\Core\Batch\BatchBuilderTest:operationCallback', [4])
      ->addOperation([static::class, 'operationCallback'], [5])
      ->toArray();

    $this->assertEquals([
      ['\Drupal\Tests\Core\Batch\BatchBuilderTest::operationCallback', []],
      ['\Drupal\Tests\Core\Batch\BatchBuilderTest::operationCallback', [2]],
      ['\Drupal\Tests\Core\Batch\BatchBuilderTest::operationCallback', [3]],
      ['Drupal\Tests\Core\Batch\BatchBuilderTest:operationCallback', [2]],
      ['Drupal\Tests\Core\Batch\BatchBuilderTest:operationCallback', [3]],
      ['Drupal\Tests\Core\Batch\BatchBuilderTest:operationCallback', [4]],
      [[static::class, 'operationCallback'], [5]],
    ], $batch['operations']);
  }