Skip to content

Commit

Permalink
Issue #3130220: fix PHPunit configuration, first non-crashing, but fa…
Browse files Browse the repository at this point in the history
…iling test.
  • Loading branch information
fgm committed Jul 25, 2021
1 parent 775efe8 commit 0ed7224
Show file tree
Hide file tree
Showing 8 changed files with 225 additions and 35 deletions.
18 changes: 0 additions & 18 deletions core.phpunit.xml
Original file line number Diff line number Diff line change
Expand Up @@ -22,10 +22,6 @@
<!-- Example SIMPLETEST_DB value: mysql://username:password@localhost/databasename#table_prefix -->
<env name="SIMPLETEST_DB" value=""/>
<!-- Example BROWSERTEST_OUTPUT_DIRECTORY value: /path/to/webroot/sites/simpletest/browser_output -->
<!-- To have browsertest output use an alternative base URL. For example if
SIMPLETEST_BASE_URL is an internal DDEV URL, you can set this to the
external DDev URL so you can follow the links directly.
-->
<env name="BROWSERTEST_OUTPUT_DIRECTORY" value=""/>
<!-- To have browsertest output use an alternative base URL. For example if
SIMPLETEST_BASE_URL is an internal DDEV URL, you can set this to the
Expand Down Expand Up @@ -78,18 +74,4 @@
</exclude>
</whitelist>
</filter>
<!-- Filter for coverage reports. -->
<coverage>
<include>
<directory>../modules/contrib/mongodb</directory>
</include>
<exclude>
<file>../modules/contrib/mongodb/example.settings.local.php</file>
<!-- By definition test classes have no tests. -->
<directory suffix="Test.php">../modules/contrib/mongodb</directory>
<directory suffix="TestBase.php">../modules/contrib/mongodb</directory>
<!-- There is a remaining legacy test for reference in watchdog for now -->
<directory suffix=".test">../modules/contrib/mongodb</directory>
</exclude>
</coverage>
</phpunit>
6 changes: 3 additions & 3 deletions modules/mongodb_storage/mongodb_storage.services.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,12 @@ services:
class: 'Drupal\mongodb_storage\KeyValue\KeyValueFactory'

mongodb.storage.queue:
class: 'MongoDB\Database'
class: MongoDB\Database
factory: [ '@mongodb.database_factory', 'get' ]
arguments: [ 'queue' ]

mongodb.storage.sql_import:
class: \Drupal\mongodb_storage\Install\SqlImport
class: Drupal\mongodb_storage\Install\SqlImport
arguments:
- '@database'
- '@keyvalue.database'
Expand All @@ -26,5 +26,5 @@ services:
- '@datetime.time'

queue.mongodb:
class: Drupal\mongodb_storage\Queue\QueueMongodbFactory
class: Drupal\mongodb_storage\Queue\QueueMongoDBFactory
arguments: [ '@mongodb.storage.queue', '@settings' ]
Original file line number Diff line number Diff line change
Expand Up @@ -2,18 +2,22 @@

declare(strict_types=1);

namespace Drupal\mongodb\Queue;
namespace Drupal\mongodb_storage\Queue;

use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\Core\Queue\QueueInterface;
use Drupal\mongodb\MongoDb;
use MongoDB\Database;

/**
* Mongodb queue implementation.
* MongoDB queue implementation.
*
* @ingroup queue
*/
class MongodbQueue implements QueueInterface {
class MongoDBQueue implements QueueInterface {

/* Fails tests otherwise, as $database and $collection embeds MongoDB\Driver\Manager */
use DependencySerializationTrait;

/**
* The queue storage.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,29 +2,29 @@

declare(strict_types=1);

namespace Drupal\mongodb\Queue;
namespace Drupal\mongodb_storage\Queue;

use Drupal\Core\Site\Settings;
use MongoDB\Database;

/**
* Defines the queue factory for the MongoDB backend.
*/
class QueueMongodbFactory {
class QueueMongoDBFactory {

/**
* The queue storage.
*
* @var \MongoDB\Database
*/
protected $database;
protected Database $database;

/**
* The settings array.
* The settings from settings.php.
*
* @var \Drupal\Core\Site\Settings
*/
protected $settings;
protected Settings $settings;

/**
* Constructs this factory object.
Expand All @@ -45,12 +45,12 @@ public function __construct(Database $database, Settings $settings) {
* @param string $name
* The name of the collection holding key and value pairs.
*
* @return \Drupal\Core\Queue\DatabaseQueue
* A key/value store implementation for the given $collection.
* @return \Drupal\mongodb_storage\Queue\MongoDBQueue
* A mongodb queue database the given $name.
*/
public function get($name) {
$settings = $this->settings->get('mongodb_queue_' . $name);
return new MongodbQueue($name, $settings, $this->database);
return new MongoDBQueue($name, $settings, $this->database);
}

}
1 change: 1 addition & 0 deletions modules/mongodb_storage/src/Storage.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,5 @@ class Storage {

const SERVICE_SQL_IMPORT = 'mongodb.storage.sql_import';

const SERVICE_QUEUE_STORAGE = 'mongodb.storage.queue';
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ public function testGetExpirable() {
$factory = $this->container->get(Storage::SERVICE_KVE);
$store = $factory->get(static::COLLECTION);

$this->assertInstanceOf(KeyValueStoreExpirable::class, $store, "Store is not an expirable key-value");
$this->assertInstanceOf(KeyValueStoreExpirable::class, $store,
"Store is not an expirable key-value");
$actual = $store->getCollectionName();
$this->assertEquals(static::COLLECTION, $actual, 'Collection name matches');
}
Expand All @@ -44,8 +45,10 @@ public function testGetPersistent() {
$factory = $this->container->get(Storage::SERVICE_KV);
$store = $factory->get(static::COLLECTION);

$this->assertInstanceOf(KeyValueStore::class, $store, "Store is a MongoDB key-value");
$this->assertNotInstanceOf(KeyValueStoreExpirable::class, $store, "Store is not an expirable key-value");
$this->assertInstanceOf(KeyValueStore::class, $store,
"Store is a MongoDB key-value");
$this->assertNotInstanceOf(KeyValueStoreExpirable::class, $store,
"Store is not an expirable key-value");
$actual = $store->getCollectionName();
$this->assertEquals(static::COLLECTION, $actual, 'Collection name matches');
}
Expand Down
155 changes: 155 additions & 0 deletions modules/mongodb_storage/tests/src/Kernel/QueueTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
<?php

declare(strict_types=1);

namespace Drupal\Tests\mongodb_storage\Kernel;

use Drupal\Core\DependencyInjection\DependencySerializationTrait;
use Drupal\KernelTests\KernelTestBase;
use Drupal\mongodb_storage\Queue\MongoDBQueue;
use Drupal\mongodb_storage\Storage;

/**
* Queues and dequeues a set of items to check the basic queue functionality.
*
* @coversDefaultClass \Drupal\mongodb_storage\Queue\MongoDbQueue
*
* @group MongoDB
*/
class QueueTest extends QueueTestBase {

use DependencySerializationTrait;

/**
* Tests the System queue.
*/
public function testMongoDBQueue() {
// Create two queues.
$queue1 = new MongoDBQueue(
$this->randomMachineName(),
$this->getSettingsArray(),
$this->container->get(Storage::SERVICE_QUEUE_STORAGE)
);
$queue1->createQueue();

$queue2 = new MongoDBQueue(
$this->randomMachineName(),
$this->getSettingsArray(),
$this->container->get(Storage::SERVICE_QUEUE_STORAGE)
);
$queue1->createQueue();

$this->runQueueTest($queue1, $queue2);
// // fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n"); ob_flush();
}

/**
* Queues and dequeues a set of items to check the basic queue functionality.
*
* @param \Drupal\Core\Queue\QueueInterface $queue1
* An instantiated queue object.
* @param \Drupal\Core\Queue\QueueInterface $queue2
* An instantiated queue object.
*/
protected function runQueueTest($queue1, $queue2) {
// Create four items.
$data = [];
for ($i = 0; $i < 4; $i++) {
$data[] = [$this->randomMachineName() => $this->randomMachineName()];
}

// Queue items 1 and 2 in the queue1.
$queue1->createItem($data[0]);
$queue1->createItem($data[1]);

// Retrieve two items from queue1.
$items = [];
$new_items = [];

$items[] = $item = $queue1->claimItem();
$new_items[] = $item->data;

$items[] = $item = $queue1->claimItem();
$new_items[] = $item->data;

// First two dequeued items should match the first two items we queued.
$score = $this->queueScore($data, $new_items);

// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();
$this->assertEquals(2, $score, 'Two items matched');
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();

// Add two more items.
$queue1->createItem($data[2]);
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();
$queue1->createItem($data[3]);
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();

$this->assertSame(4, $queue1->numberOfItems(),
'Queue 1 is not empty after adding items.');
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();
$this->assertSame(0, $queue2->numberOfItems(),
'Queue 2 is empty while Queue 1 has items');
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();

$items[] = $item = $queue1->claimItem();
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();
$new_items[] = $item->data;

$items[] = $item = $queue1->claimItem();
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();
$new_items[] = $item->data;

// All dequeued items should match the items we queued exactly once,
// therefore the score must be exactly 4.
$this->assertEquals(4, $this->queueScore($data, $new_items),
'Four items matched');
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();

// There should be no duplicate items.
$this->assertEquals(4, $this->queueScore($new_items, $new_items),
'Four items matched');
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();

// Delete all items from queue1.
foreach ($items as $item) {
$queue1->deleteItem($item);
}
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();

// Check that both queues are empty.
$this->assertSame(0, $queue1->numberOfItems(), 'Queue 1 is empty');
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();
$this->assertSame(0, $queue2->numberOfItems(), 'Queue 2 is empty');
// fwrite(STDERR, __METHOD__ . " line " . __LINE__ . "\n");
ob_flush();
}

/**
* Returns the number of equal items in two arrays.
*/
protected function queueScore($items, $new_items): int {
$score = 0;
foreach ($items as $item) {
foreach ($new_items as $new_item) {
if ($item === $new_item) {
$score++;
}
}
}
return $score;
}

}
45 changes: 45 additions & 0 deletions modules/mongodb_storage/tests/src/Kernel/QueueTestBase.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
<?php

declare(strict_types=1);

namespace Drupal\Tests\mongodb_storage\Kernel;

use Drupal\mongodb\MongoDb;
use Drupal\mongodb_storage\Storage;
use Drupal\Tests\mongodb\Kernel\MongoDbTestBase;

/**
* Class QueueTestBase provides a base for Queue kernel tests.
*
* As such, it initializes the MongoDB database setting for queue.
*
* @group MongoDB
*/
abstract class QueueTestBase extends MongoDbTestBase {

const MAGIC = 'mongodb.nonexistent';

/**
* Modules to enable.
*
* @var array
*/
protected static $modules = [
MongoDb::MODULE,
Storage::MODULE,
];

/**
* {@inheritdoc}
*/
protected function getSettingsArray(): array {
$settings = parent::getSettingsArray();
$settings['databases']['queue'] = [
static::CLIENT_TEST_ALIAS,
$this->getDatabasePrefix(),
];

return $settings;
}

}

0 comments on commit 0ed7224

Please sign in to comment.