StreamWrapperFunctionalTest.php 4.33 KB
Newer Older
1 2 3 4 5
<?php

namespace MongoDB\Tests\GridFS;

use MongoDB\BSON\Binary;
6
use MongoDB\BSON\UTCDateTime;
7 8 9 10 11 12 13 14 15 16 17

/**
 * Functional tests for the internal StreamWrapper class.
 */
class StreamWrapperFunctionalTest extends FunctionalTestCase
{
    public function setUp()
    {
        parent::setUp();

        $this->filesCollection->insertMany([
18
            ['_id' => 'length-10', 'length' => 10, 'chunkSize' => 4, 'uploadDate' => new UTCDateTime('1484202200000')],
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
        ]);

        $this->chunksCollection->insertMany([
            ['_id' => 1, 'files_id' => 'length-10', 'n' => 0, 'data' => new Binary('abcd', Binary::TYPE_GENERIC)],
            ['_id' => 2, 'files_id' => 'length-10', 'n' => 1, 'data' => new Binary('efgh', Binary::TYPE_GENERIC)],
            ['_id' => 3, 'files_id' => 'length-10', 'n' => 2, 'data' => new Binary('ij', Binary::TYPE_GENERIC)],
        ]);
    }

    public function testReadableStreamClose()
    {
        $stream = $this->bucket->openDownloadStream('length-10');

        $this->assertTrue(fclose($stream));
    }

    public function testReadableStreamEof()
    {
        $stream = $this->bucket->openDownloadStream('length-10');

        $this->assertFalse(feof($stream));
        $this->assertStreamContents('abcdefghij', $stream);
        $this->assertTrue(feof($stream));
    }

    public function testReadableStreamRead()
    {
        $stream = $this->bucket->openDownloadStream('length-10');

        $this->assertSame('abc', fread($stream, 3));
        $this->assertSame('defghij', fread($stream, 10));
        $this->assertSame('', fread($stream, 3));
    }

53 54 55 56 57 58 59
    public function testReadableStreamStat()
    {
        $stream = $this->bucket->openDownloadStream('length-10');

        $stat = fstat($stream);
        $this->assertSame(0100444, $stat[2]);
        $this->assertSame(0100444, $stat['mode']);
60 61
        $this->assertSame(10, $stat[7]);
        $this->assertSame(10, $stat['size']);
62 63 64 65
        $this->assertSame(1484202200, $stat[9]);
        $this->assertSame(1484202200, $stat['mtime']);
        $this->assertSame(1484202200, $stat[10]);
        $this->assertSame(1484202200, $stat['ctime']);
66 67
        $this->assertSame(4, $stat[11]);
        $this->assertSame(4, $stat['blksize']);
68 69
    }

70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
    public function testReadableStreamWrite()
    {
        $stream = $this->bucket->openDownloadStream('length-10');

        $this->assertSame(0, fwrite($stream, 'foobar'));
    }

    public function testWritableStreamClose()
    {
        $stream = $this->bucket->openUploadStream('filename');

        $this->assertSame(6, fwrite($stream, 'foobar'));
        $this->assertTrue(fclose($stream));

        $this->assertStreamContents('foobar', $this->bucket->openDownloadStreamByName('filename'));
    }

    public function testWritableStreamEof()
    {
        $stream = $this->bucket->openUploadStream('filename');

        $this->assertFalse(feof($stream));
        $this->assertSame(6, fwrite($stream, 'foobar'));
        $this->assertFalse(feof($stream));
    }

    public function testWritableStreamRead()
    {
        $stream = $this->bucket->openUploadStream('filename');

        $this->assertSame('', fread($stream, 8192));
        $this->assertSame(6, fwrite($stream, 'foobar'));
        $this->assertSame('', fread($stream, 8192));
    }

105 106
    public function testWritableStreamStat()
    {
107
        $currentTimestamp = time();
108
        $stream = $this->bucket->openUploadStream('filename', ['chunkSizeBytes' => 1024]);
109 110 111 112

        $stat = fstat($stream);
        $this->assertSame(0100222, $stat[2]);
        $this->assertSame(0100222, $stat['mode']);
113 114
        $this->assertSame(0, $stat[7]);
        $this->assertSame(0, $stat['size']);
115 116 117 118
        $this->assertGreaterThanOrEqual($currentTimestamp, $stat[9]);
        $this->assertGreaterThanOrEqual($currentTimestamp, $stat['mtime']);
        $this->assertGreaterThanOrEqual($currentTimestamp, $stat[10]);
        $this->assertGreaterThanOrEqual($currentTimestamp, $stat['ctime']);
119 120
        $this->assertSame(1024, $stat[11]);
        $this->assertSame(1024, $stat['blksize']);
121 122 123 124 125 126

        $this->assertSame(6, fwrite($stream, 'foobar'));

        $stat = fstat($stream);
        $this->assertSame(6, $stat[7]);
        $this->assertSame(6, $stat['size']);
127 128
    }

129 130 131 132 133 134 135
    public function testWritableStreamWrite()
    {
        $stream = $this->bucket->openUploadStream('filename');

        $this->assertSame(6, fwrite($stream, 'foobar'));
    }
}