public function testFunctionalS3()
{
$this->skipIfEc2PlatformDisabled();
$client = $this->s3->getApiHandler()->getClient();
//AP region aws instance
$awsap = $this->getEnvironment()->aws(Aws::REGION_AP_SOUTHEAST_1);
$awsap->s3->enableEntityManager();
$bucketList = $this->s3->bucket->getList();
$this->assertInstanceOf(self::CLASS_S3_BUCKET_LIST, $bucketList);
$this->assertInstanceOf(self::CLASS_S3, $bucketList->getS3());
$this->assertInstanceOf(self::CLASS_S3_OWNER_DATA, $bucketList->getOwner());
$bucket = $this->s3->bucket->get(self::getTestName('bucket'));
if ($bucket !== null) {
$list = $awsap->s3->bucket->listObjects($bucket->bucketName);
/* @var $object ObjectData */
foreach ($list as $object) {
if ($object->objectName == self::getTestName(self::OBJECT_NAME_DUMMY)) {
//Removes dummy object
$object->delete();
}
}
//Removes bucket
$awsap->s3->bucket->delete($bucket->bucketName);
unset($bucket);
unset($list);
}
$bucket = $this->s3->bucket->get(self::getTestName('bucket-copy'));
if ($bucket !== null) {
$list = $awsap->s3->bucket->listObjects($bucket->bucketName);
foreach ($list as $object) {
if ($object->objectName == self::getTestName(self::OBJECT_NAME_DUMMY)) {
$object->delete();
}
}
$awsap->s3->bucket->delete($bucket->bucketName);
unset($bucket);
unset($list);
}
//Tests creation of the bucket
$bucket = $awsap->s3->bucket->create(self::getTestName('bucket'));
$this->assertInstanceOf(self::CLASS_S3_BUCKET_DATA, $bucket);
$this->assertInstanceOf(self::CLASS_S3, $bucket->getS3());
$this->assertEquals(self::getTestName('bucket'), $bucket->bucketName);
$this->assertNotEmpty($bucket->creationDate);
$bucketCopy = $awsap->s3->bucket->create(self::getTestName('bucket-copy'));
$this->assertInstanceOf(self::CLASS_S3_BUCKET_DATA, $bucketCopy);
$this->assertInstanceOf(self::CLASS_S3, $bucketCopy->getS3());
//Checks location
$this->assertEquals(Aws::REGION_AP_SOUTHEAST_1, $bucket->getLocation());
$acl = $bucket->getAcl();
$this->assertInstanceOf(self::CLASS_S3_ACCESS_CONTROL_POLICY_DATA, $acl);
$this->assertNotEmpty($acl->toXml());
//Checks that generated document is properly constructed.
$dom = new \DOMDocument();
$dom->loadXML($acl->getOriginalXml());
$this->assertEqualXMLStructure($acl->toXml(true)->firstChild, $dom->firstChild);
//Applies canned ACL
$ret = $bucket->setAcl(array('x-amz-acl' => 'authenticated-read'));
$this->assertTrue($ret);
$acl2 = $bucket->getAcl();
$this->assertInstanceOf(self::CLASS_S3_ACCESS_CONTROL_POLICY_DATA, $acl2);
//Restores acl to previous state
$ret = $bucket->setAcl($acl);
$this->assertTrue($ret);
//Compare restored with its stored value
$this->assertEqualXMLStructure($bucket->getAcl()->toXml(true)->firstChild, $dom->firstChild);
//Create object test
$fileInfo = new SplFileInfo($this->getFixturesDirectory() . '/dummy');
/* @var $response ClientResponseInterface */
$response = $bucket->addObject(self::getTestName(self::OBJECT_NAME_DUMMY), $fileInfo, array('Content-Type' => 'text/plain; charset:UTF-8'));
$this->assertInstanceOf($this->getAwsClassName('Client\\ClientResponseInterface'), $response);
$this->assertNotEmpty($response->getHeader('ETag'));
/* @var $dresponse ClientResponseInterface */
$dresponse = $bucket->getObject(self::getTestName(self::OBJECT_NAME_DUMMY));
$this->assertInstanceOf($this->getAwsClassName('Client\\ClientResponseInterface'), $dresponse);
$objectContent = $dresponse->getRawContent();
$this->assertContains('This is a dummy file', $objectContent);
unset($dresponse);
$objList = $bucket->listObjects();
$this->assertInstanceOf($this->getS3ClassName('DataType\\ObjectList'), $objList);
$object = $awsap->s3->object->get(array(self::getTestName('bucket'), self::getTestName(self::OBJECT_NAME_DUMMY)));
$this->assertInstanceOf($this->getS3ClassName('DataType\\ObjectData'), $object);
$this->assertSame($object, $objList[0]);
$arr = $awsap->s3->bucket->getObjectsFromStorage(self::getTestName('bucket'));
$this->assertSame($object, $arr[0]);
unset($arr);
$objectAcl = $object->getAcl();
$this->assertInstanceOf(self::CLASS_S3_ACCESS_CONTROL_POLICY_DATA, $objectAcl);
$ret = $object->setAcl(array('x-amz-acl' => 'public-read'));
$this->assertTrue($ret);
$objectAclChanged = $object->getAcl();
$this->assertInstanceOf(self::CLASS_S3_ACCESS_CONTROL_POLICY_DATA, $objectAclChanged);
$this->assertContains('xsi:type="CanonicalUser"', $objectAclChanged->toXml());
unset($objectAclChanged);
unset($objectAcl);
$rmetadata = $object->getMetadata();
$this->assertInstanceOf($this->getAwsClassName('Client\\ClientResponseInterface'), $rmetadata);
$this->assertNotEmpty($rmetadata->getHeader('ETag'));
$this->assertNotEmpty($rmetadata->getHeader('Last-Modified'));
unset($rmetadata);
$copyResponse = $object->copy($bucketCopy, self::getTestName(self::OBJECT_NAME_DUMMY));
$this->assertInstanceOf($this->getS3ClassName('DataType\\CopyObjectResponseData'), $copyResponse);
$this->assertInstanceOf(self::CLASS_S3, $copyResponse->getS3());
$this->assertEquals(self::getTestName('bucket-copy'), $copyResponse->bucketName);
$this->assertEquals(self::getTestName(self::OBJECT_NAME_DUMMY), $copyResponse->objectName);
$this->assertNotEmpty($copyResponse->eTag);
$this->assertInstanceOf('DateTime', $copyResponse->lastModified);
$this->assertInternalType('array', $copyResponse->headers);
unset($copyResponse);
$dresponse = $bucket->deleteObject(self::getTestName(self::OBJECT_NAME_DUMMY));
$this->assertInstanceOf($this->getAwsClassName('Client\\ClientResponseInterface'), $dresponse);
$this->assertEquals(204, $dresponse->getResponseCode());
unset($dresponse);
unset($objList);
unset($object);
//Object must be detached from entity storage after deletion.
$object = $awsap->s3->object->get(array(self::getTestName('bucket'), self::getTestName(self::OBJECT_NAME_DUMMY)));
$this->assertNull($object);
$dresponse = $bucketCopy->deleteObject(self::getTestName(self::OBJECT_NAME_DUMMY));
$this->assertInstanceOf($this->getAwsClassName('Client\\ClientResponseInterface'), $dresponse);
$this->assertEquals(204, $dresponse->getResponseCode());
unset($dresponse);
$ret = $bucket->delete();
$this->assertTrue($ret);
$this->assertNull($this->s3->bucket->get(self::getTestName('bucket')));
unset($bucket);
$ret = $bucketCopy->delete();
$this->assertTrue($ret);
$this->assertNull($this->s3->bucket->get(self::getTestName('bucket-copy')));
unset($bucketCopy);
}