Passed
Push — master ( 2b0006...a1b0fe )
by Petr
02:56
created

VolumeTest::testDirsRecursive()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 10
Code Lines 8

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 8
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 10
rs 10
1
<?php
2
3
namespace StorageTests;
4
5
6
use CommonTestClass;
7
use kalanis\kw_storage\Storage\Target;
8
use kalanis\kw_storage\StorageException;
9
10
11
class VolumeTest extends CommonTestClass
12
{
13
    public function tearDown(): void
14
    {
15
        if (is_file($this->mockTestFile())) {
16
            unlink($this->mockTestFile());
17
        }
18
        if (is_dir($this->mockTestFile())) {
19
            rmdir($this->mockTestFile());
20
        }
21
        if (is_dir($this->getTestDir() . 'some')) {
22
            rmdir($this->getTestDir() . 'some');
23
        }
24
        parent::tearDown();
25
    }
26
27
    public function testDir(): void
28
    {
29
        $volume = new Target\Volume();
30
31
        // test dir
32
        $testDir = $this->getTestDir();
33
        $this->assertTrue($volume->isDir($testDir));
34
        $mockPath = substr($testDir, 0, strrpos($testDir, DIRECTORY_SEPARATOR)) . 'dummy';
35
        if (is_dir($mockPath)) {
36
            rmdir($mockPath);
37
        }
38
        file_put_contents($mockPath, 'just leave it there');
39
        $this->assertTrue($volume->check($mockPath . DIRECTORY_SEPARATOR));
40
        rmdir($mockPath);
41
    }
42
43
    /**
44
     * @throws StorageException
45
     */
46
    public function testExists(): void
47
    {
48
        $volume = new Target\Volume();
49
        $this->assertTrue($volume->check($this->getTestDir()));
50
        $this->assertFalse($volume->exists($this->mockTestFile()));
51
        $this->assertFalse($volume->isDir($this->mockTestFile()));
52
        $this->expectException(StorageException::class);
53
        $volume->load($this->mockTestFile());
54
    }
55
56
    /**
57
     * @throws StorageException
58
     */
59
    public function testOperations(): void
60
    {
61
        $volume = new Target\Volume();
62
        $this->assertFalse($volume->exists($this->mockTestFile()));
63
        $this->assertFalse($volume->isDir($this->mockTestFile()));
64
        $this->assertTrue($volume->save($this->mockTestFile(), 'asdfghjklpoiuztrewqyxcvbnm'));
65
        $this->assertTrue($volume->exists($this->mockTestFile()));
66
        $this->assertFalse($volume->isDir($this->mockTestFile()));
67
        $this->assertEquals('asdfghjklpoiuztrewqyxcvbnm', $volume->load($this->mockTestFile()));
68
        $this->assertTrue($volume->remove($this->mockTestFile()));
69
        $this->assertFalse($volume->exists($this->mockTestFile()));
70
        $this->assertFalse($volume->isDir($this->mockTestFile()));
71
    }
72
73
    /**
74
     * @throws StorageException
75
     */
76
    public function testDirsRecursive(): void
77
    {
78
        $volume = new Target\Volume();
79
        $this->assertTrue($volume->mkDir($this->getTestDir() . implode(DIRECTORY_SEPARATOR, ['some', 'none', 'hoo']), true));
80
        $this->assertTrue($volume->exists($this->getTestDir() . 'some'));
81
        $this->assertFalse($volume->exists($this->getTestDir() . 'some' . DIRECTORY_SEPARATOR . 'hint.none'));
82
        $this->assertTrue($volume->save($this->getTestDir() . 'some' . DIRECTORY_SEPARATOR . 'hint.none', 'asdfghjklpoiuztrewqyxcvbnm'));
83
        $this->assertTrue($volume->rmDir($this->getTestDir() . 'some', true));
84
        $this->assertFalse($volume->isDir($this->getTestDir() . 'some'));
85
        $this->assertFalse($volume->exists($this->getTestDir() . 'some'));
86
    }
87
88
    /**
89
     * @throws StorageException
90
     */
91
    public function testLookup(): void
92
    {
93
        $volume = new Target\Volume();
94
        $this->assertTrue($volume->check($this->getTestDir()));
95
        $testFiles = [
96
            'dummyFile.tst' => $this->getTestDir() . 'dummyFile.tst',
97
            'dummyFile.0.tst' => $this->getTestDir() . 'dummyFile.0.tst',
98
            'dummyFile.1.tst' => $this->getTestDir() . 'dummyFile.1.tst',
99
            'dummyFile.2.tst' => $this->getTestDir() . 'dummyFile.2.tst',
100
        ];
101
        $removal = $volume->removeMulti($testFiles);
102
        $this->assertEquals([
103
            'dummyFile.tst' => false,
104
            'dummyFile.0.tst' => false,
105
            'dummyFile.1.tst' => false,
106
            'dummyFile.2.tst' => false,
107
        ], $removal);
108
109
        iterator_to_array($volume->lookup('this path does not exists'));
110
        $this->assertEquals(0, count(array_filter(iterator_to_array($volume->lookup($this->getTestDir())), [$this, 'dotDirs'])));
111
112
        file_put_contents($this->getTestDir() . 'dummyFile.tst', 'asdfghjklqwertzuiopyxcvbnm');
113
        file_put_contents($this->getTestDir() . 'dummyFile.0.tst', 'asdfghjklqwertzuiopyxcvbnm');
114
        file_put_contents($this->getTestDir() . 'dummyFile.1.tst', 'asdfghjklqwertzuiopyxcvbnm');
115
        file_put_contents($this->getTestDir() . 'dummyFile.2.tst', 'asdfghjklqwertzuiopyxcvbnm');
116
117
        $files = iterator_to_array($volume->lookup($this->getTestDir()));
118
        sort($files);
119
        $files = array_filter($files, [$this, 'dotDirs']);
120
121
        $this->assertEquals(count($testFiles), count($files));
122
        $this->assertEquals('dummyFile.0.tst', reset($files));
123
        $this->assertEquals('dummyFile.1.tst', next($files));
124
        $this->assertEquals('dummyFile.2.tst', next($files));
125
        $this->assertEquals('dummyFile.tst', next($files));
126
127
        $removal = $volume->removeMulti($testFiles);
128
        $this->assertFalse($volume->exists($this->getTestDir() . 'dummyFile.tst'));
129
        $this->assertFalse($volume->exists($this->getTestDir() . 'dummyFile.0.tst'));
130
        $this->assertFalse($volume->exists($this->getTestDir() . 'dummyFile.1.tst'));
131
        $this->assertFalse($volume->exists($this->getTestDir() . 'dummyFile.2.tst'));
132
133
        $this->assertEquals([
134
            'dummyFile.tst' => true,
135
            'dummyFile.0.tst' => true,
136
            'dummyFile.1.tst' => true,
137
            'dummyFile.2.tst' => true,
138
        ], $removal);
139
    }
140
141
    public function dotDirs(string $path): bool
142
    {
143
        return !in_array($path, ['.', '..']);
144
    }
145
146
    /**
147
     * @throws StorageException
148
     */
149
    public function testSimpleCounter(): void
150
    {
151
        $volume = new Target\Volume();
152
        $this->assertFalse($volume->exists($this->mockTestFile()));
153
        $this->assertTrue($volume->save($this->mockTestFile(), 15));
154
        $this->assertTrue($volume->decrement($this->mockTestFile()));
155
        $this->assertTrue($volume->decrement($this->mockTestFile()));
156
        $this->assertTrue($volume->increment($this->mockTestFile()));
157
        $this->assertEquals(14, $volume->load($this->mockTestFile()));
158
        $this->assertTrue($volume->remove($this->mockTestFile()));
159
        $this->assertFalse($volume->exists($this->mockTestFile()));
160
    }
161
162
    /**
163
     * @throws StorageException
164
     */
165
    public function testHarderCounter(): void
166
    {
167
        $volume = new Target\Volume();
168
        $this->assertFalse($volume->exists($this->mockTestFile()));
169
        $this->assertTrue($volume->decrement($this->mockTestFile()));
170
        $this->assertTrue($volume->increment($this->mockTestFile()));
171
        $this->assertEquals(1, $volume->load($this->mockTestFile()));
172
        $this->assertTrue($volume->remove($this->mockTestFile()));
173
        $this->assertTrue($volume->increment($this->mockTestFile()));
174
        $this->assertTrue($volume->decrement($this->mockTestFile()));
175
        $this->assertEquals(0, $volume->load($this->mockTestFile()));
176
        $this->assertTrue($volume->remove($this->mockTestFile()));
177
        $this->assertFalse($volume->exists($this->mockTestFile()));
178
    }
179
}
180