1
0
mirror of https://github.com/danog/parallel.git synced 2025-01-22 05:51:14 +01:00
parallel/test/Sync/SharedMemoryParcelTest.php

102 lines
2.6 KiB
PHP
Raw Normal View History

2016-12-29 19:16:04 -06:00
<?php
2016-08-23 16:47:40 -05:00
namespace Amp\Parallel\Test\Sync;
2016-08-18 11:04:48 -05:00
2016-08-23 16:47:40 -05:00
use Amp\Parallel\Sync\SharedMemoryParcel;
/**
* @requires extension shmop
2015-08-31 12:26:11 -05:00
* @requires extension sysvmsg
*/
2016-08-18 17:36:58 -05:00
class SharedMemoryParcelTest extends AbstractParcelTest {
2015-08-28 16:58:15 -05:00
private $parcel;
2016-08-18 17:36:58 -05:00
protected function createParcel($value) {
2015-12-04 23:50:32 -06:00
$this->parcel = new SharedMemoryParcel($value);
2015-08-28 16:58:15 -05:00
return $this->parcel;
}
2016-08-18 17:36:58 -05:00
public function tearDown() {
2015-08-28 16:58:15 -05:00
if ($this->parcel !== null) {
$this->parcel->free();
}
}
2016-08-18 17:36:58 -05:00
public function testNewObjectIsNotFreed() {
2015-12-04 23:50:32 -06:00
$object = new SharedMemoryParcel(new \stdClass());
$this->assertFalse($object->isFreed());
$object->free();
}
2016-08-18 17:36:58 -05:00
public function testFreeReleasesObject() {
2015-12-04 23:50:32 -06:00
$object = new SharedMemoryParcel(new \stdClass());
$object->free();
$this->assertTrue($object->isFreed());
}
/**
2016-08-23 16:47:40 -05:00
* @expectedException \Amp\Parallel\SharedMemoryException
*/
2016-08-18 17:36:58 -05:00
public function testUnwrapThrowsErrorIfFreed() {
2015-12-04 23:50:32 -06:00
$object = new SharedMemoryParcel(new \stdClass());
$object->free();
$object->unwrap();
}
2016-08-18 17:36:58 -05:00
public function testCloneIsNewObject() {
2016-08-22 18:25:19 -05:00
$object = new \stdClass;
2015-12-04 23:50:32 -06:00
$shared = new SharedMemoryParcel($object);
$clone = clone $shared;
$this->assertNotSame($shared, $clone);
$this->assertNotSame($object, $clone->unwrap());
$this->assertNotEquals($shared->__debugInfo()['id'], $clone->__debugInfo()['id']);
$clone->free();
$shared->free();
}
2015-08-10 14:28:47 -05:00
2016-08-18 17:36:58 -05:00
public function testObjectOverflowMoved() {
2015-12-04 23:50:32 -06:00
$object = new SharedMemoryParcel('hi', 14);
2016-08-18 17:36:58 -05:00
$awaitable = $object->synchronized(function () {
return 'hello world';
2016-08-18 17:36:58 -05:00
});
\Amp\Promise\wait($awaitable);
$this->assertEquals('hello world', $object->unwrap());
$object->free();
}
2015-08-10 14:28:47 -05:00
/**
* @group posix
* @requires extension pcntl
2015-08-10 14:28:47 -05:00
*/
2016-08-18 17:36:58 -05:00
public function testSetInSeparateProcess() {
2015-12-04 23:50:32 -06:00
$object = new SharedMemoryParcel(42);
2015-08-10 14:28:47 -05:00
$this->doInFork(function () use ($object) {
2016-08-18 17:36:58 -05:00
$awaitable = $object->synchronized(function () {
return 43;
2016-08-18 17:36:58 -05:00
});
\Amp\Promise\wait($awaitable);
2015-08-10 14:28:47 -05:00
});
$this->assertEquals(43, $object->unwrap());
2015-08-10 14:28:47 -05:00
$object->free();
}
/**
* @group posix
* @requires extension pcntl
2015-08-10 14:28:47 -05:00
*/
2016-08-18 17:36:58 -05:00
public function testFreeInSeparateProcess() {
2015-12-04 23:50:32 -06:00
$object = new SharedMemoryParcel(42);
2015-08-10 14:28:47 -05:00
$this->doInFork(function () use ($object) {
$object->free();
});
$this->assertTrue($object->isFreed());
}
}