From d4c92e48bada7593b6fbec612a742c599de6e736 Mon Sep 17 00:00:00 2001 From: Valery Piashchynski Date: Tue, 15 Jun 2021 22:12:32 +0300 Subject: - Jobs plugin initial commit Signed-off-by: Valery Piashchynski --- plugins/jobs/tests/Jobs/Amqp/BrokerTest.php | 20 ++++ plugins/jobs/tests/Jobs/Amqp/ErrorJob.php | 22 +++++ plugins/jobs/tests/Jobs/Amqp/Job.php | 26 +++++ plugins/jobs/tests/Jobs/BaseTest.php | 115 +++++++++++++++++++++++ plugins/jobs/tests/Jobs/Beanstalk/BrokerTest.php | 20 ++++ plugins/jobs/tests/Jobs/Beanstalk/ErrorJob.php | 22 +++++ plugins/jobs/tests/Jobs/Beanstalk/Job.php | 26 +++++ plugins/jobs/tests/Jobs/Local/BrokerTest.php | 20 ++++ plugins/jobs/tests/Jobs/Local/ErrorJob.php | 22 +++++ plugins/jobs/tests/Jobs/Local/Job.php | 26 +++++ plugins/jobs/tests/Jobs/OptionsTest.php | 34 +++++++ plugins/jobs/tests/Jobs/RegistryTest.php | 43 +++++++++ plugins/jobs/tests/Jobs/ShortCircuitTest.php | 90 ++++++++++++++++++ plugins/jobs/tests/Jobs/Sqs/BrokerTest.php | 20 ++++ plugins/jobs/tests/Jobs/Sqs/ErrorJob.php | 22 +++++ plugins/jobs/tests/Jobs/Sqs/Job.php | 26 +++++ 16 files changed, 554 insertions(+) create mode 100644 plugins/jobs/tests/Jobs/Amqp/BrokerTest.php create mode 100644 plugins/jobs/tests/Jobs/Amqp/ErrorJob.php create mode 100644 plugins/jobs/tests/Jobs/Amqp/Job.php create mode 100644 plugins/jobs/tests/Jobs/BaseTest.php create mode 100644 plugins/jobs/tests/Jobs/Beanstalk/BrokerTest.php create mode 100644 plugins/jobs/tests/Jobs/Beanstalk/ErrorJob.php create mode 100644 plugins/jobs/tests/Jobs/Beanstalk/Job.php create mode 100644 plugins/jobs/tests/Jobs/Local/BrokerTest.php create mode 100644 plugins/jobs/tests/Jobs/Local/ErrorJob.php create mode 100644 plugins/jobs/tests/Jobs/Local/Job.php create mode 100644 plugins/jobs/tests/Jobs/OptionsTest.php create mode 100644 plugins/jobs/tests/Jobs/RegistryTest.php create mode 100644 plugins/jobs/tests/Jobs/ShortCircuitTest.php create mode 100644 plugins/jobs/tests/Jobs/Sqs/BrokerTest.php create mode 100644 plugins/jobs/tests/Jobs/Sqs/ErrorJob.php create mode 100644 plugins/jobs/tests/Jobs/Sqs/Job.php (limited to 'plugins/jobs/tests/Jobs') diff --git a/plugins/jobs/tests/Jobs/Amqp/BrokerTest.php b/plugins/jobs/tests/Jobs/Amqp/BrokerTest.php new file mode 100644 index 00000000..637c14d6 --- /dev/null +++ b/plugins/jobs/tests/Jobs/Amqp/BrokerTest.php @@ -0,0 +1,20 @@ +job = static::JOB; + $this->errorJob = static::ERROR_JOB; + } + + protected function tearDown(): void + { + if (file_exists((static::JOB)::JOB_FILE)) { + unlink((static::JOB)::JOB_FILE); + } + } + + public function testJob(): void + { + $jobs = $this->makeJobs(); + + $id = $jobs->push($this->job, ['data' => 100]); + + $this->assertNotEmpty($id); + + $this->waitForJob(); + $this->assertFileExists($this->job::JOB_FILE); + + $data = json_decode(file_get_contents($this->job::JOB_FILE), true); + $this->assertSame($id, $data['id']); + $this->assertSame(100, $data['data']); + } + + public function testErrorJob(): void + { + $jobs = $this->makeJobs(); + + $id = $jobs->push($this->errorJob, ['data' => 100]); + $this->assertNotEmpty($id); + } + + public function testDelayJob(): void + { + $jobs = $this->makeJobs(); + + $id = $jobs->push($this->job, ['data' => 100], Options::delayed(1)); + + $this->assertNotEmpty($id); + + $this->assertTrue($this->waitForJob() > 1); + $this->assertFileExists($this->job::JOB_FILE); + + $data = json_decode(file_get_contents($this->job::JOB_FILE), true); + $this->assertSame($id, $data['id']); + $this->assertSame(100, $data['data']); + } + + /** + * @expectedException \Spiral\Jobs\Exception\JobException + */ + public function testConnectionException(): void + { + $jobs = new Queue( + new RPC(new SocketRelay('localhost', 6002)), + new ContainerRegistry(new Container()) + ); + + $jobs->push($this->job, ['data' => 100]); + } + + public function makeJobs(): Queue + { + return new Queue( + new RPC(new SocketRelay('localhost', 6001)), + new ContainerRegistry(new Container()) + ); + } + + private function waitForJob(): float + { + $start = microtime(true); + $try = 0; + while (!file_exists($this->job::JOB_FILE) && $try < 10) { + usleep(250000); + $try++; + } + + return microtime(true) - $start; + } +} diff --git a/plugins/jobs/tests/Jobs/Beanstalk/BrokerTest.php b/plugins/jobs/tests/Jobs/Beanstalk/BrokerTest.php new file mode 100644 index 00000000..d1ea4682 --- /dev/null +++ b/plugins/jobs/tests/Jobs/Beanstalk/BrokerTest.php @@ -0,0 +1,20 @@ +assertNull($o->getDelay()); + $o = $o->withDelay(10); + $this->assertSame(10, $o->getDelay()); + } + + public function testPipeline(): void + { + $o = new Options(); + $this->assertNull($o->getPipeline()); + $o = $o->withPipeline('custom'); + $this->assertSame('custom', $o->getPipeline()); + } +} diff --git a/plugins/jobs/tests/Jobs/RegistryTest.php b/plugins/jobs/tests/Jobs/RegistryTest.php new file mode 100644 index 00000000..7abd75f7 --- /dev/null +++ b/plugins/jobs/tests/Jobs/RegistryTest.php @@ -0,0 +1,43 @@ +getHandler('spiral.jobs.tests.local.job'); + $this->assertInstanceOf(Job::class, $j); + + $this->assertSame(json_encode(['data' => 200]), $j->serialize( + 'spiral.jobs.tests.local.job', + ['data' => 200] + )); + } + + /** + * @expectedException \Spiral\Jobs\Exception\JobException + */ + public function testMakeUndefined(): void + { + $factory = new ContainerRegistry(new Container()); + + $factory->getHandler('spiral.jobs.undefined'); + } +} diff --git a/plugins/jobs/tests/Jobs/ShortCircuitTest.php b/plugins/jobs/tests/Jobs/ShortCircuitTest.php new file mode 100644 index 00000000..c3306385 --- /dev/null +++ b/plugins/jobs/tests/Jobs/ShortCircuitTest.php @@ -0,0 +1,90 @@ +push(Job::class, ['data' => 100]); + + $this->assertNotEmpty($id); + + $this->assertFileExists(Job::JOB_FILE); + + $data = json_decode(file_get_contents(Job::JOB_FILE), true); + $this->assertSame($id, $data['id']); + $this->assertSame(100, $data['data']); + } + + public function testLocalDelayed(): void + { + $c = new ContainerRegistry(new Container()); + $jobs = new ShortCircuit($c, $c); + + $t = microtime(true); + $id = $jobs->push(Job::class, ['data' => 100], Options::delayed(1)); + + $this->assertTrue(microtime(true) - $t >= 1); + + $this->assertNotEmpty($id); + + $this->assertFileExists(Job::JOB_FILE); + + $data = json_decode(file_get_contents(Job::JOB_FILE), true); + $this->assertSame($id, $data['id']); + $this->assertSame(100, $data['data']); + } + + /** + * @expectedException \Spiral\Jobs\Exception\JobException + */ + public function testError(): void + { + $c = new ContainerRegistry(new Container()); + $jobs = new ShortCircuit($c, $c); + $jobs->push(ErrorJob::class); + } + + public function testLocalDelay(): void + { + $c = new ContainerRegistry(new Container()); + $jobs = new ShortCircuit($c, $c); + + $id = $jobs->push(Job::class, ['data' => 100], Options::delayed(1)); + $this->assertNotEmpty($id); + + $this->assertFileExists(Job::JOB_FILE); + + $data = json_decode(file_get_contents(Job::JOB_FILE), true); + $this->assertSame($id, $data['id']); + $this->assertSame(100, $data['data']); + } +} diff --git a/plugins/jobs/tests/Jobs/Sqs/BrokerTest.php b/plugins/jobs/tests/Jobs/Sqs/BrokerTest.php new file mode 100644 index 00000000..ccaa96de --- /dev/null +++ b/plugins/jobs/tests/Jobs/Sqs/BrokerTest.php @@ -0,0 +1,20 @@ +