public function provideMutexFactories()
{
$cases = ["NoMutex" => [function () {
return new NoMutex();
}], "TransactionalMutex" => [function () {
$pdo = new \PDO("sqlite::memory:");
$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
return new TransactionalMutex($pdo, self::TIMEOUT);
}], "FlockMutex" => [function () {
vfsStream::setup("test");
return new FlockMutex(fopen(vfsStream::url("test/lock"), "w"));
}], "SemaphoreMutex" => [function () {
return new SemaphoreMutex(sem_get(ftok(__FILE__, "a")));
}], "SpinlockMutex" => [function () {
$mock = $this->getMockForAbstractClass(SpinlockMutex::class, ["test"]);
$mock->expects($this->any())->method("acquire")->willReturn(true);
$mock->expects($this->any())->method("release")->willReturn(true);
return $mock;
}], "LockMutex" => [function () {
$mock = $this->getMockForAbstractClass(LockMutex::class);
$mock->expects($this->any())->method("lock")->willReturn(true);
$mock->expects($this->any())->method("unlock")->willReturn(true);
return $mock;
}]];
if (getenv("MEMCACHE_HOST")) {
$cases["MemcachedMutex"] = [function () {
$memcache = new Memcached();
$memcache->addServer(getenv("MEMCACHE_HOST"), 11211);
return new MemcachedMutex("test", $memcache, self::TIMEOUT);
}];
}
if (getenv("REDIS_URIS")) {
$uris = explode(",", getenv("REDIS_URIS"));
$cases["PredisMutex"] = [function () use($uris) {
$clients = array_map(function ($uri) {
return new Client($uri);
}, $uris);
return new PredisMutex($clients, "test", self::TIMEOUT);
}];
$cases["PHPRedisMutex"] = [function () use($uris) {
$apis = array_map(function ($uri) {
$redis = new Redis();
$uri = parse_url($uri);
if (!empty($uri["port"])) {
$redis->connect($uri["host"], $uri["port"]);
} else {
$redis->connect($uri["host"]);
}
return $redis;
}, $uris);
return new PHPRedisMutex($apis, "test", self::TIMEOUT);
}];
}
return $cases;
}