27 Commits

Author SHA1 Message Date
a6ecf19932 fix: Fixing CI. Added directory listing 👷🔥
Some checks failed
CI / release (push) Successful in 13s
Create Distribution / Create Archive (push) Failing after 5s
2024-10-29 21:37:39 +13:00
942c4e8699 fix: Fixing CI. Separate flow for upload 👷🔥
Some checks failed
CI / release (push) Successful in 14s
Create Distribution / Create Archive (push) Failing after 4s
2024-10-29 21:31:10 +13:00
d9d01fcbb3 fix: Fixing CI. Separate flow for upload 👷🔥
Some checks failed
CI / release (push) Successful in 1m47s
Create Distribution / Create Archive (push) Failing after 2s
2024-10-29 21:10:53 +13:00
de1973025f fix: Exclude generated changelog 🔥
All checks were successful
CI / release (push) Successful in 16s
2024-10-24 23:03:56 +13:00
dede25ec32 fix: Do not include semrel folder 🔥
All checks were successful
CI / release (push) Successful in 16s
2024-10-24 22:59:47 +13:00
607d3a9004 fix: Relabelling namespace/package names ♻️
All checks were successful
CI / release (push) Successful in 24s
2024-10-24 22:38:37 +13:00
032be45f9f fix: Create .zip archive instead of .tar.gz for Gitea 💚👷
All checks were successful
CI / release (push) Successful in 42s
2024-10-24 22:25:21 +13:00
afbddabea2 chore: Updated repo path 🔨 2024-10-24 22:24:23 +13:00
2ec085419f fix: Updated build script 🔨💚
All checks were successful
CI / release (push) Successful in 22s
2024-10-24 16:58:31 +13:00
7657af0a55 fix: Updated build script 🔨💚
All checks were successful
CI / release (push) Successful in 19s
2024-10-24 16:55:02 +13:00
8b87324850 ci: Use gitea provider from go-semantic-release 💚
All checks were successful
CI / release (push) Successful in 21s
2024-10-24 16:41:41 +13:00
25c80c4baf chore: Updated gitignore 🙈
Some checks failed
CI / release (push) Failing after 2m21s
2024-10-24 16:36:53 +13:00
afc24185d3 ci: Added Gitea Actions config 👷 2024-10-24 16:36:25 +13:00
e1cac1e31d fix: Don't break on whitespace. Helpful for JSON 🐛 2024-10-24 16:26:31 +13:00
0c05079327 tests: Updated tests for later PHPUnit 🔥 2024-10-24 15:37:18 +13:00
7526e04e08 chore: Update namespace 2024-10-24 15:36:26 +13:00
b84bde262e ⬆️ chore: Change namespace 2024-10-24 15:34:40 +13:00
a2b204fa47 Update README.md 2015-10-13 15:49:15 -05:00
f03508bf3e First round of updates finished.
- Needs better test cases.
2015-09-30 15:12:35 -05:00
49677e8bf2 Merge branch 'master' of https://github.com/dcarbone/ugly-queue 2015-09-30 08:56:31 -05:00
50601bc3c8 First round of updates finished. 2015-09-30 08:55:18 -05:00
d935032ec3 Devil is in the details. 2015-09-29 12:08:32 -05:00
232e228475 Lots of cleanup, removing of dumb code. More to do. 2015-09-29 11:35:48 -05:00
d40357df73 Update LICENSE 2015-07-31 10:31:08 -05:00
4020de5223 Update .travis.yml
Updating to take advantage of Travis-CI containers.
2015-07-20 10:17:07 -05:00
13df907166 Updating README.md 2014-10-30 10:55:29 -05:00
b840f40a89 - Moving Notify things into "enum" class
- Adding \Countable interfaces to both UglyQueue and UglyQueueManager
2014-10-30 10:54:06 -05:00
14 changed files with 999 additions and 679 deletions

23
.github/workflows/build.yml vendored Normal file
View File

@@ -0,0 +1,23 @@
name: CI
on:
push:
branches:
- "**"
tags:
- "!**"
jobs:
release:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Create Release Archive
id: semrelease
uses: go-semantic-release/action@v1
with:
# custom-arguments: --provider=gitea
hooks: exec
env:
GITEA_TOKEN: ${{ secrets.G_TOKEN }}
GITEA_HOST: ${{ secrets.G_SERVER_URL}}

24
.github/workflows/dist.yml vendored Normal file
View File

@@ -0,0 +1,24 @@
name: Create Distribution
run-name: Distribute composer package with Gitea Actions 🚀
on:
push:
tags:
- 'v*'
jobs:
dist:
name: Create Archive
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4 # Checkout Sourcecode
- uses: https://hub.cybercinch.nz/cybercinch/composer-build-action@v1
- run: |
ls -lah
- uses: https://hub.cybercinch.nz/guisea/gitea-composer-upload-action@v1
with:
base_url: "${{ secrets.G_SERVER_URL}}"
access_token: "${{ secrets.G_TOKEN }}"
username: "${{ secrets.G_USERNAME }}"
owner: "cybercinch" # Override owner name for repository (Optional)
package_version: "${{ env.GITHUB_REF_NAME }}"

4
.gitignore vendored Normal file
View File

@@ -0,0 +1,4 @@
**/vendor
tests/misc/*
!tests/misc/cleanup.php
!tests/misc/index.html

21
.semrelrc Normal file
View File

@@ -0,0 +1,21 @@
{
"plugins": {
"provider": {
"name": "gitea"
},
"changelog-generator": {
"name": "default",
"options": {
"emojis": "true"
}
},
"hooks": {
"names": [
"exec"
],
"options": {
"exec_on_no_release": "echo {{.Reason}}: {{.Message}}"
}
}
}
}

View File

@@ -1,5 +1,7 @@
language: php
sudo: false
php:
- 5.3.3
- 5.3
@@ -8,9 +10,8 @@ php:
- 5.6
before_script:
- composer self-update
- composer update --prefer-source
- composer install --no-interaction --dev --prefer-source
- composer self-update 1.0.0-alpha10
- composer install --no-interaction --prefer-source
script:
- ./vendor/bin/phpunit

View File

@@ -652,7 +652,7 @@ Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
{project} Copyright (C) {year} {fullname}
dcarbone/ugly-queue Copyright (C) 2015 Daniel Paul Carbone
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.

View File

@@ -1,8 +1,91 @@
ugly-queue
==========
A simple file-based queue system for PHP 5.3.3+
A simple file-based FIFO queue system for PHP 5.3.3+
Build status: [![Build Status](https://travis-ci.org/dcarbone/ugly-queue.svg)](https://travis-ci.org/dcarbone/ugly-queue)
Build status: [![Build Status](https://travis-ci.org/Cybercinch/ugly-queue.svg?branch=master)](https://travis-ci.org/Cybercinch/ugly-queue)
Documentation and Test suites forthcoming.
## Installation
This library is designed to be installed into your app using [https://getcomposer.org/](Composer).
Simply copy-paste the following line into your `"requires:"` hash:
```json
"dcarbone/ugly-queue": "0.4.*"
```
## Basic Usage
Once installed, you must first initialize an instance of [src/UglyQueueManager.php](UglyQueueManager).
This is done as such:
```php
$queueBaseDir = 'path to where you would like queue files and directories to be stored';
$manager = new UglyQueueManager($queueBaseDir);
```
Once initialized, you can start adding queues!
```php
$sandwichQueue = $manager->createQueue('sandwiches');
$sandwichQueue->lock();
$sandwichQueue->addItems(array(
'bread',
'meat',
'cheese',
'lettuce',
'bread'
));
$sandwichQueue->unlock();
```
Once you have items added to the queue, you can either pull items out ad-hoc or set up some sort of cron
or schedule task to process items regularly.
If the base directory for all of your queues remains the same, each initialization
of `UglyQueueManager` will automatically find and initialize instances of pre-existing
UglyQueues.
In a subsequent request, simply do the following:
```php
$queueBaseDir = 'path to where you would like queue files and directories to be stored';
$manager = new UglyQueueManager($queueBaseDir);
$tastySandwich = $manager->getQueue('sandwiches');
// 'sandwiches' queue will exist now
$tastySandwich->lock();
// Specify the number of items you wish to retrieve from the queue
$items = $tastySandwich->retrieveItems(4);
// $items is now an array...
var_export($items);
/*
array (
4 => 'bread',
3 => 'lettuce',
2 => 'cheese',
1 => 'meat',
)
*/
```
The queue will then retain a single item, `0 => 'bread'` as the 5th item left in the queue.
At any time you can determine how many items remain in a queue by executing `count($queueObj);`
There are a few limitations currently:
1. This lib is designed for small values without much in the way of formatting or line breaks
2. It is designed to be atomic, meaning that only one process can be adding / retrieving items from
a queue at a time. Reading actions (count, searching, etc) are NOT atomic, however.

View File

@@ -1,5 +1,5 @@
{
"name" : "dcarbone/ugly-queue",
"name" : "cybercinch/ugly-queue",
"type" : "library",
"description" : "A simple file-based queue system for PHP 5.3.3+",
@@ -9,28 +9,32 @@
"file queue",
"ugly queue"
],
"homepage": "https://github.com/dcarbone/ugly-queue",
"homepage": "https://hub.cybercinch.nz/cybercinch/ugly-queue",
"license": "GPLv3",
"authors" : [
{
"name" : "Daniel Carbone",
"email" : "daniel.p.carbone@gmail.com"
},
{
"name" : "Aaron Guise",
"email" : "aaron-composer@guise.net.nz"
}
],
"require" : {
"php" : ">=5.3.3",
"dcarbone/helpers" : "6.1.*"
"php" : ">=7.1",
"dcarbone/helpers" : "~6.1"
},
"require-dev" : {
"phpunit/phpunit": "4.1.*"
"phpunit/phpunit": "~9.6.21"
},
"autoload" : {
"psr-4" : {
"DCarbone\\" : "src/"
"Cybercinch\\" : "src/"
}
}
}

32
scripts/build.sh Executable file
View File

@@ -0,0 +1,32 @@
#!/bin/bash
mkdir -p ./build/
echo "Made temporary directory"
# Package up the release (Needs to be .zip for upload to gitea)
zip -r "./build/Package.zip" \
. \
-x '.semrel/*' \
-x '.generated-go-semantic-release-changelog.md' \
-x './vendor/*' \
-x './tests/*' \
-x './build/*' \
-x './.git/*' \
-x './.idea/*' \
-x './.github/*' \
-x './scripts/*'
#RELEASE_ID=$(curl --silent -X 'GET' "${GITEA_HOST}/api/v1/repos/cybercinch/ugly-queue/releases/latest" \
#-H "accept: application/json" \
#-H "Authorization: token ${GITEA_TOKEN}" | jq -r .id)
#
## Attach to release
#curl --silent -X 'POST' "${GITEA_HOST}/api/v1/repos/cybercinch/ugly-queue/releases/${RELEASE_ID}/assets?name=ugly-queue-${1}.tar.gz" \
#-H "Authorization: token ${GITEA_TOKEN}" \
#--form attachment="@build/ugly-queue-${1}.tar.gz"
# Upload the artifact to composer registry
curl --user "cibot:${GITEA_TOKEN}" \
--upload-file "build/ugly-queue.zip" \
"${GITEA_HOST}/api/packages/cybercinch/composer?version=${1}"

View File

@@ -1,141 +1,74 @@
<?php namespace DCarbone;
<?php namespace Cybercinch;
use DCarbone\Helpers\FileHelper;
/**
* Class UglyQueue
* @package DCarbone
*
* @property string name
* @property string path
* @property bool locked
* @package Cybercinch
*/
class UglyQueue implements \Serializable, \SplSubject
class UglyQueue implements \Serializable, \SplSubject, \Countable
{
const NOTIFY_QUEUE_INITIALIZED = 0;
const NOTIFY_QUEUE_LOCKED = 1;
const NOTIFY_QUEUE_FAILED_TO_LOCK = 2;
const NOTIFY_QUEUE_LOCKED_BY_OTHER_PROCESS = 3;
const NOTIFY_QUEUE_UNLOCKED = 4;
const NOTIFY_QUEUE_PROCESSING = 5;
const NOTIFY_QUEUE_REACHED_END = 6;
/** @var int */
public $notifyStatus;
const QUEUE_READONLY = 0;
const QUEUE_READWRITE = 1;
/** @var array */
private $observers = array();
/** @var int */
private $_notifyStatus;
/** @var \SplObserver[] */
private $_observers = array();
/** @var int */
protected $mode = null;
/** @var string */
protected $_name;
protected $baseDir;
/** @var string */
protected $_path;
protected $name;
/** @var string */
protected $path;
/** @var bool */
protected $_locked = false;
protected $locked = false;
/** @var resource */
protected $_tmpHandle;
protected $tmpHandle;
/** @var string */
protected $queueFile;
/** @var string */
protected $queueTmpFile;
/** @var string */
protected $lockFile;
/** @var string */
protected $serializeFile;
/**
* @param string $directoryPath
* @param array $observers
* @throws \RuntimeException
* @throws \InvalidArgumentException
* @return UglyQueue
* @param string $baseDir
* @param string $name
* @param \SplObserver[] $observers
*/
public static function queueWithDirectoryPathAndObservers($directoryPath, array $observers = array())
public function __construct($baseDir, $name, array $observers = array())
{
if (!is_string($directoryPath))
throw new \InvalidArgumentException('Argument 1 expected to be string, '.gettype($directoryPath).' seen');
$this->baseDir = realpath($baseDir);
$this->name = $name;
$this->_observers = $observers;
if (($directoryPath = trim($directoryPath)) === '')
throw new \InvalidArgumentException('Empty string passed for argument 1');
$path = sprintf('%s%s%s', $baseDir, DIRECTORY_SEPARATOR, $name);
if (!file_exists($path) && !@mkdir($path))
throw new \RuntimeException('Unable to initialize queue directory "'.$path.'". Please check permissions.');
if (file_exists($directoryPath))
{
if (!is_dir($directoryPath))
throw new \RuntimeException('Argument 1 expected to be path to directory, path to non-directory seen');
}
else if (!@mkdir($directoryPath))
{
throw new \RuntimeException('Unable to create queue directory at path: "'.$directoryPath.'".');
}
$this->path = $path;
$this->lockFile = sprintf('%s%squeue.lock', $path, DIRECTORY_SEPARATOR);
$this->queueFile = sprintf('%s%squeue.txt', $path, DIRECTORY_SEPARATOR);
$this->queueTmpFile = sprintf('%s%squeue.tmp', $path, DIRECTORY_SEPARATOR);
$this->serializeFile = sprintf('%s%sugly-queue.obj', $path, DIRECTORY_SEPARATOR);
$uglyQueue = new UglyQueue();
$uglyQueue->observers = $observers;
$split = preg_split('#[/\\\]+#', $directoryPath);
$uglyQueue->_name = end($split);
$uglyQueue->_path = rtrim(realpath(implode(DIRECTORY_SEPARATOR, $split)), "/\\").DIRECTORY_SEPARATOR;
if (is_writable($uglyQueue->_path))
$uglyQueue->mode = self::QUEUE_READWRITE;
else if (is_readable($uglyQueue->_path))
$uglyQueue->mode = self::QUEUE_READONLY;
// Insert "don't look here" index.html file
if (!file_exists($uglyQueue->_path.'index.html'))
{
if ($uglyQueue->mode === self::QUEUE_READONLY)
throw new \RuntimeException('Cannot initialize queue with name "'.$uglyQueue->_name.'", the user lacks permission to create files.');
$html = <<<HTML
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>
HTML;
file_put_contents($uglyQueue->_path.'index.html', $html);
}
if (!file_exists($uglyQueue->_path.'queue.txt'))
{
if ($uglyQueue->mode === self::QUEUE_READONLY)
throw new \RuntimeException('Cannot initialize queue with name "'.$uglyQueue->_name.'", the user lacks permission to create files.');
file_put_contents($uglyQueue->_path.'queue.txt', '');
}
$uglyQueue->notifyStatus = self::NOTIFY_QUEUE_INITIALIZED;
$uglyQueue->notify();
return $uglyQueue;
}
/**
* @param string $param
* @return string
* @throws \OutOfBoundsException
*/
public function __get($param)
{
switch($param)
{
case 'name' :
return $this->_name;
case 'path':
return $this->_path;
case 'locked':
return $this->_locked;
default:
throw new \OutOfBoundsException(get_class($this).' does not have a property named "'.$param.'".');
}
$this->initialize();
}
/**
@@ -145,7 +78,79 @@ HTML;
{
$this->_populateQueue();
$this->unlock();
file_put_contents($this->_path.UglyQueueManager::UGLY_QUEUE_SERIALIZED_NAME, serialize($this));
file_put_contents($this->path.'/ugly-queue.obj', serialize($this));
}
/**
* @return string
*/
public function getName()
{
return $this->name;
}
/**
* @return int
*/
public function getMode()
{
return $this->mode;
}
/**
* @return string
*/
public function getPath()
{
return $this->path;
}
/**
* @return string
*/
public function getBaseDir()
{
return $this->baseDir;
}
/**
* @return string
*/
public function getQueueFile()
{
return $this->queueFile;
}
/**
* @return string
*/
public function getQueueTmpFile()
{
return $this->queueTmpFile;
}
/**
* @return string
*/
public function getLockFile()
{
return $this->lockFile;
}
/**
* @return string
*/
public function getSerializeFile()
{
return $this->serializeFile;
}
/**
* @return boolean
*/
public function isLocked()
{
return $this->locked;
}
/**
@@ -158,59 +163,32 @@ HTML;
if (!is_int($ttl))
throw new \InvalidArgumentException('Argument 1 expected to be integer, "'.gettype($ttl).'" seen');
if ($ttl < 0)
throw new \InvalidArgumentException('Argument 1 expected to be positive integer, "'.$ttl.'" seen');
$alreadyLocked = $this->isLocked();
if ($ttl < 1)
throw new \InvalidArgumentException('Argument 1 expected to be greater than 0 "'.$ttl.'" seen');
// If there is currently no lock
if ($alreadyLocked === false)
if ($this->isAlreadyLocked() === false)
return $this->createLockFile($ttl);
// If we make it this far, there is already a lock in place.
$this->_locked = false;
$this->notifyStatus = self::NOTIFY_QUEUE_LOCKED_BY_OTHER_PROCESS;
$this->locked = false;
$this->_notifyStatus = UglyQueueEnum::QUEUE_LOCKED_BY_OTHER_PROCESS;
$this->notify();
return false;
}
/**
* @param int $ttl seconds to live
* @return bool
*/
protected function createLockFile($ttl)
{
$ok = (bool)@file_put_contents(
$this->_path.'queue.lock',
json_encode(array('ttl' => $ttl, 'born' => time())));
if ($ok !== true)
{
$this->notifyStatus = self::NOTIFY_QUEUE_FAILED_TO_LOCK;
$this->notify();
return $this->_locked = false;
}
$this->_locked = true;
$this->notifyStatus = self::NOTIFY_QUEUE_LOCKED;
$this->notify();
return true;
}
/**
* Close this ugly queue, writing out contents to file.
*/
public function unlock()
{
if ($this->_locked === true)
if ($this->isLocked() === true)
{
unlink($this->_path.'queue.lock');
$this->_locked = false;
unlink($this->lockFile);
$this->locked = false;
$this->notifyStatus = self::NOTIFY_QUEUE_UNLOCKED;
$this->_notifyStatus = UglyQueueEnum::QUEUE_UNLOCKED;
$this->notify();
}
}
@@ -219,27 +197,26 @@ HTML;
* @throws \RuntimeException
* @return bool
*/
public function isLocked()
public function isAlreadyLocked()
{
// First check for lock file
if (is_file($this->_path.'queue.lock'))
if (is_file($this->lockFile))
{
$lock = json_decode(file_get_contents($this->_path.'queue.lock'), true);
$lock = json_decode(file_get_contents($this->lockFile), true);
// If we have an invalid lock structure.
if (!isset($lock['ttl']) || !isset($lock['born']))
throw new \RuntimeException('Invalid "queue.lock" file structure seen at "'.$this->_path.'queue.lock".');
// If the decoded lock file contains a ttl and born value...
if (isset($lock['ttl']) && isset($lock['born']))
{
$lock_ttl = ((int)$lock['born'] + (int)$lock['ttl']);
// Otherwise...
$lock_ttl = ((int)$lock['born'] + (int)$lock['ttl']);
// If we're within the TTL of the lock, assume another thread is already processing.
// We'll pick it up on the next go around.
if ($lock_ttl > time())
return true;
// If we're within the TTL of the lock, assume another thread is already processing.
// We'll pick it up on the next go around.
if ($lock_ttl > time())
return true;
}
// Else, remove lock file and assume we're good to go!
unlink($this->_path.'queue.lock');
unlink($this->lockFile);
return false;
}
@@ -253,14 +230,14 @@ HTML;
* @throws \InvalidArgumentException
* @return bool|array
*/
public function processQueue($count = 1)
public function retrieveItems($count = 1)
{
if ($this->mode === self::QUEUE_READONLY)
throw new \RuntimeException('Queue "'.$this->_name.'" cannot be processed. It was started in Read-Only mode (the user running this process does not have permission to write to the queue directory).');
throw new \RuntimeException('Queue "'.$this->name.'" cannot be processed. It was started in Read-Only mode (the user running this process does not have permission to write to the queue directory).');
// If we don't have a lock, assume issue and move on.
if ($this->_locked === false)
throw new \RuntimeException('Cannot process queue named "'.$this->_name.'". It is locked by another process.');
if ($this->isLocked() === false)
throw new \RuntimeException('Cannot process queue named "'.$this->name.'". It is locked by another process.');
// If non-int valid is passed
if (!is_int($count))
@@ -270,21 +247,21 @@ HTML;
if ($count <= 0)
throw new \InvalidArgumentException('Argument 1 expected to be integer greater than 0, "'.$count.'" seen');
if ($this->notifyStatus !== self::NOTIFY_QUEUE_PROCESSING)
if ($this->_notifyStatus !== UglyQueueEnum::QUEUE_PROCESSING)
{
$this->notifyStatus = self::NOTIFY_QUEUE_PROCESSING;
$this->_notifyStatus = UglyQueueEnum::QUEUE_PROCESSING;
$this->notify();
}
// Find number of lines in the queue file
$lineCount = FileHelper::getLineCount($this->_path.'queue.txt');
$lineCount = count($this);
// If queue line count is 0, assume empty
if ($lineCount === 0)
return false;
// Try to open the file for reading / writing.
$queueFileHandle = fopen($this->_path.'queue.txt', 'r+');
$queueFileHandle = fopen($this->queueFile, 'r+');
if ($queueFileHandle === false)
$this->unlock();
@@ -292,12 +269,12 @@ HTML;
$data = array();
$start_line = $lineCount - $count;
$i = 0;
while (($line = fscanf($queueFileHandle, "%s\t%s\n")) !== false && $i < $lineCount)
while (($line = fscanf($queueFileHandle, "%s\t%[^\n]")) !== false && $i < $lineCount)
{
if ($i++ >= $start_line)
{
list ($key, $value) = $line;
$data[$key] = $value;
$data = array($key => $value) + $data;
}
}
@@ -308,13 +285,13 @@ HTML;
ftruncate($queueFileHandle, 0);
fclose($queueFileHandle);
$this->notifyStatus = self::NOTIFY_QUEUE_REACHED_END;
$this->_notifyStatus = UglyQueueEnum::QUEUE_REACHED_END;
$this->notify();
}
// Otherwise, create new queue file minus the processed lines.
else
{
$tmp = fopen($this->_path.'queue.tmp', 'w+');
$tmp = fopen($this->queueTmpFile, 'w+');
rewind($queueFileHandle);
$i = 0;
while (($line = fgets($queueFileHandle)) !== false && $i < $start_line)
@@ -327,8 +304,8 @@ HTML;
fclose($queueFileHandle);
fclose($tmp);
unlink($this->_path.'queue.txt');
rename($this->_path.'queue.tmp', $this->_path.'queue.txt');
unlink($this->queueFile);
rename($this->queueTmpFile, $this->queueFile);
}
return $data;
@@ -340,19 +317,19 @@ HTML;
* @return bool
* @throws \RuntimeException
*/
public function addToQueue($key, $value)
public function addItem($key, $value)
{
if ($this->mode === self::QUEUE_READONLY)
throw new \RuntimeException('Cannot add items to queue "'.$this->_name.'" as it is in read-only mode');
throw new \RuntimeException('Cannot add item to queue "'.$this->name.'" as it is in read-only mode');
// If we don't have a lock, assume issue and move on.
if ($this->_locked === false)
throw new \RuntimeException('Cannot add items to queue "'.$this->_name.'". Queue is already locked by another process');
if ($this->isLocked() === false)
throw new \RuntimeException('Cannot add item to queue "'.$this->name.'". Queue is already locked by another process');
if (!is_resource($this->_tmpHandle))
if (!is_resource($this->tmpHandle))
{
$this->_tmpHandle = fopen($this->_path.'queue.tmp', 'w+');
if ($this->_tmpHandle === false)
$this->tmpHandle = fopen($this->queueTmpFile, 'w+');
if ($this->tmpHandle === false)
throw new \RuntimeException('Unable to create "queue.tmp" file.');
}
@@ -360,11 +337,22 @@ HTML;
$value = json_encode($value);
return (bool)fwrite(
$this->_tmpHandle,
$this->tmpHandle,
$key."\t".str_replace(array("\r\n", "\n"), ' ', $value)
."\n");
}
/**
* @param array $items
*/
public function addItems(array $items)
{
foreach($items as $k=>$v)
{
$this->addItem($k, $v);
}
}
/**
* If there is a tmp queue file, add it's contents to the beginning of a new queue file
*
@@ -372,35 +360,26 @@ HTML;
*/
public function _populateQueue()
{
if (is_resource($this->_tmpHandle))
if (is_resource($this->tmpHandle))
{
if (file_exists($this->_path.'queue.txt'))
if (file_exists($this->queueFile))
{
$queueFileHandle = fopen($this->_path.'queue.txt', 'r+');
$queueFileHandle = fopen($this->queueFile, 'r+');
while (($line = fgets($queueFileHandle)) !== false)
{
if ($line !== "\n" && $line !== "")
fwrite($this->_tmpHandle, $line);
fwrite($this->tmpHandle, $line);
}
fclose($queueFileHandle);
unlink($this->_path.'queue.txt');
unlink($this->queueFile);
}
fclose($this->_tmpHandle);
rename($this->_path.'queue.tmp', $this->_path.'queue.txt');
fclose($this->tmpHandle);
rename($this->queueTmpFile, $this->queueFile);
}
}
/**
* @return int
* @throws \RuntimeException
*/
public function getQueueItemCount()
{
return FileHelper::getLineCount($this->_path.'queue.txt');
}
/**
* @param string $key
* @return bool
@@ -411,13 +390,11 @@ HTML;
$key = (string)$key;
// Try to open the file for reading / writing.
$queueFileHandle = fopen($this->_path.'queue.txt', 'r');
$queueFileHandle = fopen($this->queueFile, 'r');
while(($line = fscanf($queueFileHandle, "%s\t%s\n")) !== false)
{
list ($lineKey, $lineValue) = $line;
if ($key === $lineKey)
if ($key === $line[0])
{
fclose($queueFileHandle);
return true;
@@ -428,6 +405,18 @@ HTML;
return false;
}
/**
* (PHP 5 >= 5.1.0)
* Count elements of an object
* @link http://php.net/manual/en/countable.count.php
*
* @return int The custom count as an integer.
*/
public function count()
{
return (int)FileHelper::getLineCount($this->queueFile);
}
/**
* (PHP 5 >= 5.1.0)
* String representation of object
@@ -437,7 +426,17 @@ HTML;
*/
public function serialize()
{
return serialize(array($this->_name, $this->_path));
return serialize(
array(
$this->baseDir,
$this->name,
$this->path,
$this->queueFile,
$this->queueTmpFile,
$this->lockFile,
$this->serializeFile,
)
);
}
/**
@@ -450,10 +449,15 @@ HTML;
*/
public function unserialize($serialized)
{
/** @var \DCarbone\UglyQueue $uglyQueue */
$data = unserialize($serialized);
$this->_name = $data[0];
$this->_path = $data[1];
$this->baseDir = $data[0];
$this->name = $data[1];
$this->path = $data[2];
$this->queueFile = $data[3];
$this->queueTmpFile = $data[4];
$this->lockFile = $data[5];
$this->serializeFile = $data[6];
$this->initialize();
}
/**
@@ -466,8 +470,8 @@ HTML;
*/
public function attach(\SplObserver $observer)
{
if (!in_array($observer, $this->observers))
$this->observers[] = $observer;
if (!in_array($observer, $this->_observers))
$this->_observers[] = $observer;
}
/**
@@ -480,9 +484,9 @@ HTML;
*/
public function detach(\SplObserver $observer)
{
$idx = array_search($observer, $this->observers, true);
$idx = array_search($observer, $this->_observers, true);
if ($idx !== false)
unset($this->observers[$idx]);
unset($this->_observers[$idx]);
}
/**
@@ -494,9 +498,97 @@ HTML;
*/
public function notify()
{
for ($i = 0, $count = count($this->observers); $i < $count; $i++)
foreach($this->_observers as $observer)
{
$this->observers[$i]->notify($this);
$observer->update($this);
}
}
/**
* This method is mostly intended to check the "validity" of a re-initialized queue
*
* Could probably stand to be improved.
*
* @return bool
*/
public function _valid()
{
return (
$this->baseDir !== null &&
$this->name !== null &&
$this->path !== null &&
$this->queueFile !== null &&
$this->queueTmpFile !== null &&
$this->lockFile !== null &&
$this->serializeFile !== null
);
}
// --------
/**
* @param int $ttl seconds to live
* @return bool
*/
protected function createLockFile($ttl)
{
$ok = (bool)@file_put_contents(
$this->lockFile,
json_encode(array('ttl' => $ttl, 'born' => time())));
if ($ok !== true)
{
$this->_notifyStatus = UglyQueueEnum::QUEUE_FAILED_TO_LOCK;
$this->notify();
return $this->locked = false;
}
$this->locked = true;
$this->_notifyStatus = UglyQueueEnum::QUEUE_LOCKED;
$this->notify();
return true;
}
/**
* Post-construct initialization method.
*
* Also used post-un-serialization
*/
protected function initialize()
{
if (is_readable($this->path) && is_writable($this->path))
$this->mode = self::QUEUE_READWRITE;
else if (is_readable($this->path))
$this->mode = self::QUEUE_READONLY;
if (!file_exists($this->path.'/index.html'))
{
if ($this->mode === self::QUEUE_READONLY)
throw new \RuntimeException('Cannot initialize queue with name "'.$this->name.'", the user lacks permission to create files.');
$html = <<<HTML
<html>
<head>
<title>403 Forbidden</title>
</head>
<body>
<p>Directory access is forbidden.</p>
</body>
</html>
HTML;
file_put_contents($this->path.'/index.html', $html);
}
if (!file_exists($this->queueFile))
{
if ($this->mode === self::QUEUE_READONLY)
throw new \RuntimeException('Cannot initialize queue with name "'.$this->name.'", the user lacks permission to create files.');
file_put_contents($this->queueFile, '');
}
$this->_notifyStatus = UglyQueueEnum::QUEUE_INITIALIZED;
$this->notify();
}
}

24
src/UglyQueueEnum.php Normal file
View File

@@ -0,0 +1,24 @@
<?php namespace Cybercinch;
/**
* Class UglyQueueEnum
* @package Cybercinch
*
* Pseudo-enum thing.
*/
abstract class UglyQueueEnum
{
// Typically used by UglyQueueManager
const MANAGER_INITIALIZED = 1;
const QUEUE_ADDED = 2;
const QUEUE_REMOVED = 3;
// Typically used by UglyQueues
const QUEUE_INITIALIZED = 100;
const QUEUE_LOCKED = 101;
const QUEUE_FAILED_TO_LOCK = 102;
const QUEUE_LOCKED_BY_OTHER_PROCESS = 103;
const QUEUE_UNLOCKED = 104;
const QUEUE_PROCESSING = 105;
const QUEUE_REACHED_END = 106;
}

View File

@@ -1,154 +1,152 @@
<?php namespace DCarbone;
<?php namespace Cybercinch;
use InvalidArgumentException;
/**
* Class UglyQueueManager
* @package DCarbone
* @package Cybercinch
*/
class UglyQueueManager implements \SplObserver, \SplSubject
class UglyQueueManager implements \SplObserver, \Countable
{
const NOTIFY_MANAGER_INITIALIZED = 0;
const NOTIFY_QUEUE_ADDED = 1;
const NOTIFY_QUEUE_REMOVED = 2;
/** @var int */
public $notifyStatus;
const UGLY_QUEUE_SERIALIZED_NAME = 'ugly-queue.obj';
/** @var array */
private $observers = array();
/** @var array */
/** @var UglyQueue[] */
protected $queues = array();
/** @var array */
protected $config = array();
/** @var string */
protected $queueBaseDir;
protected $baseDir;
/**
* Constructor
*
* @param array $config
* @param array $observers
* @param string $baseDir
* @throws \RuntimeException
* @throws \InvalidArgumentException
* @throws InvalidArgumentException
*/
protected function __construct(array $config, array $observers = array())
public function __construct($baseDir)
{
if (!isset($config['queue-base-dir']))
throw new \InvalidArgumentException('"$config" parameter "queue-base-dir" not seen.');
if (false === is_string($baseDir))
throw new InvalidArgumentException('Argument 1 expected to be string, "'.gettype($baseDir).'" seen.');
if (!is_dir($config['queue-base-dir']))
throw new \RuntimeException('"queue-base-dir" points to a directory that does not exist.');
if (false === is_dir($baseDir))
throw new \RuntimeException('"'.$baseDir.'" points to a directory that does not exist.');
$this->config = $config;
$this->queueBaseDir = rtrim(realpath($this->config['queue-base-dir']), "/\\").DIRECTORY_SEPARATOR;
$this->observers = $observers;
if (false === is_readable($baseDir))
throw new \RuntimeException('"'.$baseDir.'" is not readable and/or writable .');
$this->baseDir = rtrim($baseDir, "/\\");
foreach(glob(sprintf('%s/*', $this->baseDir), GLOB_ONLYDIR) as $queueDir)
{
$this->addQueueAtPath($queueDir);
}
}
/**
* @param array $config
* @param array $observers
* @return UglyQueueManager
* @param string $name
* @return UglyQueue
*/
public static function init(array $config, array $observers = array())
public function getQueue($name)
{
/** @var \DCarbone\UglyQueueManager $manager */
$manager = new static($config, $observers);
if (isset($this->queues[$name]))
return $this->queues[$name];
/** @var \DCarbone\UglyQueue $uglyQueue */
$path = sprintf('%s/%s', $this->baseDir, $name);
if (file_exists($path))
return $this->addQueueAtPath($path);
foreach(glob($manager->queueBaseDir.DIRECTORY_SEPARATOR.'*', GLOB_ONLYDIR) as $queueDir)
{
// Try to avoid looking at hidden directories or magic dirs such as '.' and '..'
$split = preg_split('#[/\\\]+#', $queueDir);
if (strpos(end($split), '.') === 0)
continue;
if (file_exists($queueDir.DIRECTORY_SEPARATOR.self::UGLY_QUEUE_SERIALIZED_NAME))
$uglyQueue = unserialize(file_get_contents($queueDir.DIRECTORY_SEPARATOR.self::UGLY_QUEUE_SERIALIZED_NAME));
else
$uglyQueue = UglyQueue::queueWithDirectoryPathAndObservers($queueDir, $manager->observers);
$manager->addQueue($uglyQueue);
}
$manager->notifyStatus = self::NOTIFY_MANAGER_INITIALIZED;
$manager->notify();
return $manager;
return $this->createQueue($name);
}
/**
* @param UglyQueue $uglyQueue
* @return \DCarbone\UglyQueueManager
* @return UglyQueueManager
* @throws \RuntimeException
*/
public function addQueue(UglyQueue $uglyQueue)
{
if ($this->containsQueueWithName($uglyQueue->name))
throw new \RuntimeException('Queue named "'.$uglyQueue->name.'" already exists in this manager.');
$name = $uglyQueue->getName();
$this->queues[$uglyQueue->name] = $uglyQueue;
if ($this->containsQueueWithName($name))
throw new \RuntimeException('Queue named "'.$name.'" already exists in this manager.');
$this->notifyStatus = self::NOTIFY_QUEUE_ADDED;
$this->notify();
$this->queues[$name] = $uglyQueue;
return $this;
}
/**
* @param $path
* @param string $name
* @return UglyQueue
*/
public function createQueue($name)
{
$queue = new UglyQueue($this->baseDir, $name, array($this));
$this->addQueue($queue);
return end($this->queues);
}
/**
* @param string $path
* @return \DCarbone\UglyQueueManager
*/
public function addQueueAtPath($path)
{
$uglyQueue = UglyQueue::queueWithDirectoryPathAndObservers($path, $this->observers);
// Try to avoid looking at hidden directories or magic dirs such as '.' and '..'
$split = preg_split('#[/\\\]+#', $path);
$queueName = end($split);
if (0 === strpos($queueName, '.'))
return null;
$serializedFile = sprintf('%s/%s/ugly-queue.obj', $this->baseDir, $queueName);
/** @var \DCarbone\UglyQueue $uglyQueue */
if (file_exists($serializedFile))
$uglyQueue = unserialize(file_get_contents($serializedFile));
if (!isset($uglyQueue) || $uglyQueue->_valid() === false)
$uglyQueue = new UglyQueue($this->baseDir, $queueName, array($this));
$uglyQueue->attach($this);
return $this->addQueue($uglyQueue);
}
/**
* @param UglyQueue $uglyQueue
* @return \DCarbone\UglyQueueManager
* @return UglyQueueManager
*/
public function removeQueue(UglyQueue $uglyQueue)
{
if ($this->containsQueueWithName($uglyQueue->name))
unset($this->queues[$uglyQueue->name]);
$name = $uglyQueue->getName();
if ($this->containsQueueWithName($name))
unset($this->queues[$name]);
return $this;
}
/**
* @param string $name
* @return \DCarbone\UglyQueueManager
* @return UglyQueueManager
*/
public function removeQueueByName($name)
{
if ($this->containsQueueWithName($name))
{
unset($this->queues[$name]);
$this->notifyStatus = self::NOTIFY_QUEUE_REMOVED;
$this->notify();
}
return $this;
}
/**
* @param string $name
* @return \DCarbone\UglyQueue
* @throws \InvalidArgumentException
* @return UglyQueue
* @throws InvalidArgumentException
*/
public function &getQueueWithName($name)
public function getQueueWithName($name)
{
if (isset($this->queues[$name]))
return $this->queues[$name];
throw new \InvalidArgumentException('Argument 1 expected to be valid queue name.');
throw new InvalidArgumentException('Argument 1 expected to be valid queue name.');
}
/**
@@ -168,6 +166,18 @@ class UglyQueueManager implements \SplObserver, \SplSubject
return array_keys($this->queues);
}
/**
* (PHP 5 >= 5.1.0)
* Count elements of an object
* @link http://php.net/manual/en/countable.count.php
*
* @return int The custom count as an integer. The return value is cast to an integer.
*/
public function count()
{
return count($this->queues);
}
/**
* (PHP 5 >= 5.1.0)
* Receive update from subject
@@ -178,53 +188,6 @@ class UglyQueueManager implements \SplObserver, \SplSubject
*/
public function update(\SplSubject $subject)
{
for ($i = 0, $count = count($this->observers); $i < $count; $i++)
{
$this->observers[$i]->notify($subject);
}
}
/**
* (PHP 5 >= 5.1.0)
* Attach an SplObserver
* @link http://php.net/manual/en/splsubject.attach.php
*
* @param \SplObserver $observer The SplObserver to attach.
* @return void
*/
public function attach(\SplObserver $observer)
{
if (!in_array($observer, $this->observers, true))
$this->observers[] = $observer;
}
/**
* (PHP 5 >= 5.1.0)
* Detach an observer
* @link http://php.net/manual/en/splsubject.detach.php
*
* @param \SplObserver $observer The SplObserver to detach.
* @return void
*/
public function detach(\SplObserver $observer)
{
$idx = array_search($observer, $this->observers, true);
if ($idx !== false)
unset($this->observers[$idx]);
}
/**
* (PHP 5 >= 5.1.0)
* Notify an observer
* @link http://php.net/manual/en/splsubject.notify.php
*
* @return void
*/
public function notify()
{
for ($i = 0, $count = count($this->observers); $i < $count; $i++)
{
$this->observers[$i]->notify($this);
}
// Nothing for now...
}
}

View File

@@ -7,8 +7,10 @@ require_once __DIR__.'/../misc/cleanup.php';
/**
* Class UglyQueueTest
*/
class UglyQueueTest extends PHPUnit_Framework_TestCase
class UglyQueueTest extends PHPUnit\Framework\TestCase
{
protected $baseDir;
/**
* @var array
*/
@@ -26,201 +28,265 @@ class UglyQueueTest extends PHPUnit_Framework_TestCase
'10' => 'Virginia baked ham, sliced',
);
/**
* @covers \DCarbone\UglyQueue::queueWithDirectoryPathAndObservers
* @uses \DCarbone\UglyQueue
* @return \DCarbone\UglyQueue
*/
public function testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers()
protected function setUp(): void
{
$uglyQueue = \DCarbone\UglyQueue::queueWithDirectoryPathAndObservers(dirname(__DIR__).'/misc/queues/tasty-sandwich');
$this->baseDir = realpath(__DIR__.'/../misc/queues');
}
$this->assertInstanceOf('\\DCarbone\\UglyQueue', $uglyQueue);
/**
* @covers \Cybercinch\UglyQueue::__construct
* @uses \Cybercinch\UglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanInitializeObjectWithValidParameters()
{
$uglyQueue = new \Cybercinch\UglyQueue($this->baseDir, 'tasty-sandwich');
$this->assertInstanceOf('\\Cybercinch\\UglyQueue', $uglyQueue);
return $uglyQueue;
}
/**
* @covers \DCarbone\UglyQueue::queueWithDirectoryPathAndObservers
* @uses \DCarbone\UglyQueue
* @expectedException \InvalidArgumentException
* @covers \Cybercinch\UglyQueue::retrieveItems
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenInitializingUglyQueueWithEmptyOrInvalidConf()
public function testExceptionThrownWhenTryingToProcessQueueAfterInitializationBeforeLock(\Cybercinch\UglyQueue $uglyQueue)
{
$uglyQueue = \DCarbone\UglyQueue::queueWithDirectoryPathAndObservers(array());
$this->expectException(\RuntimeException::class);
$uglyQueue->retrieveItems();
}
/**
* @covers \DCarbone\UglyQueue::processQueue
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @expectedException \RuntimeException
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::keyExistsInQueue
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenTryingToProcessQueueAfterInitializationBeforeLock(\DCarbone\UglyQueue $uglyQueue)
{
$process = $uglyQueue->processQueue();
}
/**
* @covers \DCarbone\UglyQueue::keyExistsInQueue
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
*/
public function testKeyExistsInQueueReturnsFalseWithEmptyQueueAfterInitialization(\DCarbone\UglyQueue $uglyQueue)
public function testKeyExistsInQueueReturnsFalseWithEmptyQueueAfterInitialization(\Cybercinch\UglyQueue $uglyQueue)
{
$exists = $uglyQueue->keyExistsInQueue(0);
$this->assertFalse($exists);
}
/**
* @covers \DCarbone\UglyQueue::addToQueue
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @expectedException \RuntimeException
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::addItem
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenTryingToAddItemsToQueueWithoutLock(\DCarbone\UglyQueue $uglyQueue)
public function testExceptionThrownWhenTryingToAddItemsToQueueWithoutLock(\Cybercinch\UglyQueue $uglyQueue)
{
$addToQueue = $uglyQueue->addToQueue('test', 'value');
$this->expectException(\RuntimeException::class);
$uglyQueue->addItem('test', 'value');
}
/**
* @covers \DCarbone\UglyQueue::__get
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::getPath
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetQueueDirectory(\DCarbone\UglyQueue $uglyQueue)
public function testCanGetQueueDirectory(\Cybercinch\UglyQueue $uglyQueue)
{
$queuePath = $uglyQueue->path;
$queuePath = $uglyQueue->getPath();
$this->assertFileExists($queuePath);
}
/**
* @covers \DCarbone\UglyQueue::__get
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::getName
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetQueueName(\DCarbone\UglyQueue $uglyQueue)
public function testCanGetQueueName(\Cybercinch\UglyQueue $uglyQueue)
{
$queueName = $uglyQueue->name;
$queueName = $uglyQueue->getName();
$this->assertEquals('tasty-sandwich', $queueName);
}
/**
* @covers \DCarbone\UglyQueue::__get
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::getMode
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetQueueLockedStatus(\DCarbone\UglyQueue $uglyQueue)
public function testCanGetQueueMode(\Cybercinch\UglyQueue $uglyQueue)
{
$locked = $uglyQueue->locked;
$mode = $uglyQueue->getMode();
$this->assertEquals(\Cybercinch\UglyQueue::QUEUE_READWRITE, $mode);
}
/**
* @covers \Cybercinch\UglyQueue::getBaseDir
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetBaseDirectory(\Cybercinch\UglyQueue $uglyQueue)
{
$baseDir = $uglyQueue->getBaseDir();
$this->assertEquals($this->baseDir, $baseDir);
}
/**
* @covers \Cybercinch\UglyQueue::getLockFile
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetLockFilePath(\Cybercinch\UglyQueue $uglyQueue)
{
$lockFile = $uglyQueue->getLockFile();
$this->assertEquals(
sprintf('%s%s%s%squeue.lock',
$this->baseDir,
DIRECTORY_SEPARATOR,
$uglyQueue->getName(),
DIRECTORY_SEPARATOR),
$lockFile
);
}
/**
* @covers \Cybercinch\UglyQueue::getQueueFile
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetQueueFilePath(\Cybercinch\UglyQueue $uglyQueue)
{
$queueFile = $uglyQueue->getQueueFile();
$this->assertEquals(
sprintf('%s%s%s%squeue.txt',
$this->baseDir,
DIRECTORY_SEPARATOR,
$uglyQueue->getName(),
DIRECTORY_SEPARATOR),
$queueFile
);
}
/**
* @covers \Cybercinch\UglyQueue::getQueueTmpFile
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetQueueTmpFilePath(\Cybercinch\UglyQueue $uglyQueue)
{
$queueTmpFile = $uglyQueue->getQueueTmpFile();
$this->assertEquals(
sprintf(
'%s%s%s%squeue.tmp',
$this->baseDir,
DIRECTORY_SEPARATOR,
$uglyQueue->getName(),
DIRECTORY_SEPARATOR),
$queueTmpFile
);
}
/**
* @covers \Cybercinch\UglyQueue::getSerializeFile
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetSerializeFilePath(\Cybercinch\UglyQueue $uglyQueue)
{
$serializeFile = $uglyQueue->getSerializeFile();
$this->assertEquals(
sprintf(
'%s%s%s%sugly-queue.obj',
$this->baseDir,
DIRECTORY_SEPARATOR,
$uglyQueue->getName(),
DIRECTORY_SEPARATOR),
$serializeFile
);
}
/**
* @covers \Cybercinch\isAlreadyLocked::isAlreadyLocked
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetQueueLockedStatus(\Cybercinch\UglyQueue $uglyQueue)
{
$locked = $uglyQueue->isAlreadyLocked();
$this->assertFalse($locked);
}
/**
* @covers \DCarbone\UglyQueue::__get
* @uses \DCarbone\UglyQueue
* @expectedException \OutOfBoundsException
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::count
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenAttemptingToGetInvalidProperty(\DCarbone\UglyQueue $uglyQueue)
public function testGetQueueItemCountReturnsZeroWithEmptyQueue(\Cybercinch\UglyQueue $uglyQueue)
{
$sandwich = $uglyQueue->sandwich;
}
/**
* @covers \DCarbone\UglyQueue::isLocked
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
*/
public function testIsLockedReturnsFalseBeforeLocking(\DCarbone\UglyQueue $uglyQueue)
{
$isLocked = $uglyQueue->isLocked();
$this->assertFalse($isLocked);
}
/**
* @covers \DCarbone\UglyQueue::getQueueItemCount
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
*/
public function testGetQueueItemCountReturnsZeroWithEmptyQueue(\DCarbone\UglyQueue $uglyQueue)
{
$itemCount = $uglyQueue->getQueueItemCount();
$itemCount = count($uglyQueue);
$this->assertEquals(0, $itemCount);
}
/**
* @covers \DCarbone\UglyQueue::queueWithDirectoryPathAndObservers
* @uses \DCarbone\UglyQueue
* @return \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::__construct
* @uses \Cybercinch\UglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanInitializeExistingQueue()
{
$uglyQueue = \DCarbone\UglyQueue::queueWithDirectoryPathAndObservers(dirname(__DIR__).'/misc/queues/tasty-sandwich');
$uglyQueue = new \Cybercinch\UglyQueue($this->baseDir, 'tasty-sandwich');
$this->assertInstanceOf('\\DCarbone\\UglyQueue', $uglyQueue);
$this->assertInstanceOf('\\Cybercinch\\UglyQueue', $uglyQueue);
return $uglyQueue;
}
/**
* @covers \DCarbone\UglyQueue::lock
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @expectedException \InvalidArgumentException
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::lock
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenPassingNonIntegerValueToLock(\DCarbone\UglyQueue $uglyQueue)
public function testExceptionThrownWhenPassingNonIntegerValueToLock(\Cybercinch\UglyQueue $uglyQueue)
{
$this->expectException(\InvalidArgumentException::class);
$uglyQueue->lock('7 billion');
}
/**
* @covers \DCarbone\UglyQueue::lock
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @expectedException \InvalidArgumentException
* @param \DCarbone\UglyQueue $uglyQueue
* @covers \Cybercinch\UglyQueue::lock
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenPassingNegativeIntegerValueToLock(\DCarbone\UglyQueue $uglyQueue)
public function testExceptionThrownWhenPassingNegativeIntegerValueToLock(\Cybercinch\UglyQueue $uglyQueue)
{
$this->expectException(\InvalidArgumentException::class);
$uglyQueue->lock(-73);
}
/**
* @covers \DCarbone\UglyQueue::lock
* @covers \DCarbone\UglyQueue::isLocked
* @covers \DCarbone\UglyQueue::createLockFile
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeUglyQueueWithValidConfigArrayAndNoObservers
* @param \DCarbone\UglyQueue $uglyQueue
* @return \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::lock
* @covers \Cybercinch\isAlreadyLocked::isAlreadyLocked
* @covers \Cybercinch\UglyQueue::createLockFile
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidParameters
* @param \Cybercinch\UglyQueue $uglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanLockUglyQueueWithDefaultTTL(\DCarbone\UglyQueue $uglyQueue)
public function testCanLockUglyQueueWithDefaultTTL(\Cybercinch\UglyQueue $uglyQueue)
{
$locked = $uglyQueue->lock();
$this->assertTrue($locked);
$queueDir = $uglyQueue->path;
$this->assertFileExists($uglyQueue->getLockFile());
$this->assertFileExists($queueDir.'queue.lock');
$decode = @json_decode(file_get_contents($queueDir.'queue.lock'));
$decode = @json_decode(file_get_contents($uglyQueue->getLockFile()));
$this->assertTrue((json_last_error() === JSON_ERROR_NONE));
$this->assertObjectHasAttribute('ttl', $decode);
@@ -231,103 +297,104 @@ class UglyQueueTest extends PHPUnit_Framework_TestCase
}
/**
* @covers \DCarbone\UglyQueue::lock
* @covers \DCarbone\UglyQueue::isLocked
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::lock
* @covers \Cybercinch\isAlreadyLocked::isAlreadyLocked
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeExistingQueue
* @param \DCarbone\UglyQueue $uglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCannotLockQueueThatIsAlreadyLocked(\DCarbone\UglyQueue $uglyQueue)
public function testCannotLockQueueThatIsAlreadyLocked(\Cybercinch\UglyQueue $uglyQueue)
{
$lock = $uglyQueue->lock();
$this->assertFalse($lock);
}
/**
* @covers \DCarbone\UglyQueue::isLocked
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\isAlreadyLocked::isAlreadyLocked
* @uses \Cybercinch\UglyQueue
* @depends testCanLockUglyQueueWithDefaultTTL
* @param \DCarbone\UglyQueue $uglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testIsLockedReturnsTrueAfterLocking(\DCarbone\UglyQueue $uglyQueue)
public function testIsLockedReturnsTrueAfterLocking(\Cybercinch\UglyQueue $uglyQueue)
{
$isLocked = $uglyQueue->isLocked();
$isLocked = $uglyQueue->isAlreadyLocked();
$this->assertTrue($isLocked);
}
/**
* @covers \DCarbone\UglyQueue::unlock
* @uses \DCarbone\UglyQueue
* @uses \DCarbone\Helpers\FileHelper
* @covers \Cybercinch\UglyQueue::unlock
* @uses \Cybercinch\UglyQueue
* @uses \Cybercinch\Helpers\FileHelper
* @depends testCanLockUglyQueueWithDefaultTTL
* @param \DCarbone\UglyQueue $uglyQueue
* @return \DCarbone\UglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanUnlockLockedQueue(\DCarbone\UglyQueue $uglyQueue)
public function testCanUnlockLockedQueue(\Cybercinch\UglyQueue $uglyQueue)
{
$uglyQueue->unlock();
$queueGroupDir = $uglyQueue->path;
$this->assertFileNotExists($queueGroupDir.'queue.lock');
$this->assertFileNotExists($uglyQueue->getLockFile());
return $uglyQueue;
}
/**
* @covers \DCarbone\UglyQueue::isLocked
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\isAlreadyLocked::isAlreadyLocked
* @uses \Cybercinch\UglyQueue
* @depends testCanUnlockLockedQueue
* @param \DCarbone\UglyQueue $uglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testIsLockedReturnsFalseAfterUnlockingQueue(\DCarbone\UglyQueue $uglyQueue)
public function testIsLockedReturnsFalseAfterUnlockingQueue(\Cybercinch\UglyQueue $uglyQueue)
{
$isLocked = $uglyQueue->isLocked();
$isLocked = $uglyQueue->isAlreadyLocked();
$this->assertFalse($isLocked);
}
/**
* @covers \DCarbone\UglyQueue::lock
* @covers \DCarbone\UglyQueue::isLocked
* @uses \DCarbone\UglyQueue
* @uses \DCarbone\Helpers\FileHelper
* @covers \Cybercinch\UglyQueue::lock
* @covers \Cybercinch\isAlreadyLocked::isAlreadyLocked
* @uses \Cybercinch\UglyQueue
* @uses \Cybercinch\Helpers\FileHelper
* @depends testCanUnlockLockedQueue
* @param \DCarbone\UglyQueue $uglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testIsLockedReturnsFalseWithStaleQueueLockFile(\DCarbone\UglyQueue $uglyQueue)
public function testIsLockedReturnsFalseWithStaleQueueLockFile(\Cybercinch\UglyQueue $uglyQueue)
{
$uglyQueue->lock(2);
$isLocked = $uglyQueue->isLocked();
$isLocked = $uglyQueue->isAlreadyLocked();
$this->assertTrue($isLocked);
sleep(3);
$isLocked = $uglyQueue->isLocked();
$isLocked = $uglyQueue->isAlreadyLocked();
$this->assertFalse($isLocked);
}
/**
* @covers \DCarbone\UglyQueue::lock
* @covers \DCarbone\UglyQueue::isLocked
* @covers \DCarbone\UglyQueue::__get
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::lock
* @covers \Cybercinch\isAlreadyLocked::isAlreadyLocked
* @uses \Cybercinch\UglyQueue
* @depends testCanUnlockLockedQueue
* @param \DCarbone\UglyQueue $uglyQueue
* @return \DCarbone\UglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanLockQueueWithValidIntegerValue(\DCarbone\UglyQueue $uglyQueue)
public function testCanLockQueueWithValidIntegerValue(\Cybercinch\UglyQueue $uglyQueue)
{
$locked = $uglyQueue->lock(200);
$this->assertTrue($locked);
$queueDir = $uglyQueue->path;
$this->assertFileExists($uglyQueue->getLockFile());
$this->assertFileExists($queueDir.'queue.lock');
$decode = @json_decode(file_get_contents($queueDir.'queue.lock'));
$decode = @json_decode(file_get_contents($uglyQueue->getLockFile()));
$this->assertTrue((json_last_error() === JSON_ERROR_NONE));
$this->assertObjectHasAttribute('ttl', $decode);
@@ -338,28 +405,27 @@ class UglyQueueTest extends PHPUnit_Framework_TestCase
}
/**
* @covers \DCarbone\UglyQueue::addToQueue
* @uses \DCarbone\UglyQueue
* @uses \DCarbone\Helpers\FileHelper
* @covers \Cybercinch\UglyQueue::addItem
* @uses \Cybercinch\UglyQueue
* @uses \Cybercinch\Helpers\FileHelper
* @depends testCanLockQueueWithValidIntegerValue
* @param \DCarbone\UglyQueue $uglyQueue
* @return \DCarbone\UglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock(\DCarbone\UglyQueue $uglyQueue)
public function testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock(\Cybercinch\UglyQueue $uglyQueue)
{
foreach(array_reverse($this->tastySandwich, true) as $k=>$v)
{
$added = $uglyQueue->addToQueue($k, $v);
$added = $uglyQueue->addItem($k, $v);
$this->assertTrue($added);
}
$groupDir = $uglyQueue->path;
$this->assertFileExists(
$groupDir.'queue.tmp',
$uglyQueue->getQueueTmpFile(),
'queue.tmp file was not created!');
$lineCount = \DCarbone\Helpers\FileHelper::getLineCount($groupDir.'queue.tmp');
$lineCount = \Dcarbone\Helpers\FileHelper::getLineCount($uglyQueue->getQueueTmpFile());
$this->assertEquals(11, $lineCount);
@@ -367,19 +433,18 @@ class UglyQueueTest extends PHPUnit_Framework_TestCase
}
/**
* @covers \DCarbone\UglyQueue::_populateQueue
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::_populateQueue
* @uses \Cybercinch\UglyQueue
* @depends testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock
* @param \DCarbone\UglyQueue $uglyQueue
* @return \DCarbone\UglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanForciblyUpdateQueueFileFromTempFile(\DCarbone\UglyQueue $uglyQueue)
public function testCanForciblyUpdateQueueFileFromTempFile(\Cybercinch\UglyQueue $uglyQueue)
{
$uglyQueue->_populateQueue();
$groupDir = $uglyQueue->path;
$this->assertFileNotExists($groupDir.'queue.tmp');
$this->assertFileNotExists($uglyQueue->getQueueTmpFile());
$uglyQueue->_populateQueue();
@@ -387,98 +452,101 @@ class UglyQueueTest extends PHPUnit_Framework_TestCase
}
/**
* @covers \DCarbone\UglyQueue::getQueueItemCount
* @uses \DCarbone\UglyQueue
* @uses \DCarbone\Helpers\FileHelper
* @covers \Cybercinch\UglyQueue::count
* @uses \Cybercinch\UglyQueue
* @uses \Cybercinch\Helpers\FileHelper
* @depends testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock
* @param \DCarbone\UglyQueue $uglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testCanGetCountOfItemsInPopulatedQueue(\DCarbone\UglyQueue $uglyQueue)
public function testCanGetCountOfItemsInPopulatedQueue(\Cybercinch\UglyQueue $uglyQueue)
{
$itemCount = $uglyQueue->getQueueItemCount();
$itemCount = count($uglyQueue);
$this->assertEquals(11, $itemCount);
}
/**
* @covers \DCarbone\UglyQueue::keyExistsInQueue
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::keyExistsInQueue
* @uses \Cybercinch\UglyQueue
* @depends testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock
* @param \DCarbone\UglyQueue $uglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testKeyExistsReturnsTrueWithPopulatedQueue(\DCarbone\UglyQueue $uglyQueue)
public function testKeyExistsReturnsTrueWithPopulatedQueue(\Cybercinch\UglyQueue $uglyQueue)
{
$exists = $uglyQueue->keyExistsInQueue(5);
$this->assertTrue($exists);
}
/**
* @covers \DCarbone\UglyQueue::processQueue
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::retrieveItems
* @uses \Cybercinch\UglyQueue
* @depends testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock
* @expectedException \InvalidArgumentException
* @param \DCarbone\UglyQueue $uglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenTryingToProcessLockedQueueWithNonInteger(\DCarbone\UglyQueue $uglyQueue)
public function testExceptionThrownWhenTryingToProcessLockedQueueWithNonInteger(\Cybercinch\UglyQueue $uglyQueue)
{
$process = $uglyQueue->processQueue('Eleventy Billion');
$this->expectException(\InvalidArgumentException::class);
$uglyQueue->retrieveItems('Eleventy Billion');
}
/**
* @covers \DCarbone\UglyQueue::processQueue
* @uses \DCarbone\UglyQueue
* @covers \Cybercinch\UglyQueue::retrieveItems
* @uses \Cybercinch\UglyQueue
* @depends testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock
* @expectedException \InvalidArgumentException
* @param \DCarbone\UglyQueue $uglyQueue
* @expectedException
* @param \Cybercinch\UglyQueue $uglyQueue
*/
public function testExceptionThrownWhenTryingToProcessLockedQueueWithIntegerLessThan1(\DCarbone\UglyQueue $uglyQueue)
public function testExceptionThrownWhenTryingToProcessLockedQueueWithIntegerLessThan1(\Cybercinch\UglyQueue $uglyQueue)
{
$process = $uglyQueue->processQueue(0);
$this->expectException(\InvalidArgumentException::class);
$uglyQueue->retrieveItems(0);
}
/**
* @covers \DCarbone\UglyQueue::processQueue
* @covers \DCarbone\UglyQueue::getQueueItemCount
* @uses \DCarbone\UglyQueue
* @uses \DCarbone\Helpers\FileHelper
* @covers \Cybercinch\UglyQueue::retrieveItems
* @covers \Cybercinch\UglyQueue::count
* @uses \Cybercinch\UglyQueue
* @uses \Cybercinch\Helpers\FileHelper
* @depends testCanPopulateQueueTempFileAfterInitializationAndAcquiringLock
* @param \DCarbone\UglyQueue $uglyQueue
* @return \DCarbone\UglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanGetPartialQueueContents(\DCarbone\UglyQueue $uglyQueue)
public function testCanGetPartialQueueContents(\Cybercinch\UglyQueue $uglyQueue)
{
$process = $uglyQueue->processQueue(5);
$process = $uglyQueue->retrieveItems(5);
$this->assertEquals(5, count($process));
$this->assertArrayHasKey('0', $process);
$this->assertArrayHasKey('4', $process);
$this->assertEquals(6, $uglyQueue->getQueueItemCount());
$this->assertEquals(6, count($uglyQueue));
return $uglyQueue;
}
/**
* @covers \DCarbone\UglyQueue::processQueue
* @covers \DCarbone\UglyQueue::getQueueItemCount
* @uses \DCarbone\UglyQueue
* @uses \DCarbone\Helpers\FileHelper
* @covers \Cybercinch\UglyQueue::retrieveItems
* @covers \Cybercinch\UglyQueue::count
* @uses \Cybercinch\UglyQueue
* @uses \Cybercinch\Helpers\FileHelper
* @depends testCanGetPartialQueueContents
* @param \DCarbone\UglyQueue $uglyQueue
* @return \DCarbone\UglyQueue
* @param \Cybercinch\UglyQueue $uglyQueue
* @return \Cybercinch\UglyQueue
*/
public function testCanGetFullQueueContents(\DCarbone\UglyQueue $uglyQueue)
public function testCanGetFullQueueContents(\Cybercinch\UglyQueue $uglyQueue)
{
$process = $uglyQueue->processQueue(6);
$process = $uglyQueue->retrieveItems(6);
$this->assertEquals(6, count($process));
$this->assertArrayHasKey('10', $process);
$this->assertArrayHasKey('5', $process);
$this->assertEquals(0, $uglyQueue->getQueueItemCount());
$this->assertEquals(0, count($uglyQueue));
return $uglyQueue;
}

View File

@@ -3,75 +3,57 @@
/**
* Class UglyQueueManagerTest
*/
class UglyQueueManagerTest extends PHPUnit_Framework_TestCase
class UglyQueueManagerTest extends PHPUnit\Framework\TestCase
{
protected $baseDir;
protected $reallyTastySandwich = array(
'0' => 'beef broth',
'1' => 'barbeque sauce',
'2' => 'boneless pork ribs',
);
/**
* @covers \DCarbone\UglyQueueManager::__construct
* @covers \DCarbone\UglyQueueManager::init
* @covers \DCarbone\UglyQueue::unserialize
* @covers \DCarbone\UglyQueue::__get
* @covers \DCarbone\UglyQueueManager::addQueue
* @covers \DCarbone\UglyQueueManager::containsQueueWithName
* @uses \DCarbone\UglyQueueManager
* @uses \DCarbone\UglyQueue
* @return \DCarbone\UglyQueueManager
*/
public function testCanInitializeManagerWithConfigAndNoObservers()
protected function setUp(): void
{
$config = array(
'queue-base-dir' => __DIR__.'/../misc/queues'
);
$this->baseDir = realpath(__DIR__.'/../misc/queues');
}
$manager = \DCarbone\UglyQueueManager::init($config);
/**
* @covers \Cybercinch\UglyQueueManager::__construct
* @covers \Cybercinch\UglyQueue::unserialize
* @covers \Cybercinch\UglyQueueManager::addQueue
* @covers \Cybercinch\UglyQueueManager::containsQueueWithName
* @uses \Cybercinch\UglyQueueManager
* @uses \Cybercinch\UglyQueue
* @return \Cybercinch\UglyQueueManager
*/
public function testCanInitializeObjectWithValidPath()
{
$manager = new \Cybercinch\UglyQueueManager($this->baseDir);
$this->assertInstanceOf('\\DCarbone\\UglyQueueManager', $manager);
$this->assertInstanceOf('\\Cybercinch\\UglyQueueManager', $manager);
return $manager;
}
/**
* @covers \DCarbone\UglyQueueManager::init
* @covers \DCarbone\UglyQueueManager::__construct
* @uses \DCarbone\UglyQueueManager
* @expectedException \RuntimeException
* @covers \Cybercinch\UglyQueueManager::__construct
* @uses \Cybercinch\UglyQueueManager
*/
public function testExceptionThrownDuringConstructionWithInvalidBasePathValue()
{
$config = array(
'queue-base-dir' => 'i do not exist!'
);
$manager = \DCarbone\UglyQueueManager::init($config);
$this->expectException(RuntimeException::class);
new \Cybercinch\UglyQueueManager('i do not exist!');
}
/**
* @covers \DCarbone\UglyQueueManager::init
* @covers \DCarbone\UglyQueueManager::__construct
* @uses \DCarbone\UglyQueueManager
* @expectedException \InvalidArgumentException
*/
public function testExceptionThrownDuringConstructionWithInvalidConfArray()
{
$config = array(
'wrong-key' => 'wrong value'
);
$manager = \DCarbone\UglyQueueManager::init($config);
}
/**
* @covers \DCarbone\UglyQueueManager::containsQueueWithName
* @uses \DCarbone\UglyQueueManager
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::containsQueueWithName
* @uses \Cybercinch\UglyQueueManager
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testCanDetermineIfValidQueueExistsInManager(\DCarbone\UglyQueueManager $manager)
public function testCanDetermineIfValidQueueExistsInManager(\Cybercinch\UglyQueueManager $manager)
{
$shouldBeTrue = $manager->containsQueueWithName('tasty-sandwich');
@@ -79,12 +61,12 @@ class UglyQueueManagerTest extends PHPUnit_Framework_TestCase
}
/**
* @covers \DCarbone\UglyQueueManager::containsQueueWithName
* @uses \DCarbone\UglyQueueManager
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::containsQueueWithName
* @uses \Cybercinch\UglyQueueManager
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testCanDetermineQueueDoesNotExistInManager(\DCarbone\UglyQueueManager $manager)
public function testCanDetermineQueueDoesNotExistInManager(\Cybercinch\UglyQueueManager $manager)
{
$shouldBeFalse = $manager->containsQueueWithName('i should not exist');
@@ -92,96 +74,95 @@ class UglyQueueManagerTest extends PHPUnit_Framework_TestCase
}
/**
* @covers \DCarbone\UglyQueueManager::getQueueWithName
* @covers \DCarbone\UglyQueue::__get
* @uses \DCarbone\UglyQueueManager
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::getQueueWithName
* @uses \Cybercinch\UglyQueueManager
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testCanGetUglyQueueObjectFromManager(\DCarbone\UglyQueueManager $manager)
public function testCanGetUglyQueueObjectFromManager(\Cybercinch\UglyQueueManager $manager)
{
$uglyQueue = $manager->getQueueWithName('tasty-sandwich');
$this->assertInstanceOf('\\DCarbone\\UglyQueue', $uglyQueue);
$this->assertEquals('tasty-sandwich', $uglyQueue->name);
$this->assertInstanceOf('\\Cybercinch\\UglyQueue', $uglyQueue);
$this->assertEquals('tasty-sandwich', $uglyQueue->getName());
}
/**
* @covers \DCarbone\UglyQueueManager::getQueueWithName
* @uses \DCarbone\UglyQueueManager
* @expectedException \InvalidArgumentException
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::getQueueWithName
* @uses \Cybercinch\UglyQueueManager
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testExceptionThrownWhenTryingToGetNonExistentQueueFromManager(\DCarbone\UglyQueueManager $manager)
public function testExceptionThrownWhenTryingToGetNonExistentQueueFromManager(\Cybercinch\UglyQueueManager $manager)
{
$shouldNotExist = $manager->getQueueWithName('sandwiches');
$this->expectException(InvalidArgumentException::class);
$manager->getQueueWithName('sandwiches');
}
/**
* @covers \DCarbone\UglyQueueManager::getQueueList
* @uses \DCarbone\UglyQueueManager
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::getQueueList
* @uses \Cybercinch\UglyQueueManager
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testCanGetListOfQueuesInManager(\DCarbone\UglyQueueManager $manager)
public function testCanGetListOfQueuesInManager(\Cybercinch\UglyQueueManager $manager)
{
$queueList = $manager->getQueueList();
$this->assertInternalType('array', $queueList);
$this->assertIsArray($queueList);
$this->assertCount(1, $queueList);
$this->assertContains('tasty-sandwich', $queueList);
}
/**
* @covers \DCarbone\UglyQueueManager::getQueueWithName
* @covers \DCarbone\UglyQueueManager::addQueue
* @uses \DCarbone\UglyQueueManager
* @uses \DCarbone\UglyQueue
* @expectedException \RuntimeException
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::getQueueWithName
* @covers \Cybercinch\UglyQueueManager::addQueue
* @uses \Cybercinch\UglyQueueManager
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testExceptionThrownWhenReAddingQueueToManager(\DCarbone\UglyQueueManager $manager)
public function testExceptionThrownWhenReAddingQueueToManager(\Cybercinch\UglyQueueManager $manager)
{
$this->expectException(RuntimeException::class);
$uglyQueue = $manager->getQueueWithName('tasty-sandwich');
$manager->addQueue($uglyQueue);
}
/**
* @covers \DCarbone\UglyQueueManager::addQueueAtPath
* @covers \DCarbone\UglyQueueManager::addQueue
* @covers \DCarbone\UglyQueueManager::getQueueWithName
* @uses \DCarbone\UglyQueueManager
* @uses \DCarbone\UglyQueue
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::addQueueAtPath
* @covers \Cybercinch\UglyQueueManager::addQueue
* @covers \Cybercinch\UglyQueueManager::getQueueWithName
* @uses \Cybercinch\UglyQueueManager
* @uses \Cybercinch\UglyQueue
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testCanInitializeNewQueueAndAddToManager(\DCarbone\UglyQueueManager $manager)
public function testCanInitializeNewQueueAndAddToManager(\Cybercinch\UglyQueueManager $manager)
{
$manager->addQueueAtPath(__DIR__.'/../misc/queues/really-tasty-sandwich');
$manager->addQueueAtPath($this->baseDir.'/really-tasty-sandwich');
$uglyQueue = $manager->getQueueWithName('really-tasty-sandwich');
$this->assertInstanceOf('\\DCarbone\\UglyQueue', $uglyQueue);
$this->assertEquals('really-tasty-sandwich', $uglyQueue->name);
$this->assertInstanceOf('\\Cybercinch\\UglyQueue', $uglyQueue);
$this->assertEquals('really-tasty-sandwich', $uglyQueue->getName());
$queueList = $manager->getQueueList();
$this->assertInternalType('array', $queueList);
$this->assertIsArray($queueList);
$this->assertCount(2, $queueList);
$this->assertContains('really-tasty-sandwich', $queueList);
}
/**
* @covers \DCarbone\UglyQueueManager::removeQueueByName
* @uses \DCarbone\UglyQueueManager
* @depends testCanInitializeManagerWithConfigAndNoObservers
* @param \DCarbone\UglyQueueManager $manager
* @covers \Cybercinch\UglyQueueManager::removeQueueByName
* @uses \Cybercinch\UglyQueueManager
* @depends testCanInitializeObjectWithValidPath
* @param \Cybercinch\UglyQueueManager $manager
*/
public function testCanRemoveQueueFromManagerByName(\DCarbone\UglyQueueManager $manager)
public function testCanRemoveQueueFromManagerByName(\Cybercinch\UglyQueueManager $manager)
{
$manager->removeQueueByName('really-tasty-sandwich');
@@ -192,12 +173,12 @@ class UglyQueueManagerTest extends PHPUnit_Framework_TestCase
}
// /**
// * @covers \DCarbone\UglyQueue::queueExists
// * @uses \DCarbone\UglyQueue
// * @covers \Cybercinch\UglyQueue::queueExists
// * @uses \Cybercinch\UglyQueue
// * @depends testCanInitializeNewUglyQueue
// * @param \DCarbone\UglyQueue $uglyQueue
// * @param \Cybercinch\UglyQueue $uglyQueue
// */
// public function testCanDetermineExistenceOfExistingQueue(\DCarbone\UglyQueue $uglyQueue)
// public function testCanDetermineExistenceOfExistingQueue(\Cybercinch\UglyQueue $uglyQueue)
// {
// $exists = $uglyQueue->queueExists('tasty-sandwich');
//
@@ -205,12 +186,12 @@ class UglyQueueManagerTest extends PHPUnit_Framework_TestCase
// }
//
// /**
// * @covers \DCarbone\UglyQueue::queueExists
// * @uses \DCarbone\UglyQueue
// * @covers \Cybercinch\UglyQueue::queueExists
// * @uses \Cybercinch\UglyQueue
// * @depends testCanInitializeNewUglyQueue
// * @param \DCarbone\UglyQueue $uglyQueue
// * @param \Cybercinch\UglyQueue $uglyQueue
// */
// public function testCanDetermineExistenceOfNonExistingQueue(\DCarbone\UglyQueue $uglyQueue)
// public function testCanDetermineExistenceOfNonExistingQueue(\Cybercinch\UglyQueue $uglyQueue)
// {
// $exists = $uglyQueue->queueExists('nasty-sandwich');
//
@@ -218,12 +199,12 @@ class UglyQueueManagerTest extends PHPUnit_Framework_TestCase
// }
//
// /**
// * @covers \DCarbone\UglyQueue::getInitializedQueueList
// * @uses \DCarbone\UglyQueue
// * @covers \Cybercinch\UglyQueue::getInitializedQueueList
// * @uses \Cybercinch\UglyQueue
// * @depends testCanInitializeNewUglyQueue
// * @param \DCarbone\UglyQueue $uglyQueue
// * @param \Cybercinch\UglyQueue $uglyQueue
// */
// public function testCanGetListOfInitializedQueues(\DCarbone\UglyQueue $uglyQueue)
// public function testCanGetListOfInitializedQueues(\Cybercinch\UglyQueue $uglyQueue)
// {
// $queueList = $uglyQueue->getInitializedQueueList();
//