File size: 2,471 Bytes
bf8c0ce
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php

/**
 * Matomo - free/libre analytics platform
 *
 * @link    https://matomo.org
 * @license https://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
 */

namespace Piwik\Tests\Integration\ArchiveProcessor;

use Piwik\ArchiveProcessor\LoaderLock;
use Piwik\Common;
use Piwik\Tests\Framework\TestCase\IntegrationTestCase;

/**
 * @group ArchiveProcessor
 * @group ArchiveProcessorLoaderLock
 */
class LoaderLockTest extends IntegrationTestCase
{
    public function testLockerIdShort()
    {
        $lockId = Common::getRandomString(60);

        $lock = new LoaderLock($lockId);
        $this->assertSame($lockId, $lock->getId());
    }

    public function testLockerIdMaxLength()
    {
        $lockId = str_pad('0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 128, '5');
        $this->assertEquals(strlen($lockId), 128);

        $lock = new LoaderLock($lockId);
        $this->assertSame('0123456789abcdefghijklmnopqrstuvbafb96951317fae753ab8ec1b2dad6e6', $lock->getId());
    }

    public function testSingleLocking()
    {
        $lockId = "lock1";
        $lockOne = new LoaderLock($lockId);
        $lockOne->setLock();
        $formatLockKey = $lockOne->getId();
        $isLocked = LoaderLock::isLockAvailable($formatLockKey);
        $this->assertFalse($isLocked);
        $lockOne->unLock();
        $isLocked = LoaderLock::isLockAvailable($formatLockKey);
        $this->assertTrue($isLocked);
    }

    public function testMultipleLocking()
    {
        $lockId = "lock1";
        $lockOne = new LoaderLock($lockId);
        $lockOne->setLock();
        $formatLockKey = $lockOne->getId();
        $isLocked = LoaderLock::isLockAvailable($formatLockKey);
        $this->assertFalse($isLocked);

        $lockId = "lock2";
        $lockTwo = new LoaderLock($lockId);
        $lockTwo->setLock();
        $formatLockKey = $lockTwo->getId();
        $isLocked = LoaderLock::isLockAvailable($formatLockKey);
        $this->assertFalse($isLocked);

        //unlock lock 1
        $lockOne->unLock();
        $lockOneStatus = LoaderLock::isLockAvailable($lockOne->getId());
        $this->assertTrue($lockOneStatus);
        $lockTwoStatus = LoaderLock::isLockAvailable($lockTwo->getId());
        $this->assertFalse($lockTwoStatus);

        $lockTwo->unLock();
    }

    public function testCallUnlockWhenThereIsNoLock()
    {
        $result = LoaderLock::isLockAvailable("no lock");
        $this->assertTrue($result);
    }
}