Commit dccf20aa authored by Jeremy Mikola's avatar Jeremy Mikola

Merge pull request #324

parents 391334a8 fcdc117c
...@@ -17,6 +17,7 @@ ...@@ -17,6 +17,7 @@
namespace MongoDB\GridFS; namespace MongoDB\GridFS;
use MongoDB\BSON\UTCDateTime;
use Exception; use Exception;
/** /**
...@@ -145,9 +146,23 @@ class StreamWrapper ...@@ -145,9 +146,23 @@ class StreamWrapper
{ {
$stat = $this->getStatTemplate(); $stat = $this->getStatTemplate();
$stat[2] = $stat['mode'] = $this->mode; $stat[2] = $stat['mode'] = $this->stream instanceof ReadableStream
? 0100444 // S_IFREG & S_IRUSR & S_IRGRP & S_IROTH
: 0100222; // S_IFREG & S_IWUSR & S_IWGRP & S_IWOTH
$stat[7] = $stat['size'] = $this->stream->getSize(); $stat[7] = $stat['size'] = $this->stream->getSize();
$file = $this->stream->getFile();
if (isset($file->uploadDate) && $file->uploadDate instanceof UTCDateTime) {
$timestamp = $file->uploadDate->toDateTime()->getTimestamp();
$stat[9] = $stat['mtime'] = $timestamp;
$stat[10] = $stat['ctime'] = $timestamp;
}
if (isset($file->chunkSize) && is_integer($file->chunkSize)) {
$stat[11] = $stat['blksize'] = $file->chunkSize;
}
return $stat; return $stat;
} }
......
...@@ -158,7 +158,7 @@ class WritableStream ...@@ -158,7 +158,7 @@ class WritableStream
*/ */
public function getSize() public function getSize()
{ {
return $this->length; return $this->length + strlen($this->buffer);
} }
/** /**
......
<?php
namespace MongoDB\Tests\GridFS;
use MongoDB\BSON\Binary;
use MongoDB\BSON\UTCDateTime;
/**
* Functional tests for the internal StreamWrapper class.
*/
class StreamWrapperFunctionalTest extends FunctionalTestCase
{
public function setUp()
{
parent::setUp();
$this->filesCollection->insertMany([
['_id' => 'length-10', 'length' => 10, 'chunkSize' => 4, 'uploadDate' => new UTCDateTime('1484202200000')],
]);
$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));
}
public function testReadableStreamStat()
{
$stream = $this->bucket->openDownloadStream('length-10');
$stat = fstat($stream);
$this->assertSame(0100444, $stat[2]);
$this->assertSame(0100444, $stat['mode']);
$this->assertSame(10, $stat[7]);
$this->assertSame(10, $stat['size']);
$this->assertSame(1484202200, $stat[9]);
$this->assertSame(1484202200, $stat['mtime']);
$this->assertSame(1484202200, $stat[10]);
$this->assertSame(1484202200, $stat['ctime']);
$this->assertSame(4, $stat[11]);
$this->assertSame(4, $stat['blksize']);
}
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));
}
public function testWritableStreamStat()
{
$currentTimestamp = time();
$stream = $this->bucket->openUploadStream('filename', ['chunkSizeBytes' => 1024]);
$stat = fstat($stream);
$this->assertSame(0100222, $stat[2]);
$this->assertSame(0100222, $stat['mode']);
$this->assertSame(0, $stat[7]);
$this->assertSame(0, $stat['size']);
$this->assertGreaterThanOrEqual($currentTimestamp, $stat[9]);
$this->assertGreaterThanOrEqual($currentTimestamp, $stat['mtime']);
$this->assertGreaterThanOrEqual($currentTimestamp, $stat[10]);
$this->assertGreaterThanOrEqual($currentTimestamp, $stat['ctime']);
$this->assertSame(1024, $stat[11]);
$this->assertSame(1024, $stat['blksize']);
$this->assertSame(6, fwrite($stream, 'foobar'));
$stat = fstat($stream);
$this->assertSame(6, $stat[7]);
$this->assertSame(6, $stat['size']);
}
public function testWritableStreamWrite()
{
$stream = $this->bucket->openUploadStream('filename');
$this->assertSame(6, fwrite($stream, 'foobar'));
}
}
...@@ -61,6 +61,22 @@ class WritableStreamFunctionalTest extends FunctionalTestCase ...@@ -61,6 +61,22 @@ class WritableStreamFunctionalTest extends FunctionalTestCase
new WritableStream($this->collectionWrapper, 'filename', ['chunkSizeBytes' => 0]); new WritableStream($this->collectionWrapper, 'filename', ['chunkSizeBytes' => 0]);
} }
public function testWriteBytesAlwaysUpdatesFileSize()
{
$stream = new WritableStream($this->collectionWrapper, 'filename', ['chunkSizeBytes' => 1024]);
$this->assertSame(0, $stream->getSize());
$this->assertSame(512, $stream->writeBytes(str_repeat('a', 512)));
$this->assertSame(512, $stream->getSize());
$this->assertSame(512, $stream->writeBytes(str_repeat('a', 512)));
$this->assertSame(1024, $stream->getSize());
$this->assertSame(512, $stream->writeBytes(str_repeat('a', 512)));
$this->assertSame(1536, $stream->getSize());
$stream->close();
$this->assertSame(1536, $stream->getSize());
}
/** /**
* @dataProvider provideInputDataAndExpectedMD5 * @dataProvider provideInputDataAndExpectedMD5
*/ */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment