This commit is contained in:
gaofeng
2026-06-17 09:23:18 +08:00
commit 81ade70944
1638 changed files with 213697 additions and 0 deletions

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,242 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientAccessPointTest extends TestIntegration
{
public function testAccessPoint()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// CreateAccessPoint
$accessPointName = 'ap-01-' . strval(rand(0, 100)) . '-' . strval(time());
$createResult = $client->createAccessPoint(new Oss\Models\CreateAccessPointRequest(
$bucketName,
new Oss\Models\CreateAccessPointConfiguration(
accessPointName: $accessPointName,
networkOrigin: 'internet',
)));
$this->assertEquals(200, $createResult->statusCode);
$this->assertEquals('OK', $createResult->status);
$this->assertEquals(True, count($createResult->headers) > 0);
$this->assertEquals(24, strlen($createResult->requestId));
// GetAccessPoint
$getResult = $client->getAccessPoint(new Oss\Models\GetAccessPointRequest(
$bucketName, $accessPointName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// ListAccessPoints
$listResult = $client->listAccessPoints(new Oss\Models\ListAccessPointsRequest());
$this->assertEquals(200, $listResult->statusCode);
$this->assertEquals('OK', $listResult->status);
$this->assertEquals(True, count($listResult->headers) > 0);
$this->assertEquals(24, strlen($listResult->requestId));
// PutAccessPointPolicy
$policy = '{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["' . self::$USER_ID . '"],"Resource":["acs:oss:' . self::$REGION . ':' . self::$USER_ID . ':accesspoint/' . $accessPointName . '","acs:oss:' . self::$REGION . ':' . self::$USER_ID . ':accesspoint/' . $accessPointName . '/object/*"]}]}';
$putPolicyResult = $client->putAccessPointPolicy(new Oss\Models\PutAccessPointPolicyRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
body: Oss\Utils::streamFor($policy)
));
$this->assertEquals(200, $putPolicyResult->statusCode);
$this->assertEquals('OK', $putPolicyResult->status);
$this->assertEquals(True, count($putPolicyResult->headers) > 0);
$this->assertEquals(24, strlen($putPolicyResult->requestId));
// GetAccessPointPolicy
$getPolicyResult = $client->getAccessPointPolicy(new Oss\Models\GetAccessPointPolicyRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
));
$this->assertEquals(200, $getPolicyResult->statusCode);
$this->assertEquals('OK', $getPolicyResult->status);
$this->assertEquals(True, count($getPolicyResult->headers) > 0);
$this->assertEquals(24, strlen($getPolicyResult->requestId));
$this->assertEquals($policy, $getPolicyResult->body);
// DeleteAccessPointPolicy
$delPolicyResult = $client->deleteAccessPointPolicy(new Oss\Models\DeleteAccessPointPolicyRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
));
$this->assertEquals(204, $delPolicyResult->statusCode);
$this->assertEquals('No Content', $delPolicyResult->status);
$this->assertEquals(True, count($delPolicyResult->headers) > 0);
$this->assertEquals(24, strlen($delPolicyResult->requestId));
while (true) {
$getResult = $client->getAccessPoint(new Oss\Models\GetAccessPointRequest(
$bucketName, $accessPointName
));
if ($getResult->getAccessPoint->status != 'creating') {
break;
} else {
sleep(3);
}
}
$delResult = $client->deleteAccessPoint(new Oss\Models\DeleteAccessPointRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testAccessPointFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// CreateAccessPoint
try {
$accessPointName = 'ap-01-' . strval(rand(0, 100)) . '-' . strval(time());
$createResult = $client->createAccessPoint(new Oss\Models\CreateAccessPointRequest(
$bucketName,
new Oss\Models\CreateAccessPointConfiguration(
accessPointName: $accessPointName,
networkOrigin: 'internet',
)));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CreateAccessPoint', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetAccessPoint
try {
$getResult = $client->getAccessPoint(new Oss\Models\GetAccessPointRequest(
$bucketName, $accessPointName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetAccessPoint', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// ListAccessPoints
try {
$listResult = $client->listAccessPoints(new Oss\Models\ListAccessPointsRequest());
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListAccessPoints', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// PutAccessPointPolicy
try {
$policy = '{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["' . self::$USER_ID . '"],"Resource":["acs:oss:' . self::$REGION . ':' . self::$USER_ID . ':accesspoint/' . $accessPointName . '","acs:oss:' . self::$REGION . ':' . self::$USER_ID . ':accesspoint/' . $accessPointName . '/object/*"]}]}';
$putPolicyResult = $client->putAccessPointPolicy(new Oss\Models\PutAccessPointPolicyRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
body: Oss\Utils::streamFor($policy)
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutAccessPointPolicy', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetAccessPointPolicy
try {
$getPolicyResult = $client->getAccessPointPolicy(new Oss\Models\GetAccessPointPolicyRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetAccessPointPolicy', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteAccessPointPolicy
try {
$delPolicyResult = $client->deleteAccessPointPolicy(new Oss\Models\DeleteAccessPointPolicyRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteAccessPointPolicy', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetAccessPoint
try {
$getResult = $client->getAccessPoint(new Oss\Models\GetAccessPointRequest(
$bucketName, $accessPointName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetAccessPoint', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteAccessPoint
try {
$delResult = $client->deleteAccessPoint(new Oss\Models\DeleteAccessPointRequest(
bucket: $bucketName,
accessPointName: $accessPointName,
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteAccessPoint', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketAccessMonitorTest extends TestIntegration
{
public function testBucketAccessMonitor()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketAccessMonitor
$putResult = $client->putBucketAccessMonitor(new Oss\Models\PutBucketAccessMonitorRequest(
$bucketName,
new Oss\Models\AccessMonitorConfiguration(
status: Oss\Models\AccessMonitorStatusType::ENABLED
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketAccessMonitor
$getResult = $client->getBucketAccessMonitor(new Oss\Models\GetBucketAccessMonitorRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
}
public function testBucketAccessMonitorFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketAccessMonitor
try {
$putResult = $client->putBucketAccessMonitor(new Oss\Models\PutBucketAccessMonitorRequest(
$bucketName,
new Oss\Models\AccessMonitorConfiguration(
status: Oss\Models\AccessMonitorStatusType::ENABLED
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketAccessMonitor', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketAccessMonitor
try {
$getResult = $client->getBucketAccessMonitor(new Oss\Models\GetBucketAccessMonitorRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketAccessMonitor', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,81 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;
class ClientBucketArchiveDirectReadTest extends TestIntegration
{
public function testBucketArchiveDirectRead()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketArchiveDirectRead
$putResult = $client->putBucketArchiveDirectRead(new Oss\Models\PutBucketArchiveDirectReadRequest(
$bucketName,
new Oss\Models\ArchiveDirectReadConfiguration(
true
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketArchiveDirectRead
$getResult = $client->getBucketArchiveDirectRead(new Oss\Models\GetBucketArchiveDirectReadRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
}
public function testBucketArchiveDirectReadFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketArchiveDirectRead
try {
$putResult = $client->putBucketArchiveDirectRead(new Oss\Models\PutBucketArchiveDirectReadRequest(
$bucketName,
new Oss\Models\ArchiveDirectReadConfiguration(
true
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketArchiveDirectRead', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketArchiveDirectRead
try {
$getResult = $client->getBucketArchiveDirectRead(new Oss\Models\GetBucketArchiveDirectReadRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketArchiveDirectRead', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,514 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketBasicTest extends TestIntegration
{
public function testBucketBasic()
{
$client = $this->getDefaultClient();
//default
$bucketName = self::randomBucketName() . "-default";
$result = $client->putBucket(new Oss\Models\PutBucketRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get stat
$result = $client->getBucketStat(new Oss\Models\GetBucketStatRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals(0, $result->storage);
// get location
$result = $client->getBucketLocation(new Oss\Models\GetBucketLocationRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$region = self::$REGION;
$this->assertEquals("oss-$region", $result->location);
// get info
$result = $client->getBucketInfo(new Oss\Models\GetBucketInfoRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals('private', $result->bucketInfo->acl);
//delete
$result = $client->deleteBucket(new Oss\Models\DeleteBucketRequest(
$bucketName
));
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// create bucket with acl & storage class & data redundancy
$bucketName = self::randomBucketName() . '-acl-storage';
$result = $client->putBucket(new Oss\Models\PutBucketRequest(
$bucketName,
'public-read',
null,
new Oss\Models\CreateBucketConfiguration(
'IA',
'ZRS'
)
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get info
$result = $client->getBucketInfo(new Oss\Models\GetBucketInfoRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals('public-read', $result->bucketInfo->acl);
$this->assertEquals('IA', $result->bucketInfo->storageClass);
$this->assertEquals('ZRS', $result->bucketInfo->dataRedundancyType);
$result = $client->listObjects(new Oss\Models\ListObjectsRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$result = $client->listObjectsV2(new Oss\Models\ListObjectsV2Request(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
//delete
$result = $client->deleteBucket(new Oss\Models\DeleteBucketRequest(
$bucketName
));
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
}
public function testBucketAcl()
{
$client = $this->getDefaultClient();
//default
$bucketName = self::randomBucketName();
$result = $client->putBucket(new Oss\Models\PutBucketRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// set acl
$result = $client->putBucketAcl(new Oss\Models\PutBucketAclRequest(
$bucketName,
'private'
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get acl
$result = $client->getBucketAcl(new Oss\Models\GetBucketAclRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals('private', $result->accessControlList->grant);
$client->deleteBucket(new Oss\Models\DeleteBucketRequest(
$bucketName
));
}
public function testBucketVersioning()
{
$client = $this->getDefaultClient();
//default
$bucketName = self::randomBucketName();
$result = $client->putBucket(new Oss\Models\PutBucketRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$result = $client->putBucketVersioning(new Oss\Models\PutBucketVersioningRequest(
$bucketName,
new Oss\Models\VersioningConfiguration(
Oss\Models\BucketVersioningStatusType::ENABLED
)
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$result = $client->getBucketVersioning(new Oss\Models\GetBucketVersioningRequest(
$bucketName,
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals(Oss\Models\BucketVersioningStatusType::ENABLED, $result->versioningConfiguration->status);
$result = $client->listObjectVersions(new Oss\Models\ListObjectVersionsRequest(
$bucketName,
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertNull($result->versions);
$this->waitFor(3);
$client->deleteBucket(new Oss\Models\DeleteBucketRequest(
$bucketName
));
}
public function testListBuckets()
{
$client = $this->getDefaultClient();
//default
$bucketName = self::randomBucketName();
$result = $client->putBucket(new Oss\Models\PutBucketRequest(
$bucketName
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$result = $client->listBuckets(new Oss\Models\ListBucketsRequest(self::$BUCKETNAME_PREFIX));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals(True, count($result->buckets) > 0);
$request = new Oss\Models\ListBucketsRequest(self::$BUCKETNAME_PREFIX);
$request->tagging = 'k:v';
$result = $client->listBuckets($request);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertNull($result->buckets);
$request = new Oss\Models\ListBucketsRequest(self::$BUCKETNAME_PREFIX);
$request->tagKey = 'k';
$request->tagValue = 'v';
$result = $client->listBuckets($request);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertNull($result->buckets);
$this->waitFor(3);
$client->deleteBucket(new Oss\Models\DeleteBucketRequest(
$bucketName
));
}
public function testDescribeRegions()
{
$client = $this->getDefaultClient();
$result = $client->describeRegions(new Oss\Models\DescribeRegionsRequest());
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals(true, count($result->regionInfos) > 1);
$result = $client->describeRegions(new Oss\Models\DescribeRegionsRequest("oss-cn-hangzhou"));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertEquals(1, count($result->regionInfos));
}
public function testPutBucketFail()
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::randomBucketName();
$client->putBucket(new Oss\Models\PutBucketRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucket', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testPutBucketAclFail()
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->putBucketAcl(new Oss\Models\PutBucketAclRequest(
$bucketName,
'private'
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketAcl', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testGetBucketAclFail()
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->getBucketAcl(new Oss\Models\GetBucketAclRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketAcl', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testGetBucketStatFail()
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->getBucketStat(new Oss\Models\GetBucketStatRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketStat', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testGetBucketLocationFail()
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->getBucketLocation(new Oss\Models\GetBucketLocationRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketLocation', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testGetBucketInfoFail(): void
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->getBucketInfo(new Oss\Models\GetBucketInfoRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketInfo', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testPutBucketVersioningFail(): void
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->putBucketVersioning(new Oss\Models\PutBucketVersioningRequest(
$bucketName,
new Oss\Models\VersioningConfiguration('Enabled')
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketVersioning', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testGetBucketVersioningFail(): void
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->GetBucketVersioning(new Oss\Models\GetBucketVersioningRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketVersioning', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testListObjectVersionsFail(): void
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->listObjectVersions(new Oss\Models\ListObjectVersionsRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjectVersions', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testListObjectsFail(): void
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->listObjects(new Oss\Models\ListObjectsRequest(
$bucketName,
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjects', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testListObjectsV2Fail(): void
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->listObjectsV2(new Oss\Models\ListObjectsV2Request(
$bucketName,
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjectsV2', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testListBucketsFail(): void
{
$client = $this->getInvalidAkClient();
try {
$bucketName = self::$bucketName;
$client->listBuckets(new Oss\Models\ListBucketsRequest());
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListBuckets', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
}

View File

@@ -0,0 +1,166 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketCnameTest extends TestIntegration
{
public function testBucketCname()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// CreateCnameToken
$createResult = $client->createCnameToken(new Oss\Models\CreateCnameTokenRequest(
$bucketName,
new Oss\Models\BucketCnameConfiguration(
new Oss\Models\Cname(
'example.com'
)
)
));
$this->assertEquals(200, $createResult->statusCode);
$this->assertEquals('OK', $createResult->status);
$this->assertEquals(True, count($createResult->headers) > 0);
$this->assertEquals(24, strlen($createResult->requestId));
// GetCnameToken
$getResult = $client->getCnameToken(new Oss\Models\GetCnameTokenRequest(
$bucketName,
'example.com'
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// ListCname
$listResult = $client->listCname(new Oss\Models\ListCnameRequest(
$bucketName,
));
$this->assertEquals(200, $listResult->statusCode);
$this->assertEquals('OK', $listResult->status);
$this->assertEquals(True, count($listResult->headers) > 0);
$this->assertEquals(24, strlen($listResult->requestId));
// DeleteCname
$delResult = $client->deleteCname(new Oss\Models\DeleteCnameRequest(
$bucketName,
new Oss\Models\BucketCnameConfiguration(
new Oss\Models\Cname(
'example.com'
)
)
));
$this->assertEquals(200, $delResult->statusCode);
$this->assertEquals('OK', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketCnameFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
try {
$putResult = $client->putCname(new Oss\Models\PutCnameRequest(
$bucketName,
new Oss\Models\BucketCnameConfiguration(
new Oss\Models\Cname(
'example.com'
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutCname', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$createResult = $client->createCnameToken(new Oss\Models\CreateCnameTokenRequest(
$bucketName,
new Oss\Models\BucketCnameConfiguration(
new Oss\Models\Cname(
'example.com'
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CreateCnameToken', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$getTokenResult = $client->getCnameToken(new Oss\Models\GetCnameTokenRequest(
$bucketName,
'example.com'
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetCnameToken', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$listResult = $client->listCname(new Oss\Models\ListCnameRequest(
$bucketName,
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListCname', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$delResult = $client->deleteCname(new Oss\Models\DeleteCnameRequest(
$bucketName,
new Oss\Models\BucketCnameConfiguration(
new Oss\Models\Cname(
'example.com'
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteCname', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,159 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketCorsTest extends TestIntegration
{
public function testBucketCors()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketCors
$putResult = $client->putBucketCors(new Oss\Models\PutBucketCorsRequest(
$bucketName,
corsConfiguration: new Oss\Models\CORSConfiguration(
array(
new Oss\Models\CORSRule(
allowedOrigins: ['*'],
allowedMethods: ['PUT', 'GET']
)
)
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// OptionObject
$objectName = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-put-object';
$putObjResult = $client->putObject(new Oss\Models\PutObjectRequest(
$bucketName,
$objectName,
body: Oss\Utils::streamFor('hi oss')
));
$this->assertEquals(200, $putObjResult->statusCode);
$this->assertEquals('OK', $putObjResult->status);
$this->assertEquals(True, count($putObjResult->headers) > 0);
$this->assertEquals(24, strlen($putObjResult->requestId));
$optionObjResult = $client->optionObject(new Oss\Models\OptionObjectRequest(
$bucketName,
$objectName,
origin: 'http://www.example.com',
accessControlRequestMethod: 'PUT',
));
$this->assertEquals(200, $optionObjResult->statusCode);
$this->assertEquals('OK', $optionObjResult->status);
$this->assertEquals(True, count($optionObjResult->headers) > 0);
$this->assertEquals(24, strlen($optionObjResult->requestId));
// GetBucketCors
$getResult = $client->getBucketCors(new Oss\Models\GetBucketCorsRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketCors
$delResult = $client->deleteBucketCors(new Oss\Models\DeleteBucketCorsRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketCorsFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketCors
try {
$putResult = $client->putBucketCors(new Oss\Models\PutBucketCorsRequest(
$bucketName,
corsConfiguration: new Oss\Models\CORSConfiguration(
array(
new Oss\Models\CORSRule(
allowedOrigins: ['*'],
allowedMethods: ['PUT', 'GET']
)
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketCors', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$objectName = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-put-object';
$optionObjResult = $client->optionObject(new Oss\Models\OptionObjectRequest(
$bucketName,
$objectName,
origin: 'http://www.example.com',
accessControlRequestMethod: 'PUT',
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error OptionObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketCors
try {
$getResult = $client->getBucketCors(new Oss\Models\GetBucketCorsRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketCors', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketCors
try {
$delResult = $client->deleteBucketCors(new Oss\Models\DeleteBucketCorsRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketCors', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,147 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketDataRedundancyTransitionTest extends TestIntegration
{
public function testBucketDataRedundancyTransition()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// CreateBucketDataRedundancyTransition
$createResult = $client->createBucketDataRedundancyTransition(new Oss\Models\CreateBucketDataRedundancyTransitionRequest(
$bucketName,
targetRedundancyType: 'ZRS'
));
$this->assertEquals(200, $createResult->statusCode);
$this->assertEquals('OK', $createResult->status);
$this->assertEquals(True, count($createResult->headers) > 0);
$this->assertEquals(24, strlen($createResult->requestId));
// GetBucketDataRedundancyTransition
$getResult = $client->getBucketDataRedundancyTransition(new Oss\Models\GetBucketDataRedundancyTransitionRequest(
$bucketName,
redundancyTransitionTaskid: $createResult->bucketDataRedundancyTransition->taskId
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// ListBucketDataRedundancyTransition
$listResult = $client->listBucketDataRedundancyTransition(new Oss\Models\ListBucketDataRedundancyTransitionRequest(
$bucketName,
));
$this->assertEquals(200, $listResult->statusCode);
$this->assertEquals('OK', $listResult->status);
$this->assertEquals(True, count($listResult->headers) > 0);
$this->assertEquals(24, strlen($listResult->requestId));
// ListUserDataRedundancyTransition
$listResult = $client->listUserDataRedundancyTransition(new Oss\Models\ListUserDataRedundancyTransitionRequest());
$this->assertEquals(200, $listResult->statusCode);
$this->assertEquals('OK', $listResult->status);
$this->assertEquals(True, count($listResult->headers) > 0);
$this->assertEquals(24, strlen($listResult->requestId));
// DeleteBucketDataRedundancyTransition
$delResult = $client->deleteBucketDataRedundancyTransition(new Oss\Models\DeleteBucketDataRedundancyTransitionRequest(
$bucketName, $createResult->bucketDataRedundancyTransition->taskId
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketDataRedundancyTransitionFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
try {
$createResult = $client->createBucketDataRedundancyTransition(new Oss\Models\CreateBucketDataRedundancyTransitionRequest(
$bucketName,
targetRedundancyType: 'ZRS'
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CreateBucketDataRedundancyTransition', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$getResult = $client->getBucketDataRedundancyTransition(new Oss\Models\GetBucketDataRedundancyTransitionRequest(
$bucketName, '123'
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketDataRedundancyTransition', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$delResult = $client->deleteBucketDataRedundancyTransition(new Oss\Models\DeleteBucketDataRedundancyTransitionRequest(
$bucketName, '123'
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketDataRedundancyTransition', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$listResult = $client->listBucketDataRedundancyTransition(new Oss\Models\ListBucketDataRedundancyTransitionRequest(
$bucketName,
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListBucketDataRedundancyTransition', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$client = $this->getInvalidAkClient();
$listResult = $client->listUserDataRedundancyTransition(new Oss\Models\ListUserDataRedundancyTransitionRequest());
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListUserDataRedundancyTransition', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,109 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketEncryptionTest extends TestIntegration
{
public function testBucketEncryption()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketEncryption
$putResult = $client->putBucketEncryption(new Oss\Models\PutBucketEncryptionRequest(
$bucketName,
new Oss\Models\ServerSideEncryptionRule(
new Oss\Models\ApplyServerSideEncryptionByDefault(
sseAlgorithm: 'KMS',
kmsDataEncryption: 'SM4'
))
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketEncryption
$getResult = $client->getBucketEncryption(new Oss\Models\GetBucketEncryptionRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketEncryption
$delResult = $client->deleteBucketEncryption(new Oss\Models\DeleteBucketEncryptionRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketEncryptionFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketEncryption
try {
$putResult = $client->putBucketEncryption(new Oss\Models\PutBucketEncryptionRequest(
$bucketName,
new Oss\Models\ServerSideEncryptionRule(
new Oss\Models\ApplyServerSideEncryptionByDefault(
sseAlgorithm: 'KMS',
kmsDataEncryption: 'SM4'
))
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketEncryption', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketEncryption
try {
$getResult = $client->getBucketEncryption(new Oss\Models\GetBucketEncryptionRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketEncryption', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketEncryption
try {
$delResult = $client->deleteBucketEncryption(new Oss\Models\DeleteBucketEncryptionRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketEncryption', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,116 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketHttpsConfigTest extends TestIntegration
{
public function testBucketHttpsConfig()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketHttpsConfig
$putResult = $client->putBucketHttpsConfig(new Oss\Models\PutBucketHttpsConfigRequest(
$bucketName,
new Oss\Models\HttpsConfiguration(
tls: new Oss\Models\TLS(
tlsVersions: ['TLSv1.2', 'TLSv1.3'],
enable: true
)
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketHttpsConfig
$getResult = $client->getBucketHttpsConfig(new Oss\Models\GetBucketHttpsConfigRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// PutBucketHttpsConfig
$putResult = $client->putBucketHttpsConfig(new Oss\Models\PutBucketHttpsConfigRequest(
$bucketName,
new Oss\Models\HttpsConfiguration(
tls: new Oss\Models\TLS(
tlsVersions: ['TLSv1.2', 'TLSv1.3'],
enable: true
),
cipherSuite: new Oss\Models\CipherSuite(
enable: true,
strongCipherSuite: false,
customCipherSuites: ['ECDHE-ECDSA-AES128-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-CCM8'],
tls13CustomCipherSuites: ['TLS_AES_256_GCM_SHA384', 'TLS_AES_128_GCM_SHA256', 'TLS_CHACHA20_POLY1305_SHA256'],
)
),
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketHttpsConfig
$getResult = $client->getBucketHttpsConfig(new Oss\Models\GetBucketHttpsConfigRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
}
public function testBucketHttpsConfigFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketHttpsConfig
try {
$putResult = $client->putBucketHttpsConfig(new Oss\Models\PutBucketHttpsConfigRequest(
$bucketName,
new Oss\Models\HttpsConfiguration(
tls: new Oss\Models\TLS(
tlsVersions: ['TLSv1.2', 'TLSv1.3'],
enable: true
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketHttpsConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketHttpsConfig
try {
$getResult = $client->getBucketHttpsConfig(new Oss\Models\GetBucketHttpsConfigRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketHttpsConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,190 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketInventoryTest extends TestIntegration
{
public function testBucketInventory()
{
if (self::$USER_ID === false) {
throw new \Exception('user id can not be empty!');
}
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$id = 'report1' . rand(0, 100) . '-' . time();
// PutBucketInventory
$putResult = $client->putBucketInventory(new Oss\Models\PutBucketInventoryRequest(
$bucketName,
inventoryId: $id,
inventoryConfiguration: new Oss\Models\InventoryConfiguration(
isEnabled: true,
destination: new Oss\Models\InventoryDestination(
ossBucketDestination: new Oss\Models\InventoryOSSBucketDestination(
bucket: 'acs:oss:::' . $bucketName,
prefix: 'prefix1',
format: Oss\Models\InventoryFormatType::CSV,
accountId: self::$USER_ID,
roleArn: 'acs:ram::' . self::$USER_ID . ':role/AliyunOSSRole'
)
),
schedule: new Oss\Models\InventorySchedule(
frequency: Oss\Models\InventoryFrequencyType::DAILY
),
filter: new Oss\Models\InventoryFilter(
prefix: 'filterPrefix',
lastModifyBeginTimeStamp: 1637883649,
lastModifyEndTimeStamp: 1638347592,
lowerSizeBound: 1024,
upperSizeBound: 1048576,
storageClass: 'Standard,IA'
),
includedObjectVersions: 'All',
optionalFields: new Oss\Models\OptionalFields(
fields: array(
Oss\Models\InventoryOptionalFieldType::STORAGE_CLASS
)
),
id: $id
)));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketInventory
$getResult = $client->getBucketInventory(new Oss\Models\GetBucketInventoryRequest(
$bucketName, $id
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// ListBucketInventory
$listResult = $client->listBucketInventory(new Oss\Models\ListBucketInventoryRequest(
$bucketName
));
$this->assertEquals(200, $listResult->statusCode);
$this->assertEquals('OK', $listResult->status);
$this->assertEquals(True, count($listResult->headers) > 0);
$this->assertEquals(24, strlen($listResult->requestId));
// DeleteBucketInventory
$delResult = $client->deleteBucketInventory(new Oss\Models\DeleteBucketInventoryRequest(
$bucketName, $id
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketInventoryFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
$id = 'report1' . rand(0, 100) . '-' . time();
// PutBucketInventory
try {
$putResult = $client->putBucketInventory(new Oss\Models\PutBucketInventoryRequest(
$bucketName,
inventoryId: $id,
inventoryConfiguration: new Oss\Models\InventoryConfiguration(
isEnabled: true,
destination: new Oss\Models\InventoryDestination(
ossBucketDestination: new Oss\Models\InventoryOSSBucketDestination(
bucket: 'acs:oss:::' . $bucketName,
prefix: 'prefix1',
format: Oss\Models\InventoryFormatType::CSV,
accountId: self::$USER_ID,
roleArn: 'acs:ram::' . self::$USER_ID . ':role/AliyunOSSRole'
)
),
schedule: new Oss\Models\InventorySchedule(
frequency: Oss\Models\InventoryFrequencyType::DAILY
),
filter: new Oss\Models\InventoryFilter(
prefix: 'filterPrefix',
lastModifyBeginTimeStamp: 1637883649,
lastModifyEndTimeStamp: 1638347592,
lowerSizeBound: 1024,
upperSizeBound: 1048576,
storageClass: 'Standard,IA'
),
includedObjectVersions: 'All',
optionalFields: new Oss\Models\OptionalFields(
fields: array(
Oss\Models\InventoryOptionalFieldType::STORAGE_CLASS
)
),
id: $id
)));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketInventory', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketInventory
try {
$getResult = $client->getBucketInventory(new Oss\Models\GetBucketInventoryRequest(
$bucketName, $id
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketInventory', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// ListBucketInventory
try {
$getResult = $client->listBucketInventory(new Oss\Models\ListBucketInventoryRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListBucketInventory', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketInventory
try {
$delResult = $client->deleteBucketInventory(new Oss\Models\DeleteBucketInventoryRequest(
$bucketName, $id
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketInventory', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,127 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;
class ClientBucketLifecycleTest extends TestIntegration
{
public function testBucketLifecycle()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketLifecycle
$putResult = $client->putBucketLifecycle(new Oss\Models\PutBucketLifecycleRequest(
$bucketName,
lifecycleConfiguration: new LifecycleConfiguration(
array(new Oss\Models\LifecycleRule(
prefix: 'log/',
transitions: array(
new Oss\Models\LifecycleRuleTransition(
days: 30,
storageClass: 'IA'
)
),
id: 'rule',
status: 'Enabled'
))
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketLifecycle
$getResult = $client->getBucketLifecycle(new Oss\Models\GetBucketLifecycleRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketLifecycle
$delResult = $client->deleteBucketLifecycle(new Oss\Models\DeleteBucketLifecycleRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketLifecycleFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketLifecycle
try {
$putResult = $client->putBucketLifecycle(new Oss\Models\PutBucketLifecycleRequest(
$bucketName,
lifecycleConfiguration: new LifecycleConfiguration(
array(new Oss\Models\LifecycleRule(
prefix: 'log/',
transitions: array(
new Oss\Models\LifecycleRuleTransition(
days: 30,
storageClass: 'IA'
)
),
id: 'rule',
status: 'Enabled'
))
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketLifecycle', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketLifecycle
try {
$getResult = $client->getBucketLifecycle(new Oss\Models\GetBucketLifecycleRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketLifecycle', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketLifecycle
try {
$delResult = $client->deleteBucketLifecycle(new Oss\Models\DeleteBucketLifecycleRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketLifecycle', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,188 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketLoggingTest extends TestIntegration
{
public function testBucketLogging()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketLogging
$putResult = $client->putBucketLogging(new Oss\Models\PutBucketLoggingRequest(
$bucketName,
new Oss\Models\BucketLoggingStatus(
new Oss\Models\LoggingEnabled(
targetBucket: $bucketName, targetPrefix: 'TargetPrefix', loggingRole: 'AliyunOSSLoggingDefaultRole'
)
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketLogging
$getResult = $client->getBucketLogging(new Oss\Models\GetBucketLoggingRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketLogging
$delResult = $client->deleteBucketLogging(new Oss\Models\DeleteBucketLoggingRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
// PutUserDefinedLogFieldsConfig
$putResult = $client->putUserDefinedLogFieldsConfig(new Oss\Models\PutUserDefinedLogFieldsConfigRequest(
$bucketName,
new Oss\Models\UserDefinedLogFieldsConfiguration(
paramSet: new Oss\Models\LoggingParamSet(['param1', 'param2']), headerSet: new Oss\Models\LoggingHeaderSet(['header1', 'header2'])
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetUserDefinedLogFieldsConfig
$getResult = $client->getUserDefinedLogFieldsConfig(new Oss\Models\GetUserDefinedLogFieldsConfigRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteUserDefinedLogFieldsConfig
$delResult = $client->deleteUserDefinedLogFieldsConfig(new Oss\Models\DeleteUserDefinedLogFieldsConfigRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketLoggingFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
try {
$putResult = $client->putBucketLogging(new Oss\Models\PutBucketLoggingRequest(
$bucketName,
new Oss\Models\BucketLoggingStatus(
new Oss\Models\LoggingEnabled(
targetBucket: $bucketName, targetPrefix: 'TargetPrefix'
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketLogging', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$getResult = $client->getBucketLogging(new Oss\Models\GetBucketLoggingRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketLogging', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$delResult = $client->deleteBucketLogging(new Oss\Models\DeleteBucketLoggingRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketLogging', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$putResult = $client->putUserDefinedLogFieldsConfig(new Oss\Models\PutUserDefinedLogFieldsConfigRequest(
$bucketName,
new Oss\Models\UserDefinedLogFieldsConfiguration(
paramSet: new Oss\Models\LoggingParamSet(['param1', 'param2']), headerSet: new Oss\Models\LoggingHeaderSet(['header1', 'header2'])
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutUserDefinedLogFieldsConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$getResult = $client->getUserDefinedLogFieldsConfig(new Oss\Models\GetUserDefinedLogFieldsConfigRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetUserDefinedLogFieldsConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$delResult = $client->deleteUserDefinedLogFieldsConfig(new Oss\Models\DeleteUserDefinedLogFieldsConfigRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteUserDefinedLogFieldsConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,184 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketMetaQueryTest extends TestIntegration
{
public function testBucketMetaQuery()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// OpenMetaQuery
$putResult = $client->openMetaQuery(new Oss\Models\OpenMetaQueryRequest(
$bucketName,
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetMetaQueryStatus
$getResult = $client->getMetaQueryStatus(new Oss\Models\GetMetaQueryStatusRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DoMetaQuery
$request = new Oss\Models\DoMetaQueryRequest($bucketName, new Oss\Models\MetaQuery(
maxResults: 5,
query: "{'Field': 'Size','Value': '1048576','Operation': 'gt'}",
sort: 'Size',
order: Oss\Models\MetaQueryOrderType::ASC,
aggregations: new Oss\Models\MetaQueryAggregations(
[
new Oss\Models\MetaQueryAggregation(
field: 'Size',
operation: 'sum'
),
new Oss\Models\MetaQueryAggregation(
field: 'Size',
operation: 'max'
),
]
),
));
$doResult = $client->doMetaQuery($request);
$this->assertEquals(200, $doResult->statusCode);
$this->assertEquals('OK', $doResult->status);
$this->assertEquals(True, count($doResult->headers) > 0);
$this->assertEquals(24, strlen($doResult->requestId));
// CloseMetaQuery
$closeResult = $client->closeMetaQuery(new Oss\Models\CloseMetaQueryRequest($bucketName));
$this->assertEquals(200, $closeResult->statusCode);
$this->assertEquals('OK', $closeResult->status);
$this->assertEquals(True, count($closeResult->headers) > 0);
$this->assertEquals(24, strlen($closeResult->requestId));
$bucketNameAiSearch = self::$BUCKETNAME_PREFIX . strval(rand(0, 100)) . '-' . strval(time()) . '-semantic';
$client->putBucket(new Oss\Models\PutBucketRequest($bucketNameAiSearch));
// OpenMetaQuery with semantic
$putResult = $client->openMetaQuery(new Oss\Models\OpenMetaQueryRequest(
$bucketNameAiSearch, 'semantic'
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// DoMetaQuery with semantic
$request = new Oss\Models\DoMetaQueryRequest($bucketNameAiSearch, new Oss\Models\MetaQuery(
maxResults: 99,
query: "Overlook the snow-covered forest",
mediaTypes: new Oss\Models\MetaQueryMediaTypes('image'),
simpleQuery: '{"Operation":"gt", "Field": "Size", "Value": "30"}',
), 'semantic');
$doResult = $client->doMetaQuery($request);
$this->assertEquals(200, $doResult->statusCode);
$this->assertEquals('OK', $doResult->status);
$this->assertEquals(True, count($doResult->headers) > 0);
$this->assertEquals(24, strlen($doResult->requestId));
$client->deleteBucket(new Oss\Models\DeleteBucketRequest($bucketNameAiSearch));
}
public function testBucketMetaQueryFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// OpenMetaQuery
try {
$putResult = $client->openMetaQuery(new Oss\Models\OpenMetaQueryRequest(
$bucketName,
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error OpenMetaQuery', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetMetaQueryStatus
try {
$getResult = $client->getMetaQueryStatus(new Oss\Models\GetMetaQueryStatusRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetMetaQueryStatus', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DoMetaQuery
try {
$request = new Oss\Models\DoMetaQueryRequest($bucketName, new Oss\Models\MetaQuery(
maxResults: 5,
query: "{'Field': 'Size','Value': '1048576','Operation': 'gt'}",
sort: 'Size',
order: Oss\Models\MetaQueryOrderType::ASC,
aggregations: new Oss\Models\MetaQueryAggregations(
[
new Oss\Models\MetaQueryAggregation(
field: 'Size',
operation: 'sum'
),
new Oss\Models\MetaQueryAggregation(
field: 'Size',
operation: 'max'
),
]
),
));
$doResult = $client->doMetaQuery($request);
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DoMetaQuery', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// CloseMetaQuery
try {
$closeResult = $client->closeMetaQuery(new Oss\Models\CloseMetaQueryRequest($bucketName));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CloseMetaQuery', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,112 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketOverwriteTest extends TestIntegration
{
public function testBucketOverwriteConfig()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketOverwriteConfig
$putResult = $client->putBucketOverwriteConfig(new Oss\Models\PutBucketOverwriteConfigRequest(
$bucketName,
new Oss\Models\OverwriteConfiguration(
array(
new Oss\Models\OverwriteRule(
'forbid', null, null, null, 'rule-001'
)
)
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketOverwriteConfig
$getResult = $client->getBucketOverwriteConfig(new Oss\Models\GetBucketOverwriteConfigRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketOverwriteConfig
$delResult = $client->deleteBucketOverwriteConfig(new Oss\Models\DeleteBucketOverwriteConfigRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketOverwriteConfigFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
try {
$putResult = $client->putBucketOverwriteConfig(new Oss\Models\PutBucketOverwriteConfigRequest(
$bucketName,
new Oss\Models\OverwriteConfiguration(
array(
new Oss\Models\OverwriteRule(
'forbid', null, null, null, 'rule-001'
)
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketOverwriteConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('MalformedXML', $se->getErrorCode());
$this->assertEquals(400, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$getResult = $client->getBucketOverwriteConfig(new Oss\Models\GetBucketOverwriteConfigRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketOverwriteConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$delResult = $client->deleteBucketOverwriteConfig(new Oss\Models\DeleteBucketOverwriteConfigRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketOverwriteConfig', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,136 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;
class ClientBucketPolicyTest extends TestIntegration
{
public function testBucketPolicy()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$client->putBucketPublicAccessBlock(new Oss\Models\PutBucketPublicAccessBlockRequest(
$bucketName,
new Oss\Models\PublicAccessBlockConfiguration(
false
)
));
// PutBucketPolicy
$putResult = $client->putBucketPolicy(new Oss\Models\PutBucketPolicyRequest(
$bucketName,
'{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Allow","Resource":["acs:oss:*:*:*"]}]}'
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketPolicy
$getResult = $client->getBucketPolicy(new Oss\Models\GetBucketPolicyRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// GetBucketPolicyStatus
$getResult2 = $client->getBucketPolicyStatus(new Oss\Models\GetBucketPolicyStatusRequest(
$bucketName
));
$this->assertEquals(200, $getResult2->statusCode);
$this->assertEquals('OK', $getResult2->status);
$this->assertEquals(True, count($getResult2->headers) > 0);
$this->assertEquals(24, strlen($getResult2->requestId));
// DeleteBucketPolicy
$delResult = $client->deleteBucketPolicy(new Oss\Models\DeleteBucketPolicyRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketTransferAccelerationFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketPolicy
try {
$putResult = $client->putBucketPolicy(new Oss\Models\PutBucketPolicyRequest(
$bucketName,
'{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Allow","Resource":["acs:oss:*:*:*"]}]}'
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketPolicy', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketPolicy
try {
$getResult = $client->getBucketPolicy(new Oss\Models\GetBucketPolicyRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketPolicy', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketPolicyStatus
try {
$getResult = $client->getBucketPolicyStatus(new Oss\Models\GetBucketPolicyStatusRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketPolicyStatus', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketPolicy
try {
$delResult = $client->deleteBucketPolicy(new Oss\Models\DeleteBucketPolicyRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketPolicy', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,90 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketPublicAccessBlockTest extends TestIntegration
{
public function testBucketPublicAccessBlock()
{
$client = $this->getDefaultClient();
$bucket = self::$bucketName;
// PutBucketPublicAccessBlock
$putResult = $client->putBucketPublicAccessBlock(new Oss\Models\PutBucketPublicAccessBlockRequest(
$bucket, new Oss\Models\PublicAccessBlockConfiguration(true)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketPublicAccessBlock
$getResult = $client->getBucketPublicAccessBlock(new Oss\Models\GetBucketPublicAccessBlockRequest($bucket));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketPublicAccessBlock
$delResult = $client->deleteBucketPublicAccessBlock(new Oss\Models\DeleteBucketPublicAccessBlockRequest($bucket));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketPublicAccessBlockFail()
{
$client = $this->getInvalidAkClient();
$bucketName = self::$bucketName;
// PutBucketPublicAccessBlock
try {
$putResult = $client->putBucketPublicAccessBlock(new Oss\Models\PutBucketPublicAccessBlockRequest(
$bucketName, new Oss\Models\PublicAccessBlockConfiguration(true)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketPublicAccessBlock', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketPublicAccessBlock
try {
$getResult = $client->getBucketPublicAccessBlock(new Oss\Models\GetBucketPublicAccessBlockRequest($bucketName));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketPublicAccessBlock', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketPublicAccessBlock
try {
$delResult = $client->deleteBucketPublicAccessBlock(new Oss\Models\DeleteBucketPublicAccessBlockRequest($bucketName));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketPublicAccessBlock', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,83 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;
class ClientBucketRefererTest extends TestIntegration
{
public function testBucketReferer()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketReferer
$putResult = $client->putBucketReferer(new Oss\Models\PutBucketRefererRequest(
$bucketName,
refererConfiguration: new Oss\Models\RefererConfiguration(
allowEmptyReferer: false,
refererList: new Oss\Models\RefererList([""]),
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketReferer
$getResult = $client->getBucketReferer(new Oss\Models\GetBucketRefererRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
}
public function testBucketRefererFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketReferer
try {
$putResult = $client->putBucketReferer(new Oss\Models\PutBucketRefererRequest(
$bucketName,
refererConfiguration: new Oss\Models\RefererConfiguration(
allowEmptyReferer: false,
refererList: new Oss\Models\RefererList([""]),
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketReferer', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketReferer
try {
$getResult = $client->getBucketReferer(new Oss\Models\GetBucketRefererRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketReferer', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,246 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketReplicationTest extends TestIntegration
{
public function testBucketReplication()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$targetBucketName = self::randomBucketName() . '-target';
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider(new Oss\Credentials\StaticCredentialsProvider(
self::$ACCESS_ID,
self::$ACCESS_KEY
));
$cfg->setRegion('cn-beijing');
$client1 = new Oss\Client($cfg);
$client1->putBucket(new Oss\Models\PutBucketRequest(
$targetBucketName
));
// PutBucketReplication
$putResult = $client->putBucketReplication(new Oss\Models\PutBucketReplicationRequest(
$bucketName,
new Oss\Models\ReplicationConfiguration(
array(
new Oss\Models\ReplicationRule(
sourceSelectionCriteria: new Oss\Models\ReplicationSourceSelectionCriteria(
sseKmsEncryptedObjects: new Oss\Models\SseKmsEncryptedObjects(
status: 'Enabled'
)
),
destination: new Oss\Models\ReplicationDestination(
bucket: $targetBucketName,
location: 'oss-cn-beijing',
transferType: Oss\Models\TransferType::INTERNAL
),
historicalObjectReplication: Oss\Models\HistoricalObjectReplicationType::ENABLED,
rtc: new Oss\Models\ReplicationTimeControl(status: 'enabled')
)
)
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketReplication
$getResult = $client->getBucketReplication(new Oss\Models\GetBucketReplicationRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// GetBucketReplicationLocation
$getLocationResult = $client->getBucketReplicationLocation(new Oss\Models\GetBucketReplicationLocationRequest(
$bucketName
));
$this->assertEquals(200, $getLocationResult->statusCode);
$this->assertEquals('OK', $getLocationResult->status);
$this->assertEquals(True, count($getLocationResult->headers) > 0);
$this->assertEquals(24, strlen($getLocationResult->requestId));
// GetBucketReplicationProgress
$getProgressResult = $client->getBucketReplicationProgress(new Oss\Models\GetBucketReplicationProgressRequest(
$bucketName,
$getResult->replicationConfiguration->rules[0]->id
));
$this->assertEquals(200, $getProgressResult->statusCode);
$this->assertEquals('OK', $getProgressResult->status);
$this->assertEquals(True, count($getProgressResult->headers) > 0);
$this->assertEquals(24, strlen($getProgressResult->requestId));
// PutBucketRtc
$putRtcResult = $client->putBucketRtc(new Oss\Models\PutBucketRtcRequest(
$bucketName,
rtcConfiguration: new Oss\Models\RtcConfiguration(
rtc: new Oss\Models\ReplicationTimeControl(
status: 'disabled'
),
id: $getResult->replicationConfiguration->rules[0]->id
),
));
$this->assertEquals(200, $putRtcResult->statusCode);
$this->assertEquals('OK', $putRtcResult->status);
$this->assertEquals(True, count($putRtcResult->headers) > 0);
$this->assertEquals(24, strlen($putRtcResult->requestId));
// DeleteBucketReplication
$delResult = $client->deleteBucketReplication(new Oss\Models\DeleteBucketReplicationRequest(
$bucketName,
replicationRules: new Oss\Models\ReplicationRules(
ids: [$getResult->replicationConfiguration->rules[0]->id]
)
),
);
$this->assertEquals(200, $delResult->statusCode);
$this->assertEquals('OK', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
$client1->deleteBucket(new Oss\Models\DeleteBucketRequest(
$targetBucketName
));
}
public function testBucketReplicationFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketReplication
try {
$putResult = $client->putBucketReplication(new Oss\Models\PutBucketReplicationRequest(
$bucketName,
new Oss\Models\ReplicationConfiguration(
array(
new Oss\Models\ReplicationRule(
sourceSelectionCriteria: new Oss\Models\ReplicationSourceSelectionCriteria(
sseKmsEncryptedObjects: new Oss\Models\SseKmsEncryptedObjects(
status: 'Enabled'
)
),
destination: new Oss\Models\ReplicationDestination(
bucket: 'bucket-not-exist',
location: 'oss-cn-beijing',
transferType: Oss\Models\TransferType::INTERNAL
),
historicalObjectReplication: Oss\Models\HistoricalObjectReplicationType::ENABLED,
rtc: new Oss\Models\ReplicationTimeControl(status: 'enabled')
)
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketReplication', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketReplication
try {
$getResult = $client->getBucketReplication(new Oss\Models\GetBucketReplicationRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketReplication', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$getLocationResult = $client->getBucketReplicationLocation(new Oss\Models\GetBucketReplicationLocationRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketReplicationLocation', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$getProgressResult = $client->getBucketReplicationProgress(new Oss\Models\GetBucketReplicationProgressRequest(
$bucketName,
'rule-id'
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketReplicationProgress', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$putRtcResult = $client->putBucketRtc(new Oss\Models\PutBucketRtcRequest(
$bucketName,
rtcConfiguration: new Oss\Models\RtcConfiguration(
rtc: new Oss\Models\ReplicationTimeControl(
status: 'disabled'
),
id: 'rule-id'
),
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketRtc', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
try {
$delResult = $client->deleteBucketReplication(new Oss\Models\DeleteBucketReplicationRequest(
$bucketName,
replicationRules: new Oss\Models\ReplicationRules(
ids: ['rule-id']
)
),
);
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketReplication', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketRequestPaymentTest extends TestIntegration
{
public function testBucketRequestPayment()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketRequestPayment
$putResult = $client->putBucketRequestPayment(new Oss\Models\PutBucketRequestPaymentRequest(
$bucketName,
new Oss\Models\RequestPaymentConfiguration(
'Requester'
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketRequestPayment
$getResult = $client->getBucketRequestPayment(new Oss\Models\GetBucketRequestPaymentRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
}
public function testBucketRequestPaymentFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketRequestPayment
try {
$putResult = $client->putBucketRequestPayment(new Oss\Models\PutBucketRequestPaymentRequest(
$bucketName,
new Oss\Models\RequestPaymentConfiguration(
'Requester'
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketRequestPayment', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketRequestPayment
try {
$getResult = $client->getBucketRequestPayment(new Oss\Models\GetBucketRequestPaymentRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketRequestPayment', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,78 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketResourceGroupTest extends TestIntegration
{
public function testBucketResourceGroup()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// GetBucketResourceGroup
$getResult = $client->getBucketResourceGroup(new Oss\Models\GetBucketResourceGroupRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// PutBucketResourceGroup
$putResult = $client->putBucketResourceGroup(new Oss\Models\PutBucketResourceGroupRequest(
$bucketName,
new Oss\Models\BucketResourceGroupConfiguration(
$getResult->bucketResourceGroupConfiguration->resourceGroupId
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
}
public function testBucketResourceGroupFail()
{
$client = $this->getInvalidAkClient();
$bucketName = self::$bucketName;
// PutBucketResourceGroup
try {
$putResult = $client->putBucketResourceGroup(new Oss\Models\PutBucketResourceGroupRequest(
$bucketName,
new Oss\Models\BucketResourceGroupConfiguration('rg-123')
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketResourceGroup', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketResourceGroup
try {
$getResult = $client->getBucketResourceGroup(new Oss\Models\GetBucketResourceGroupRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketResourceGroup', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,128 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketStyleTest extends TestIntegration
{
public function testBucketStyle()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutStyle
$putResult = $client->putStyle(new Oss\Models\PutStyleRequest(
$bucketName,
styleName: 'test',
style: new Oss\Models\StyleContent('image/resize,p_50')
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetStyle
$getResult = $client->getStyle(new Oss\Models\GetStyleRequest(
$bucketName, 'test'
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// ListStyle
$listResult = $client->listStyle(new Oss\Models\ListStyleRequest(
$bucketName
));
$this->assertEquals(200, $listResult->statusCode);
$this->assertEquals('OK', $listResult->status);
$this->assertEquals(True, count($listResult->headers) > 0);
$this->assertEquals(24, strlen($listResult->requestId));
// DeleteStyle
$delResult = $client->deleteStyle(new Oss\Models\DeleteStyleRequest(
$bucketName, 'test'
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketStyleFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutStyle
try {
$putResult = $client->putStyle(new Oss\Models\PutStyleRequest(
$bucketName,
styleName: 'test',
style: new Oss\Models\StyleContent('image/resize,p_50')
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutStyle', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetStyle
try {
$getResult = $client->getStyle(new Oss\Models\GetStyleRequest(
$bucketName, 'test'
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetStyle', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// ListStyle
try {
$listResult = $client->listStyle(new Oss\Models\ListStyleRequest(
$bucketName
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListStyle', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteStyle
try {
$delResult = $client->deleteStyle(new Oss\Models\DeleteStyleRequest(
$bucketName, 'test'
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteStyle', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,109 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;
class ClientBucketTagsTest extends TestIntegration
{
public function testBucketTags()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketTags
$putResult = $client->putBucketTags(new Oss\Models\PutBucketTagsRequest(
$bucketName,
tagging: new Oss\Models\Tagging(
tagSet: new Oss\Models\TagSet(
[new Oss\Models\Tag(key: 'key1', value: 'value1'), new Oss\Models\Tag(key: 'key2', value: 'value2')])
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketTags
$getResult = $client->getBucketTags(new Oss\Models\GetBucketTagsRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketTags
$delResult = $client->deleteBucketTags(new Oss\Models\DeleteBucketTagsRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketTagsFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketTags
try {
$putResult = $client->putBucketTags(new Oss\Models\PutBucketTagsRequest(
$bucketName,
tagging: new Oss\Models\Tagging(
tagSet: new Oss\Models\TagSet(
[new Oss\Models\Tag(key: 'key1', value: 'value1'), new Oss\Models\Tag(key: 'key2', value: 'value2')])
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketTags', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketTags
try {
$getResult = $client->getBucketTags(new Oss\Models\GetBucketTagsRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketTags', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketTags
try {
$delResult = $client->deleteBucketTags(new Oss\Models\DeleteBucketTagsRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketTags', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,81 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use AlibabaCloud\Oss\V2\Models\LifecycleConfiguration;
class ClientBucketTransferAccelerationTest extends TestIntegration
{
public function testBucketTransferAcceleration()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketTransferAcceleration
$putResult = $client->putBucketTransferAcceleration(new Oss\Models\PutBucketTransferAccelerationRequest(
$bucketName,
new Oss\Models\TransferAccelerationConfiguration(
true
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketTransferAcceleration
$getResult = $client->getBucketTransferAcceleration(new Oss\Models\GetBucketTransferAccelerationRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
}
public function testBucketTransferAccelerationFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketTransferAcceleration
try {
$putResult = $client->putBucketTransferAcceleration(new Oss\Models\PutBucketTransferAccelerationRequest(
$bucketName,
new Oss\Models\TransferAccelerationConfiguration(
true
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketTransferAcceleration', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketTransferAcceleration
try {
$getResult = $client->getBucketTransferAcceleration(new Oss\Models\GetBucketTransferAccelerationRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketTransferAcceleration', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,242 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketWebsiteTest extends TestIntegration
{
public function testBucketWebsite()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// PutBucketWebsite
$putResult = $client->putBucketWebsite(new Oss\Models\PutBucketWebsiteRequest(
$bucketName,
websiteConfiguration: new Oss\Models\WebsiteConfiguration(
indexDocument: new Oss\Models\IndexDocument(
suffix: 'index.html', supportSubDir: true, type: 0
),
errorDocument: new Oss\Models\ErrorDocument(
key: 'error.html', httpStatus: 404
)
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetBucketWebsite
$getResult = $client->getBucketWebsite(new Oss\Models\GetBucketWebsiteRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeleteBucketWebsite
$delResult = $client->deleteBucketWebsite(new Oss\Models\DeleteBucketWebsiteRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
// PutBucketWebsite
$putResult = $client->putBucketWebsite(new Oss\Models\PutBucketWebsiteRequest(
$bucketName,
websiteConfiguration: new Oss\Models\WebsiteConfiguration(
indexDocument: new Oss\Models\IndexDocument(
suffix: 'index.html', supportSubDir: true, type: 0
),
errorDocument: new Oss\Models\ErrorDocument(
key: 'error.html', httpStatus: 404
),
routingRules: new Oss\Models\RoutingRules([
new Oss\Models\RoutingRule(
redirect: new Oss\Models\RoutingRuleRedirect(
mirrorPassOriginalSlashes: false,
redirectType: 'Mirror',
mirrorURL: 'http://example.com/',
mirrorPassQueryString: true,
mirrorCheckMd5: true,
mirrorSNI: true,
replaceKeyPrefixWith: "def/",
mirrorFollowRedirect: true,
hostName: "example.com",
mirrorHeaders: new Oss\Models\MirrorHeaders(
passs: ["myheader-key1", "myheader-key2"],
sets: array(
new Oss\Models\MirrorHeaderSet(key: 'myheader-key5', value: 'myheader-value5'),
),
passAll: true,
),
passQueryString: true,
enableReplacePrefix: true,
httpRedirectCode: 301,
mirrorURLSlave: 'http://example.com/',
mirrorSaveOssMeta: true,
mirrorProxyPass: false,
mirrorAllowGetImageInfo: true,
mirrorAllowVideoSnapshot: false,
mirrorIsExpressTunnel: true,
mirrorDstRegion: 'cn-hangzhou',
mirrorUserLastModified: false,
mirrorSwitchAllErrors: true,
mirrorUsingRole: true,
mirrorRole: 'aliyun-test-role',
mirrorAllowHeadObject: true,
transparentMirrorResponseCodes: '400',
mirrorTaggings: new Oss\Models\MirrorTaggings(
taggings: [new Oss\Models\MirrorTagging(
value: 'v',
key: 'k'
)]
),
mirrorReturnHeaders: new Oss\Models\MirrorReturnHeaders(
returnHeaders: [
new Oss\Models\ReturnHeader(
key: 'k',
value: 'v'
)
]
),
mirrorAuth: new Oss\Models\MirrorAuth(
'S3V4', 'ap-southeast-1', 'TESTAK', 'TESTSK'
),
mirrorMultiAlternates: new Oss\Models\MirrorMultiAlternates(
[
new Oss\Models\MirrorMultiAlternate(
mirrorMultiAlternateNumber: 32, mirrorMultiAlternateURL: 'https://test-multi-alter.example.com', mirrorMultiAlternateVpcId: 'vpc-test-id', mirrorMultiAlternateDstRegion: 'ap-southeast-1'
)
]
)
),
ruleNumber: 1,
condition: new Oss\Models\RoutingRuleCondition(
keyPrefixEquals: 'abc/',
keySuffixEquals: ".txt",
httpErrorCodeReturnedEquals: 404,
),
luaConfig: new Oss\Models\RoutingRuleLuaConfig(
script: "test.lua",
)
),
new Oss\Models\RoutingRule(
redirect: new Oss\Models\RoutingRuleRedirect(
redirectType: 'AliCDN',
mirrorURL: 'http://example.com/',
mirrorPassQueryString: true,
mirrorCheckMd5: true,
mirrorSNI: true,
protocol: 'http',
mirrorFollowRedirect: true,
mirrorHeaders: new Oss\Models\MirrorHeaders(
passs: ["myheader-key1", "myheader-key2"],
sets: array(
new Oss\Models\MirrorHeaderSet(key: 'myheader-key5', value: 'myheader-value5'),
),
passAll: true,
),
passQueryString: true,
replaceKeyWith: "abc",
),
ruleNumber: 2,
condition: new Oss\Models\RoutingRuleCondition(
keyPrefixEquals: 'abc/',
keySuffixEquals: ".txt",
httpErrorCodeReturnedEquals: 404,
),
luaConfig: new Oss\Models\RoutingRuleLuaConfig(
script: "test.lua",
)
),
]),
)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// DeleteBucketWebsite
$delResult = $client->deleteBucketWebsite(new Oss\Models\DeleteBucketWebsiteRequest(
$bucketName
));
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testBucketWebsiteFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// PutBucketWebsite
try {
$putResult = $client->putBucketWebsite(new Oss\Models\PutBucketWebsiteRequest(
$bucketName,
websiteConfiguration: new Oss\Models\WebsiteConfiguration(
indexDocument: new Oss\Models\IndexDocument(
suffix: 'index.html', supportSubDir: true, type: 0
),
errorDocument: new Oss\Models\ErrorDocument(
key: 'error.html', httpStatus: 404
)
)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutBucketWebsite', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketWebsite
try {
$getResult = $client->getBucketWebsite(new Oss\Models\GetBucketWebsiteRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketWebsite', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeleteBucketWebsite
try {
$delResult = $client->deleteBucketWebsite(new Oss\Models\DeleteBucketWebsiteRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteBucketWebsite', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,183 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientBucketWormTest extends TestIntegration
{
public function testBucketWorm()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
// InitiateBucketWorm
$initResult = $client->initiateBucketWorm(new Oss\Models\InitiateBucketWormRequest(
$bucketName,
new Oss\Models\InitiateWormConfiguration(1)
));
$this->assertEquals(200, $initResult->statusCode);
$this->assertEquals('OK', $initResult->status);
$this->assertEquals(True, count($initResult->headers) > 0);
$this->assertEquals(24, strlen($initResult->requestId));
$this->assertNotEmpty($initResult->wormId);
// GetBucketWorm
$getResult = $client->getBucketWorm(new Oss\Models\GetBucketWormRequest(
$bucketName
));
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
$this->assertEquals($initResult->wormId, $getResult->wormConfiguration->wormId);
$this->assertNotEmpty($getResult->wormConfiguration->creationDate);
$this->assertNotEmpty($getResult->wormConfiguration->retentionPeriodInDays);
$this->assertNotEmpty($getResult->wormConfiguration->state);
// AbortBucketWorm
$abortResult = $client->abortBucketWorm(new Oss\Models\AbortBucketWormRequest(
$bucketName
));
$this->assertEquals(204, $abortResult->statusCode);
$this->assertEquals('No Content', $abortResult->status);
$this->assertEquals(True, count($abortResult->headers) > 0);
$this->assertEquals(24, strlen($abortResult->requestId));
// CompleteBucketWorm
try {
$result = $client->completeBucketWorm(new Oss\Models\CompleteBucketWormRequest(
$bucketName,
$initResult->wormId
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CompleteBucketWorm', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchWORMConfiguration', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// ExtendBucketWorm
try {
$result = $client->extendBucketWorm(new Oss\Models\ExtendBucketWormRequest(
$bucketName,
$initResult->wormId,
new Oss\Models\ExtendWormConfiguration(2)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ExtendBucketWorm', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchWORMConfiguration', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
public function testBucketWormFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . "-not-exist";
// InitiateBucketWorm
try {
$initResult = $client->initiateBucketWorm(new Oss\Models\InitiateBucketWormRequest(
$bucketName,
new Oss\Models\InitiateWormConfiguration(1)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error InitiateBucketWorm', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetBucketWorm
try {
$getResult = $client->getBucketWorm(new Oss\Models\GetBucketWormRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetBucketWorm', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// AbortBucketWorm
try {
$abortResult = $client->abortBucketWorm(new Oss\Models\AbortBucketWormRequest(
$bucketName
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error AbortBucketWorm', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
$wormId = 'not-exist-wormId';
// CompleteBucketWorm
try {
$result = $client->completeBucketWorm(new Oss\Models\CompleteBucketWormRequest(
$bucketName,
$wormId
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CompleteBucketWorm', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// ExtendBucketWorm
try {
$result = $client->extendBucketWorm(new Oss\Models\ExtendBucketWormRequest(
$bucketName,
$wormId,
new Oss\Models\ExtendWormConfiguration(2)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ExtendBucketWorm', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,57 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use GuzzleHttp\Psr7\LazyOpenStream;
use GuzzleHttp\Psr7\NoSeekStream;
use GuzzleHttp\Psr7\BufferStream;
class ClientListCloudBoxesTest extends TestIntegration
{
public function testListCloudBoxes()
{
$client = $this->getDefaultClient();
// ListCloudBoxes
try {
$result = $client->listCloudBoxes(new Oss\Models\ListCloudBoxesRequest());
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListCloudBoxes', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('You are forbidden to oss-cloudbox:ListCloudBoxes', $se->getErrorMessage());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
} else {
$this->assertTrue(false, "should not here");
}
}
}
public function testListCloudBoxesFail()
{
$client = $this->getInvalidAkClient();
try {
$result = $client->listCloudBoxes(new Oss\Models\ListCloudBoxesRequest());
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListCloudBoxes', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

View File

@@ -0,0 +1,380 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use GuzzleHttp\Promise as P;
use GuzzleHttp\Psr7\LimitStream;
use GuzzleHttp\Psr7\LazyOpenStream;
use AlibabaCloud\Oss\V2 as Oss;
class ClientMiscTest extends TestIntegration
{
public function testPutObjectProgress()
{
$client = self::getDefaultClient();
$bucketName = self::$bucketName;
$filename = self::getTempFileName();
$size = 512 * 1024 + 1234;
$this->generateFile($filename, $size);
$handle = fopen($filename, 'rb');
$reqeust = new Oss\Models\PutObjectRequest($bucketName, 'key-123+-/123%/345');
$reqeust->body = Oss\Utils::streamFor($handle);
$gotIncrement = 0;
$gotSize = 0;
$gotTotal = 0;
$reqeust->progressFn = static function (int $increment, int $transferred, int $total) use (&$gotIncrement, &$gotSize, &$gotTotal) {
$gotIncrement += $increment;
$gotSize = $transferred;
$gotTotal = $total;
};
$client->putObject($reqeust);
fclose($handle);
$this->assertEquals($size, $gotIncrement);
$this->assertEquals($size, $gotSize);
$this->assertEquals($size, $gotTotal);
}
public function testAppendObjectProgress()
{
$client = self::getDefaultClient();
$bucketName = self::$bucketName;
$filename = self::getTempFileName();
$size = 512 * 1024 + 1234;
$this->generateFile($filename, $size);
$handle = fopen($filename, 'rb');
$reqeust = new Oss\Models\AppendObjectRequest($bucketName, 'append-key-123.txt');
$reqeust->position = 0;
$reqeust->body = Oss\Utils::streamFor($handle);
$gotIncrement = 0;
$gotSize = 0;
$gotTotal = 0;
$reqeust->progressFn = static function (int $increment, int $transferred, int $total) use (&$gotIncrement, &$gotSize, &$gotTotal) {
$gotIncrement += $increment;
$gotSize = $transferred;
$gotTotal = $total;
};
$client->appendObject($reqeust);
fclose($handle);
$this->assertEquals($size, $gotIncrement);
$this->assertEquals($size, $gotSize);
$this->assertEquals($size, $gotTotal);
$reqeust = new Oss\Models\AppendObjectRequest($bucketName, 'append-key-123.txt');
$reqeust->body = Oss\Utils::streamFor('hello world');
$reqeust->position = $size;
$gotIncrement = 0;
$gotSize = 0;
$gotTotal = 0;
$reqeust->progressFn = static function (int $increment, int $transferred, int $total) use (&$gotIncrement, &$gotSize, &$gotTotal) {
$gotIncrement += $increment;
$gotSize = $transferred;
$gotTotal = $total;
};
$client->appendObject($reqeust);
$this->assertEquals(11, $gotIncrement);
$this->assertEquals(11, $gotSize);
$this->assertEquals(11, $gotTotal);
}
public function testUploadPartProgress()
{
$client = $this->getDefaultClient();
$totalSize = 250 * 1024 + 123;
$partSize = 100 * 1024;
$filename = self::getTempFileName();
$this->generateFile($filename, $totalSize);
$key = 'bigfile.tmp';
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$file = fopen($filename, 'rb');
$parts = [];
$fileStream = Oss\Utils::streamFor($file);
$gotIncrement = 0;
for ($i = 0, $partNum = 1; $i < $totalSize; $i += $partSize, $partNum++) {
$gotSize = 0;
$gotTotal = 0;
$body = new LimitStream($fileStream, $partSize, $i);
$sendSize = $body->getSize();
$partResult = $client->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
$partNum,
$initResult->uploadId,
null,
null,
null,
null,
$body,
static function (int $increment, int $transferred, int $total) use (&$gotIncrement, &$gotSize, &$gotTotal) {
$gotIncrement += $increment;
$gotSize = $transferred;
$gotTotal = $total;
}
)
);
$this->assertEquals(200, $partResult->statusCode);
$this->assertEquals($sendSize, $gotSize);
$this->assertEquals($sendSize, $gotTotal);
$part = new Oss\Models\UploadPart(
$partNum,
$partResult->etag,
);
$parts[] = $part;
}
//$this->assertEquals($totalSize, $gotIncrement);
fclose($file);
$comResult = $client->completeMultipartUpload(
new Oss\Models\CompleteMultipartUploadRequest(
self::$bucketName,
$key,
$initResult->uploadId,
null,
new Oss\Models\CompleteMultipartUpload(
$parts
),
)
);
$this->assertEquals(200, $comResult->statusCode);
$this->assertEquals(self::$bucketName, $comResult->bucket);
$this->assertEquals($key, $comResult->key);
$this->assertNotEmpty($comResult->etag);
$this->assertNotEmpty($comResult->location);
$getObj = $client->getObject(new Oss\Models\GetObjectRequest(
self::$bucketName,
$key,
));
$objMd5 = base64_encode(md5($getObj->body, true));
$fileMd5 = base64_encode(md5(file_get_contents($filename), true));
$this->assertEquals($fileMd5, $objMd5);
}
public function testUploadPartUseCoroutine(): void
{
$totalSize = 250 * 1024 + 123;
$partSize = 100 * 1024;
$filename = self::getTempFileName();
$this->generateFile($filename, $totalSize);
$key = 'coroutine.tmp';
$bucketName = self::$bucketName;
// upload context
$context['client'] = self::getDefaultClient();
$context['request'] = new Oss\Models\PutObjectRequest($bucketName, $key);
$context['filename'] = $filename;
$context['parallel_num'] = 2;
$context['part_size'] = $partSize;
// use coroutine
$promisor = P\Coroutine::of(function () use (&$context) {
$client = $context['client'];
// initiate multipart upload
$request = new Oss\Models\InitiateMultipartUploadRequest();
Oss\Utils::copyRequest($request, $context['request']);
yield $client->initiateMultipartUploadAsync($request)->then(
function (Oss\Models\InitiateMultipartUploadResult $result) use (&$context) {
$context['upload_id'] = $result->uploadId;
},
);
// upload part
$context['errors'] = [];
$context['parts'] = [];
$uploadFns = function () use (&$context) {
$client = $context['client'];
$part_size = intval($context['part_size']);
$filepath = strval($context['filename']);
$source = new LazyOpenStream($filepath, 'rb');
$source->seek(0);
for ($partNumber = 1; $source->tell() < $source->getSize(); $partNumber++) {
$body = new LimitStream(
new LazyOpenStream($source->getMetadata('uri'), 'rb'),
$part_size,
$source->tell()
);
$source->seek(min($source->tell() + $part_size, $source->getSize()));
$request = new Oss\Models\UploadPartRequest();
Oss\Utils::copyRequest($request, $context['request']);
$request->partNumber = $partNumber;
$request->uploadId = $context['upload_id'];
$request->body = $body;
yield $partNumber => $client->uploadPartAsync($request)->otherwise(
function ($reason) use (&$context) {
$context['errors'][] = $reason;
return P\Create::rejectionFor($reason);
},
);
if (!empty($context['errors'])) {
break;
}
}
};
$each = new P\EachPromise(
$uploadFns(),
[
'concurrency' => $context['parallel_num'],
'fulfilled' => function (Oss\Models\UploadPartResult $result, $key) use (&$context) {
$context['parts'][] = new Oss\Models\UploadPart($key, $result->etag);
return $result;
}
]
);
yield $each->promise();
if (!empty($context['errors'])) {
throw end($context['errors']);
}
$parts = $context['parts'];
usort($parts, function ($a, $b) {
if ($a->partNumber == $b->partNumber)
return 0;
return $a->partNumber < $b->partNumber ? -1 : 1;
});
$request = new Oss\Models\CompleteMultipartUploadRequest();
Oss\Utils::copyRequest($request, $context['request']);
$request->uploadId = $context['upload_id'];
$request->completeMultipartUpload = new Oss\Models\CompleteMultipartUpload($parts);
yield $client->completeMultipartUploadAsync($request)->then(
function (Oss\Models\CompleteMultipartUploadResult $result) use (&$context) {
$context['upload_result'] = $result;
return $result;
},
);
});
// wait finish
$promisor->wait();
// check result
$result = $context['upload_result'];
$this->assertInstanceOf(Oss\Models\CompleteMultipartUploadResult::class, $result);
if ($result instanceof Oss\Models\CompleteMultipartUploadResult) {
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertStringEndsWith('-3"', $result->etag);
}
$fileMd5 = md5(file_get_contents($filename), true);
$objectMd5 = md5($this->object_get_contents(self::getDefaultClient(), $bucketName, $key), true);
$this->assertEquals($fileMd5, $objectMd5);
}
public function testGetObjectIntoSink(): void
{
$client = self::getDefaultClient();
$bucketName = self::$bucketName;
$filename = self::getTempFileName();
$key = self::randomObjectName();
$size = 123 * 1024 + 1234;
$this->generateFile($filename, $size);
$content = file_get_contents($filename);
$handle = fopen($filename, 'rb');
$request = new Oss\Models\PutObjectRequest($bucketName, $key);
$request->body = Oss\Utils::streamFor($handle);
$result = $client->putObject($request);
fclose($handle);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
// use sink to save object into file
$filenameSave = self::getTempFileName();
$this->assertFileNotEquals($filename, $filenameSave);
$request = new Oss\Models\GetObjectRequest($bucketName, $key);
$result = $client->getObject(
$request,
[
'request_options' =>
['sink' => $filenameSave]
]
);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertFileEquals($filename, $filenameSave);
$this->assertNull($result->body);
// use sink to save object into memeroy
$sink = \GuzzleHttp\Psr7\Utils::tryFopen('php://temp', 'w+');
$request = new Oss\Models\GetObjectRequest($bucketName, $key);
$result = $client->getObject(
$request,
[
'request_options' =>
['sink' => $sink]
]
);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertNotNull($result->body);
$this->assertEquals($content, $result->body->getContents());
}
public function testGetObjectStreamMode(): void
{
$client = self::getDefaultClient();
$bucketName = self::$bucketName;
$filename = self::getTempFileName();
$key = self::randomObjectName();
$size = 123 * 1024 + 1234;
$this->generateFile($filename, $size);
$content = file_get_contents($filename);
$handle = fopen($filename, 'rb');
$request = new Oss\Models\PutObjectRequest($bucketName, $key);
$request->body = Oss\Utils::streamFor($handle);
$result = $client->putObject($request);
fclose($handle);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
// use non stream
$request = new Oss\Models\GetObjectRequest($bucketName, $key);
$result = $client->getObject(
$request,
[
'request_options' =>
['stream' => false]
]
);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertNotNull($result->body);
$this->assertTrue($result->body->isSeekable());
$this->assertEquals($content, $result->body->getContents());
$this->assertEquals($size, $result->body->getSize());
$this->assertEquals('', $result->body->read(100));
// use stream
$request = new Oss\Models\GetObjectRequest($bucketName, $key);
$result = $client->getObject(
$request,
[
'request_options' =>
['stream' => true]
]
);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertNotNull($result->body);
$this->assertFalse($result->body->isSeekable());
$this->assertNull($result->body->getSize());
$this->assertEquals($content, $result->body->getContents());
$this->assertEquals('', $result->body->read(100));
}
}

View File

@@ -0,0 +1,634 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
use SebastianBergmann\Type\ObjectType;
class ClientObjectBasicTest extends TestIntegration
{
public function testObjectBasic()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
// put object
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get object
$result = $client->getObject(new Oss\Models\GetObjectRequest(
$bucketName,
$key
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// copy object
$destKey = self::randomObjectName() . '-dest';
$copyObjRequest = new Oss\Models\CopyObjectRequest(
$bucketName,
$destKey,
);
$copyObjRequest->sourceKey = $key;
$result = $client->copyObject($copyObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// append object
$appendKey = self::randomObjectName() . '-append';
$appendObjRequest = new Oss\Models\AppendObjectRequest(
$bucketName,
$appendKey,
0
);
$result = $client->appendObject($appendObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// head object
$headObjRequest = new Oss\Models\HeadObjectRequest(
$bucketName,
$appendKey,
);
$result = $client->headObject($headObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get object meta
$getObjMetaRequest = new Oss\Models\GetObjectMetaRequest(
$bucketName,
$appendKey,
);
$result = $client->getObjectMeta($getObjMetaRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// restore object
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$putObjRequest->storageClass = Oss\Models\StorageClassType::DEEP_COLD_ARCHIVE;
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$restoreObjRequest = new Oss\Models\RestoreObjectRequest(
$bucketName,
$key,
);
$restoreObjRequest->restoreRequest = new Oss\Models\RestoreRequest(3);
$result = $client->restoreObject($restoreObjRequest);
$this->assertEquals(202, $result->statusCode);
$this->assertEquals('Accepted', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// clean restored object
try {
$result = $client->cleanRestoredObject(new Oss\Models\CleanRestoredObjectRequest(
$bucketName,
$key,
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CleanRestoredObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('ArchiveRestoreNotFinished', $se->getErrorCode());
$this->assertEquals(409, $se->getStatusCode());
}
}
// delete object
$delObjRequest = new Oss\Models\DeleteObjectRequest(
$bucketName,
$key,
);
$result = $client->deleteObject($delObjRequest);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// delete objects
$delObjsRequest = new Oss\Models\DeleteMultipleObjectsRequest(
$bucketName,
);
$delArray = [];
for ($i = 1; $i <= 10; $i++) {
// put object
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key . $i,
);
$delArray[] = new Oss\Models\ObjectIdentifier($key . $i);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
}
$delObjsRequest->delete = new Oss\Models\Delete($delArray);
$result = $client->deleteMultipleObjects($delObjsRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
}
public function testObjectBasicFail()
{
$client = $this->getInvalidAkClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
try {
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$result = $client->getObject(new Oss\Models\GetObjectRequest(
$bucketName,
$key
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$destKey = self::randomObjectName() . '-dest';
$copyObjRequest = new Oss\Models\CopyObjectRequest(
$bucketName,
$destKey,
);
$copyObjRequest->sourceKey = $key;
$result = $client->copyObject($copyObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CopyObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
// append object
try {
$appendKey = self::randomObjectName() . '-append';
$appendObjRequest = new Oss\Models\AppendObjectRequest(
$bucketName,
$appendKey,
0
);
$result = $client->appendObject($appendObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error AppendObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
// seal append object
try {
$sealAppendObjRequest = new Oss\Models\SealAppendObjectRequest(
$bucketName,
$appendKey,
0
);
$result = $client->sealAppendObject($sealAppendObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error SealAppendObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
// head object
try {
$headObjRequest = new Oss\Models\HeadObjectRequest(
$bucketName,
$key,
);
$result = $client->headObject($headObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error HeadObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$metaObjRequest = new Oss\Models\GetObjectMetaRequest(
$bucketName,
$key,
);
$result = $client->getObjectMeta($metaObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetObjectMeta', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$result = $client->restoreObject(new Oss\Models\RestoreObjectRequest(
$bucketName,
$key,
null,
new Oss\Models\RestoreRequest(3)
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error RestoreObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$result = $client->cleanRestoredObject(new Oss\Models\CleanRestoredObjectRequest(
$bucketName,
$key,
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error CleanRestoredObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
// delete object
try {
$delObjRequest = new Oss\Models\DeleteObjectRequest(
$bucketName,
$key,
);
$result = $client->deleteObject($delObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteObject', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
// delete objects
try {
$delObjRequest = new Oss\Models\DeleteMultipleObjectsRequest(
$bucketName,
);
$delObjRequest->delete = new Oss\Models\Delete(
[
new Oss\Models\ObjectIdentifier('key1'),
new Oss\Models\ObjectIdentifier('key2', 'version-id-2'),
], true
);
$result = $client->deleteMultipleObjects($delObjRequest);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteMultipleObjects', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
}
public function testObjectAcl()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
// put object
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// put object acl
$result = $client->putObjectAcl(new Oss\Models\PutObjectAclRequest(
$bucketName,
$key,
Oss\Models\ObjectACLType::PRIVATE
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get object acl
$result = $client->getObjectAcl(new Oss\Models\GetObjectAclRequest(
$bucketName,
$key
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertNull($result->versionId);
$this->assertEquals(Oss\Models\ObjectACLType::PRIVATE, $result->accessControlList->grant);
}
public function testObjectAclFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName() . "-not-exist";
try {
$result = $client->putObjectAcl(new Oss\Models\PutObjectAclRequest(
$bucketName,
$key,
Oss\Models\ObjectACLType::PRIVATE
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutObjectAcl', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchKey', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
}
}
try {
$result = $client->getObjectAcl(new Oss\Models\GetObjectAclRequest(
$bucketName,
$key
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetObjectAcl', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchKey', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
}
}
}
public function testObjectTagging()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
// put object
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// put object tagging
$result = $client->putObjectTagging(new Oss\Models\PutObjectTaggingRequest(
$bucketName,
$key,
new Oss\Models\Tagging(
new Oss\Models\TagSet(
[new Oss\Models\Tag('k1', 'v1'), new Oss\Models\Tag('k2', 'v2')]
)
)
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get object tagging
$result = $client->getObjectTagging(new Oss\Models\GetObjectTaggingRequest(
$bucketName,
$key
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
$this->assertNull($result->versionId);
$this->assertEquals(2, count($result->tagSet->tags));
// delete object tagging
$result = $client->deleteObjectTagging(new Oss\Models\DeleteObjectTaggingRequest(
$bucketName,
$key
));
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
}
public function testObjectTaggingFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName() . "-not-exist";
try {
$result = $client->putObjectTagging(new Oss\Models\PutObjectTaggingRequest(
$bucketName,
$key,
new Oss\Models\Tagging(
new Oss\Models\TagSet(
[new Oss\Models\Tag('k1', 'v1'), new Oss\Models\Tag('k2', 'v2')]
)
)
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutObjectTagging', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchKey', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
}
}
try {
$result = $client->getObjectTagging(new Oss\Models\GetObjectTaggingRequest(
$bucketName,
$key
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetObjectTagging', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchKey', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
}
}
try {
$result = $client->deleteObjectTagging(new Oss\Models\DeleteObjectTaggingRequest(
$bucketName,
$key
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeleteObjectTagging', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchKey', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
}
}
}
public function testSymlink()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName() . '-target';
// put object
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// put symlink
$symlinkKey = self::randomObjectName() . '-symlink';
$result = $client->putSymlink(new Oss\Models\PutSymlinkRequest(
$bucketName,
$symlinkKey,
$key
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
// get symlink
$result = $client->getSymlink(new Oss\Models\GetSymlinkRequest(
$bucketName,
$symlinkKey
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(True, count($result->headers) > 0);
$this->assertEquals(24, strlen($result->requestId));
}
public function testSymlinkFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
$key = self::randomObjectName() . "-target";
$symlinkKey = self::randomObjectName() . '-symlink';
try {
$result = $client->putSymlink(new Oss\Models\PutSymlinkRequest(
$bucketName,
$symlinkKey,
$key
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutSymlink', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
}
}
try {
$result = $client->getSymlink(new Oss\Models\GetSymlinkRequest(
$bucketName,
$symlinkKey,
));
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetSymlink', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
}
}
}
}

View File

@@ -0,0 +1,433 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientObjectMultipartTest extends TestIntegration
{
public function testObjectMultipart()
{
$client = $this->getDefaultClient();
// test initiateMultipartUpload, uploadPart, completeMultipartUpload
$partSize = 200 * 1024;
$key = 'bigfile.tmp';
try {
$bigFileName = self::getTempFileName() . "-bigfile.tmp";
if (!file_exists($bigFileName)) {
$this->generateFile($bigFileName, 500 * 1024);
}
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$file = fopen($bigFileName, 'r');
$parts = array();
if ($file) {
$i = 1;
while (!feof($file)) {
$chunk = fread($file, $partSize);
$partResult = $client->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
$i,
$initResult->uploadId,
null,
null,
null,
null,
Oss\Utils::streamFor($chunk)
)
);
$this->assertEquals(200, $partResult->statusCode);
$part = new Oss\Models\UploadPart(
$i,
$partResult->etag,
);
array_push($parts, $part);
$i++;
}
fclose($file);
}
$comResult = $client->completeMultipartUpload(
new Oss\Models\CompleteMultipartUploadRequest(
self::$bucketName,
$key,
$initResult->uploadId,
null,
new Oss\Models\CompleteMultipartUpload(
$parts
),
)
);
$this->assertEquals(200, $comResult->statusCode);
$this->assertEquals(self::$bucketName, $comResult->bucket);
$this->assertEquals($key, $comResult->key);
$this->assertNotEmpty($comResult->etag);
$this->assertNotEmpty($comResult->location);
$getObj = $client->getObject(new Oss\Models\GetObjectRequest(
self::$bucketName,
$key,
));
$this->assertEquals(base64_encode(md5(file_get_contents($bigFileName), true)), base64_encode(md5($getObj->body, true)));
} catch (\Throwable $e) {
$this->assertTrue(false, "should not here");
}
// test initiateMultipartUpload, uploadPartCopy, completeMultipartUpload
try {
$key1 = self::randomObjectName() . "\f\v\t";
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key1,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$partResult = $client->uploadPartCopy(
new Oss\Models\UploadPartCopyRequest(
self::$bucketName,
$key1,
1,
$initResult->uploadId,
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $partResult->statusCode);
$comResult = $client->completeMultipartUpload(
new Oss\Models\CompleteMultipartUploadRequest(
self::$bucketName,
$key1,
$initResult->uploadId,
null,
null,
'yes',
)
);
$this->assertEquals(200, $comResult->statusCode);
$this->assertEquals(self::$bucketName, $comResult->bucket);
$this->assertEquals($key1, $comResult->key);
$this->assertNotEmpty($comResult->etag);
$this->assertNotEmpty($comResult->location);
$client->deleteObject(new Oss\Models\DeleteObjectRequest(
self::$bucketName,
$key1,
));
} catch (\Throwable $e) {
$this->assertTrue(false, "should not here");
}
$client->deleteObject(new Oss\Models\DeleteObjectRequest(
self::$bucketName,
$key,
));
// test listParts and listMultipartUploads
$objectPrefix = self::randomObjectName();
try {
for ($i = 0; $i < 3; $i++) {
$key = $objectPrefix . $i;
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$file = fopen($bigFileName, 'r');
if ($file) {
$n = 1;
while (!feof($file)) {
$chunk = fread($file, $partSize);
$partResult = $client->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
$n,
$initResult->uploadId,
null,
null,
null,
null,
Oss\Utils::streamFor($chunk)
)
);
$this->assertEquals(200, $partResult->statusCode);
$n++;
}
fclose($file);
}
}
$listUploads = $client->listMultipartUploads(
new Oss\Models\ListMultipartUploadsRequest(
self::$bucketName,
)
);
$this->assertEquals(200, $listUploads->statusCode);
$this->assertCount(3, $listUploads->uploads);
$listParts = $client->listParts(
new Oss\Models\ListPartsRequest(
self::$bucketName,
$listUploads->uploads[0]->key,
$listUploads->uploads[0]->uploadId,
)
);
$this->assertEquals(200, $listParts->statusCode);
$this->assertCount(3, $listParts->parts);
} catch (\Throwable $e) {
$this->assertTrue(false, "should not here");
}
// test abortMultipartUpload
try {
foreach ($listUploads->uploads as $k => $upload) {
$abort = $client->abortMultipartUpload(
new Oss\Models\AbortMultipartUploadRequest(
self::$bucketName,
$upload->key,
$upload->uploadId,
)
);
$this->assertEquals(204, $abort->statusCode);
}
$listUploads = $client->listMultipartUploads(
new Oss\Models\ListMultipartUploadsRequest(
self::$bucketName,
)
);
$this->assertEquals(200, $listUploads->statusCode);
$this->assertNull($listUploads->uploads);
} catch (\Throwable $e) {
$this->assertTrue(false, "should not here");
}
}
public function testObjectMultipartFail()
{
$client = $this->getDefaultClient();
$invalidAkClient = $this->getInvalidAkClient();
$partSize = 200 * 1024;
$key = 'bigfile.tmp';
$bigFileName = self:: getTempFileName() . "-bigfile.tmp";
if (!file_exists($bigFileName)) {
$this->generateFile($bigFileName, 500 * 1024);
}
// test initiateMultipartUpload
try {
$invalidAkClient->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error InitiateMultipartUpload', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
// test uploadPart
try {
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$invalidAkClient->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
1,
$initResult->uploadId,
null,
null,
null,
null,
Oss\Utils::streamFor($bigFileName)
)
);
} catch (\Throwable $e) {
$this->assertStringContainsString('Operation error UploadPart', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
// test uploadPartCopy
try {
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$client->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
1,
$initResult->uploadId,
null,
null,
null,
null,
Oss\Utils::streamFor($bigFileName)
)
);
$invalidAkClient->uploadPartCopy(
new Oss\Models\UploadPartCopyRequest(
self::$bucketName,
$key,
1,
$initResult->uploadId,
self::$bucketName,
$key,
)
);
} catch (\Throwable $e) {
$this->assertStringContainsString('Operation error UploadPartCopy', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$file = fopen($bigFileName, 'r');
$parts = array();
if ($file) {
$i = 1;
while (!feof($file)) {
$chunk = fread($file, $partSize);
$partResult = $client->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
$i,
$initResult->uploadId,
null,
null,
null,
null,
Oss\Utils::streamFor($chunk)
)
);
$this->assertEquals(200, $partResult->statusCode);
$part = new Oss\Models\UploadPart(
$i,
$partResult->etag,
);
array_push($parts, $part);
$i++;
}
fclose($file);
}
$invalidAkClient->completeMultipartUpload(
new Oss\Models\CompleteMultipartUploadRequest(
self::$bucketName,
$key,
$initResult->uploadId,
null,
new Oss\Models\CompleteMultipartUpload(
$parts
),
)
);
} catch (\Throwable $e) {
$this->assertStringContainsString('Operation error CompleteMultipartUpload', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$invalidAkClient->listMultipartUploads(
new Oss\Models\ListMultipartUploadsRequest(
self::$bucketName,
)
);
} catch (\Throwable $e) {
$this->assertStringContainsString('Operation error ListMultipartUploads', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
try {
$invalidAkClient->listParts(
new Oss\Models\ListPartsRequest(
self::$bucketName,
$initResult->uploadId,
$initResult->key,
)
);
} catch (\Throwable $e) {
$this->assertStringContainsString('Operation error ListParts', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
}
}
$listUploads = $client->listMultipartUploads(
new Oss\Models\ListMultipartUploadsRequest(
self::$bucketName,
)
);
foreach ($listUploads->uploads as $k => $upload) {
$abort = $client->abortMultipartUpload(
new Oss\Models\AbortMultipartUploadRequest(
self::$bucketName,
$upload->key,
$upload->uploadId,
)
);
$this->assertEquals(204, $abort->statusCode);
}
}
}

View File

@@ -0,0 +1,774 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientPaginatorTest extends TestIntegration
{
public function testListObjectsPaginator()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$paginator = new Oss\Paginator\ListObjectsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListObjectsRequest($bucketName),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->contents ?? [] as $content) {
$this->assertEquals($key, $content->key);
}
}
$result = $client->deleteObject(new Oss\Models\DeleteObjectRequest(
$bucketName, $key
));
$this->assertEquals(204, $result->statusCode);
}
public function testListObjectsPaginatorFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListObjectsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListObjectsRequest($bucketName),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->contents ?? [] as $content) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjects', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListObjectsPaginatorAsync()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$paginator = new Oss\Paginator\ListObjectsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListObjectsRequest($bucketName),
['limit' => 10]
);
$this->assertTrue(is_object($iterPromise));
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->contents ?? [] as $content) {
$this->assertEquals($key, $content->key);
}
}
$result = $client->deleteObject(new Oss\Models\DeleteObjectRequest(
$bucketName, $key
));
$this->assertEquals(204, $result->statusCode);
}
public function testListObjectsPaginatorAsyncFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListObjectsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListObjectsRequest($bucketName),
['limit' => 1]
);
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->contents ?? [] as $content) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjects', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListObjectsV2Paginator()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$paginator = new Oss\Paginator\ListObjectsV2Paginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListObjectsV2Request($bucketName),
['limit' => 1]
);
$this->assertTrue(is_object($iter));
foreach ($iter as $page) {
foreach ($page->contents ?? [] as $content) {
$this->assertEquals($key, $content->key);
}
}
$result = $client->deleteObject(new Oss\Models\DeleteObjectRequest(
$bucketName, $key
));
$this->assertEquals(204, $result->statusCode);
}
public function testListObjectsV2PaginatorFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListObjectsV2Paginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListObjectsV2Request($bucketName),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->contents ?? [] as $content) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjects', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListObjectsV2PaginatorAsync()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$paginator = new Oss\Paginator\ListObjectsV2Paginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListObjectsV2Request($bucketName),
['limit' => 1]
);
$this->assertTrue(is_object($iterPromise));
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->contents ?? [] as $content) {
$this->assertEquals($key, $content->key);
}
}
$result = $client->deleteObject(new Oss\Models\DeleteObjectRequest(
$bucketName, $key
));
$this->assertEquals(204, $result->statusCode);
}
public function testListObjectsV2PaginatorAsyncFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListObjectsV2Paginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListObjectsV2Request($bucketName),
['limit' => 1]
);
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->contents ?? [] as $content) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjects', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListObjectVersionsPaginator()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$paginator = new Oss\Paginator\ListObjectVersionsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListObjectVersionsRequest($bucketName),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->contents ?? [] as $content) {
$this->assertEquals($key, $content->key);
}
}
}
public function testListObjectVersionsPaginatorFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListObjectVersionsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListObjectVersionsRequest($bucketName),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->contents ?? [] as $content) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjectVersions', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListObjectVersionsPaginatorAsync()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = self::randomObjectName();
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$key,
);
$body = 'hi oss';
$putObjRequest->body = Oss\Utils::streamFor($body);
$result = $client->putObject($putObjRequest);
$this->assertEquals(200, $result->statusCode);
$paginator = new Oss\Paginator\ListObjectVersionsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListObjectVersionsRequest($bucketName),
['limit' => 1]
);
$this->assertTrue(is_object($iterPromise));
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->contents ?? [] as $content) {
$this->assertEquals($key, $content->key);
}
}
}
public function testListObjectVersionsPaginatorAsyncFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListObjectVersionsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListObjectVersionsRequest($bucketName),
['limit' => 1]
);
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->contents ?? [] as $content) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListObjectVersions', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListMultipartUploadsPaginator()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = 'bigfile.tmp';
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$paginator = new Oss\Paginator\ListMultipartUploadsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListMultipartUploadsRequest($bucketName),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->uploads ?? [] as $upload) {
$this->assertEquals($key, $upload->key);
$this->assertEquals($initResult->uploadId, $upload->uploadId);
}
}
}
public function testListMultipartUploadsPaginatorFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListMultipartUploadsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListMultipartUploadsRequest($bucketName),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->uploads ?? [] as $upload) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListMultipartUploads', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListMultipartUploadsPaginatorAsync()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = 'bigfile.tmp';
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$paginator = new Oss\Paginator\ListObjectsV2Paginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListObjectsV2Request($bucketName),
['limit' => 1]
);
$this->assertTrue(is_object($iterPromise));
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->uploads ?? [] as $upload) {
$this->assertEquals($key, $upload->key);
$this->assertEquals($initResult->uploadId, $upload->uploadId);
}
}
}
public function testListMultipartUploadsPaginatorAsyncFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListMultipartUploadsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListMultipartUploadsRequest($bucketName),
['limit' => 1]
);
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->uploads ?? [] as $upload) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListMultipartUploads', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListPartsPaginator()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$partSize = 200 * 1024;
$bigFileName = self::getTempFileName() . "-bigfile.tmp";
if (!file_exists($bigFileName)) {
$this->generateFile($bigFileName, 500 * 1024);
}
$key = 'bigfile.tmp';
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$file = fopen($bigFileName, 'r');
$parts = array();
if ($file) {
$i = 1;
while (!feof($file)) {
$chunk = fread($file, $partSize);
$partResult = $client->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
$i,
$initResult->uploadId,
null,
null,
null,
null,
Oss\Utils::streamFor($chunk)
)
);
$this->assertEquals(200, $partResult->statusCode);
$part = new Oss\Models\UploadPart(
$i,
$partResult->etag,
);
array_push($parts, $part);
$i++;
}
fclose($file);
}
$paginator = new Oss\Paginator\ListPartsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListPartsRequest($bucketName, $key, $initResult->uploadId),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->parts ?? [] as $part) {
$this->assertNotEmpty($part->partNumber);
$this->assertNotEmpty($part->etag);
$this->assertNotEmpty($part->size);
}
}
}
public function testListPartsPaginatorFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListPartsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListPartsRequest($bucketName, "not-exist", "not-exist"),
['limit' => 1]
);
foreach ($iter as $page) {
foreach ($page->parts ?? [] as $part) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListParts', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListPartsPaginatorAsync()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$partSize = 200 * 1024;
$bigFileName = self::getTempFileName() . "-bigfile.tmp";
if (!file_exists($bigFileName)) {
$this->generateFile($bigFileName, 500 * 1024);
}
$key = 'bigfile.tmp';
$initResult = $client->initiateMultipartUpload(
new Oss\Models\InitiateMultipartUploadRequest(
self::$bucketName,
$key,
)
);
$this->assertEquals(200, $initResult->statusCode);
$this->assertNotEmpty($initResult->uploadId);
$file = fopen($bigFileName, 'r');
$parts = array();
if ($file) {
$i = 1;
while (!feof($file)) {
$chunk = fread($file, $partSize);
$partResult = $client->uploadPart(
new Oss\Models\UploadPartRequest(
self::$bucketName,
$key,
$i,
$initResult->uploadId,
null,
null,
null,
null,
Oss\Utils::streamFor($chunk)
)
);
$this->assertEquals(200, $partResult->statusCode);
$part = new Oss\Models\UploadPart(
$i,
$partResult->etag,
);
array_push($parts, $part);
$i++;
}
fclose($file);
}
$paginator = new Oss\Paginator\ListPartsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListPartsRequest($bucketName, $key, $initResult->uploadId),
['limit' => 1]
);
$resultParts = [];
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->parts ?? [] as $part) {
$resultParts[] = $part;
}
}
$this->assertEquals(count($parts), count($resultParts));
}
public function testListPartsPaginatorAsyncFail()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName . '-not-exist';
try {
$paginator = new Oss\Paginator\ListPartsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListPartsRequest($bucketName, "not-exist", "not-exist"),
['limit' => 1]
);
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->parts ?? [] as $part) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListParts', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('NoSuchBucket', $se->getErrorCode());
$this->assertEquals(404, $se->getStatusCode());
$this->assertEquals('The specified bucket does not exist.', $se->getErrorMessage());
$this->assertEquals('0015-00000101', $se->getEC());
}
}
}
public function testListBucketsPaginator()
{
$client = $this->getDefaultClient();
$paginator = new Oss\Paginator\ListBucketsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListBucketsRequest(self::$BUCKETNAME_PREFIX),
['limit' => 10]
);
foreach ($iter as $page) {
foreach ($page->buckets ?? [] as $bucket) {
$this->assertStringContainsString(self::$BUCKETNAME_PREFIX, $bucket->name);
}
}
}
public function testListBucketsPaginatorFail()
{
$client = $this->getInvalidAkClient();
try {
$paginator = new Oss\Paginator\ListBucketsPaginator($client);
$iter = $paginator->iterPage(
new Oss\Models\ListBucketsRequest(self::$BUCKETNAME_PREFIX),
['limit' => 10]
);
foreach ($iter as $page) {
foreach ($page->buckets ?? [] as $bucket) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListBuckets', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals('The OSS Access Key Id you provided does not exist in our records.', $se->getErrorMessage());
$this->assertEquals('0002-00000902', $se->getEC());
}
}
}
public function testListBucketsPaginatorAsync()
{
$client = $this->getDefaultClient();
$paginator = new Oss\Paginator\ListBucketsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListBucketsRequest(self::$BUCKETNAME_PREFIX),
['limit' => 10]
);
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->buckets ?? [] as $bucket) {
$this->assertStringContainsString(self::$BUCKETNAME_PREFIX, $bucket->name);
}
}
}
public function testListBucketsPaginatorAsyncFail()
{
$client = $this->getInvalidAkClient();
try {
$paginator = new Oss\Paginator\ListBucketsPaginator($client);
$iterPromise = $paginator->iterPageAsync(
new Oss\Models\ListBucketsRequest(self::$BUCKETNAME_PREFIX),
['limit' => 10]
);
foreach ($iterPromise as $pagePromise) {
$page = $pagePromise->wait();
foreach ($page->buckets ?? [] as $bucket) {
$this->assertTrue(false, 'should not here');
}
}
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error ListBuckets', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals('The OSS Access Key Id you provided does not exist in our records.', $se->getErrorMessage());
$this->assertEquals('0002-00000902', $se->getEC());
}
}
}
}

View File

@@ -0,0 +1,507 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2\Client;
use AlibabaCloud\Oss\V2\Models\CompleteMultipartUpload;
use AlibabaCloud\Oss\V2\Transform\Functions;
use AlibabaCloud\Oss\V2\Utils;
use DateInterval;
use GuzzleHttp;
use AlibabaCloud\Oss\V2 as Oss;
class ClientPresignerTest extends TestIntegration
{
public function testGetObject()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$key = 'key-123+-/123%/345';
$content = 'hello world';
$request = new Oss\Models\PutObjectRequest($bucketName, $key);
$request->body = Oss\Utils::streamFor($content);
$result = $client->putObject($request);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$request = new Oss\Models\GetObjectRequest($bucketName, $key);
$result = $client->presign($request);
$uri = GuzzleHttp\Psr7\Utils::uriFor($result->url);
$this->assertEquals('/key-123%2B-/123%25/345', $uri->getPath());
$query = GuzzleHttp\Psr7\Query::parse($uri->getQuery());
$this->assertArrayHasKey('x-oss-credential', $query);
$this->assertArrayHasKey('x-oss-date', $query);
$this->assertArrayHasKey('x-oss-expires', $query);
$this->assertEquals('900', $query['x-oss-expires']);
$this->assertArrayHasKey('x-oss-signature', $query);
$this->assertArrayHasKey('x-oss-signature-version', $query);
$this->assertEquals('OSS4-HMAC-SHA256', $query['x-oss-signature-version']);
$httpClient = new GuzzleHttp\Client();
$response = $httpClient->get($result->url);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals($content, $response->getBody()->getContents());
}
public function testPresign()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$objectName = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-put-object';
$body = 'hi oss';
$httpClient = new GuzzleHttp\Client();
// PutObjRequest
try {
$request = new Oss\Models\PutObjectRequest($bucketName, $objectName);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url, ['body' => $body]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
print_r($e->getMessage());
$this->assertTrue(false, 'should not here');
}
// GetObjRequest
try {
$request = new Oss\Models\GetObjectRequest($bucketName, $objectName);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals($body, $response->getBody()->getContents());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
// HeadObjRequest
try {
$request = new Oss\Models\HeadObjectRequest($bucketName, $objectName);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals(strlen($body), $response->getHeaderLine('content-length'));
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
// UploadPart
$objectNameMultipart = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-multi-part';
try {
$request = new Oss\Models\InitiateMultipartUploadRequest($bucketName, $objectNameMultipart);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
$body = $response->getBody()->getContents();
$xml = Utils::parseXml($body);
$uploadId = Functions::tryToString($xml->UploadId);
try {
$partRequest = new Oss\Models\UploadPartRequest($bucketName, $objectNameMultipart);
$partRequest->partNumber = 1;
$partRequest->uploadId = $uploadId;
$result = $client->presign($partRequest);
$response = $httpClient->request($result->method, $result->url, ['body' => $body, ['headers' => $result->signedHeaders]]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
print_r($e->getMessage());
$this->assertTrue(false, 'should not here');
}
try {
$request = new Oss\Models\CompleteMultipartUploadRequest($bucketName, $objectNameMultipart);
$request->completeMultipartUpload = new CompleteMultipartUpload(
[new Oss\Models\UploadPart(
$partRequest->partNumber, $response->getHeaderLine('ETag')
)]
);
$request->uploadId = $uploadId;
$result = $client->presign($request);
$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><CompleteMultipartUpload></CompleteMultipartUpload>');
if (isset($request->completeMultipartUpload->parts)) {
foreach ($request->completeMultipartUpload->parts as $part) {
$xmlPart = $xml->addChild('Part');
$xmlPart->addChild('PartNumber', strval($part->partNumber));
$xmlPart->addChild('ETag', $part->etag);
}
}
$response = $httpClient->request($result->method, $result->url, ['body' => $xml->asXML(), 'headers' => $result->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
$headRequest = new Oss\Models\HeadObjectRequest($bucketName, $objectNameMultipart);
$headResult = $client->headObject($headRequest);
$this->assertEquals(200, $headResult->statusCode);
$this->assertEquals(strlen($body), $headResult->contentLength);
$this->assertEquals('Multipart', $headResult->objectType);
} catch (\Throwable $e) {
print_r($e->getMessage());
$this->assertTrue(false, 'should not here');
}
$objectNameMultipartCopy = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-multi-part-copy';
try {
$initRequest = new Oss\Models\InitiateMultipartUploadRequest($bucketName, $objectNameMultipartCopy);
$initResult = $client->presign($initRequest);
$response = $httpClient->request($initResult->method, $initResult->url, ['headers' => $initResult->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
$body = $response->getBody()->getContents();
$xml = Utils::parseXml($body);
$uploadId = Functions::tryToString($xml->UploadId);
$abortRequest = new Oss\Models\AbortMultipartUploadRequest($bucketName, $objectNameMultipartCopy, $uploadId);
$result = $client->presign($abortRequest);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertEquals(204, $response->getStatusCode());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
}
public function testPresignExtra()
{
$bucketName = self::$bucketName;
$objectName = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-put-object';
$body = 'hi oss';
$httpClient = new GuzzleHttp\Client();
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider(new Oss\Credentials\StaticCredentialsProvider(
self::$ACCESS_ID,
self::$ACCESS_KEY
));
$cfg->setRegion(self::$REGION);
$cfg->setEndpoint(self::$ENDPOINT);
$cfg->setSignatureVersion('v1');
$cfg->setAdditionalHeaders(['email', 'name']);
$clientV1 = new Client($cfg);
$cfg->setSignatureVersion('v4');
$clientV4 = new Client($cfg);
$putObjRequest = new Oss\Models\PutObjectRequest(
$bucketName,
$objectName,
);
$putObjRequest->body = Utils::streamFor($body);
$putObjResult = $clientV1->putObject($putObjRequest);
$this->assertEquals(200, $putObjResult->statusCode);
$this->assertEquals('OK', $putObjResult->status);
// GetObjRequest
try {
$request = new Oss\Models\GetObjectRequest($bucketName, $objectName, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, ['headers' => ['email' => 'demo@aliyun.com']]);
$options['expiration'] = (new \DateTime('now', new \DateTimeZone('UTC')))->add(new DateInterval('PT1M'));
$result = $clientV1->presign($request, $options);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals($body, $response->getBody()->getContents());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
try {
$options = null;
$request = new Oss\Models\GetObjectRequest($bucketName, $objectName, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, ['headers' => ['email' => 'demo@aliyun.com']]);
$options['expiration'] = (new \DateTime('now', new \DateTimeZone('UTC')))->modify('-10 second');
$result = $clientV1->presign($request, $options);
$response = $httpClient->request($result->method, $result->url);
$this->assertTrue(false, 'should not here');
} catch (\Throwable $e) {
//$this->assertEquals(403, $e->getMessage());
$this->assertStringContainsString("403 Forbidden", $e->getMessage());
$this->assertStringContainsString("Request has expired.", $e->getMessage());
$this->assertInstanceOf(GuzzleHttp\Exception\ClientException::class, $e);
}
try {
$options = null;
$request = new Oss\Models\GetObjectRequest($bucketName, $objectName);
$options['expiration'] = (new \DateTime('now', new \DateTimeZone('UTC')))->add(new DateInterval('PT192H'));
$result = $clientV4->presign($request, $options);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertTrue(false, 'should not here');
} catch (\Throwable $e) {
$this->assertStringContainsString('Expires should not be greater than 604800 (seven days)', $e->getMessage());
}
$options = null;
$request = new Oss\Models\GetObjectRequest($bucketName, $objectName, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, ['headers' => ['email' => 'demo@aliyun.com']]);
$options['expires'] = new DateInterval('PT1H');
$result = $clientV4->presign($request, $options);
$response = $httpClient->request($result->method, $result->url, ['headers' => ['email' => 'demo@aliyun.com']]);
$this->assertEquals(200, $response->getStatusCode());
}
public function testPresignWithStsToken()
{
$client = $this->getClientUseStsToken();
$bucketName = self::$bucketName;
$objectName = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-put-object';
$body = 'hi oss';
$httpClient = new GuzzleHttp\Client();
// PutObjRequest
try {
$request = new Oss\Models\PutObjectRequest($bucketName, $objectName);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url, ['body' => $body]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
print_r($e->getMessage());
$this->assertTrue(false, 'should not here');
}
// GetObjRequest
try {
$request = new Oss\Models\GetObjectRequest($bucketName, $objectName);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals($body, $response->getBody()->getContents());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
// HeadObjRequest
try {
$request = new Oss\Models\HeadObjectRequest($bucketName, $objectName);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url);
$this->assertEquals(200, $response->getStatusCode());
$this->assertEquals(strlen($body), $response->getHeaderLine('content-length'));
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
// UploadPart
$objectNameMultipart = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-multi-part';
try {
$request = new Oss\Models\InitiateMultipartUploadRequest($bucketName, $objectNameMultipart);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
$body = $response->getBody()->getContents();
$xml = Utils::parseXml($body);
$uploadId = Functions::tryToString($xml->UploadId);
try {
$partRequest = new Oss\Models\UploadPartRequest($bucketName, $objectNameMultipart);
$partRequest->partNumber = 1;
$partRequest->uploadId = $uploadId;
$result = $client->presign($partRequest);
$response = $httpClient->request($result->method, $result->url, ['body' => $body, ['headers' => $result->signedHeaders]]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
try {
$request = new Oss\Models\CompleteMultipartUploadRequest($bucketName, $objectNameMultipart);
$request->completeMultipartUpload = new CompleteMultipartUpload(
[new Oss\Models\UploadPart(
$partRequest->partNumber, $response->getHeaderLine('ETag')
)]
);
$request->uploadId = $uploadId;
$result = $client->presign($request);
$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><CompleteMultipartUpload></CompleteMultipartUpload>');
if (isset($request->completeMultipartUpload->parts)) {
foreach ($request->completeMultipartUpload->parts as $part) {
$xmlPart = $xml->addChild('Part');
$xmlPart->addChild('PartNumber', strval($part->partNumber));
$xmlPart->addChild('ETag', $part->etag);
}
}
$response = $httpClient->request($result->method, $result->url, ['body' => $xml->asXML(), 'headers' => $result->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
$headRequest = new Oss\Models\HeadObjectRequest($bucketName, $objectNameMultipart);
$headResult = $client->headObject($headRequest);
$this->assertEquals(200, $headResult->statusCode);
$this->assertEquals(strlen($body), $headResult->contentLength);
$this->assertEquals('Multipart', $headResult->objectType);
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
$objectNameMultipartCopy = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-multi-part-copy';
try {
$initRequest = new Oss\Models\InitiateMultipartUploadRequest($bucketName, $objectNameMultipartCopy);
$initResult = $client->presign($initRequest);
$response = $httpClient->request($initResult->method, $initResult->url, ['headers' => $initResult->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
$body = $response->getBody()->getContents();
$xml = Utils::parseXml($body);
$uploadId = Functions::tryToString($xml->UploadId);
$abortRequest = new Oss\Models\AbortMultipartUploadRequest($bucketName, $objectNameMultipartCopy, $uploadId);
$result = $client->presign($abortRequest);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertEquals(204, $response->getStatusCode());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
}
public function testPresignError()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
try {
$request = new Oss\Models\ListObjectsRequest($bucketName);
$result = $client->presign($request);
$this->assertTrue(false, 'should not here');
} catch (\Throwable $e) {
$this->assertStringContainsString("Invalid request type: AlibabaCloud\Oss\V2\Models\ListObjectsRequest", $e);
}
try {
$result = $client->presign(null);
$this->assertTrue(false, 'should not here');
} catch (\Throwable $e) {
$this->assertStringContainsString("is not subclass of RequestModel, got NULL", $e);
}
}
public function testPresignWithContentType()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName;
$objectName = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-put-object.zip';
$body = 'hi oss';
$httpClient = new GuzzleHttp\Client();
// PutObjRequest
try {
$request = new Oss\Models\PutObjectRequest($bucketName, $objectName);
$result = $client->presign($request);
$response = $httpClient->request($result->method, $result->url, ['body' => $body]);
$this->assertCount(0, $result->signedHeaders);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
print_r($e->getMessage());
$this->assertTrue(false, 'should not here');
}
// UploadPart
$objectNameMultipart = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-multi-part.zip';
try {
$request = new Oss\Models\InitiateMultipartUploadRequest($bucketName, $objectNameMultipart);
$result = $client->presign($request);
$this->assertCount(1, $result->signedHeaders);
$this->assertArrayHasKey('content-md5', $result->signedHeaders);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
$body = $response->getBody()->getContents();
$xml = Utils::parseXml($body);
$uploadId = Functions::tryToString($xml->UploadId);
try {
$partRequest = new Oss\Models\UploadPartRequest($bucketName, $objectNameMultipart);
$partRequest->partNumber = 1;
$partRequest->uploadId = $uploadId;
$result = $client->presign($partRequest);
$response = $httpClient->request($result->method, $result->url, ['body' => $body, ['headers' => $result->signedHeaders]]);
$this->assertEquals(200, $response->getStatusCode());
} catch (\Throwable $e) {
print_r($e->getMessage());
$this->assertTrue(false, 'should not here');
}
try {
$request = new Oss\Models\CompleteMultipartUploadRequest($bucketName, $objectNameMultipart);
$request->completeMultipartUpload = new CompleteMultipartUpload(
[new Oss\Models\UploadPart(
$partRequest->partNumber, $response->getHeaderLine('ETag')
)]
);
$request->uploadId = $uploadId;
$result = $client->presign($request);
$xml = new \SimpleXMLElement('<?xml version="1.0" encoding="UTF-8"?><CompleteMultipartUpload></CompleteMultipartUpload>');
if (isset($request->completeMultipartUpload->parts)) {
foreach ($request->completeMultipartUpload->parts as $part) {
$xmlPart = $xml->addChild('Part');
$xmlPart->addChild('PartNumber', strval($part->partNumber));
$xmlPart->addChild('ETag', $part->etag);
}
}
$response = $httpClient->request($result->method, $result->url, ['body' => $xml->asXML(), 'headers' => $result->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
$headRequest = new Oss\Models\HeadObjectRequest($bucketName, $objectNameMultipart);
$headResult = $client->headObject($headRequest);
$this->assertEquals(200, $headResult->statusCode);
$this->assertEquals(strlen($body), $headResult->contentLength);
$this->assertEquals('Multipart', $headResult->objectType);
} catch (\Throwable $e) {
print_r($e->getMessage());
$this->assertTrue(false, 'should not here');
}
$objectNameMultipartCopy = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-multi-part-copy';
try {
$initRequest = new Oss\Models\InitiateMultipartUploadRequest($bucketName, $objectNameMultipartCopy);
$initResult = $client->presign($initRequest);
$response = $httpClient->request($initResult->method, $initResult->url, ['headers' => $initResult->signedHeaders]);
$this->assertEquals(200, $response->getStatusCode());
$body = $response->getBody()->getContents();
$xml = Utils::parseXml($body);
$uploadId = Functions::tryToString($xml->UploadId);
$abortRequest = new Oss\Models\AbortMultipartUploadRequest($bucketName, $objectNameMultipartCopy, $uploadId);
$result = $client->presign($abortRequest);
$response = $httpClient->request($result->method, $result->url, ['headers' => $result->signedHeaders]);
$this->assertEquals(204, $response->getStatusCode());
} catch (\Throwable $e) {
$this->assertTrue(false, 'should not here');
}
}
public function testPresignWithAnonymous()
{
$client = $this->getDefaultClient();
$bucketName = self::$bucketName.'-pub';
$objectName = self::$OBJECTNAME_PREFIX . self::randomLowStr() . '-put-object';
$client->putBucket(new Oss\Models\PutBucketRequest($bucketName));
$client->putBucketPublicAccessBlock(new Oss\Models\PutBucketPublicAccessBlockRequest(
$bucketName,
new Oss\Models\PublicAccessBlockConfiguration(
false
)
));
$content = 'hi oss';
$putObjectRequest = new Oss\Models\PutObjectRequest(
$bucketName, $objectName
);
$putObjectRequest->acl = 'public-read';
$putObjectRequest->body = Utils::streamFor($content);
$client->putObject($putObjectRequest);
$request = new Oss\Models\GetObjectRequest($bucketName, $objectName);
$options['credentials_provider'] = new Oss\Credentials\AnonymousCredentialsProvider();
$result = $client->presign($request, $options);
$this->assertNotEmpty($result->url);
$this->assertNotEmpty($result->method);
$this->assertStringNotContainsString('?', $result->url);
$httpClient = new GuzzleHttp\Client();
$response = $httpClient->get($result->url);
$this->assertEquals($response->getStatusCode(), 200);
$this->assertEquals($response->getBody()->getContents(), $content);
}
}

View File

@@ -0,0 +1,88 @@
<?php
namespace IntegrationTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestIntegration.php';
use AlibabaCloud\Oss\V2 as Oss;
class ClientPublicAccessBlockTest extends TestIntegration
{
public function testPublicAccessBlock()
{
$client = $this->getDefaultClient();
// PutPublicAccessBlock
$putResult = $client->putPublicAccessBlock(new Oss\Models\PutPublicAccessBlockRequest(
new Oss\Models\PublicAccessBlockConfiguration(true)
));
$this->assertEquals(200, $putResult->statusCode);
$this->assertEquals('OK', $putResult->status);
$this->assertEquals(True, count($putResult->headers) > 0);
$this->assertEquals(24, strlen($putResult->requestId));
// GetPublicAccessBlock
$getResult = $client->getPublicAccessBlock(new Oss\Models\GetPublicAccessBlockRequest());
$this->assertEquals(200, $getResult->statusCode);
$this->assertEquals('OK', $getResult->status);
$this->assertEquals(True, count($getResult->headers) > 0);
$this->assertEquals(24, strlen($getResult->requestId));
// DeletePublicAccessBlock
$delResult = $client->deletePublicAccessBlock(new Oss\Models\DeletePublicAccessBlockRequest());
$this->assertEquals(204, $delResult->statusCode);
$this->assertEquals('No Content', $delResult->status);
$this->assertEquals(True, count($delResult->headers) > 0);
$this->assertEquals(24, strlen($delResult->requestId));
}
public function testPublicAccessBlockFail()
{
$client = $this->getInvalidAkClient();
// PutPublicAccessBlock
try {
$putResult = $client->putPublicAccessBlock(new Oss\Models\PutPublicAccessBlockRequest(
new Oss\Models\PublicAccessBlockConfiguration(true)
));
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error PutPublicAccessBlock', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// GetPublicAccessBlock
try {
$getResult = $client->getPublicAccessBlock(new Oss\Models\GetPublicAccessBlockRequest());
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error GetPublicAccessBlock', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
// DeletePublicAccessBlock
try {
$delResult = $client->deletePublicAccessBlock(new Oss\Models\DeletePublicAccessBlockRequest());
$this->assertTrue(false, "should not here");
} catch (Oss\Exception\OperationException $e) {
$this->assertStringContainsString('Operation error DeletePublicAccessBlock', $e);
$se = $e->getPrevious();
$this->assertInstanceOf(Oss\Exception\ServiceException::class, $se);
if ($se instanceof Oss\Exception\ServiceException) {
$this->assertEquals('InvalidAccessKeyId', $se->getErrorCode());
$this->assertEquals(403, $se->getStatusCode());
$this->assertEquals(24, strlen($se->getRequestId()));
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,402 @@
<?php
namespace IntegrationTests;
use AlibabaCloud\Oss\V2 as Oss;
class TestIntegration extends \PHPUnit\Framework\TestCase
{
static $ACCESS_ID;
static $ACCESS_KEY;
static $ENDPOINT;
static $REGION;
static $RAM_ROLE_ARN;
static $USER_ID;
static $PAYER_ACCESS_ID;
static $PAYER_ACCESS_KEY;
static $PAYER_UID;
public static $BUCKETNAME_PREFIX = "php-sdk-test-bucket-";
public static $OBJECTNAME_PREFIX = "php-sdk-test-object-";
static ?Oss\Client $defaultClient = null;
static ?Oss\Client $invalidAkClient = null;
static ?Oss\Client $signV1Client = null;
static ?string $tempDir;
static ?string $bucketName = null;
public static function setUpBeforeClass(): void
{
self::$ACCESS_ID = getenv("OSS_TEST_ACCESS_KEY_ID");
self::$ACCESS_KEY = getenv("OSS_TEST_ACCESS_KEY_SECRET");
self::$ENDPOINT = getenv("OSS_TEST_ENDPOINT");
self::$REGION = getenv("OSS_TEST_REGION") ?? 'cn-hangzhou';
self::$RAM_ROLE_ARN = getenv("OSS_TEST_RAM_ROLE_ARN");
self::$USER_ID = getenv("OSS_TEST_USER_ID");
self::$PAYER_ACCESS_ID = getenv("OSS_TEST_PAYER_ACCESS_KEY_ID");
self::$PAYER_ACCESS_KEY = getenv("OSS_TEST_PAYER_ACCESS_KEY_SECRET");
self::$PAYER_UID = getenv("OSS_TEST_PAYER_UID");
$client = self::getDefaultClient();
$bucketName = self::randomBucketName();
self::$bucketName = $bucketName;
self::$tempDir = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'oss-php-sdk-test-' . strval(time());
mkdir(self::$tempDir);
$client->putBucket(new Oss\Models\PutBucketRequest($bucketName));
}
public static function tearDownAfterClass(): void
{
//clean access points
if (version_compare(PHP_VERSION, '8.0.0', '>=')) {
self::deleteAccessPoint(self::getDefaultClient(), self::$bucketName);
}
//clean buckets
self::cleanBucket(self::getDefaultClient(), self::$bucketName);
//clean temp dir
self::deleteDir(self::$tempDir);
}
static function getDefaultClient()
{
if (self::$defaultClient != null) {
return self::$defaultClient;
}
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider(new Oss\Credentials\StaticCredentialsProvider(
self::$ACCESS_ID,
self::$ACCESS_KEY
));
$cfg->setRegion(self::$REGION);
$cfg->setEndpoint(self::$ENDPOINT);
self::$defaultClient = new Oss\Client($cfg);
return self::$defaultClient;
}
static function getClient(string $ak, $sk, $region, $endpoint)
{
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider(new Oss\Credentials\StaticCredentialsProvider(
$ak,
$sk
));
$cfg->setRegion($region);
if (!empty($endpoint)) {
$cfg->setEndpoint($endpoint);
}
return new Oss\Client($cfg);
}
static function getInvalidAkClient()
{
if (self::$invalidAkClient != null) {
return self::$invalidAkClient;
}
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider(new Oss\Credentials\StaticCredentialsProvider(
'invalid-ak',
'invalid'
));
$cfg->setRegion(self::$REGION);
$cfg->setEndpoint(self::$ENDPOINT);
self::$invalidAkClient = new Oss\Client($cfg);
return self::$invalidAkClient;
}
public static function getTempFileName()
{
return tempnam(self::$tempDir, 'test');
}
/**
* @return Oss\Client|null
* @throws \Throwable
*/
public function getClientUseStsToken()
{
try {
$resp = $this->stsAssumeRole(self::$ACCESS_ID, self::$ACCESS_KEY, self::$RAM_ROLE_ARN);
$accessKeyId = $resp['Credentials']['AccessKeyId'];
$accessKeySecret = $resp['Credentials']['AccessKeySecret'];
$token = $resp['Credentials']['SecurityToken'];
$cfg = Oss\Config::loadDefault();
$cfg->setCredentialsProvider(new Oss\Credentials\StaticCredentialsProvider(
$accessKeyId,
$accessKeySecret,
$token
));
$cfg->setRegion(self::$REGION);
$cfg->setEndpoint(self::$ENDPOINT);
return new Oss\Client($cfg);
} catch (\Throwable $e) {
throw $e;
}
}
private function stsAssumeRole($accessKeyId, $accessKeySecret, $roleArn)
{
// Constants
$StsSignVersion = "1.0";
$StsAPIVersion = "2015-04-01";
$StsHost = "https://sts.aliyuncs.com/";
$TimeFormat = "Y-m-d\TH:i:s\Z";
$RespBodyFormat = "JSON";
$PercentEncode = "%2F";
$HTTPGet = "GET";
$uuid = "Nonce-" . rand(1000, 9999);
$currentTime = (new \DateTime('now', new \DateTimeZone('UTC')))->format($TimeFormat);
$queryStr = http_build_query([
"SignatureVersion" => $StsSignVersion,
"Format" => $RespBodyFormat,
"Timestamp" => $currentTime,
"RoleArn" => $roleArn,
"RoleSessionName" => "oss_test_sess",
"AccessKeyId" => $accessKeyId,
"SignatureMethod" => "HMAC-SHA1",
"Version" => $StsAPIVersion,
"Action" => "AssumeRole",
"SignatureNonce" => $uuid,
"DurationSeconds" => 3600
]);
parse_str($queryStr, $queryParams);
ksort($queryParams);
$queryStr = http_build_query($queryParams);
$strToSign = $HTTPGet . "&" . $PercentEncode . "&" . rawurlencode($queryStr);
$signature = base64_encode(hash_hmac('sha1', $strToSign, $accessKeySecret . "&", true));
$assumeURL = $StsHost . "?" . $queryStr . "&Signature=" . urlencode($signature);
$httpClient = new \GuzzleHttp\Client();
try {
$resp = $httpClient->get($assumeURL);
$result = json_decode($resp->getBody()->getContents(), true);
if (json_last_error() !== JSON_ERROR_NONE) {
throw new \Exception("Failed to decode JSON response");
}
return $result;
} catch (\Throwable $e) {
throw $e;
}
}
public static function randomBucketName()
{
return self::$BUCKETNAME_PREFIX . strval(rand(0, 100)) . '-' . strval(time());
}
public static function randomObjectName()
{
return self::$OBJECTNAME_PREFIX . strval(rand(0, 100)) . '-' . strval(time());
}
public static function randomLowStr()
{
self::$BUCKETNAME_PREFIX . strval(rand(0, 100)) . '-' . strval(time());
}
public static function randomStr()
{
self::$BUCKETNAME_PREFIX . strval(rand(0, 100)) . '-' . strval(time());
}
public static function waitFor(float $sec)
{
usleep((int)($sec * 1000000));
}
public static function cleanBucket(Oss\Client $client, string $bucketName): void
{
//delete Objects
$paginator = new Oss\Paginator\ListObjectsPaginator($client);
$iter = $paginator->iterPage(new Oss\Models\ListObjectsRequest($bucketName));
foreach ($iter as $page) {
$objects = [];
foreach ($page->contents ?? [] as $content) {
$objects[] = new Oss\Models\DeleteObject($content->key);
}
if (!empty($objects)) {
$client->deleteMultipleObjects(new Oss\Models\DeleteMultipleObjectsRequest(
$bucketName,
$objects
));
}
}
//delete uploadpart
$paginator = new Oss\Paginator\ListMultipartUploadsPaginator($client);
$iter = $paginator->iterPage(new Oss\Models\ListMultipartUploadsRequest($bucketName));
foreach ($iter as $page) {
foreach ($page->uploads ?? [] as $upload) {
$client->abortMultipartUpload(new Oss\Models\AbortMultipartUploadRequest(
$bucketName,
$upload->key,
$upload->uploadId
));
}
}
$client->deleteBucket(new Oss\Models\DeleteBucketRequest($bucketName));
}
public static function deleteDir(string $dir): void
{
if (!is_dir($dir)) {
return;
}
if ($handle = opendir($dir)) {
while (($entry = readdir($handle)) !== false) {
if ($entry == '.' || $entry == '..') {
continue;
}
$file = $dir . DIRECTORY_SEPARATOR . $entry;
if (is_dir($file)) {
self::deleteDir($file);
} else {
unlink($file);
}
}
closedir($handle);
}
rmdir($dir);
}
public static function getDataPath(): string
{
return dirname(dirname(__FILE__)) . DIRECTORY_SEPARATOR . 'Data';
}
public static function deleteAccessPoint(Oss\Client $client, string $bucketName): void
{
$listRequest = new Oss\Models\ListAccessPointsRequest();
$listRequest->bucket = $bucketName;
while (true) {
$listResult = $client->listAccessPoints($listRequest);
if (isset($listResult->listAccessPoints->accessPoints->accessPoints) && count($listResult->listAccessPoints->accessPoints->accessPoints) > 0) {
foreach ($listResult->listAccessPoints->accessPoints->accessPoints as $accessPoint) {
switch ($accessPoint->status) {
case 'creating':
sleep(3);
while (true) {
$getResult = $client->getAccessPoint(new Oss\Models\GetAccessPointRequest(
$bucketName, $accessPoint->accessPointName
));
if ($getResult->getAccessPoint->status != 'creating') {
break;
} else {
sleep(3);
}
}
$client->deleteAccessPoint(new Oss\Models\DeleteAccessPointRequest(
$bucketName, $accessPoint->accessPointName
));
break;
case 'deleting':
sleep(5);
break;
default:
$client->deleteAccessPoint(new Oss\Models\DeleteAccessPointRequest(
$bucketName, $accessPoint->accessPointName
));
break;
}
while (true) {
try {
$client->getAccessPoint(new Oss\Models\GetAccessPointRequest(
$bucketName, $accessPoint->accessPointName
));
} catch (Oss\Exception\OperationException $e) {
$se = $e->getPrevious();
if ($se instanceof Oss\Exception\ServiceException) {
if ($se->getErrorCode() == 'NoSuchAccessPoint' && $se->getStatusCode() == 404) {
break;
}
}
}
sleep(3);
}
}
if ($listResult->listAccessPoints->isTruncated == false) {
break;
}
if ($listResult->listAccessPoints->nextContinuationToken != "") {
$listRequest->continuationToken = $listResult->listAccessPoints->nextContinuationToken;
}
} else {
break;
}
}
}
/**
* @param $filename
* @param $size
*/
public function generateFile($filename, $size)
{
if (
file_exists($filename) &&
$size == sprintf('%u', filesize($filename))
) {
return;
}
$part_size = 32;
$fp = fopen($filename, "w");
$characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$charactersLength = strlen($characters);
if ($fp) {
while ($size > 0) {
if ($size < $part_size) {
$write_size = $size;
} else {
$write_size = $part_size;
}
$size -= $write_size;
$a = $characters[rand(0, $charactersLength - 1)];
$content = str_repeat($a, $write_size);
$flag = fwrite($fp, $content);
if (!$flag) {
$this->assertTrue(false, "write to $filename failed.");
break;
}
}
} else {
$this->assertTrue(false, "open $filename failed.");
}
fclose($fp);
}
public function object_get_contents($client, $bucket, $key): string
{
$result = $client->getObject(new Oss\Models\GetObjectRequest(
self::$bucketName,
$key,
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
return $result->body->getContents();
}
public function object_get_content_type($client, $bucket, $key): string
{
$result = $client->headObject(new Oss\Models\HeadObjectRequest(
self::$bucketName,
$key,
));
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
return $result->contentType;
}
}

View File

@@ -0,0 +1,80 @@
<?php
namespace UnitTests\Annotation;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'XmlObject.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'ModelObject.php';
use AlibabaCloud\Oss\V2\Annotation\Functions;
class AnnotationTest extends \PHPUnit\Framework\TestCase
{
public function testXmlAnnotation()
{
$obj = new XmlObject();
$ro = new \ReflectionObject($obj);
$attributes = $ro->getAttributes();
$this->assertCount(1, $attributes);
$inst = $attributes[0]->newInstance();
$this->assertNotNull($inst);
$this->assertEquals("XmlRoot", $inst->name);
$prop = $ro->getProperty("strValue");
$this->assertNotNull($prop);
$attributes = $prop->getAttributes();
$this->assertCount(1, $attributes);
$inst = $attributes[0]->newInstance();
$this->assertNotNull($inst);
$this->assertEquals("StrValue", $inst->rename);
$this->assertEquals("string", $inst->type);
$prop = $ro->getProperty("strValueLists");
$this->assertNotNull($prop);
$attributes = $prop->getAttributes();
$this->assertCount(1, $attributes);
$inst = $attributes[0]->newInstance();
$this->assertNotNull($inst);
$this->assertEquals("StrValueList", $inst->rename);
$this->assertEquals("string", $inst->type);
}
public function testRequiredProperty()
{
$obj = new ModelObject();
$ro = new \ReflectionObject($obj);
$prop = $ro->getProperty("strValue");
$this->assertNotNull($prop);
$this->assertTrue(Functions::isRequiredProperty($prop));
$prop = $ro->getProperty("intValue");
$this->assertNotNull($prop);
$this->assertFalse(Functions::isRequiredProperty($prop));
}
public function testFunctions()
{
$obj = new ModelObject();
$ro = new \ReflectionObject($obj);
$prop = $ro->getProperty("strValue");
$this->assertNotNull($prop);
$result = Functions::getXmlElementAnnotation($prop);
$this->assertNull($result);
$result = Functions::getTagAnnotation($prop);
$this->assertNotNull($result);
$this->assertEquals("input", $result->tag);
$this->assertEquals("nop", $result->position);
$this->assertEquals("StrValue", $result->rename);
$this->assertEquals("string", $result->type);
$result = Functions::getPropertyAnnotations($prop);
$this->assertCount(2, $result);
$this->assertEquals("input", $result[1]->tag);
$this->assertEquals("nop", $result[1]->position);
$this->assertEquals("StrValue", $result[1]->rename);
$this->assertEquals("string", $result[1]->type);
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace UnitTests\Annotation;
use AlibabaCloud\Oss\V2\Annotation\TagProperty;
use AlibabaCloud\Oss\V2\Annotation\RequiredProperty;
class ModelObject
{
#[RequiredProperty()]
#[TagProperty(tag: 'input', position: 'nop', rename:'StrValue', type: 'string')]
public ?string $strValue;
#[TagProperty(tag: 'input', position: 'nop', rename:'IntValue', type: 'int')]
public ?int $intValue;
#[TagProperty(tag: 'input', position: 'nop', rename:'BoolValue', type: 'bool')]
public ?bool $boolValue;
#[TagProperty(tag: 'input', position: 'nop', rename:'FloatValue', type: 'float')]
public ?float $floatValue;
#[TagProperty(tag: 'input', position: 'nop', rename:'StrValueList', type: 'string')]
public ?array $strValueLists;
public function __construct(
?string $strValue = null,
?int $intValue = null,
?bool $boolValue = null,
?float $floatValue = null,
?array $strValueLists = null
) {
$this->strValue = $strValue;
$this->intValue = $intValue;
$this->boolValue = $boolValue;
$this->floatValue = $floatValue;
$this->strValueLists = $strValueLists;
}
}

View File

@@ -0,0 +1,39 @@
<?php
namespace UnitTests\Annotation;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
#[XmlRoot(name:'XmlRoot')]
class XmlObject
{
#[XmlElement(rename:'StrValue', type: 'string')]
public ?string $strValue;
#[XmlElement(rename:'IntValue', type: 'int')]
public ?int $intValue;
#[XmlElement(rename:'BoolValue', type: 'bool')]
public ?bool $boolValue;
#[XmlElement(rename:'FloatValue', type: 'float')]
public ?float $floatValue;
#[XmlElement(rename:'StrValueList', type: 'string')]
public ?array $strValueLists;
public function __construct(
?string $strValue = null,
?int $intValue = null,
?bool $boolValue = null,
?float $floatValue = null,
?array $strValueLists = null
) {
$this->strValue = $strValue;
$this->intValue = $intValue;
$this->boolValue = $boolValue;
$this->floatValue = $floatValue;
$this->strValueLists = $strValueLists;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,84 @@
<?php
namespace UnitTests\Credentials;
use AlibabaCloud\Oss\V2\Credentials\Credentials;
use AlibabaCloud\Oss\V2\Credentials\AnonymousCredentialsProvider;
use AlibabaCloud\Oss\V2\Credentials\CredentialsProviderFunc;
class CredentialsTest extends \PHPUnit\Framework\TestCase
{
public function testCredentials()
{
$credentials = new Credentials("", "");
$this->assertEquals("", $credentials->getAccessKeyId());
$this->assertEquals("", $credentials->getAccessKeySecret());
$this->assertNull($credentials->getSecurityToken());
$this->assertNull($credentials->getExpiration());
$this->assertFalse($credentials->hasKeys());
$this->assertFalse($credentials->isExpired());
$credentials = new Credentials("ak", "sk");
$this->assertEquals("ak", $credentials->getAccessKeyId());
$this->assertEquals("sk", $credentials->getAccessKeySecret());
$this->assertNull($credentials->getSecurityToken());
$this->assertNull($credentials->getExpiration());
$this->assertTrue($credentials->hasKeys());
$this->assertFalse($credentials->isExpired());
$credentials = new Credentials("ak", "sk", "token");
$this->assertEquals("ak", $credentials->getAccessKeyId());
$this->assertEquals("sk", $credentials->getAccessKeySecret());
$this->assertEquals("token", $credentials->getSecurityToken());
$this->assertNull($credentials->getExpiration());
$this->assertTrue($credentials->hasKeys());
$this->assertFalse($credentials->isExpired());
$expiration = new \DateTime('now', new \DateTimeZone('UTC'));
$expiration->modify("+ 100 seconds");
$credentials = new Credentials("ak", "sk", "token", $expiration);
$this->assertEquals("ak", $credentials->getAccessKeyId());
$this->assertEquals("sk", $credentials->getAccessKeySecret());
$this->assertEquals("token", $credentials->getSecurityToken());
$this->assertNotNull($credentials->getExpiration());
$this->assertTrue($credentials->hasKeys());
$this->assertFalse($credentials->isExpired());
$expiration = new \DateTime('now', new \DateTimeZone('UTC'));
$expiration->modify("- 100 seconds");
$credentials = new Credentials("ak", "sk", "token", $expiration);
$this->assertEquals("ak", $credentials->getAccessKeyId());
$this->assertEquals("sk", $credentials->getAccessKeySecret());
$this->assertEquals("token", $credentials->getSecurityToken());
$this->assertNotNull($credentials->getExpiration());
$this->assertTrue($credentials->hasKeys());
$this->assertTrue($credentials->isExpired());
}
public function testAnonymousCredentialsProvider()
{
$provider = new AnonymousCredentialsProvider();
$credentials = $provider->getCredentials();
$this->assertEquals("", $credentials->getAccessKeyId());
$this->assertEquals("", $credentials->getAccessKeySecret());
$this->assertNull($credentials->getSecurityToken());
$this->assertNull($credentials->getExpiration());
$this->assertFalse($credentials->isExpired());
}
public function testCredentialsProviderFunc()
{
$provider = new CredentialsProviderFunc( function () {
return new Credentials("ak", "sk");
});
$credentials = $provider->getCredentials();
$this->assertEquals("ak", $credentials->getAccessKeyId());
$this->assertEquals("sk", $credentials->getAccessKeySecret());
$this->assertNull($credentials->getSecurityToken());
$this->assertNull($credentials->getExpiration());
$this->assertTrue($credentials->hasKeys());
$this->assertFalse($credentials->isExpired());
}
}

View File

@@ -0,0 +1,218 @@
<?php
namespace UnitTests\Crypto;
use AlibabaCloud\Oss\V2\Crypto\AesCtrCipherBuilder;
use AlibabaCloud\Oss\V2\Crypto\MasterRsaCipher;
use AlibabaCloud\Oss\V2\Crypto\Envelope;
use AlibabaCloud\Oss\V2\Crypto\CipherData;
use AlibabaCloud\Oss\V2\Crypto\AesCtr;
class AesCtrCipherTest extends \PHPUnit\Framework\TestCase
{
const RSA_PUBLIC_KEY = <<<BBB
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCokfiAVXXf5ImFzKDw+XO/UByW
6mse2QsIgz3ZwBtMNu59fR5zttSx+8fB7vR4CN3bTztrP9A6bjoN0FFnhlQ3vNJC
5MFO1PByrE/MNd5AAfSVba93I6sx8NSk5MzUCA4NJzAUqYOEWGtGBcom6kEF6MmR
1EKib1Id8hpooY5xaQIDAQAB
-----END PUBLIC KEY-----
BBB;
const RSA_PRIVATE_KEY = <<<BBB
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKiR+IBVdd/kiYXM
oPD5c79QHJbqax7ZCwiDPdnAG0w27n19HnO21LH7x8Hu9HgI3dtPO2s/0DpuOg3Q
UWeGVDe80kLkwU7U8HKsT8w13kAB9JVtr3cjqzHw1KTkzNQIDg0nMBSpg4RYa0YF
yibqQQXoyZHUQqJvUh3yGmihjnFpAgMBAAECgYA49RmCQ14QyKevDfVTdvYlLmx6
kbqgMbYIqk+7w611kxoCTMR9VMmJWgmk/Zic9mIAOEVbd7RkCdqT0E+xKzJJFpI2
ZHjrlwb21uqlcUqH1Gn+wI+jgmrafrnKih0kGucavr/GFi81rXixDrGON9KBE0FJ
cPVdc0XiQAvCBnIIAQJBANXu3htPH0VsSznfqcDE+w8zpoAJdo6S/p30tcjsDQnx
l/jYV4FXpErSrtAbmI013VYkdJcghNSLNUXppfk2e8UCQQDJt5c07BS9i2SDEXiz
byzqCfXVzkdnDj9ry9mba1dcr9B9NCslVelXDGZKvQUBqNYCVxg398aRfWlYDTjU
IoVVAkAbTyjPN6R4SkC4HJMg5oReBmvkwFCAFsemBk0GXwuzD0IlJAjXnAZ+/rIO
ItewfwXIL1Mqz53lO/gK+q6TR585AkB304KUIoWzjyF3JqLP3IQOxzns92u9EV6l
V2P+CkbMPXiZV6sls6I4XppJXX2i3bu7iidN3/dqJ9izQK94fMU9AkBZvgsIPCot
y1/POIbv9LtnviDKrmpkXgVQSU4BmTPvXwTJm8APC7P/horSh3SVf1zgmnsyjm9D
hO92gGc+4ajL
-----END PRIVATE KEY-----
BBB;
public static function getDataPath(): string
{
return dirname(dirname(dirname(__FILE__))) . DIRECTORY_SEPARATOR .'Data';
}
public function testCreateCipherData()
{
$cipher = new MasterRsaCipher(
self::RSA_PUBLIC_KEY,
self::RSA_PRIVATE_KEY,
['key' => 'value']
);
$cipherBuider = new AesCtrCipherBuilder($cipher);
$cihperData = $cipherBuider->createCipherData();
$this->assertNotNull($cihperData);
$this->assertEquals(16, strlen($cihperData->iv));
$this->assertEquals(32, strlen($cihperData->key));
$this->assertEquals(128, strlen($cihperData->encryptedIv));
$this->assertEquals(128, strlen($cihperData->encryptedKey));
$this->assertEquals('{"key":"value"}', $cihperData->matDesc);
$this->assertEquals('RSA/NONE/PKCS1Padding', $cihperData->wrapAlgorithm);
$this->assertEquals('AES/CTR/NoPadding', $cihperData->cekAlgorithm);
}
public function testFromEnvelope()
{
$cipher = new MasterRsaCipher(
self::RSA_PUBLIC_KEY,
self::RSA_PRIVATE_KEY,
['key' => 'value']
);
$cipherBuider = new AesCtrCipherBuilder($cipher);
$envelope = new Envelope(
'De/S3T8wFjx7QPxAAFl7h7TeI2EsZlfCwox4WhLGng5DK2vNXxULmulMUUpYkdc9umqmDilgSy5Z3Foafw+v4JJThfw68T/9G2gxZLrQTbAlvFPFfPM9Ehk6cY4+8WpY32uN8w5vrHyoSZGr343NxCUGIp6fQ9sSuOLMoJg7hNw=',
'nyXOp7delQ/MQLjKQMhHLaT0w7u2yQoDLkSnK8MFg/MwYdh4na4/LS8LLbLcM18m8I/ObWUHU775I50sJCpdv+f4e0jLeVRRiDFWe+uo7Puc9j4xHj8YB3QlcIOFQiTxHIB6q+C+RA6lGwqqYVa+n3aV5uWhygyv1MWmESurppg=',
'AES/CTR/NoPadding',
);
$cihperData = $cipherBuider->createCipherData();
$this->assertNotNull($cihperData);
$this->assertEquals(16, strlen($cihperData->iv));
$this->assertEquals(32, strlen($cihperData->key));
$this->assertEquals(128, strlen($cihperData->encryptedIv));
$this->assertEquals(128, strlen($cihperData->encryptedKey));
$this->assertEquals('{"key":"value"}', $cihperData->matDesc);
$this->assertEquals('RSA/NONE/PKCS1Padding', $cihperData->wrapAlgorithm);
$this->assertEquals('AES/CTR/NoPadding', $cihperData->cekAlgorithm);
}
public function testEncrypt()
{
$cipherMaster = new MasterRsaCipher(
self::RSA_PUBLIC_KEY,
self::RSA_PRIVATE_KEY,
['key' => 'value']
);
$cipherBuider = new AesCtrCipherBuilder($cipherMaster);
$base64_encrypted_key = 'nyXOp7delQ/MQLjKQMhHLaT0w7u2yQoDLkSnK8MFg/MwYdh4na4/LS8LLbLcM18m8I/ObWUHU775I50sJCpdv+f4e0jLeVRRiDFWe+uo7Puc9j4xHj8YB3QlcIOFQiTxHIB6q+C+RA6lGwqqYVa+n3aV5uWhygyv1MWmESurppg=';
$base64_encrypted_iv = 'De/S3T8wFjx7QPxAAFl7h7TeI2EsZlfCwox4WhLGng5DK2vNXxULmulMUUpYkdc9umqmDilgSy5Z3Foafw+v4JJThfw68T/9G2gxZLrQTbAlvFPFfPM9Ehk6cY4+8WpY32uN8w5vrHyoSZGr343NxCUGIp6fQ9sSuOLMoJg7hNw=';
$encrypted_key = base64_decode($base64_encrypted_key);
$encrypted_iv = base64_decode($base64_encrypted_iv);
$key = $cipherMaster->decrypt($encrypted_key);
$iv = $cipherMaster->decrypt($encrypted_iv);
$cipherData = new CipherData(
$iv,
$key,
$encrypted_iv,
$encrypted_key,
'',
'RSA/NONE/PKCS1Padding',
'AES/CTR/NoPadding'
);
$content = file_get_contents(self::getDataPath() . DIRECTORY_SEPARATOR . 'example.jpg');
$enc_content = file_get_contents(self::getDataPath() . DIRECTORY_SEPARATOR . 'enc-example.jpg');
$cipher = new AesCtr($cipherData, 0);
foreach([16, 32, 64]as $key => $step) {
$total = 0;
for ($i = 0; $i < strlen($content); $i += $step) {
$data = substr($content, $i, $step);
$edata_pat = substr($enc_content, $i, $step);
$edata = $cipher->encrypt($data);
$this->assertEquals($edata_pat, $edata);
$total += strlen($edata);
}
$this->assertEquals($total, strlen($content));
$cipher->reset();
}
$cipher->reset();
$this->assertEquals($enc_content, $cipher->encrypt($content));
foreach([16, 32, 64] as $setp) {
$total = 0;
$cipher = new AesCtr($cipherData, 0);
for ($i = 0; $i < strlen($content); $i += $setp) {
$edata = substr($enc_content, $i, $setp);
$data_pat = substr($content, $i, $setp);
$dedata = $cipher->decrypt($edata);
$this->assertEquals($data_pat, $dedata);
$total += strlen($dedata);
}
$this->assertEquals($total, strlen($content));
}
$cipher = new AesCtr($cipherData, 0);
$this->assertEquals($content, $cipher->decrypt($enc_content));
}
public function testEncrypt2()
{
$cipherMaster = new MasterRsaCipher(
self::RSA_PUBLIC_KEY,
self::RSA_PRIVATE_KEY,
['key' => 'value']
);
$cipherBuider = new AesCtrCipherBuilder($cipherMaster);
$base64_encrypted_key = 'nyXOp7delQ/MQLjKQMhHLaT0w7u2yQoDLkSnK8MFg/MwYdh4na4/LS8LLbLcM18m8I/ObWUHU775I50sJCpdv+f4e0jLeVRRiDFWe+uo7Puc9j4xHj8YB3QlcIOFQiTxHIB6q+C+RA6lGwqqYVa+n3aV5uWhygyv1MWmESurppg=';
$base64_encrypted_iv = 'De/S3T8wFjx7QPxAAFl7h7TeI2EsZlfCwox4WhLGng5DK2vNXxULmulMUUpYkdc9umqmDilgSy5Z3Foafw+v4JJThfw68T/9G2gxZLrQTbAlvFPFfPM9Ehk6cY4+8WpY32uN8w5vrHyoSZGr343NxCUGIp6fQ9sSuOLMoJg7hNw=';
$encrypted_key = base64_decode($base64_encrypted_key);
$encrypted_iv = base64_decode($base64_encrypted_iv);
$key = $cipherMaster->decrypt($encrypted_key);
$iv = $cipherMaster->decrypt($encrypted_iv);
$cipherData = new CipherData(
$iv,
$key,
$encrypted_iv,
$encrypted_key,
'',
'RSA/NONE/PKCS1Padding',
'AES/CTR/NoPadding'
);
$content = file_get_contents(self::getDataPath() . DIRECTORY_SEPARATOR . 'example.jpg');
$enc_content = file_get_contents(self::getDataPath() . DIRECTORY_SEPARATOR . 'enc-example.jpg');
$cipher = new AesCtr($cipherData, 0);
foreach([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18]as $key => $step) {
$total = 0;
for ($i = 0; $i < strlen($content); $i += $step) {
$data = substr($content, $i, $step);
$edata_pat = substr($enc_content, $i, $step);
$edata = $cipher->encrypt($data);
$this->assertEquals($edata_pat, $edata);
$total += strlen($edata);
}
$this->assertEquals($total, strlen($content));
$cipher->reset();
}
$cipher->reset();
$this->assertEquals($enc_content, $cipher->encrypt($content));
foreach([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] as $setp) {
$total = 0;
$cipher = new AesCtr($cipherData, 0);
for ($i = 0; $i < strlen($content); $i += $setp) {
$edata = substr($enc_content, $i, $setp);
$data_pat = substr($content, $i, $setp);
$dedata = $cipher->decrypt($edata);
$this->assertEquals($data_pat, $dedata);
$total += strlen($dedata);
}
$this->assertEquals($total, strlen($content));
}
$cipher = new AesCtr($cipherData, 0);
$this->assertEquals($content, $cipher->decrypt($enc_content));
}
}

View File

@@ -0,0 +1,113 @@
<?php
namespace UnitTests\Crypto;
use AlibabaCloud\Oss\V2\Crypto\MasterRsaCipher;
class MasterRsaCipherTest extends \PHPUnit\Framework\TestCase
{
const RSA_PUBLIC_KEY = <<<BBB
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCokfiAVXXf5ImFzKDw+XO/UByW
6mse2QsIgz3ZwBtMNu59fR5zttSx+8fB7vR4CN3bTztrP9A6bjoN0FFnhlQ3vNJC
5MFO1PByrE/MNd5AAfSVba93I6sx8NSk5MzUCA4NJzAUqYOEWGtGBcom6kEF6MmR
1EKib1Id8hpooY5xaQIDAQAB
-----END PUBLIC KEY-----
BBB;
const RSA_PRIVATE_KEY = <<<BBB
-----BEGIN PRIVATE KEY-----
MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBAKiR+IBVdd/kiYXM
oPD5c79QHJbqax7ZCwiDPdnAG0w27n19HnO21LH7x8Hu9HgI3dtPO2s/0DpuOg3Q
UWeGVDe80kLkwU7U8HKsT8w13kAB9JVtr3cjqzHw1KTkzNQIDg0nMBSpg4RYa0YF
yibqQQXoyZHUQqJvUh3yGmihjnFpAgMBAAECgYA49RmCQ14QyKevDfVTdvYlLmx6
kbqgMbYIqk+7w611kxoCTMR9VMmJWgmk/Zic9mIAOEVbd7RkCdqT0E+xKzJJFpI2
ZHjrlwb21uqlcUqH1Gn+wI+jgmrafrnKih0kGucavr/GFi81rXixDrGON9KBE0FJ
cPVdc0XiQAvCBnIIAQJBANXu3htPH0VsSznfqcDE+w8zpoAJdo6S/p30tcjsDQnx
l/jYV4FXpErSrtAbmI013VYkdJcghNSLNUXppfk2e8UCQQDJt5c07BS9i2SDEXiz
byzqCfXVzkdnDj9ry9mba1dcr9B9NCslVelXDGZKvQUBqNYCVxg398aRfWlYDTjU
IoVVAkAbTyjPN6R4SkC4HJMg5oReBmvkwFCAFsemBk0GXwuzD0IlJAjXnAZ+/rIO
ItewfwXIL1Mqz53lO/gK+q6TR585AkB304KUIoWzjyF3JqLP3IQOxzns92u9EV6l
V2P+CkbMPXiZV6sls6I4XppJXX2i3bu7iidN3/dqJ9izQK94fMU9AkBZvgsIPCot
y1/POIbv9LtnviDKrmpkXgVQSU4BmTPvXwTJm8APC7P/horSh3SVf1zgmnsyjm9D
hO92gGc+4ajL
-----END PRIVATE KEY-----
BBB;
const RSA_PUBLIC_KEY_PKS1 = <<<BBB
'-----BEGIN RSA PUBLIC KEY-----
MIGJAoGBAKiR+IBVdd/kiYXMoPD5c79QHJbqax7ZCwiDPdnAG0w27n19HnO21LH7
x8Hu9HgI3dtPO2s/0DpuOg3QUWeGVDe80kLkwU7U8HKsT8w13kAB9JVtr3cjqzHw
1KTkzNQIDg0nMBSpg4RYa0YFyibqQQXoyZHUQqJvUh3yGmihjnFpAgMBAAE=
-----END RSA PUBLIC KEY-----
BBB;
const RSA_PRIVATE_KEY_PKS1 = <<<BBB
-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgQCokfiAVXXf5ImFzKDw+XO/UByW6mse2QsIgz3ZwBtMNu59fR5z
ttSx+8fB7vR4CN3bTztrP9A6bjoN0FFnhlQ3vNJC5MFO1PByrE/MNd5AAfSVba93
I6sx8NSk5MzUCA4NJzAUqYOEWGtGBcom6kEF6MmR1EKib1Id8hpooY5xaQIDAQAB
AoGAOPUZgkNeEMinrw31U3b2JS5sepG6oDG2CKpPu8OtdZMaAkzEfVTJiVoJpP2Y
nPZiADhFW3e0ZAnak9BPsSsySRaSNmR465cG9tbqpXFKh9Rp/sCPo4Jq2n65yood
JBrnGr6/xhYvNa14sQ6xjjfSgRNBSXD1XXNF4kALwgZyCAECQQDV7t4bTx9FbEs5
36nAxPsPM6aACXaOkv6d9LXI7A0J8Zf42FeBV6RK0q7QG5iNNd1WJHSXIITUizVF
6aX5NnvFAkEAybeXNOwUvYtkgxF4s28s6gn11c5HZw4/a8vZm2tXXK/QfTQrJVXp
VwxmSr0FAajWAlcYN/fGkX1pWA041CKFVQJAG08ozzekeEpAuByTIOaEXgZr5MBQ
gBbHpgZNBl8Lsw9CJSQI15wGfv6yDiLXsH8FyC9TKs+d5Tv4Cvquk0efOQJAd9OC
lCKFs48hdyaiz9yEDsc57PdrvRFepVdj/gpGzD14mVerJbOiOF6aSV19ot27u4on
Td/3aifYs0CveHzFPQJAWb4LCDwqLctfzziG7/S7Z74gyq5qZF4FUElOAZkz718E
yZvADwuz/4aK0od0lX9c4Jp7Mo5vQ4TvdoBnPuGoyw==
-----END RSA PRIVATE KEY-----
BBB;
public function testNormal()
{
$cipher = new MasterRsaCipher();
$this->assertNotNull($cipher);
$this->assertEquals('', $cipher->getMatDesc());
$this->assertEquals('RSA/NONE/PKCS1Padding', $cipher->getWrapAlgorithm());
$cipher = new MasterRsaCipher(self::RSA_PUBLIC_KEY, self::RSA_PRIVATE_KEY, ['key' => 'value']);
$this->assertNotNull($cipher);
$this->assertEquals('{"key":"value"}', $cipher->getMatDesc());
$this->assertEquals('RSA/NONE/PKCS1Padding', $cipher->getWrapAlgorithm());
$data = 'hello world';
$edata = $cipher->encrypt($data);
$this->assertNotEquals($data, $edata);
$eedata = $cipher->decrypt($edata);
$this->assertEquals($data, $eedata);
}
public function testFail()
{
try {
$cipher = new MasterRsaCipher('RSA_PUBLIC_KEY', self::RSA_PRIVATE_KEY, ['key' => 'value']);
$this->assertTrue(false, 'should not here');
} catch (\Exception $e) {
$this->assertStringContainsString('RSA key format is not supported', $e->getMessage());
}
try {
$cipher = new MasterRsaCipher(self::RSA_PUBLIC_KEY, 'RSA_PRIVATE_KEY', ['key' => 'value']);
$this->assertTrue(false, 'should not here');
} catch (\Exception $e) {
$this->assertStringContainsString('RSA key format is not supported', $e->getMessage());
}
try {
$cipher = new MasterRsaCipher(null, null, null);
$cipher->encrypt('hello world 123');
$this->assertTrue(false, 'should not here');
} catch (\Exception $e) {
$this->assertStringContainsString('RSA public key is none or invalid', $e->getMessage());
}
try {
$cipher = new MasterRsaCipher(null, null, null);
$cipher->decrypt('hello world 123');
$this->assertTrue(false, 'should not here');
} catch (\Exception $e) {
$this->assertStringContainsString('RSA private key is none or invalid', $e->getMessage());
}
}
}

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

View File

@@ -0,0 +1,632 @@
<?php
namespace UnitTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'BaiscTypeXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'BaiscTypeListXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'MixedTypeXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'MixedTypeListXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'BaiscTypeLackAnnotationXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'DatetimeTypeXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'PutApiResult.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'PutApiBResult.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'RootConfiguration.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'SubConfiguration.php';
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Deserializer;
use AlibabaCloud\Oss\V2\Utils;
use AlibabaCloud\Oss\V2\Exception\DeserializationExecption;
use UnitTests\Fixtures\BaiscTypeXml;
use UnitTests\Fixtures\BaiscTypeListXml;
use UnitTests\Fixtures\MixedTypeXml;
use UnitTests\Fixtures\MixedTypeListXml;
use UnitTests\Fixtures\DatetimeTypeXml;
use UnitTests\Fixtures\PutApiResult;
use UnitTests\Fixtures\PutApiBResult;
use UnitTests\Fixtures\RootConfiguration;
use UnitTests\Fixtures\SubConfiguration;
class DeserializerTest extends \PHPUnit\Framework\TestCase
{
public function testDeserializeBaiscTypeXml()
{
$str = '<?xml version="1.0" encoding="UTF-8"?>
<BasicType>
<StrValue>id-124</StrValue>
<IntValue>1234</IntValue>
<BoolValue>true</BoolValue>
<FloatValue>3.14</FloatValue>
</BasicType>';
$xml = new BaiscTypeXml();
Deserializer::deserializeXml($str, $xml);
$this->assertTrue(\is_scalar($xml->strValue));
$this->assertEquals('id-124', $xml->strValue);
$this->assertEquals(1234, $xml->intValue);
$this->assertEquals(true, $xml->boolValue);
$this->assertEquals(3.14, $xml->floatValue);
$str = '<?xml version="1.0" encoding="UTF-8"?>
<BasicType>
</BasicType>';
$xml = new BaiscTypeXml();
Deserializer::deserializeXml($str, $xml);
$this->assertFalse(isset($xml->StrValue));
$this->assertFalse(isset($xml->IntValue));
$this->assertFalse(isset($xml->BoolValue));
$this->assertFalse(isset($xml->FloatValue));
$str = '<?xml version="1.0" encoding="UTF-8"?>
<BasicType>
<IntValue>1234</IntValue>
<BoolValue>true</BoolValue>
</BasicType>';
$xml = new BaiscTypeXml();
Deserializer::deserializeXml($str, $xml);
$this->assertFalse(isset($xml->StrValue));
$this->assertEquals(1234, $xml->intValue);
$this->assertEquals(true, $xml->boolValue);
$this->assertFalse(isset($xml->FloatValue));
}
public function testDeserializeBaiscTypeListXml(): void
{
$str = '<?xml version="1.0" encoding="UTF-8"?>
<BasicTypeList>
<StrValue>str1</StrValue>
<StrValue>str2</StrValue>
<IntValue>1234</IntValue>
<IntValue>2234</IntValue>
<BoolValue>true</BoolValue>
<BoolValue>true</BoolValue>
<BoolValue>false</BoolValue>
<FloatValue>3.14</FloatValue>
</BasicTypeList>';
$xml = new BaiscTypeListXml();
Deserializer::deserializeXml($str, $xml);
$this->assertEquals(2, count($xml->strValues));
$this->assertEquals('str1', $xml->strValues[0]);
$this->assertEquals('str2', $xml->strValues[1]);
$this->assertEquals(2, count($xml->intValues));
$this->assertEquals(1234, $xml->intValues[0]);
$this->assertEquals(2234, $xml->intValues[1]);
$this->assertEquals(3, count($xml->boolValues));
$this->assertEquals(true, $xml->boolValues[0]);
$this->assertEquals(true, $xml->boolValues[1]);
$this->assertEquals(false, $xml->boolValues[2]);
$this->assertTrue(\is_array($xml->floatValues));
$this->assertEquals(1, count($xml->floatValues));
$this->assertEquals('3.14', $xml->floatValues[0]);
$str = '<?xml version="1.0" encoding="UTF-8"?>
<BasicTypeList>
</BasicTypeList>';
$xml = new BaiscTypeListXml();
Deserializer::deserializeXml($str, $xml);
$this->assertFalse(isset($xml->strValues));
$this->assertFalse(isset($xml->intValues));
$this->assertFalse(isset($xml->boolValues));
$this->assertFalse(isset($xml->floatValues));
}
public function testDeserializeDateTimeTypeXml()
{
$date = new \DateTime();
$date->setTimestamp(1702783809);
$date1 = new \DateTimeImmutable();
$date1 = $date1->setTimestamp(1702783819);
$str = '<?xml version="1.0" encoding="UTF-8"?>
<DatetimeType>
<DateTimeValue>2023-12-17T03:30:09Z</DateTimeValue>
<UnixtimeValue>1702783809</UnixtimeValue>
<HttptimeValue>Sun, 17 Dec 2023 03:30:09 GMT</HttptimeValue>
</DatetimeType>';
$xml = new DatetimeTypeXml();
Deserializer::deserializeXml($str, $xml);
$this->assertEquals($date, $xml->isotimeValue);
$this->assertFalse(isset($xml->dateTimeImmutableValue));
$this->assertEquals($date, $xml->unixtimeValue);
$this->assertEquals($date, $xml->httptimeValue);
}
public function testDeserializeMixedTypeXml(): void
{
$str = '<?xml version="1.0" encoding="UTF-8"?>
<MixedType>
<StrValue>str-111</StrValue>
<IntValue>12</IntValue>
<BasicTypeFiled>
<StrValue>str</StrValue>
<IntValue>123</IntValue>
<BoolValue>true</BoolValue>
<FloatValue>1.14</FloatValue>
</BasicTypeFiled>
<BasicTypeListFiled>
<StrValue>str1</StrValue>
<StrValue>str2</StrValue>
<IntValue>1234</IntValue>
<IntValue>2234</IntValue>
<BoolValue>true</BoolValue>
<BoolValue>true</BoolValue>
<BoolValue>false</BoolValue>
<FloatValue>3.14</FloatValue>
</BasicTypeListFiled>
</MixedType>';
$xml = new MixedTypeXml();
Deserializer::deserializeXml($str, $xml);
$this->assertEquals('str-111', $xml->strValue);
$this->assertEquals(12, $xml->intValue);
$this->assertEquals('str', $xml->xmlValue->strValue);
$this->assertEquals(123, $xml->xmlValue->intValue);
$this->assertEquals(true, $xml->xmlValue->boolValue);
$this->assertEquals(1.14, $xml->xmlValue->floatValue);
$this->assertEquals(2, count($xml->xmlListValue->strValues));
$this->assertEquals('str1', $xml->xmlListValue->strValues[0]);
$this->assertEquals('str2', $xml->xmlListValue->strValues[1]);
$this->assertEquals(2, count($xml->xmlListValue->intValues));
$this->assertEquals(1234, $xml->xmlListValue->intValues[0]);
$this->assertEquals(2234, $xml->xmlListValue->intValues[1]);
$this->assertEquals(3, count($xml->xmlListValue->boolValues));
$this->assertEquals(true, $xml->xmlListValue->boolValues[0]);
$this->assertEquals(true, $xml->xmlListValue->boolValues[1]);
$this->assertEquals(false, $xml->xmlListValue->boolValues[2]);
$this->assertEquals(1, count($xml->xmlListValue->floatValues));
$this->assertEquals('3.14', $xml->xmlListValue->floatValues[0]);
}
public function testDeserializeMixedTypeListXml(): void
{
$str = '<?xml version="1.0" encoding="UTF-8"?>
<MixedTypeList>
<StrValue>str-111</StrValue>
<IntValue>12</IntValue>
<BasicTypeFiled>
<StrValue>str</StrValue>
<IntValue>123</IntValue>
<BoolValue>true</BoolValue>
<FloatValue>1.14</FloatValue>
</BasicTypeFiled>
<BasicTypeFiled>
<StrValue>str-1</StrValue>
<IntValue>223</IntValue>
<BoolValue>false</BoolValue>
</BasicTypeFiled>
</MixedTypeList>';
$xml = new MixedTypeListXml();
Deserializer::deserializeXml($str, $xml);
$this->assertEquals('str-111', $xml->strValue);
$this->assertEquals(12, $xml->intValue);
$this->assertTrue(\is_array($xml->xmlValues));
$this->assertEquals(2, count($xml->xmlValues));
$this->assertEquals('str', $xml->xmlValues[0]->strValue);
$this->assertEquals(123, $xml->xmlValues[0]->intValue);
$this->assertEquals(true, $xml->xmlValues[0]->boolValue);
$this->assertEquals(1.14, $xml->xmlValues[0]->floatValue);
$this->assertEquals('str-1', $xml->xmlValues[1]->strValue);
$this->assertEquals(223, $xml->xmlValues[1]->intValue);
$this->assertEquals(false, $xml->xmlValues[1]->boolValue);
$this->assertFalse(isset($xml->xmlValues[1]->floatValue));
$str = '<?xml version="1.0" encoding="UTF-8"?>
<MixedTypeList>
<StrValue>str-111</StrValue>
<IntValue>12</IntValue>
<BasicTypeFiled>
<StrValue>str</StrValue>
<IntValue>123</IntValue>
<BoolValue>true</BoolValue>
<FloatValue>1.14</FloatValue>
</BasicTypeFiled>
</MixedTypeList>';
$xml = new MixedTypeListXml();
Deserializer::deserializeXml($str, $xml);
$this->assertEquals('str-111', $xml->strValue);
$this->assertEquals(12, $xml->intValue);
$this->assertTrue(\is_array($xml->xmlValues));
$this->assertEquals(1, count($xml->xmlValues));
$this->assertEquals('str', $xml->xmlValues[0]->strValue);
$this->assertEquals(123, $xml->xmlValues[0]->intValue);
$this->assertEquals(true, $xml->xmlValues[0]->boolValue);
$this->assertEquals(1.14, $xml->xmlValues[0]->floatValue);
}
public function testDeserializeCheckXmlRoot(): void
{
$str = '<?xml version="1.0" encoding="UTF-8"?>
<Root>
<StrValue>str-111</StrValue>
<IntValue>12</IntValue>
<BasicTypeFiled>
<StrValue>str</StrValue>
<IntValue>123</IntValue>
<BoolValue>true</BoolValue>
<FloatValue>1.14</FloatValue>
</BasicTypeFiled>
<BasicTypeFiled>
<StrValue>str-1</StrValue>
<IntValue>223</IntValue>
<BoolValue>false</BoolValue>
</BasicTypeFiled>
</Root>';
$xml = new MixedTypeListXml();
try {
Deserializer::deserializeXml($str, $xml, 'MixedTypeList');
$this->assertTrue(false, "shoud not here");
} catch (DeserializationExecption $e) {
$this->assertStringContainsString("Deserialization raised an exception: Not found tag <MixedTypeList>", (string)$e);
} catch (\Exception $e) {
$this->assertTrue(false, "shoud not here");
}
}
public function testDeserializeInvalidXml(): void
{
$str = 'invalid xml';
$xml = new MixedTypeListXml();
try {
Deserializer::deserializeXml($str, $xml, 'MixedTypeList');
$this->assertTrue(false, "shoud not here");
} catch (DeserializationExecption $e) {
$this->assertStringContainsString("Deserialization raised an exception: Error parsing XML: part data ", (string)$e);
} catch (\Exception $e) {
$this->assertTrue(false, "shoud not here");
}
}
public function testDeserializeOutputCommon(): void
{
$output = new OperationOutput();
$result = new PutApiResult();
Deserializer::deserializeOutput($result, $output);
$this->assertEquals('', $result->getStatus());
$this->assertEquals(0, $result->getStatusCode());
$this->assertEquals('', $result->getRequestId());
$this->assertEquals(0, count($result->getHeaders()));
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: ['x-oss-request-id' => '123', 'content-type' => 'test']
);
$result = new PutApiResult();
Deserializer::deserializeOutput($result, $output);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(2, count($result->getHeaders()));
$this->assertEquals('test', $result->getHeaders()['content-type']);
$this->assertEquals('123', $result->getHeaders()['x-oss-request-id']);
$output = new OperationOutput(
status: 'OK',
statusCode: 203,
headers: ['content-type' => 'test']
);
$result = new PutApiResult();
Deserializer::deserializeOutput($result, $output);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(203, $result->getStatusCode());
$this->assertEquals('', $result->getRequestId());
$this->assertEquals(1, count($result->getHeaders()));
$this->assertEquals('test', $result->getHeaders()['content-type']);
}
public function testDeserializeOutputHeaderTag(): void
{
// normal header
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'content-type' => 'test',
'x-oss-str' => 'str-1',
'x-oss-int' => '123',
'x-oss-bool' => 'false',
'x-oss-float' => '3.5',
'x-oss-isotime' => '2023-12-17T03:30:09Z',
'x-oss-httptime' => 'Sun, 17 Dec 2023 03:30:09 GMT',
'x-oss-unixtime' => '1702783809',
],
);
$date = new \DateTime();
$date->setTimestamp(1702783809);
$result = new PutApiResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputHeaders'],
];
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(9, count($result->getHeaders()));
$this->assertEquals('str-1', $result->getStrHeader());
$this->assertEquals(123, $result->getIntHeader());
$this->assertEquals(false, $result->getBoolHeader());
$this->assertEquals(3.5, $result->getFloatHeader());
$this->assertEquals($date, $result->getIsotimeHeader());
$this->assertEquals($date, $result->getHttptimeHeader());
$this->assertEquals($date, $result->getUnixtimeHeader());
// header array
// normal header
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'x-oss-str' => 'str-1',
'x-oss-int' => '123',
'x-oss-prefix-str1' => '123-1',
'x-oss-prefix-str2' => '123-2',
'x-oss-prefix-str3' => '123-3',
],
);
$date = new \DateTime();
$date->setTimestamp(1702783809);
$result = new PutApiResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputHeaders'],
];
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(6, count($result->getHeaders()));
$this->assertEquals('str-1', $result->getStrHeader());
$this->assertEquals(123, $result->getIntHeader());
$this->assertEquals(null, $result->getBoolHeader());
$this->assertEquals(null, $result->getFloatHeader());
$this->assertEquals(null, $result->getIsotimeHeader());
$this->assertEquals(null, $result->getHttptimeHeader());
$this->assertEquals(null, $result->getUnixtimeHeader());
$this->assertEquals(3, count($result->getArrayHeader()));
$this->assertEquals('123-1', $result->getArrayHeader()['str1']);
$this->assertEquals('123-2', $result->getArrayHeader()['str2']);
$this->assertEquals('123-3', $result->getArrayHeader()['str3']);
}
public function testDeserializeOutputBodyXml(): void
{
// null body
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'content-type' => 'test',
],
);
$result = new PutApiResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputBody'],
];
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(2, count($result->getHeaders()));
$this->assertEquals(null, $result->getConfiguration());
//empty body
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'content-type' => 'test',
],
body: Utils::streamFor(''),
);
$result = new PutApiResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputBody'],
];
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(2, count($result->getHeaders()));
$this->assertEquals(null, $result->getConfiguration());
//xml
$str = '<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Id>str1</Id>
<Text>str2</Text>
<SubConfiguration>
<StrField>str-sub</StrField>
<IntField>1234</IntField>
</SubConfiguration>
</Configuration>';
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'content-type' => 'test',
],
body: Utils::streamFor($str),
);
$result = new PutApiResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputBody'],
];
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(2, count($result->getHeaders()));
$this->assertInstanceOf(RootConfiguration::class, $result->getConfiguration());
$this->assertEquals('str1', $result->getConfiguration()->getId());
$this->assertEquals('str2', $result->getConfiguration()->getText());
$this->assertEquals('str-sub', $result->getConfiguration()->getSubConfiguration()[0]->getStrField());
$this->assertEquals(1234, $result->getConfiguration()->getSubConfiguration()[0]->getIntField());
//xml tag not match
$str = '<?xml version="1.0" encoding="UTF-8"?>
<RootConfiguration>
<Id>str1</Id>
<Text>str2</Text>
<SubConfiguration>
<StrField>str-sub</StrField>
<IntField>1234</IntField>
</SubConfiguration>
</RootConfiguration>';
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'content-type' => 'test',
],
body: Utils::streamFor($str),
);
$result = new PutApiResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputBody'],
];
try {
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertTrue(false, "shoud not here");
} catch (DeserializationExecption $e) {
$this->assertStringContainsString("Deserialization raised an exception: Not found tag <Configuration>", (string)$e);
} catch (\Exception $e) {
$this->assertTrue(false, "shoud not here");
}
}
public function testDeserializeOutputHeaderBodyTag(): void
{
//xml
$str = '<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Id>str1</Id>
<Text>str2</Text>
<SubConfiguration>
<StrField>str-sub</StrField>
<IntField>1234</IntField>
</SubConfiguration>
</Configuration>';
$date = new \DateTime();
$date->setTimestamp(1702783809);
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'content-type' => 'test',
'x-oss-str' => 'str-1',
'x-oss-int' => '123',
'x-oss-bool' => 'false',
'x-oss-float' => '3.5',
'x-oss-isotime' => '2023-12-17T03:30:09Z',
'x-oss-httptime' => 'Sun, 17 Dec 2023 03:30:09 GMT',
'x-oss-unixtime' => '1702783809',
],
body: Utils::streamFor($str),
);
$result = new PutApiResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputHeaders'],
[Deserializer::class, 'deserializeOutputBody'],
];
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(9, count($result->getHeaders()));
$this->assertEquals('str-1', $result->getStrHeader());
$this->assertEquals(123, $result->getIntHeader());
$this->assertEquals(false, $result->getBoolHeader());
$this->assertEquals(3.5, $result->getFloatHeader());
$this->assertEquals($date, $result->getIsotimeHeader());
$this->assertEquals($date, $result->getHttptimeHeader());
$this->assertEquals($date, $result->getUnixtimeHeader());
$this->assertInstanceOf(RootConfiguration::class, $result->getConfiguration());
$this->assertEquals('str1', $result->getConfiguration()->getId());
$this->assertEquals('str2', $result->getConfiguration()->getText());
$this->assertEquals('str-sub', $result->getConfiguration()->getSubConfiguration()[0]->getStrField());
$this->assertEquals(1234, $result->getConfiguration()->getSubConfiguration()[0]->getIntField());
}
public function testDeserializeOutputBodyXmlElement(): void
{
//xml
$str = '<?xml version="1.0" encoding="UTF-8"?>
<Configuration>
<Id>str1</Id>
<Text>str2</Text>
<SubConfiguration>
<StrField>str-sub</StrField>
<IntField>1234</IntField>
</SubConfiguration>
</Configuration>';
$date = new \DateTime();
$date->setTimestamp(1702783809);
$output = new OperationOutput(
status: 'OK',
statusCode: 200,
headers: [
'x-oss-request-id' => '123',
'content-type' => 'test',
'x-oss-str' => 'str-1',
'x-oss-int' => '123',
'x-oss-bool' => 'false',
'x-oss-float' => '3.5',
],
body: Utils::streamFor($str),
);
$result = new PutApiBResult();
$customDeserializer = [
[Deserializer::class, 'deserializeOutputHeaders'],
[Deserializer::class, 'deserializeOutputInnerBody'],
];
Deserializer::deserializeOutput($result, $output, $customDeserializer);
$this->assertEquals('OK', $result->getStatus());
$this->assertEquals(200, $result->getStatusCode());
$this->assertEquals('123', $result->getRequestId());
$this->assertEquals(6, count($result->getHeaders()));
$this->assertEquals('str-1', $result->getStrHeader());
$this->assertEquals(123, $result->getIntHeader());
$this->assertEquals(false, $result->getBoolHeader());
$this->assertEquals(3.5, $result->getFloatHeader());
$this->assertEquals('str1', $result->getId());
$this->assertEquals('str2', $result->getText());
$this->assertEquals('str-sub', $result->getSubConfiguration()[0]->getStrField());
$this->assertEquals(1234, $result->getSubConfiguration()[0]->getIntField());
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace UnitTests\Exception;
use AlibabaCloud\Oss\V2\Exception\OperationException;
class ExceptionTest extends \PHPUnit\Framework\TestCase
{
public function testOperationException()
{
$e = new OperationException('GetBucketAcl', new \InvalidArgumentException('abc is invalid'));
$this->assertNotNull($e);
$this->assertEquals('Operation error GetBucketAcl: abc is invalid', $e->getMessage());
}
}

View File

@@ -0,0 +1,32 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
class BaiscTypeLackAnnotationXml extends Model
{
#[XmlElement(rename:'StrValue', type: 'string')]
public ?string $strValue;
#[XmlElement(rename:'IntValue', type: 'int')]
public ?int $intValue;
public ?bool $boolValue;
public ?float $floatValue;
public function __construct(
?string $strValue = null,
?int $intValue = null,
?bool $boolValue = null,
?float $floatValue = null
) {
$this->strValue = $strValue;
$this->intValue = $intValue;
$this->boolValue = $boolValue;
$this->floatValue = $floatValue;
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
#[XmlRoot(name:'BasicTypeList')]
class BaiscTypeListXml extends Model
{
#[XmlElement(rename:'StrValue', type: 'string')]
public ?array $strValues;
#[XmlElement(rename:'IntValue', type: 'int')]
public ?array $intValues;
#[XmlElement(rename:'BoolValue', type: 'bool')]
public ?array $boolValues;
#[XmlElement(rename:'FloatValue', type: 'float')]
public ?array $floatValues;
public function __construct(
?array $strValues = null,
?array $intValues = null,
?array $boolValues = null,
?array $floatValues = null
) {
$this->strValues = $strValues;
$this->intValues = $intValues;
$this->boolValues = $boolValues;
$this->floatValues = $floatValues;
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
#[XmlRoot(name:'BasicType')]
class BaiscTypeXml extends Model
{
#[XmlElement(rename:'StrValue', type: 'string')]
public ?string $strValue;
#[XmlElement(rename:'IntValue', type: 'int')]
public ?int $intValue;
#[XmlElement(rename:'BoolValue', type: 'bool')]
public ?bool $boolValue;
#[XmlElement(rename:'FloatValue', type: 'float')]
public ?float $floatValue;
public function __construct(
?string $strValue = null,
?int $intValue = null,
?bool $boolValue = null,
?float $floatValue = null
) {
$this->strValue = $strValue;
$this->intValue = $intValue;
$this->boolValue = $boolValue;
$this->floatValue = $floatValue;
}
}

View File

@@ -0,0 +1,36 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
#[XmlRoot(name:'DatetimeType')]
class DatetimeTypeXml extends Model
{
#[XmlElement(rename:'DateTimeValue', type: 'DateTime')]
public ?\DateTime $isotimeValue;
#[XmlElement(rename:'DateTimeImmutableValue', type: 'DateTimeImmutable')]
public ?\DateTimeImmutable $dateTimeImmutableValue;
#[XmlElement(rename:'UnixtimeValue', type: 'DateTime', format: 'unixtime')]
public ?\DateTime $unixtimeValue;
#[XmlElement(rename:'HttptimeValue', type: 'DateTime', format: 'httptime')]
public ?\DateTime $httptimeValue;
public function __construct(
?\DateTime $isotimeValue = null,
?\DateTimeImmutable $dateTimeImmutableValue = null,
?\DateTime $unixtimeValue = null,
?\DateTime $httptimeValue = null
) {
$this->isotimeValue = $isotimeValue;
$this->dateTimeImmutableValue = $dateTimeImmutableValue;
$this->unixtimeValue = $unixtimeValue;
$this->httptimeValue = $httptimeValue;
}
}

View File

@@ -0,0 +1,30 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
#[XmlRoot(name:'MixedTypeList')]
class MixedTypeListXml extends Model
{
#[XmlElement(rename:'StrValue', type: 'string')]
public ?string $strValue;
#[XmlElement(rename:'IntValue', type: 'int')]
public ?int $intValue;
#[XmlElement(rename:'BasicTypeFiled', type: BaiscTypeXml::class)]
public ?array $xmlValues;
public function __construct(
?string $strValue = null,
?int $intValue = null,
?array $xmlValues = null
) {
$this->strValue = $strValue;
$this->intValue = $intValue;
$this->xmlValues = $xmlValues;
}
}

View File

@@ -0,0 +1,38 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
use UnitTests\Fixtures\BaiscTypeXml;
use UnitTests\Fixtures\BaiscTypeListXml;
#[XmlRoot(name:'MixedType')]
class MixedTypeXml extends Model
{
#[XmlElement(rename:'StrValue', type: 'string')]
public ?string $strValue;
#[XmlElement(rename:'IntValue', type: 'int')]
public ?int $intValue;
#[XmlElement(rename:'BasicTypeFiled', type: BaiscTypeXml::class)]
public ?BaiscTypeXml $xmlValue;
#[XmlElement(rename:'BasicTypeListFiled', type: BaiscTypeListXml::class)]
public ?BaiscTypeListXml $xmlListValue;
public function __construct(
?string $strValue = null,
?int $intValue = null,
?BaiscTypeXml $xmlValue = null,
?BaiscTypeListXml $xmlListValue = null
) {
$this->strValue = $strValue;
$this->intValue = $intValue;
$this->xmlValue = $xmlValue;
$this->xmlListValue = $xmlListValue;
}
}

View File

@@ -0,0 +1,23 @@
<?php
declare(strict_types=1);
namespace UnitTests\Fixtures;
use GuzzleHttp;
/**
* Stream decorator that prevents a stream from rewind.
*/
final class NoRewindStream implements \Psr\Http\Message\StreamInterface
{
use GuzzleHttp\Psr7\StreamDecoratorTrait;
/** @var \Psr\Http\Message\StreamInterface */
private $stream;
public function rewind(): void
{
throw new \RuntimeException('Cannot rewind a NoRewindStream');
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\ModelTrait;
use AlibabaCloud\Oss\V2\Types\RequestModel;
use AlibabaCloud\Oss\V2\Annotation\TagProperty;
use AlibabaCloud\Oss\V2\Annotation\RequiredProperty;
class PutApiARequest extends RequestModel
{
use ModelTrait;
#[RequiredProperty()]
#[TagProperty(tag: 'input', position: 'host', rename: '', type: 'string')]
private ?string $bucket;
#[RequiredProperty()]
#[TagProperty(tag: 'input', position: 'path', rename: '', type: 'string')]
private ?string $key;
#[TagProperty(tag: 'input', position: 'header', rename: 'x-oss-str', type: 'string')]
private ?string $strHeader;
#[TagProperty(tag: 'input', position: 'query', rename: 'param-str', type: 'string')]
private ?string $strParam;
#[TagProperty(tag: 'input', position: 'body', rename: '', type: 'string')]
private ?string $configuration;
public function __construct(
?string $bucket = null,
?string $key = null,
?string $strHeader = null,
?string $strParam = null,
?string $configuration = null
) {
$this->bucket = $bucket;
$this->key = $key;
$this->strHeader = $strHeader;
$this->strParam = $strParam;
$this->configuration = $configuration;
}
}

View File

@@ -0,0 +1,44 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\ModelTrait;
use AlibabaCloud\Oss\V2\Types\RequestModel;
use AlibabaCloud\Oss\V2\Annotation\TagProperty;
use AlibabaCloud\Oss\V2\Annotation\RequiredProperty;
class PutApiBRequest extends RequestModel
{
use ModelTrait;
#[RequiredProperty()]
#[TagProperty(tag: 'input', position: 'host', rename: '', type: 'string')]
private ?string $bucket;
#[RequiredProperty()]
#[TagProperty(tag: 'input', position: 'path', rename: '', type: 'string')]
private ?string $key;
#[TagProperty(tag: 'input', position: 'header', rename: 'x-oss-str', type: 'string')]
private ?string $strHeader;
#[TagProperty(tag: 'input', position: 'query', rename: 'param-str', type: 'string')]
private ?string $strParam;
#[TagProperty(tag: 'input', position: 'header', rename: 'x-oss-prefix-', type: 'string', format: 'usermeta')]
private ?array $arrayHeader;
public function __construct(
?string $bucket = null,
?string $key = null,
?string $strHeader = null,
?string $strParam = null,
?array $arrayHeader = null
) {
$this->bucket = $bucket;
$this->key = $key;
$this->strHeader = $strHeader;
$this->strParam = $strParam;
$this->arrayHeader = $arrayHeader;
}
}

View File

@@ -0,0 +1,52 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\ModelTrait;
use AlibabaCloud\Oss\V2\Types\ResultModel;
use AlibabaCloud\Oss\V2\Annotation\TagHeader;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
class PutApiBResult extends ResultModel
{
use ModelTrait;
#[TagHeader(rename: 'x-oss-str', type: 'string')]
private ?string $strHeader;
#[TagHeader(rename: 'x-oss-int', type: 'int')]
private ?int $intHeader;
#[TagHeader(rename: 'x-oss-bool', type: 'bool')]
private ?bool $boolHeader;
#[TagHeader(rename: 'x-oss-float', type: 'float')]
private ?float $floatHeader;
#[XmlElement(rename: 'Id', type: 'string')]
private ?string $id;
#[XmlElement(rename: 'Text', type: 'string')]
private ?string $text;
#[XmlElement(rename: 'SubConfiguration', type: SubConfiguration::class)]
private ?array $subConfiguration;
public function __construct(
?string $strHeader = null,
?int $intHeader = null,
?bool $boolHeader = null,
?float $floatHeader = null,
?string $id = null,
?string $text = null,
?array $subConfiguration = null
) {
$this->strHeader = $strHeader;
$this->intHeader = $intHeader;
$this->boolHeader = $boolHeader;
$this->floatHeader = $floatHeader;
$this->id = $id;
$this->text = $text;
$this->subConfiguration = $subConfiguration;
}
}

View File

@@ -0,0 +1,107 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\ModelTrait;
use AlibabaCloud\Oss\V2\Types\RequestModel;
use AlibabaCloud\Oss\V2\Annotation\TagProperty;
use AlibabaCloud\Oss\V2\Annotation\RequiredProperty;
use AlibabaCloud\Oss\V2\Annotation\TagHeader;
use AlibabaCloud\Oss\V2\Annotation\TagQuery;
use AlibabaCloud\Oss\V2\Annotation\TagBody;
class PutApiRequest extends RequestModel
{
use ModelTrait;
#[RequiredProperty()]
#[TagProperty(tag: '', position: 'host', rename: '', type: 'string')]
private ?string $bucket;
#[RequiredProperty()]
#[TagProperty(tag: '', position: 'path', rename: '', type: 'string')]
private ?string $key;
#[TagHeader(rename: 'x-oss-str', type: 'string')]
private ?string $strHeader;
#[TagHeader(rename: 'x-oss-int', type: 'int')]
private ?int $intHeader;
#[TagHeader(rename: 'x-oss-bool', type: 'bool')]
private ?bool $boolHeader;
#[TagHeader(rename: 'x-oss-float', type: 'float')]
private ?float $floatHeader;
#[TagHeader(rename: 'x-oss-isotime', type: 'Datetime')]
private ?\Datetime $isotimeHeader;
#[TagHeader(rename: 'x-oss-httptime', type: 'Datetime', format:'httptime')]
private ?\Datetime $httptimeHeader;
#[TagHeader(rename: 'x-oss-unixtime', type: 'Datetime', format:'unixtime')]
private ?\Datetime $unixtimeHeader;
#[TagQuery(rename: 'param-str', type: 'string')]
private ?string $strParam;
#[TagQuery(rename: 'param-int', type: 'int')]
private ?int $intParam;
#[TagQuery(rename: 'param-bool', type: 'bool')]
private ?bool $boolParam;
#[TagQuery(rename: 'param-float', type: 'float')]
private ?float $floatParam;
#[TagQuery(rename: 'param-isotime', type: 'Datetime')]
private ?\Datetime $isotimeParam;
#[TagQuery(rename: 'param-httptime', type: 'Datetime', format:'httptime')]
private ?\Datetime $httptimeParam;
#[TagQuery(rename: 'param-unixtime', type: 'Datetime', format:'unixtime')]
private ?\Datetime $unixtimeParam;
#[TagBody(rename: 'Configuration', type: 'xml')]
private ?RootConfiguration $configuration;
public function __construct(
?string $bucket = null,
?string $key = null,
?string $strHeader = null,
?int $intHeader = null,
?bool $boolHeader = null,
?float $floatHeader = null,
?\Datetime $isotimeHeader = null,
?\Datetime $httptimeHeader = null,
?\Datetime $unixtimeHeader = null,
?string $strParam = null,
?int $intParam = null,
?bool $boolParam = null,
?float $floatParam = null,
?\Datetime $isotimeParam = null,
?\Datetime $httptimeParam = null,
?\Datetime $unixtimeParam = null,
?RootConfiguration $configuration = null
) {
$this->bucket = $bucket;
$this->key = $key;
$this->strHeader = $strHeader;
$this->intHeader = $intHeader;
$this->boolHeader = $boolHeader;
$this->floatHeader = $floatHeader;
$this->isotimeHeader = $isotimeHeader;
$this->httptimeHeader = $httptimeHeader;
$this->unixtimeHeader = $unixtimeHeader;
$this->strParam = $strParam;
$this->intParam = $intParam;
$this->boolParam = $boolParam;
$this->floatParam = $floatParam;
$this->isotimeParam = $isotimeParam;
$this->httptimeParam = $httptimeParam;
$this->unixtimeParam = $unixtimeParam;
$this->configuration = $configuration;
}
}

View File

@@ -0,0 +1,62 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\ModelTrait;
use AlibabaCloud\Oss\V2\Types\ResultModel;
use AlibabaCloud\Oss\V2\Annotation\TagHeader;
use AlibabaCloud\Oss\V2\Annotation\TagBody;
class PutApiResult extends ResultModel
{
use ModelTrait;
#[TagHeader(rename: 'x-oss-str', type: 'string')]
private ?string $strHeader;
#[TagHeader(rename: 'x-oss-int', type: 'int')]
private ?int $intHeader;
#[TagHeader(rename: 'x-oss-bool', type: 'bool')]
private ?bool $boolHeader;
#[TagHeader(rename: 'x-oss-float', type: 'float')]
private ?float $floatHeader;
#[TagHeader(rename: 'x-oss-isotime', type: 'DateTime')]
private ?\Datetime $isotimeHeader;
#[TagHeader(rename: 'x-oss-httptime', type: 'DateTime', format: 'httptime')]
private ?\Datetime $httptimeHeader;
#[TagHeader(rename: 'x-oss-unixtime', type: 'DateTime', format: 'unixtime')]
private ?\Datetime $unixtimeHeader;
#[TagHeader(rename: 'x-oss-prefix-', type: 'string', format: 'usermeta')]
private ?array $arrayHeader;
#[TagBody(rename: 'Configuration', type: RootConfiguration::class, format: 'xml')]
private ?RootConfiguration $configuration;
public function __construct(
?string $strHeader = null,
?int $intHeader = null,
?bool $boolHeader = null,
?float $floatHeader = null,
?\Datetime $isotimeHeader = null,
?\Datetime $httptimeHeader = null,
?\Datetime $unixtimeHeader = null,
?array $arrayHeader = null,
?RootConfiguration $configuration = null
) {
$this->strHeader = $strHeader;
$this->intHeader = $intHeader;
$this->boolHeader = $boolHeader;
$this->floatHeader = $floatHeader;
$this->isotimeHeader = $isotimeHeader;
$this->httptimeHeader = $httptimeHeader;
$this->unixtimeHeader = $unixtimeHeader;
$this->arrayHeader = $arrayHeader;
$this->configuration = $configuration;
}
}

View File

@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace UnitTests\Fixtures;
use GuzzleHttp;
/**
* Stream decorator that prevents a stream from rewind.
*/
final class RewindStatStream implements \Psr\Http\Message\StreamInterface
{
use GuzzleHttp\Psr7\StreamDecoratorTrait;
/** @var \Psr\Http\Message\StreamInterface */
private $stream;
private int $rewindCount = 0;
public function rewind(): void
{
$this->rewindCount++;
$this->stream->rewind();
}
/**
* Get the value of rewindCount
*/
public function getRewindCount()
{
return $this->rewindCount;
}
}

View File

@@ -0,0 +1,34 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Types\ModelTrait;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
#[XmlRoot(name: 'RootConfiguration')]
class RootConfiguration extends Model
{
use ModelTrait;
#[XmlElement(rename: 'Id', type: 'string')]
private ?string $id;
#[XmlElement(rename: 'Text', type: 'string')]
private ?string $text;
#[XmlElement(rename: 'SubConfiguration', type: SubConfiguration::class)]
private ?array $subConfiguration;
public function __construct(
?string $id = null,
?string $text = null,
?array $subConfiguration = null
) {
$this->id = $id;
$this->text = $text;
$this->subConfiguration = $subConfiguration;
}
}

View File

@@ -0,0 +1,29 @@
<?php
namespace UnitTests\Fixtures;
use AlibabaCloud\Oss\V2\Types\Model;
use AlibabaCloud\Oss\V2\Types\ModelTrait;
use AlibabaCloud\Oss\V2\Annotation\XmlElement;
use AlibabaCloud\Oss\V2\Annotation\XmlRoot;
#[XmlRoot(name: 'SubConfiguration')]
class SubConfiguration extends Model
{
use ModelTrait;
#[XmlElement(rename: 'StrField', type: 'string')]
private ?string $strField;
#[XmlElement(rename: 'IntField', type: 'int')]
private ?int $intField;
public function __construct(
?string $strField = null,
?int $intField = null
) {
$this->strField = $strField;
$this->intField = $intField;
}
}

View File

@@ -0,0 +1,58 @@
<?php
namespace UnitTests\Retry;
use AlibabaCloud\Oss\V2\Retry;
class BackoffTest extends \PHPUnit\Framework\TestCase
{
const ATTEMPTED_CELLING = 64;
public function testEqualJitterBackoff()
{
$basedelay = 1.0;
$maxdelay = 20.0;
$r = new Retry\EqualJitterBackoff($basedelay, $maxdelay);
for ($x = 0; $x <= self::ATTEMPTED_CELLING * 2; $x++) {
$delay = $r->backoffDelay($x, new \Exception());
$this->assertLessThan( $maxdelay + 1, $delay);
$this->assertGreaterThan(0, $delay);
}
$delay = $r->backoffDelay($x, null);
$this->assertLessThan( $maxdelay + 1, $delay);
$this->assertGreaterThan(0, $delay);
}
public function testFullJitterBackoff()
{
$basedelay = 1.0;
$maxdelay = 20.0;
$r = new Retry\FullJitterBackoff($basedelay, $maxdelay);
for ($x = 0; $x <= self::ATTEMPTED_CELLING * 2; $x++) {
$delay = $r->backoffDelay($x, new \Exception());
$this->assertLessThan( $maxdelay + 1, $delay);
$this->assertGreaterThan(0, $delay);
}
$delay = $r->backoffDelay($x, null);
$this->assertLessThan( $maxdelay + 1, $delay);
$this->assertGreaterThan(0, $delay);
}
public function testFixedDelayBackoff()
{
$maxdelay = 20.0;
$r = new Retry\FixedDelayBackoff($maxdelay);
for ($x = 0; $x <= self::ATTEMPTED_CELLING * 2; $x++) {
$delay = $r->backoffDelay($x, new \Exception());
$this->assertEquals($maxdelay, $delay);
}
$delay = $r->backoffDelay($x, null);
$this->assertEquals($maxdelay, $delay);
}
}

View File

@@ -0,0 +1,72 @@
<?php
namespace UnitTests\Retry;
use AlibabaCloud\Oss\V2\Retry;
use AlibabaCloud\Oss\V2\Exception;
use GuzzleHttp;
class ErrorRetryableTest extends \PHPUnit\Framework\TestCase
{
const ATTEMPTED_CELLING = 64;
public function testHTTPStatusCodeRetryable()
{
$r = new Retry\HTTPStatusCodeRetryable();
$this->assertEquals(false, $r->isErrorRetryable(new \Exception()));
$this->assertEquals(false, $r->isErrorRetryable(self::genStatusCodeError(403)));
$this->assertEquals(false, $r->isErrorRetryable(self::genStatusCodeError(405)));
$this->assertEquals(true, $r->isErrorRetryable(self::genStatusCodeError(401)));
$this->assertEquals(true, $r->isErrorRetryable(self::genStatusCodeError(408)));
$this->assertEquals(true, $r->isErrorRetryable(self::genStatusCodeError(429)));
$this->assertEquals(true, $r->isErrorRetryable(self::genStatusCodeError(500)));
$this->assertEquals(true, $r->isErrorRetryable(self::genStatusCodeError(501)));
$this->assertEquals(true, $r->isErrorRetryable(self::genStatusCodeError(599)));
}
public function testServiceErrorCodeRetryable()
{
$r = new Retry\ServiceErrorCodeRetryable();
$this->assertEquals(false, $r->isErrorRetryable(new \Exception()));
$this->assertEquals(false, $r->isErrorRetryable(self::genServiceCodeError('123')));
$this->assertEquals(true, $r->isErrorRetryable(self::genServiceCodeError('RequestTimeTooSkewed')));
$this->assertEquals(true, $r->isErrorRetryable(self::genServiceCodeError('BadRequest')));
}
public function testClientErrorCodeRetryable()
{
$r = new Retry\ClientErrorRetryable();
$this->assertEquals(false, $r->isErrorRetryable(new \Exception()));
$this->assertEquals(false, $r->isErrorRetryable(self::genServiceCodeError('123')));
$this->assertEquals(true, $r->isErrorRetryable(new Exception\CredentialsException('')));
$this->assertEquals(true, $r->isErrorRetryable(new Exception\InconsistentExecption('1', '2')));
$request = new GuzzleHttp\Psr7\Request('GET', 'http://foo.com');
$respons = new GuzzleHttp\Psr7\Response();
$this->assertEquals(true, $r->isErrorRetryable(new GuzzleHttp\Exception\BadResponseException('', $request, $respons)));
$this->assertEquals(true, $r->isErrorRetryable(new GuzzleHttp\Exception\ConnectException('', $request)));
$this->assertEquals(true, $r->isErrorRetryable(new GuzzleHttp\Exception\RequestException('', $request)));
}
public static function genStatusCodeError(int $statusCode)
{
return new Exception\ServiceException(
[
'status_code' => $statusCode,
]
);
}
public static function genServiceCodeError(string $code)
{
return new Exception\ServiceException(
[
'code' => $code,
]
);
}
}

View File

@@ -0,0 +1,76 @@
<?php
namespace UnitTests\Retry;
use AlibabaCloud\Oss\V2\Retry;
use AlibabaCloud\Oss\V2\Defaults;
use AlibabaCloud\Oss\V2\Exception;
use GuzzleHttp;
class RetryerTest extends \PHPUnit\Framework\TestCase
{
const ATTEMPTED_CELLING = 64;
public function testNopRetryer()
{
$r = new Retry\NopRetryer();
$this->assertEquals(false, $r->isErrorRetryable(new \Exception('')));
$this->assertEquals(1, $r->getMaxAttempts());
try {
$r->retryDelay(1, new \Exception(''));
$this->assertTrue(false, 'should not here');
} catch (\Exception $e) {
$this->assertEquals('NotImplemented', $e->getMessage());
}
}
public function testStandardRetryer()
{
//default
$r = new Retry\StandardRetryer();
$this->assertEquals(Defaults::MAX_ATTEMPTS, $r->getMaxAttempts());
$this->assertEquals(false, $r->isErrorRetryable(new \Exception()));
$this->assertEquals(false, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(403)));
$this->assertEquals(false, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(405)));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(401)));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(408)));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(429)));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(500)));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(501)));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genStatusCodeError(599)));
$this->assertEquals(false, $r->isErrorRetryable(ErrorRetryableTest::genServiceCodeError('123')));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genServiceCodeError('RequestTimeTooSkewed')));
$this->assertEquals(true, $r->isErrorRetryable(ErrorRetryableTest::genServiceCodeError('BadRequest')));
$this->assertEquals(true, $r->isErrorRetryable(new Exception\ServiceException([
'status_code' => 403,
'code' => 'RequestTimeTooSkewed',
])));
$this->assertEquals(true, $r->isErrorRetryable(new Exception\CredentialsException('')));
$this->assertEquals(true, $r->isErrorRetryable(new Exception\InconsistentExecption('1', '2')));
$request = new GuzzleHttp\Psr7\Request('GET', 'http://foo.com');
$respons = new GuzzleHttp\Psr7\Response();
$this->assertEquals(true, $r->isErrorRetryable(new GuzzleHttp\Exception\BadResponseException('', $request, $respons)));
$this->assertEquals(true, $r->isErrorRetryable(new GuzzleHttp\Exception\ConnectException('', $request)));
$this->assertEquals(true, $r->isErrorRetryable(new GuzzleHttp\Exception\RequestException('', $request)));
for ($x = 0; $x <= self::ATTEMPTED_CELLING * 2; $x++) {
$delay = $r->retryDelay($x, new \Exception());
$this->assertLessThan(Defaults::MAX_BACKOFF_S + 1, $delay);
$this->assertGreaterThan(0, $delay);
}
$delay = $r->retryDelay($x, null);
$this->assertLessThan(Defaults::MAX_BACKOFF_S + 1, $delay);
$this->assertGreaterThan(0, $delay);
}
}

View File

@@ -0,0 +1,722 @@
<?php
namespace UnitTests;
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'BaiscTypeXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'BaiscTypeListXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'MixedTypeXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'MixedTypeListXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'BaiscTypeLackAnnotationXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'DatetimeTypeXml.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'SubConfiguration.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'RootConfiguration.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'PutApiRequest.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'PutApiARequest.php';
require_once __DIR__ . DIRECTORY_SEPARATOR . 'Fixtures' . DIRECTORY_SEPARATOR . 'PutApiBRequest.php';
use AlibabaCloud\Oss\V2\OperationInput;
use AlibabaCloud\Oss\V2\Serializer;
use AlibabaCloud\Oss\V2\Utils;
use UnitTests\Fixtures\BaiscTypeXml;
use UnitTests\Fixtures\BaiscTypeListXml;
use UnitTests\Fixtures\MixedTypeXml;
use UnitTests\Fixtures\MixedTypeListXml;
use UnitTests\Fixtures\BaiscTypeLackAnnotationXml;
use UnitTests\Fixtures\DatetimeTypeXml;
use UnitTests\Fixtures\SubConfiguration;
use UnitTests\Fixtures\RootConfiguration;
use UnitTests\Fixtures\PutApiRequest;
use UnitTests\Fixtures\PutApiARequest;
use UnitTests\Fixtures\PutApiBRequest;
class SerializerTest extends \PHPUnit\Framework\TestCase
{
public function testSerializeBaiscTypeXml()
{
// empty
$obj = new BaiscTypeXml();
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$this->assertStringContainsString('<BasicType/>', $str);
$xml = \simplexml_load_string($str);
$this->assertEquals(0, $xml->count());
$this->assertFalse(isset($xml->StrValue));
$this->assertFalse(isset($xml->IntValue));
$this->assertFalse(isset($xml->BoolValue));
$this->assertFalse(isset($xml->FloatValue));
// all
$obj = new BaiscTypeXml(
strValue: 'str',
intValue: 1234,
boolValue: true,
floatValue: 3.14,
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(4, $xml->count());
$this->assertEquals('str', $xml->StrValue);
$this->assertEquals('1234', $xml->IntValue);
$this->assertEquals('true', $xml->BoolValue);
$this->assertEquals('3.14', $xml->FloatValue);
// part
$obj = new BaiscTypeXml(
strValue: 'str-123',
floatValue: 2.14,
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(2, $xml->count());
$this->assertEquals('str-123', $xml->StrValue);
$this->assertFalse(isset($xml->IntValue));
$this->assertFalse(isset($xml->BoolValue));
$this->assertEquals('2.14', $xml->FloatValue);
// part 2
$obj = new BaiscTypeXml(
strValue: 'str-123',
boolValue: false,
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(2, $xml->count());
$this->assertEquals('str-123', $xml->StrValue);
$this->assertFalse(isset($xml->IntValue));
$this->assertEquals('false', $xml->BoolValue);
$this->assertFalse(isset($xml->FloatValue));
}
public function testSerializeBaiscTypeListXml(): void
{
// empty
$obj = new BaiscTypeListXml();
$str = Serializer::serializeXml($obj);
$this->assertStringContainsString('<BasicTypeList/>', $str);
// all
$obj = new BaiscTypeListXml(
strValues: ['str1', 'str2'],
intValues: [1234, 2234],
boolValues: [true, true, false],
floatValues: [3.14],
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(8, $xml->count());
$this->assertEquals(2, count($xml->StrValue));
$this->assertEquals('str1', $xml->StrValue[0]);
$this->assertEquals('str2', $xml->StrValue[1]);
$this->assertEquals(2, count($xml->IntValue));
$this->assertEquals('1234', $xml->IntValue[0]);
$this->assertEquals('2234', $xml->IntValue[1]);
$this->assertEquals(3, count($xml->BoolValue));
$this->assertEquals('true', $xml->BoolValue[0]);
$this->assertEquals('true', $xml->BoolValue[1]);
$this->assertEquals('false', $xml->BoolValue[2]);
$this->assertEquals(1, count($xml->FloatValue));
$this->assertEquals('3.14', $xml->FloatValue[0]);
}
public function testSerializeMixedTypeXml(): void
{
// empty
$obj = new MixedTypeXml();
$str = Serializer::serializeXml($obj);
$this->assertStringContainsString('<MixedType/>', $str);
// all
$obj = new MixedTypeXml(
strValue: 'str-111',
intValue: 12,
xmlValue: new BaiscTypeXml(
strValue: 'str',
intValue: 123,
boolValue: true,
floatValue: 1.14,
),
xmlListValue: new BaiscTypeListXml(
strValues: ['str1', 'str2'],
intValues: [1234, 2234],
boolValues: [true, true, false],
floatValues: [3.14],
),
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(4, $xml->count());
$this->assertEquals('str-111', $xml->StrValue);
$this->assertEquals('12', $xml->IntValue);
$this->assertEquals(1, ($xml->BasicTypeFiled)->count());
$this->assertEquals('str', $xml->BasicTypeFiled->StrValue);
$this->assertEquals('123', $xml->BasicTypeFiled->IntValue);
$this->assertEquals('true', $xml->BasicTypeFiled->BoolValue);
$this->assertEquals('1.14', $xml->BasicTypeFiled->FloatValue);
$this->assertEquals(1, ($xml->BasicTypeListFiled)->count());
$this->assertEquals(2, ($xml->BasicTypeListFiled->StrValue)->count());
$this->assertEquals('str1', $xml->BasicTypeListFiled->StrValue[0]);
$this->assertEquals('str2', $xml->BasicTypeListFiled->StrValue[1]);
$this->assertEquals(2, ($xml->BasicTypeListFiled->IntValue)->count());
$this->assertEquals('1234', $xml->BasicTypeListFiled->IntValue[0]);
$this->assertEquals('2234', $xml->BasicTypeListFiled->IntValue[1]);
$this->assertEquals(3, ($xml->BasicTypeListFiled->BoolValue)->count());
$this->assertEquals('true', $xml->BasicTypeListFiled->BoolValue[0]);
$this->assertEquals('true', $xml->BasicTypeListFiled->BoolValue[1]);
$this->assertEquals('false', $xml->BasicTypeListFiled->BoolValue[2]);
$this->assertEquals(1, ($xml->BasicTypeListFiled->FloatValue)->count());
$this->assertEquals('3.14', $xml->BasicTypeListFiled->FloatValue[0]);
}
public function testSerializeMixedTypeListXml(): void
{
// empty
$obj = new MixedTypeListXml();
$str = Serializer::serializeXml($obj);
$this->assertStringContainsString('<MixedTypeList/>', $str);
// all
$obj = new MixedTypeListXml(
strValue: 'str-111',
intValue: 12,
xmlValues: [
new BaiscTypeXml(
strValue: 'str',
intValue: 123,
boolValue: true,
floatValue: 1.14,
),
new BaiscTypeXml(
strValue: 'str-1',
intValue: 223,
boolValue: false,
),
],
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(4, $xml->count());
$this->assertEquals('str-111', $xml->StrValue);
$this->assertEquals('12', $xml->IntValue);
$this->assertEquals(2, ($xml->BasicTypeFiled)->count());
$this->assertEquals('str', $xml->BasicTypeFiled[0]->StrValue);
$this->assertEquals('123', $xml->BasicTypeFiled[0]->IntValue);
$this->assertEquals('true', $xml->BasicTypeFiled[0]->BoolValue);
$this->assertEquals('1.14', $xml->BasicTypeFiled[0]->FloatValue);
$this->assertEquals('str-1', $xml->BasicTypeFiled[1]->StrValue);
$this->assertEquals('223', $xml->BasicTypeFiled[1]->IntValue);
$this->assertEquals('false', $xml->BasicTypeFiled[1]->BoolValue);
$this->assertFalse(isset($xml->BasicTypeFiled[1]->FloatValue));
}
public function testSerializeWithSpecialRootName()
{
$obj = new BaiscTypeXml();
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$this->assertStringContainsString('<BasicType/>', $str);
// empty
$obj = new BaiscTypeXml();
$str = Serializer::serializeXml($obj, 'MyRoot');
$this->assertNotEmpty($str);
$this->assertStringContainsString('<MyRoot/>', $str);
}
public function testSerializeLackXmlAnnotation()
{
//xml root
$obj = new BaiscTypeLackAnnotationXml();
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$this->assertStringContainsString('<BaiscTypeLackAnnotationXml/>', $str);
$obj = new BaiscTypeLackAnnotationXml();
$str = Serializer::serializeXml($obj, 'MyRoot');
$this->assertNotEmpty($str);
$this->assertStringContainsString('<MyRoot/>', $str);
//xml element
$obj = new BaiscTypeLackAnnotationXml(
strValue: 'str-123',
intValue: 1234,
boolValue: true,
floatValue: 3.14,
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(2, $xml->count());
$this->assertEquals('str-123', $xml->StrValue);
$this->assertEquals('1234', $xml->IntValue);
$this->assertFalse(isset($xml->BoolValue));
$this->assertFalse(isset($xml->FloatValue));
}
public function testSerializeDateTimeTypeXml()
{
//xml root
$obj = new DatetimeTypeXml();
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$this->assertStringContainsString('<DatetimeType/>', $str);
$date = new \DateTime();
$date->setTimestamp(1702783809);
$date1 = new \DateTimeImmutable();
$date1 = $date1->setTimestamp(1702783819);
//xml element
$obj = new DatetimeTypeXml(
isotimeValue: $date,
dateTimeImmutableValue: $date1,
httptimeValue: $date,
unixtimeValue: $date,
);
$str = Serializer::serializeXml($obj);
$this->assertNotEmpty($str);
$xml = \simplexml_load_string($str);
$this->assertEquals(4, $xml->count());
$this->assertEquals('2023-12-17T03:30:09Z', $xml->DateTimeValue);
$this->assertEquals('2023-12-17T03:30:19Z', $xml->DateTimeImmutableValue);
$this->assertEquals('1702783809', $xml->UnixtimeValue);
$this->assertEquals('Sun, 17 Dec 2023 03:30:09 GMT', $xml->HttptimeValue);
}
public function testSerializeInput(): void
{
$datetimeUtc = new \DateTime();
$datetimeUtc->setTimestamp(1702783809);
$datetime2Utc = new \DateTime();
$datetime2Utc->setTimestamp(1702783819);
$request = new PutApiRequest(
bucket: "bucket-124",
#key: "key-1",
strHeader: "str_header",
intHeader: 123,
boolHeader: true,
floatHeader: 2.5,
isotimeHeader: $datetimeUtc,
httptimeHeader: $datetimeUtc,
unixtimeHeader: $datetimeUtc,
strParam: "str_param",
intParam: 456,
boolParam: false,
floatParam: 4.5,
isotimeParam: $datetime2Utc,
httptimeParam: $datetime2Utc,
unixtimeParam: $datetime2Utc,
configuration: new RootConfiguration(
id: "id-124",
text: "just for test",
subConfiguration: [
new SubConfiguration(
strField: 'str-1',
intField: 111,
),
new SubConfiguration(
strField: 'str-2',
intField: 222,
),
],
)
);
# miss required field
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
try {
Serializer::serializeInput($request, $input);
$this->assertTrue(false, "shoud not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, key", (string)$e);
} catch (\Exception $e) {
$this->assertTrue(false, "shoud not here");
}
#normal case
$request->setKey('key');
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('123', $input->getHeaders()['x-oss-int']);
$this->assertEquals('true', $input->getHeaders()['x-oss-bool']);
$this->assertEquals('2.5', $input->getHeaders()['x-oss-float']);
$this->assertEquals('2023-12-17T03:30:09Z', $input->getHeaders()['x-oss-isotime']);
$this->assertEquals('Sun, 17 Dec 2023 03:30:09 GMT', $input->getHeaders()['x-oss-httptime']);
$this->assertEquals('1702783809', $input->getHeaders()['x-oss-unixtime']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$this->assertEquals('456', $input->getParameters()['param-int']);
$this->assertEquals('false', $input->getParameters()['param-bool']);
$this->assertEquals('4.5', $input->getParameters()['param-float']);
$this->assertEquals('2023-12-17T03:30:19Z', $input->getParameters()['param-isotime']);
$this->assertEquals('Sun, 17 Dec 2023 03:30:19 GMT', $input->getParameters()['param-httptime']);
$this->assertEquals('1702783819', $input->getParameters()['param-unixtime']);
$str = $input->getBody()->getContents();
$this->assertStringContainsString('<Configuration>', $str);
$xml = \simplexml_load_string($str);
$this->assertEquals(4, $xml->count());
$this->assertEquals('id-124', $xml->Id);
$this->assertEquals('just for test', $xml->Text);
$this->assertEquals(2, ($xml->SubConfiguration)->count());
$this->assertEquals('str-1', $xml->SubConfiguration[0]->StrField);
$this->assertEquals('111', $xml->SubConfiguration[0]->IntField);
$this->assertEquals('str-2', $xml->SubConfiguration[1]->StrField);
$this->assertEquals('222', $xml->SubConfiguration[1]->IntField);
}
public function testSerializeInputWithHeadersAndParameters(): void
{
//case 1, input has headers and parameters
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
headers: ['Key' => 'value', 'key-1' => 'value-1'],
parameters: ['Key' => 'value', 'key-1' => 'value-1'],
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('value', $input->getHeaders()['key']);
$this->assertEquals('value-1', $input->getHeaders()['key-1']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$this->assertEquals('value', $input->getParameters()['Key']);
$this->assertEquals('value-1', $input->getParameters()['key-1']);
//case 2, input and request has same headers and parameters
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
headers: ['X-OSS-str' => 'value'],
parameters: ['param-str' => 'value', 'param-int' => '123'],
);
Serializer::serializeInput($request, $input);
$this->assertEquals(1, count($input->getHeaders()));
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals(2, count($input->getParameters()));
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$this->assertEquals('123', $input->getParameters()['param-int']);
//case 3, request has headers and parameters, request.headers and request.parameters
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$request->setHeaders(['X-Oss-header1' => 'value-1', 'x-oss-header2' => 'value-2']);
$request->setParameters(['X-Oss-param1' => 'value-1', 'x-oss-param2' => 'value-2']);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
headers: ['Key' => 'value', 'key-1' => 'value-1'],
parameters: ['Key' => 'value', 'key-1' => 'value-1'],
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('value', $input->getHeaders()['key']);
$this->assertEquals('value-1', $input->getHeaders()['key-1']);
$this->assertEquals('value-1', $input->getHeaders()['x-oss-header1']);
$this->assertEquals('value-2', $input->getHeaders()['x-oss-header2']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$this->assertEquals('value', $input->getParameters()['Key']);
$this->assertEquals('value-1', $input->getParameters()['key-1']);
$this->assertEquals('value-1', $input->getParameters()['X-Oss-param1']);
$this->assertEquals('value-2', $input->getParameters()['x-oss-param2']);
}
public function testSerializeInputWithBody(): void
{
#case 1, request with body
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
configuration: "hello world"
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$str = $input->getBody()->getContents();
$this->assertEquals('hello world', $str);
#case 2, request without body
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$this->assertEquals(null, $input->getBody());
#case 3, input with body
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
body: Utils::streamFor('1234'),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$str = $input->getBody()->getContents();
$this->assertEquals('1234', $str);
#case 4, input & request with body
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
configuration: "hello world abc",
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
body: Utils::streamFor('1234'),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$str = $input->getBody()->getContents();
$this->assertEquals('hello world abc', $str);
#case 5, request.paylaod
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$request->setPayload(Utils::streamFor('just a payload'));
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$str = $input->getBody()->getContents();
$this->assertEquals('just a payload', $str);
#case 6, request.paylaod and input.body
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$request->setPayload(Utils::streamFor('payload-1234'));
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
body: Utils::streamFor('body-1234'),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$str = $input->getBody()->getContents();
$this->assertEquals('payload-1234', $str);
#case 6, request.paylaod and request.body
$request = new PutApiARequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
configuration: 'request body',
);
$request->setPayload(Utils::streamFor('payload-1234'));
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
body: Utils::streamFor('body-1234'),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
$str = $input->getBody()->getContents();
$this->assertEquals('request body', $str);
}
public function testSerializeInputWithArrayHeader(): void
{
# case 1
$request = new PutApiBRequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
arrayHeader: ['a' => 'value-1', 'b' => 'value-2'],
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
Serializer::serializeInput($request, $input);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('value-1', $input->getHeaders()['x-oss-prefix-a']);
$this->assertEquals('value-2', $input->getHeaders()['x-oss-prefix-b']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
# case 1
$request = new PutApiBRequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
Serializer::serializeInput($request, $input);
$this->assertEquals(1, count($input->getHeaders()));
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
}
public static function addTestHeader($request, OperationInput $input): void
{
$input->setHeader('Serializer-Header', '12345');
}
public function testSerializeInputWithCustomSerializer(): void
{
# case 1
$request = new PutApiBRequest(
bucket: "bucket-124",
key: "key-1",
strHeader: "str_header",
strParam: "str_param",
arrayHeader: ['a' => 'value-1', 'b' => 'value-2'],
);
$input = new OperationInput(
opName: 'TestApi',
method: 'GET',
bucket: $request->getBucket(),
key: $request->getKey(),
);
$customSerializer = [
static function ($request, OperationInput $input) {
$input->setHeader('my-header', 'just test');
},
[self::class, 'addTestHeader'],
];
Serializer::serializeInput($request, $input, $customSerializer);
$this->assertEquals('str_header', $input->getHeaders()['x-oss-str']);
$this->assertEquals('value-1', $input->getHeaders()['x-oss-prefix-a']);
$this->assertEquals('value-2', $input->getHeaders()['x-oss-prefix-b']);
$this->assertEquals('just test', $input->getHeaders()['my-header']);
$this->assertEquals('12345', $input->getHeaders()['serializer-header']);
$this->assertEquals('str_param', $input->getParameters()['param-str']);
}
}

View File

@@ -0,0 +1,18 @@
<?php
namespace UnitTests\Signer;
use AlibabaCloud\Oss\V2\Signer\NopSigner;
use AlibabaCloud\Oss\V2\Signer\SigningContext;
class NopSignerTest extends \PHPUnit\Framework\TestCase
{
public function testNopSigner()
{
$r = new NopSigner();
$g = new SigningContext();
$this->assertNull($r->sign($g));
}
}

View File

@@ -0,0 +1,26 @@
<?php
namespace UnitTests\Signer;
use AlibabaCloud\Oss\V2\Signer\SigningContext;
class SignerContextTest extends \PHPUnit\Framework\TestCase
{
public function testSignerContextTestWithNull()
{
$g = new SigningContext();
$this->assertIsArray($g->subResource);
$this->assertNull($g->product);
$this->assertNull($g->region);
$this->assertNull($g->bucket);
$this->assertNull($g->key);
$this->assertNull($g->request);
$this->assertNull($g->credentials);
$this->assertNull($g->time);
$this->assertNull($g->signedHeaders);
$this->assertNull($g->stringToSign);
$this->assertFalse($g->authMethodQuery);
}
}

View File

@@ -0,0 +1,258 @@
<?php
namespace UnitTests\Signer;
use AlibabaCloud\Oss\V2\Credentials\StaticCredentialsProvider;
use AlibabaCloud\Oss\V2\Signer\SignerV1;
use AlibabaCloud\Oss\V2\Signer\SigningContext;
use DateTime;
use DateTimeZone;
use GuzzleHttp\Psr7\Request;
class SignerV1Test extends \PHPUnit\Framework\TestCase
{
public function testAuthHeader()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "https://examplebucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==")
->withHeader("Content-Type", "text/html")
->withHeader("x-oss-meta-author", "alice")
->withHeader("x-oss-meta-magic", "abracadabra")
->withHeader("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Wed, 28 Dec 2022 10:27:41 GMT");
#$signCtx = new SigningContext(bucket: "examplebucket", key: "nelson", request: $request, credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->bucket = 'examplebucket';
$signCtx->key = 'nelson';
$signCtx->request = $request;
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV1();
$signer->sign($signCtx);
$signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\n/examplebucket/nelson";
$this->assertEquals($signToString, $signCtx->stringToSign);
$this->assertEquals($signTime, $signCtx->time);
$request = $signCtx->request;
$this->assertEquals("OSS ak:kSHKmLxlyEAKtZPkJhG9bZb5k7M=", $request->getHeaderLine("Authorization"));
// case 2
$request = new Request("PUT", "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/?acl");
$request = $request->withHeader("Content-MD5", "eB5eJF1ptWaXm4bijSPyxw==")
->withHeader("Content-Type", "text/html")
->withHeader("x-oss-meta-author", "alice")
->withHeader("x-oss-meta-magic", "abracadabra")
->withHeader("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Wed, 28 Dec 2022 10:27:41 GMT");
#$signCtx = new SigningContext(bucket: "examplebucket", key: "nelson", request: $request, credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->bucket = 'examplebucket';
$signCtx->key = 'nelson';
$signCtx->request = $request;
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV1();
$signer->sign($signCtx);
$signToString = "PUT\neB5eJF1ptWaXm4bijSPyxw==\ntext/html\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\nx-oss-meta-author:alice\nx-oss-meta-magic:abracadabra\n/examplebucket/nelson?acl";
$this->assertEquals($signToString, $signCtx->stringToSign);
$this->assertEquals($signTime, $signCtx->time);
$request = $signCtx->request;
$this->assertEquals("OSS ak:/afkugFbmWDQ967j1vr6zygBLQk=", $request->getHeaderLine("Authorization"));
// case 3
$request = new Request("GET", "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/?resourceGroup&non-resousce=null");
$request = $request->withHeader("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Wed, 28 Dec 2022 10:27:41 GMT");
#$signCtx = new SigningContext(bucket: "examplebucket", request: $request, subResource: ["resourceGroup"], credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->bucket = 'examplebucket';
$signCtx->request = $request;
$signCtx->subResource = ["resourceGroup"];
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV1();
$signer->sign($signCtx);
$signToString = "GET\n\n\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\n/examplebucket/?resourceGroup";
$this->assertEquals($signToString, $signCtx->stringToSign);
$this->assertEquals($signTime, $signCtx->time);
$request = $signCtx->request;
$this->assertEquals("OSS ak:vkQmfuUDyi1uDi3bKt67oemssIs=", $request->getHeaderLine("Authorization"));
// case 4
$request = new Request("GET", "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/?resourceGroup&acl");
$request = $request->withHeader("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Wed, 28 Dec 2022 10:27:41 GMT");
#$signCtx = new SigningContext(bucket: "examplebucket", request: $request, subResource: ["resourceGroup"], credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->bucket = 'examplebucket';
$signCtx->request = $request;
$signCtx->subResource = ["resourceGroup"];
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV1();
$signer->sign($signCtx);
$signToString = "GET\n\n\nWed, 28 Dec 2022 10:27:41 GMT\nx-oss-date:Wed, 28 Dec 2022 10:27:41 GMT\n/examplebucket/?acl&resourceGroup";
$this->assertEquals($signToString, $signCtx->stringToSign);
$this->assertEquals($signTime, $signCtx->time);
$request = $signCtx->request;
$this->assertEquals("OSS ak:x3E5TgOvl/i7PN618s5mEvpJDYk=", $request->getHeaderLine("Authorization"));
// case 5
$request = new Request("GET", "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/?resourceGroup&acl");
$request = $request->withHeader("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
#$signCtx = new SigningContext(bucket: "examplebucket", request: $request, subResource: ["resourceGroup"], credentials: $cred);
$signCtx = new SigningContext();
$signCtx->bucket = 'examplebucket';
$signCtx->request = $request;
$signCtx->subResource = ["resourceGroup"];
$signCtx->credentials = $cred;
$signer = new SignerV1();
$signer->sign($signCtx);
$this->assertNotNull($signCtx->stringToSign);
$this->assertNotNull($signCtx->time->format("D, d M Y H:i:s"));
$request = $signCtx->request;
$this->assertNotNull($request->getHeaderLine("Authorization"));
$provider = new StaticCredentialsProvider("ak", "sk", "token");
$cred = $provider->getCredentials();
$request = new Request("GET", "https://examplebucket.oss-cn-hangzhou.aliyuncs.com/?resourceGroup&acl");
$request = $request->withHeader("x-oss-date", "Wed, 28 Dec 2022 10:27:41 GMT");
#$signCtx = new SigningContext(bucket: "examplebucket", request: $request, subResource: ["resourceGroup"], credentials: $cred);
$signCtx = new SigningContext();
$signCtx->bucket = 'examplebucket';
$signCtx->request = $request;
$signCtx->subResource = ["resourceGroup"];
$signCtx->credentials = $cred;
$signer = new SignerV1();
$signer->sign($signCtx);
$this->assertNotNull($signCtx->stringToSign);
$this->assertNotNull($signCtx->time->format("D, d M Y H:i:s"));
$request = $signCtx->request;
$this->assertNotNull($request->getHeaderLine("Authorization"));
}
public function testInvalidArgument()
{
try {
$signer = new SignerV1();
$signer->sign(null);
} catch (\TypeError $e) {
$this->assertStringContainsString("AlibabaCloud\Oss\V2\Signer\SigningContext, null given", $e->getMessage());
}
try {
$provider = new StaticCredentialsProvider("", "sk");
$cred = $provider->getCredentials();
#$signCtx = new SigningContext(credentials: $cred);
$signCtx = new SigningContext();
$signCtx->credentials = $cred;
$signer = new SignerV1();
$signer->sign($signCtx);
} catch (\Exception $e) {
$this->assertSame("SigningContext Credentials is null or empty.", $e->getMessage());
}
try {
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
#$signCtx = new SigningContext(credentials: $cred);
$signCtx = new SigningContext();
$signCtx->credentials = $cred;
$signer = new SignerV1();
$signer->sign($signCtx);
} catch (\Exception $e) {
$this->assertSame("SigningContext Request is null.", $e->getMessage());
}
}
public function testAuthQuery()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("GET", "https://bucket.oss-cn-hangzhou.aliyuncs.com/key?versionId=versionId");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Sun, 12 Nov 2023 16:43:40 GMT");
#$signCtx = new SigningContext(bucket: "bucket", key: "key", request: $request, credentials: $cred, time: $signTime, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->bucket = 'bucket';
$signCtx->key = 'key';
$signCtx->request = $request;
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signCtx->authMethodQuery = true;
$signer = new SignerV1();
$signer->sign($signCtx);
$signUrl = "https://bucket.oss-cn-hangzhou.aliyuncs.com/key?Expires=1699807420&OSSAccessKeyId=ak&Signature=dcLTea%2BYh9ApirQ8o8dOPqtvJXQ%3D&versionId=versionId";
$request = $signCtx->request;
$uri = $request->getUri();
$this->assertEquals($signUrl, (string)$uri);
$this->assertEquals($signTime, $signCtx->time);
// case 2
$provider = new StaticCredentialsProvider("ak", "sk", "token");
$cred = $provider->getCredentials();
$request = new Request("GET", "https://bucket.oss-cn-hangzhou.aliyuncs.com/key%2B123?versionId=versionId");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Sun, 12 Nov 2023 16:56:44 GMT");
#$signCtx = new SigningContext(bucket: "bucket", key: "key+123", request: $request, credentials: $cred, time: $signTime, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->bucket = 'bucket';
$signCtx->key = 'key+123';
$signCtx->request = $request;
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signCtx->authMethodQuery = true;
$signer = new SignerV1();
$signer->sign($signCtx);
$signUrl = "https://bucket.oss-cn-hangzhou.aliyuncs.com/key%2B123?Expires=1699808204&OSSAccessKeyId=ak&Signature=jzKYRrM5y6Br0dRFPaTGOsbrDhY%3D&security-token=token&versionId=versionId";
$request = $signCtx->request;
$uri = $request->getUri();
$this->assertEquals($signUrl, (string)$uri);
$this->assertEquals($signTime, $signCtx->time);
// case 3
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
$request = new Request("GET", "https://bucket.oss-cn-hangzhou.aliyuncs.com/key 123");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Sun, 12 Nov 2023 16:43:40 GMT");
#$signCtx = new SigningContext(bucket: "bucket", key: "key", request: $request, credentials: $cred, time: $signTime, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->bucket = 'bucket';
$signCtx->key = 'key';
$signCtx->request = $request;
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signCtx->authMethodQuery = true;
$signer = new SignerV1();
$signer->sign($signCtx);
$signUrl = "https://bucket.oss-cn-hangzhou.aliyuncs.com/key%20123?Expires=1699807420&OSSAccessKeyId=ak&Signature=tYKe4BGVXY%2FMIl5F0qSoNfAnpkk%3D";
$request = $signCtx->request;
$uri = $request->getUri();
$this->assertEquals($signUrl, (string)$uri);
$this->assertEquals($signTime, $signCtx->time);
// case 4
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
$request = new Request("GET", "https://bucket.oss-cn-hangzhou.aliyuncs.com/key 123");
$signTime = DateTime::createFromFormat("D, d M Y H:i:s T", "Sun, 12 Nov 2023 16:43:40 GMT");
$signCtx = new SigningContext();
$signCtx->bucket = 'bucket';
$signCtx->key = 'key';
$signCtx->request = $request;
$signCtx->credentials = $cred;
$signCtx->authMethodQuery = true;
$signer = new SignerV1();
$signer->sign($signCtx);
$signTime = (new DateTime('now', new DateTimeZone('UTC')))->modify('+' . SignerV1::DEFAULT_EXPIRES_DURATION . 'seconds');
$request = $signCtx->request;
$uri = $request->getUri();
$this->assertStringContainsString("https://bucket.oss-cn-hangzhou.aliyuncs.com/key%20123?Expires=" . (string)$signTime->getTimestamp() . "&OSSAccessKeyId=ak&Signature=", (string)$uri);
}
}

View File

@@ -0,0 +1,618 @@
<?php
namespace UnitTests\Signer;
use AlibabaCloud\Oss\V2\Credentials\StaticCredentialsProvider;
use AlibabaCloud\Oss\V2\Defaults;
use AlibabaCloud\Oss\V2\Signer\SignerV4;
use AlibabaCloud\Oss\V2\Signer\SigningContext;
use DateTime;
use DateTimeZone;
use GuzzleHttp\Psr7\Request;
class SignerV4Test extends \PHPUnit\Framework\TestCase
{
public function testAuthHeader()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "text/plain")
->withHeader("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
$signTime = new DateTime("@1702743657");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$this->assertEquals('OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,Signature=e21d18daa82167720f9b1047ae7e7f1ce7cb77a31e8203a7d5f4624fa0284afe', $request->getHeaderLine("Authorization"));
// case 2
$query = array();
$request = new Request("POST", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("content-type", "text/plain")
->withHeader("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
$signTime = new DateTime("@1702743657");
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = 'object';
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV4();
$query['position'] = 0;
$query['append'] = "";
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$this->assertEquals('OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,Signature=f7a645f23a0434ea90d5e2bb2bca90d0fda9ef4bc54a9c5008b2134e7c9023f2', $request->getHeaderLine("Authorization"));
// case 3
$query = array();
$request = new Request("POST", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("content-type", "text/plain");
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = 'object';
$signCtx->credentials = $cred;
$signer = new SignerV4();
$query['position'] = 0;
$query['append'] = "";
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$this->assertStringContainsString('OSS4-HMAC-SHA256', $request->getHeaderLine("Authorization"));
$date = (new DateTime('now', new DateTimeZone('UTC')))->format("Ymd");
$this->assertStringContainsString("ak/{$date}/cn-hangzhou/oss/aliyun_v4_request", $request->getHeaderLine("Authorization"));
$this->assertStringContainsString('Signature=', $request->getHeaderLine("Authorization"));
}
public function testAuthHeaderWithCloudBox()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "http://bucket.cb-123.cn-hangzhou.oss-cloudbox.aliyuncs.com/1234+-/123/1.txt");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "text/plain")
->withHeader("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
$signTime = new DateTime("@1702743657");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->product = Defaults::CLOUD_BOX_PRODUCT;
$signCtx->region = 'cb-123';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$this->assertEquals('OSS4-HMAC-SHA256 Credential=ak/20231216/cb-123/oss-cloudbox/aliyun_v4_request,Signature=94ce1f12c17d148ea681030275a94449d3357f5b5b21133996eec80af3e08a43', $request->getHeaderLine("Authorization"));
}
public function testAuthHeaderToken()
{
$provider = new StaticCredentialsProvider("ak", "sk", "token");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "text/plain")
->withHeader("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
$signTime = new DateTime("@1702784856");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->request = $request;
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$this->assertEquals('OSS4-HMAC-SHA256 Credential=ak/20231217/cn-hangzhou/oss/aliyun_v4_request,Signature=b94a3f999cf85bcdc00d332fbd3734ba03e48382c36fa4d5af5df817395bd9ea', $request->getHeaderLine("Authorization"));
}
public function testAuthHeaderWithAdditionalHeaders()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "text/plain")
->withHeader("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
$signTime = new DateTime("@1702747512");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, additionalHeaders: ["ZAbc", "abc"], credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->request = $request;
$signCtx->additionalHeaders = ["ZAbc", "abc"];
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$this->assertEquals('OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=abc;zabc,Signature=4a4183c187c07c8947db7620deb0a6b38d9fbdd34187b6dbaccb316fa251212f', $request->getHeaderLine("Authorization"));
// case 2:with default signed header
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "text/plain")
->withHeader("x-oss-content-sha256", "UNSIGNED-PAYLOAD");
$signTime = new DateTime("@1702747512");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, additionalHeaders: ["x-oss-no-exist", "ZAbc", "x-oss-head1", "abc"], credentials: $cred, time: $signTime);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->request = $request;
$signCtx->additionalHeaders = ["x-oss-no-exist", "ZAbc", "x-oss-head1", "abc"];
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$this->assertEquals('OSS4-HMAC-SHA256 Credential=ak/20231216/cn-hangzhou/oss/aliyun_v4_request,AdditionalHeaders=abc;zabc,Signature=4a4183c187c07c8947db7620deb0a6b38d9fbdd34187b6dbaccb316fa251212f', $request->getHeaderLine("Authorization"));
}
public function testInvalidArgument()
{
try {
$signer = new SignerV4();
$signer->sign(null);
} catch (\TypeError $e) {
$this->assertStringContainsString("AlibabaCloud\Oss\V2\Signer\SigningContext, null given", $e->getMessage());
}
try {
$signCtx = new SigningContext();
$signer = new SignerV4();
$signer->sign($signCtx);
} catch (\Exception $e) {
$this->assertSame("SigningContext Credentials is null or empty.", $e->getMessage());
}
try {
$provider = new StaticCredentialsProvider("", "sk");
$cred = $provider->getCredentials();
#$signCtx = new SigningContext(credentials: $cred);
$signCtx = new SigningContext();
$signCtx->credentials = $cred;
$signer = new SignerV4();
$signer->sign($signCtx);
} catch (\Exception $e) {
$this->assertSame("SigningContext Credentials is null or empty.", $e->getMessage());
}
try {
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
#$signCtx = new SigningContext(credentials: $cred);
$signCtx = new SigningContext();
$signCtx->credentials = $cred;
$signer = new SignerV4();
$signer->sign($signCtx);
} catch (\Exception $e) {
$this->assertSame("SigningContext Region is empty.", $e->getMessage());
}
try {
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
#$signCtx = new SigningContext(credentials: $cred, region: 'cn-hangzhou');
$signCtx = new SigningContext();
$signCtx->credentials = $cred;
$signCtx->region = 'cn-hangzhou';
$signer = new SignerV4();
$signer->sign($signCtx);
} catch (\Exception $e) {
$this->assertSame("SigningContext Request is null.", $e->getMessage());
}
}
public function testAuthQuery()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signTime = new DateTime("@1702781677");
$time = new DateTime("@1702782276");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, credentials: $cred, time: $time, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->credentials = $cred;
$signCtx->time = $time;
$signCtx->authMethodQuery = true;
$signCtx->signTime = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$this->assertEquals('599', $parsedQuery['x-oss-expires']);
$this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $parsedQuery['x-oss-credential']);
$this->assertEquals('a39966c61718be0d5b14e668088b3fa07601033f6518ac7b523100014269c0fe', $parsedQuery['x-oss-signature']);
$this->assertFalse(array_key_exists('x-oss-additional-headers', $parsedQuery));
// case 2
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->credentials = $cred;
$signCtx->authMethodQuery = true;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$date = (new DateTime('now', new DateTimeZone('UTC')))->format("Ymd");
$this->assertEquals('900', $parsedQuery['x-oss-expires']);
$this->assertEquals("ak/{$date}/cn-hangzhou/oss/aliyun_v4_request", $parsedQuery['x-oss-credential']);
$this->assertNotEmpty($parsedQuery['x-oss-signature']);
$this->assertFalse(array_key_exists('x-oss-additional-headers', $parsedQuery));
}
public function testAuthQueryToken()
{
$provider = new StaticCredentialsProvider("ak", "sk", "token");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signTime = new DateTime("@1702785388");
$time = new DateTime("@1702785987");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, credentials: $cred, time: $time, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->credentials = $cred;
$signCtx->time = $time;
$signCtx->authMethodQuery = true;
$signCtx->signTime = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$this->assertEquals('599', $parsedQuery['x-oss-expires']);
$this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $parsedQuery['x-oss-credential']);
$this->assertEquals('3817ac9d206cd6dfc90f1c09c00be45005602e55898f26f5ddb06d7892e1f8b5', $parsedQuery['x-oss-signature']);
$this->assertFalse(array_key_exists('x-oss-additional-headers', $parsedQuery));
}
public function testAuthQueryWithAdditionalHeaders()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signTime = new DateTime("@1702783809");
$time = new DateTime("@1702784408");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, additionalHeaders: ["ZAbc", "abc"], credentials: $cred, time: $time, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->additionalHeaders = ["ZAbc", "abc"];
$signCtx->credentials = $cred;
$signCtx->time = $time;
$signCtx->authMethodQuery = true;
$signCtx->signTime = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query, '', '&', PHP_QUERY_RFC3986)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$this->assertEquals('599', $parsedQuery['x-oss-expires']);
$this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $parsedQuery['x-oss-credential']);
$this->assertEquals('6bd984bfe531afb6db1f7550983a741b103a8c58e5e14f83ea474c2322dfa2b7', $parsedQuery['x-oss-signature']);
$this->assertEquals('abc;zabc', $parsedQuery['x-oss-additional-headers']);
// case 2:with default signed header
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signTime = new DateTime("@1702783809");
$time = new DateTime("@1702784408");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, additionalHeaders: ["x-oss-no-exist", "abc", "x-oss-head1", "ZAbc"], credentials: $cred, time: $time, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->additionalHeaders = ["x-oss-no-exist", "abc", "x-oss-head1", "ZAbc"];
$signCtx->credentials = $cred;
$signCtx->time = $time;
$signCtx->authMethodQuery = true;
$signCtx->signTime = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query, '', '&', PHP_QUERY_RFC3986)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$this->assertEquals('20231217T033009Z', $parsedQuery['x-oss-date']);
$this->assertEquals('599', $parsedQuery['x-oss-expires']);
$this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $parsedQuery['x-oss-credential']);
$this->assertEquals('6bd984bfe531afb6db1f7550983a741b103a8c58e5e14f83ea474c2322dfa2b7', $parsedQuery['x-oss-signature']);
$this->assertEquals('abc;zabc', $parsedQuery['x-oss-additional-headers']);
// case 3
$request = new Request("PUT", "https://bucket.oss-cn-hangzhou.aliyuncs.com/key 123.txt");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signTime = new DateTime("@1702783809");
$time = new DateTime("@1702784408");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "key 123.txt", request: $request, additionalHeaders: ["ZAbc", "abc"], credentials: $cred, time: $time, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->product = 'oss';
$signCtx->region = 'cn-hangzhou';
$signCtx->bucket = 'bucket';
$signCtx->key = 'key 123.txt';
$signCtx->additionalHeaders = ["ZAbc", "abc"];
$signCtx->credentials = $cred;
$signCtx->time = $signTime;
$signCtx->time = $time;
$signCtx->authMethodQuery = true;
$signCtx->signTime = $signTime;
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query, '', '&', PHP_QUERY_RFC3986)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$uri = $request->getUri();
$signUrl = "https://bucket.oss-cn-hangzhou.aliyuncs.com/key%20123.txt?%2Bparam1=value3&%2Bparam2=&param1=value1&param2=&x-oss-additional-headers=abc%3Bzabc&x-oss-credential=ak%2F20231217%2Fcn-hangzhou%2Foss%2Faliyun_v4_request&x-oss-date=20231217T033009Z&x-oss-expires=599&x-oss-signature=33208021567953241c3cc1d95ecf1864f8561890c30d29488ce76c7afb81a623&x-oss-signature-version=OSS4-HMAC-SHA256&%7Cparam1=value4&%7Cparam2=";
$this->assertEquals($signUrl, (string)$uri);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$this->assertEquals('599', $parsedQuery['x-oss-expires']);
$this->assertEquals('ak/20231217/cn-hangzhou/oss/aliyun_v4_request', $parsedQuery['x-oss-credential']);
$this->assertEquals('33208021567953241c3cc1d95ecf1864f8561890c30d29488ce76c7afb81a623', $parsedQuery['x-oss-signature']);
$this->assertEquals('abc;zabc', $parsedQuery['x-oss-additional-headers']);
}
public function testAuthQueryWithCloudBox()
{
$provider = new StaticCredentialsProvider("ak", "sk");
$cred = $provider->getCredentials();
// case 1
$request = new Request("PUT", "http://bucket.cb-123.cn-hangzhou.oss-cloudbox.aliyuncs.com/1234+-/123/1.txt");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signTime = new DateTime("@1702781677");
$time = new DateTime("@1702782276");
#$signCtx = new SigningContext(product: "oss", region: "cn-hangzhou", bucket: "bucket", key: "1234+-/123/1.txt", request: $request, credentials: $cred, time: $time, authMethodQuery: true);
$signCtx = new SigningContext();
$signCtx->product = Defaults::CLOUD_BOX_PRODUCT;
$signCtx->region = 'cb-123';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->credentials = $cred;
$signCtx->time = $time;
$signCtx->authMethodQuery = true;
$signCtx->signTime = $signTime;
$signCtx->additionalHeaders = ["ZAbc", "abc"];
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$this->assertEquals('599', $parsedQuery['x-oss-expires']);
$this->assertEquals('ak/20231217/cb-123/oss-cloudbox/aliyun_v4_request', $parsedQuery['x-oss-credential']);
$this->assertEquals('07284191b9b4978ac3520cd39ee2dea2747eda454089359371ff463a6c7ba20f', $parsedQuery['x-oss-signature']);
$this->assertTrue(array_key_exists('x-oss-additional-headers', $parsedQuery));
$this->assertEquals('abc;zabc', $parsedQuery['x-oss-additional-headers']);
// with default signed header
$request = new Request("PUT", "http://bucket.cb-123.cn-hangzhou.oss-cloudbox.aliyuncs.com/1234+-/123/1.txt");
$request = $request->withHeader("x-oss-head1", "value")
->withHeader("x-oss-head1", "value")
->withHeader("abc", "value")
->withHeader("ZAbc", "value")
->withHeader("XYZ", "value")
->withHeader("content-type", "application/octet-stream");
$signTime = new DateTime("@1702783809");
$time = new DateTime("@1702784408");
$signCtx = new SigningContext();
$signCtx->product = 'oss-cloudbox';
$signCtx->region = 'cb-123';
$signCtx->bucket = 'bucket';
$signCtx->key = '1234+-/123/1.txt';
$signCtx->credentials = $cred;
$signCtx->authMethodQuery = true;
$signCtx->signTime = $signTime;
$signCtx->time = $time;
$signCtx->additionalHeaders = ["x-oss-no-exist", "abc", "x-oss-head1", "ZAbc"];
$signer = new SignerV4();
$query['param1'] = 'value1';
$query['+param1'] = 'value3';
$query['|param1'] = 'value4';
$query['+param2'] = '';
$query['|param2'] = '';
$query['param2'] = '';
$signCtx->request = $request->withUri($request->getUri()->withQuery(http_build_query($query)));
$signer->sign($signCtx);
$request = $signCtx->request;
$queryParams = $request->getUri()->getQuery();
parse_str($queryParams, $parsedQuery);
$this->assertEquals('OSS4-HMAC-SHA256', $parsedQuery['x-oss-signature-version']);
$this->assertEquals('599', $parsedQuery['x-oss-expires']);
$this->assertEquals('ak/20231217/cb-123/oss-cloudbox/aliyun_v4_request', $parsedQuery['x-oss-credential']);
$this->assertEquals('16782cc8a7a554523db055eb804b508522e7e370073108ad88ee2f47496701dd', $parsedQuery['x-oss-signature']);
$this->assertTrue(array_key_exists('x-oss-additional-headers', $parsedQuery));
$this->assertEquals('abc;zabc', $parsedQuery['x-oss-additional-headers']);
}
}

View File

@@ -0,0 +1,482 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\AccessPoint;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class AccessPointTest extends \PHPUnit\Framework\TestCase
{
public function testFromCreateAccessPoint()
{
// miss required field
try {
$request = new Models\CreateAccessPointRequest();
$input = AccessPoint::fromCreateAccessPoint($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\CreateAccessPointRequest('bucket-123');
$input = AccessPoint::fromCreateAccessPoint($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, createAccessPointConfiguration", (string)$e);
}
$request = new Models\CreateAccessPointRequest('bucket-123', new Models\CreateAccessPointConfiguration(
accessPointName: 'ap-01',
networkOrigin: 'internet'
));
$input = AccessPoint::fromCreateAccessPoint($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><CreateAccessPointConfiguration><AccessPointName>ap-01</AccessPointName><NetworkOrigin>internet</NetworkOrigin></CreateAccessPointConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\CreateAccessPointRequest('bucket-123', new Models\CreateAccessPointConfiguration(
vpcConfiguration: new Models\AccessPointVpcConfiguration('vpc-t4nlw426y44rd3iq4xxxx'),
accessPointName: 'ap-01',
networkOrigin: 'vpc'
));
$input = AccessPoint::fromCreateAccessPoint($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><CreateAccessPointConfiguration><VpcConfiguration><VpcId>vpc-t4nlw426y44rd3iq4xxxx</VpcId></VpcConfiguration><AccessPointName>ap-01</AccessPointName><NetworkOrigin>vpc</NetworkOrigin></CreateAccessPointConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToCreateAccessPoint()
{
// empty output
$output = new OperationOutput();
$result = AccessPoint::toCreateAccessPoint($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<CreateAccessPointResult>
<AccessPointArn>acs:oss:cn-hangzhou:128364106451xxxx:accesspoint/ap-01</AccessPointArn>
<Alias>ap-01-45ee7945007a2f0bcb595f63e2215cxxxx-ossalias</Alias>
</CreateAccessPointResult>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = AccessPoint::toCreateAccessPoint($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('acs:oss:cn-hangzhou:128364106451xxxx:accesspoint/ap-01', $result->createAccessPoint->accessPointArn);
$this->assertEquals('ap-01-45ee7945007a2f0bcb595f63e2215cxxxx-ossalias', $result->createAccessPoint->alias);
}
public function testFromGetAccessPoint()
{
// miss required field
try {
$request = new Models\GetAccessPointRequest();
$input = AccessPoint::fromGetAccessPoint($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\GetAccessPointRequest('bucket-123');
$input = AccessPoint::fromGetAccessPoint($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, accessPointName", (string)$e);
}
$request = new Models\GetAccessPointRequest('bucket-123', 'ap-01');
$input = AccessPoint::fromGetAccessPoint($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('ap-01', $input->getHeaders()['x-oss-access-point-name']);
}
public function testToGetAccessPoint()
{
// empty output
$output = new OperationOutput();
$result = AccessPoint::toGetAccessPoint($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<GetAccessPointResult>
<AccessPointName>ap-01</AccessPointName>
<Bucket>oss-example</Bucket>
<AccountId>111933544165xxxx</AccountId>
<NetworkOrigin>vpc</NetworkOrigin>
<VpcConfiguration>
<VpcId>vpc-t4nlw426y44rd3iq4xxxx</VpcId>
</VpcConfiguration>
<AccessPointArn>arn:acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01</AccessPointArn>
<CreationDate>1626769503</CreationDate>
<Alias>ap-01-ossalias</Alias>
<Status>enable</Status>
<Endpoints>
<PublicEndpoint>ap-01.oss-cn-hangzhou.oss-accesspoint.aliyuncs.com</PublicEndpoint>
<InternalEndpoint>ap-01.oss-cn-hangzhou-internal.oss-accesspoint.aliyuncs.com</InternalEndpoint>
</Endpoints>
<PublicAccessBlockConfiguration>
<BlockPublicAccess>true</BlockPublicAccess>
</PublicAccessBlockConfiguration>
</GetAccessPointResult>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = AccessPoint::toGetAccessPoint($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('ap-01', $result->getAccessPoint->accessPointName);
$this->assertEquals('oss-example', $result->getAccessPoint->bucket);
$this->assertEquals('111933544165xxxx', $result->getAccessPoint->accountId);
$this->assertEquals('vpc', $result->getAccessPoint->networkOrigin);
$this->assertEquals('vpc-t4nlw426y44rd3iq4xxxx', $result->getAccessPoint->vpcConfiguration->vpcId);
$this->assertEquals('arn:acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01', $result->getAccessPoint->accessPointArn);
$this->assertEquals('1626769503', $result->getAccessPoint->creationDate);
$this->assertEquals('ap-01-ossalias', $result->getAccessPoint->alias);
$this->assertEquals('enable', $result->getAccessPoint->status);
$this->assertEquals('ap-01.oss-cn-hangzhou.oss-accesspoint.aliyuncs.com', $result->getAccessPoint->endpoints->publicEndpoint);
$this->assertEquals('ap-01.oss-cn-hangzhou-internal.oss-accesspoint.aliyuncs.com', $result->getAccessPoint->endpoints->internalEndpoint);
$this->assertTrue($result->getAccessPoint->publicAccessBlockConfiguration->blockPublicAccess);
}
public function testFromDeleteAccessPoint()
{
// miss required field
try {
$request = new Models\DeleteAccessPointRequest();
$input = AccessPoint::fromDeleteAccessPoint($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DeleteAccessPointRequest('bucket-123');
$input = AccessPoint::fromDeleteAccessPoint($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, accessPointName", (string)$e);
}
$request = new Models\DeleteAccessPointRequest('bucket-123', 'ap-01');
$input = AccessPoint::fromDeleteAccessPoint($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('ap-01', $input->getHeaders()['x-oss-access-point-name']);
}
public function testToDeleteAccessPoint()
{
// empty output
$output = new OperationOutput();
$result = AccessPoint::toDeleteAccessPoint($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123'],
);
$result = AccessPoint::toDeleteAccessPoint($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromListAccessPoints()
{
$request = new Models\ListAccessPointsRequest();
$input = AccessPoint::fromListAccessPoints($request);
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$request = new Models\ListAccessPointsRequest(10, 'token', 'bucket-123');
$input = AccessPoint::fromListAccessPoints($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('10', $input->getParameters()['max-keys']);
$this->assertEquals('token', $input->getParameters()['continuation-token']);
}
public function testToListAccessPoints()
{
// empty output
$output = new OperationOutput();
$result = AccessPoint::toGetAccessPoint($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListAccessPointsResult>
<IsTruncated>true</IsTruncated>
<NextContinuationToken>abc</NextContinuationToken>
<AccountId>111933544165****</AccountId>
<MaxKeys>3</MaxKeys>
<AccessPoints>
<AccessPoint>
<Bucket>oss-example</Bucket>
<AccessPointName>ap-01</AccessPointName>
<Alias>ap-01-ossalias</Alias>
<NetworkOrigin>vpc</NetworkOrigin>
<VpcConfiguration>
<VpcId>vpc-t4nlw426y44rd3iq4****</VpcId>
</VpcConfiguration>
<Status>enable</Status>
</AccessPoint>
<AccessPoint>
<Bucket>oss-example</Bucket>
<AccessPointName>ap-02</AccessPointName>
<Alias>ap-02-ossalias</Alias>
<NetworkOrigin>vpc</NetworkOrigin>
<VpcConfiguration>
<VpcId>vpc-t4nlw426y44rd3iq2****</VpcId>
</VpcConfiguration>
<Status>enable</Status>
</AccessPoint>
<AccessPoint>
<Bucket>oss-example</Bucket>
<AccessPointName>ap-03</AccessPointName>
<Alias>ap-03-ossalias</Alias>
<NetworkOrigin>internet</NetworkOrigin>
<VpcConfiguration>
<VpcId></VpcId>
</VpcConfiguration>
<Status>enable</Status>
</AccessPoint>
</AccessPoints>
</ListAccessPointsResult>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = AccessPoint::toListAccessPoints($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('111933544165****', $result->listAccessPoints->accountId);
$this->assertEquals('abc', $result->listAccessPoints->nextContinuationToken);
$this->assertTrue($result->listAccessPoints->isTruncated);
$this->assertEquals(3, $result->listAccessPoints->maxKeys);
$this->assertEquals(3, count($result->listAccessPoints->accessPoints->accessPoints));
$this->assertEquals('oss-example', $result->listAccessPoints->accessPoints->accessPoints[0]->bucket);
$this->assertEquals('ap-01', $result->listAccessPoints->accessPoints->accessPoints[0]->accessPointName);
$this->assertEquals('ap-01-ossalias', $result->listAccessPoints->accessPoints->accessPoints[0]->alias);
$this->assertEquals('vpc', $result->listAccessPoints->accessPoints->accessPoints[0]->networkOrigin);
$this->assertEquals('vpc-t4nlw426y44rd3iq4****', $result->listAccessPoints->accessPoints->accessPoints[0]->vpcConfiguration->vpcId);
$this->assertEquals('enable', $result->listAccessPoints->accessPoints->accessPoints[0]->status);
$this->assertEquals('oss-example', $result->listAccessPoints->accessPoints->accessPoints[1]->bucket);
$this->assertEquals('ap-02', $result->listAccessPoints->accessPoints->accessPoints[1]->accessPointName);
$this->assertEquals('ap-02-ossalias', $result->listAccessPoints->accessPoints->accessPoints[1]->alias);
$this->assertEquals('vpc', $result->listAccessPoints->accessPoints->accessPoints[1]->networkOrigin);
$this->assertEquals('vpc-t4nlw426y44rd3iq2****', $result->listAccessPoints->accessPoints->accessPoints[1]->vpcConfiguration->vpcId);
$this->assertEquals('enable', $result->listAccessPoints->accessPoints->accessPoints[1]->status);
$this->assertEquals('oss-example', $result->listAccessPoints->accessPoints->accessPoints[2]->bucket);
$this->assertEquals('ap-03', $result->listAccessPoints->accessPoints->accessPoints[2]->accessPointName);
$this->assertEquals('ap-03-ossalias', $result->listAccessPoints->accessPoints->accessPoints[2]->alias);
$this->assertEquals('internet', $result->listAccessPoints->accessPoints->accessPoints[2]->networkOrigin);
$this->assertEquals('enable', $result->listAccessPoints->accessPoints->accessPoints[2]->status);
}
public function testFromPutAccessPointPolicy()
{
// miss required field
try {
$request = new Models\PutAccessPointPolicyRequest();
$input = AccessPoint::fromPutAccessPointPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutAccessPointPolicyRequest('bucket-123');
$input = AccessPoint::fromPutAccessPointPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, accessPointName", (string)$e);
}
try {
$request = new Models\PutAccessPointPolicyRequest('bucket-123', 'ap-01');
$input = AccessPoint::fromPutAccessPointPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, body", (string)$e);
}
$request = new Models\PutAccessPointPolicyRequest('bucket-123', 'ap-01', '{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["27737962156157xxxx"],"Resource":["acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01","acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01/object/*"]}]}');
$input = AccessPoint::fromPutAccessPointPolicy($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["27737962156157xxxx"],"Resource":["acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01","acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01/object/*"]}]}', $input->getBody()->getContents());
}
public function testToPutAccessPointPolicy()
{
// empty output
$output = new OperationOutput();
$result = AccessPoint::toPutAccessPointPolicy($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
);
$result = AccessPoint::toPutAccessPointPolicy($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetAccessPointPolicy()
{
// miss required field
try {
$request = new Models\GetAccessPointPolicyRequest();
$input = AccessPoint::fromGetAccessPointPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\GetAccessPointPolicyRequest('bucket-123');
$input = AccessPoint::fromGetAccessPointPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, accessPointName", (string)$e);
}
$request = new Models\GetAccessPointPolicyRequest('bucket-123', 'ap-01');
$input = AccessPoint::fromGetAccessPointPolicy($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('ap-01', $input->getHeaders()['x-oss-access-point-name']);
}
public function testToGetAccessPointPolicy()
{
// empty output
$output = new OperationOutput();
$result = AccessPoint::toGetAccessPointPolicy($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["27737962156157xxxx"],"Resource":["acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01","acs:oss:cn-hangzhou:111933544165xxxx:accesspoint/ap-01/object/*"]}]}';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/json'],
body: Utils::streamFor($body)
);
$result = AccessPoint::toGetAccessPointPolicy($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/json', $result->headers['content-type']);
$this->assertEquals($body, $result->body);
}
public function testFromDeleteAccessPointPolicy()
{
// miss required field
try {
$request = new Models\DeleteAccessPointPolicyRequest();
$input = AccessPoint::fromDeleteAccessPointPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DeleteAccessPointPolicyRequest('bucket-123');
$input = AccessPoint::fromDeleteAccessPointPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, accessPointName", (string)$e);
}
$request = new Models\DeleteAccessPointPolicyRequest('bucket-123', 'ap-01');
$input = AccessPoint::fromDeleteAccessPointPolicy($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('ap-01', $input->getHeaders()['x-oss-access-point-name']);
}
public function testToDeleteAccessPointPolicy()
{
// empty output
$output = new OperationOutput();
$result = AccessPoint::toDeleteAccessPointPolicy($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123'],
);
$result = AccessPoint::toDeleteAccessPointPolicy($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,115 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketAccessMonitor;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketAccessMonitorTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketAccessMonitor()
{
// miss required field
try {
$request = new Models\PutBucketAccessMonitorRequest();
$input = BucketAccessMonitor::fromPutBucketAccessMonitor($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketAccessMonitorRequest('bucket-123');
$input = BucketAccessMonitor::fromPutBucketAccessMonitor($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, accessMonitorConfiguration", (string)$e);
}
$request = new Models\PutBucketAccessMonitorRequest('bucket-123', new Models\AccessMonitorConfiguration(
status: Models\AccessMonitorStatusType::ENABLED
));
$input = BucketAccessMonitor::fromPutBucketAccessMonitor($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><AccessMonitorConfiguration><Status>Enabled</Status></AccessMonitorConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketAccessMonitor()
{
// empty output
$output = new OperationOutput();
$result = BucketAccessMonitor::toPutBucketAccessMonitor($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketAccessMonitor::toPutBucketAccessMonitor($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketAccessMonitor()
{
// miss required field
try {
$request = new Models\GetBucketAccessMonitorRequest();
$input = BucketAccessMonitor::fromGetBucketAccessMonitor($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketAccessMonitorRequest('bucket-123');
$input = BucketAccessMonitor::fromGetBucketAccessMonitor($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketAccessMonitor()
{
// empty output
$output = new OperationOutput();
$result = BucketAccessMonitor::toGetBucketAccessMonitor($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<AccessMonitorConfiguration>
<Status>Enabled</Status>
</AccessMonitorConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketAccessMonitor::toGetBucketAccessMonitor($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(Models\AccessMonitorStatusType::ENABLED, $result->accessMonitorConfiguration->status);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,133 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketArchiveDirectRead;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketArchiveDirectReadTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketArchiveDirectRead()
{
// miss required field
try {
$request = new Models\PutBucketArchiveDirectReadRequest();
$input = BucketArchiveDirectRead::fromPutBucketArchiveDirectRead($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketArchiveDirectReadRequest('bucket-123');
$input = BucketArchiveDirectRead::fromPutBucketArchiveDirectRead($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, archiveDirectReadConfiguration", (string)$e);
}
$request = new Models\PutBucketArchiveDirectReadRequest('bucket-123', new Models\ArchiveDirectReadConfiguration(
true
));
$input = BucketArchiveDirectRead::fromPutBucketArchiveDirectRead($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ArchiveDirectReadConfiguration><Enabled>true</Enabled></ArchiveDirectReadConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketArchiveDirectRead()
{
// empty output
$output = new OperationOutput();
$result = BucketArchiveDirectRead::toPutBucketArchiveDirectRead($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketArchiveDirectRead::toPutBucketArchiveDirectRead($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketArchiveDirectRead()
{
// miss required field
try {
$request = new Models\GetBucketArchiveDirectReadRequest();
$input = BucketArchiveDirectRead::fromGetBucketArchiveDirectRead($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketArchiveDirectReadRequest('bucket-123');
$input = BucketArchiveDirectRead::fromGetBucketArchiveDirectRead($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketArchiveDirectRead()
{
// empty output
$output = new OperationOutput();
$result = BucketArchiveDirectRead::toGetBucketArchiveDirectRead($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ArchiveDirectReadConfiguration>
<Enabled>true</Enabled>
</ArchiveDirectReadConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketArchiveDirectRead::toGetBucketArchiveDirectRead($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertTrue($result->archiveDirectReadConfiguration->enabled);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ArchiveDirectReadConfiguration>
<Enabled>false</Enabled>
</ArchiveDirectReadConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketArchiveDirectRead::toGetBucketArchiveDirectRead($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertFalse($result->archiveDirectReadConfiguration->enabled);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,377 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketCname;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketCnameTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutCname()
{
// miss required field
try {
$request = new Models\PutCnameRequest();
$input = BucketCname::fromPutCname($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutCnameRequest('bucket-123');
$input = BucketCname::fromPutCname($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucketCnameConfiguration", (string)$e);
}
$request = new Models\PutCnameRequest('bucket-123', new Models\BucketCnameConfiguration(
new Models\Cname(
domain: 'example.com'
)
));
$input = BucketCname::fromPutCname($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketCnameConfiguration><Cname><Domain>example.com</Domain></Cname></BucketCnameConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\PutCnameRequest('bucket-123', new Models\BucketCnameConfiguration(
new Models\Cname(
domain: 'example.com',
certificateConfiguration: new Models\CertificateConfiguration(
force: true,
certId: '493****-cn-hangzhou',
certificate: '-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----',
privateKey: '-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----',
previousCertId: '493****-cn-hangzhou'
)
)
));
$input = BucketCname::fromPutCname($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketCnameConfiguration><Cname><Domain>example.com</Domain><CertificateConfiguration><Force>true</Force><CertId>493****-cn-hangzhou</CertId><Certificate>-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----</Certificate><PrivateKey>-----BEGIN CERTIFICATE----- MIIDhDCCAmwCCQCFs8ixARsyrDANBgkqhkiG9w0BAQsFADCBgzELMAkGA1UEBhMC **** -----END CERTIFICATE-----</PrivateKey><PreviousCertId>493****-cn-hangzhou</PreviousCertId></CertificateConfiguration></Cname></BucketCnameConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\PutCnameRequest('bucket-123', new Models\BucketCnameConfiguration(
new Models\Cname(
domain: 'example.com',
certificateConfiguration: new Models\CertificateConfiguration(
deleteCertificate: true,
)
)
));
$input = BucketCname::fromPutCname($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketCnameConfiguration><Cname><Domain>example.com</Domain><CertificateConfiguration><DeleteCertificate>true</DeleteCertificate></CertificateConfiguration></Cname></BucketCnameConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutCname()
{
// empty output
$output = new OperationOutput();
$result = BucketCname::toPutCname($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketCname::toPutCname($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromCreateCnameToken()
{
// miss required field
try {
$request = new Models\CreateCnameTokenRequest();
$input = BucketCname::fromCreateCnameToken($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\CreateCnameTokenRequest('bucket-123');
$input = BucketCname::fromCreateCnameToken($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucketCnameConfiguration", (string)$e);
}
$request = new Models\CreateCnameTokenRequest('bucket-123', new Models\BucketCnameConfiguration(
new Models\Cname(
domain: 'example.com'
)
));
$input = BucketCname::fromCreateCnameToken($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketCnameConfiguration><Cname><Domain>example.com</Domain></Cname></BucketCnameConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToCreateCnameToken()
{
// empty output
$output = new OperationOutput();
$result = BucketCname::toCreateCnameToken($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor('<?xml version="1.0" encoding="UTF-8"?>
<CnameToken>
<Bucket>bucket</Bucket>
<Cname>example.com</Cname>;
<Token>be1d49d863dea9ffeff3df7d6455****</Token>
<ExpireTime>Wed, 23 Feb 2022 21:16:37 GMT</ExpireTime>
</CnameToken>')
);
$result = BucketCname::toCreateCnameToken($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('bucket', $result->cnameToken->bucket);
$this->assertEquals('example.com', $result->cnameToken->cname);
$this->assertEquals('be1d49d863dea9ffeff3df7d6455****', $result->cnameToken->token);
$this->assertEquals('Wed, 23 Feb 2022 21:16:37 GMT', $result->cnameToken->expireTime);
}
public function testFromGetCnameToken()
{
// miss required field
try {
$request = new Models\GetCnameTokenRequest();
$input = BucketCname::fromGetCnameToken($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\GetCnameTokenRequest('bucket-123');
$input = BucketCname::fromGetCnameToken($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, cname", (string)$e);
}
$request = new Models\GetCnameTokenRequest('bucket-123', 'example.com');
$input = BucketCname::fromGetCnameToken($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('example.com', $input->getParameters()['cname']);
}
public function testToGetCnameToken()
{
// empty output
$output = new OperationOutput();
$result = BucketCname::toGetCnameToken($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor('<?xml version="1.0" encoding="UTF-8"?>
<CnameToken>
<Bucket>bucket</Bucket>
<Cname>example.com</Cname>;
<Token>be1d49d863dea9ffeff3df7d6455****</Token>
<ExpireTime>Wed, 23 Feb 2022 21:16:37 GMT</ExpireTime>
</CnameToken>')
);
$result = BucketCname::toGetCnameToken($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('bucket', $result->cnameToken->bucket);
$this->assertEquals('example.com', $result->cnameToken->cname);
$this->assertEquals('be1d49d863dea9ffeff3df7d6455****', $result->cnameToken->token);
$this->assertEquals('Wed, 23 Feb 2022 21:16:37 GMT', $result->cnameToken->expireTime);
}
public function testFromListCname()
{
// miss required field
try {
$request = new Models\ListCnameRequest();
$input = BucketCname::fromListCname($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\ListCnameRequest('bucket-123');
$input = BucketCname::fromListCname($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToListCname()
{
// empty output
$output = new OperationOutput();
$result = BucketCname::toListCname($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListCnameResult>
<Bucket>bucket</Bucket>
<Owner>owner</Owner>
<Cname>
<Domain>example.com</Domain>
<LastModified>2021-09-15T02:35:07.000Z</LastModified>
<Status>Enabled</Status>
<Certificate>
<Type>CAS</Type>
<CertId>493****-cn-hangzhou</CertId>
<Status>Enabled</Status>
<CreationDate>Wed, 15 Sep 2021 02:35:06 GMT</CreationDate>
<Fingerprint>DE:01:CF:EC:7C:A7:98:CB:D8:6E:FB:1D:97:EB:A9:64:1D:4E:**:**</Fingerprint>
<ValidStartDate>Wed, 12 Apr 2023 10:14:51 GMT</ValidStartDate>
<ValidEndDate>Mon, 4 May 2048 10:14:51 GMT</ValidEndDate>
</Certificate>
</Cname>
<Cname>
<Domain>example.org</Domain>
<LastModified>2021-09-15T02:34:58.000Z</LastModified>
<Status>Enabled</Status>
</Cname>
<Cname>
<Domain>example.edu</Domain>
<LastModified>2021-09-15T02:50:34.000Z</LastModified>
<Status>Enabled</Status>
</Cname>
</ListCnameResult>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketCname::toListCname($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('bucket', $result->bucket);
$this->assertEquals('owner', $result->owner);
$this->assertEquals(3, count($result->cnames));
$this->assertEquals('example.com', $result->cnames[0]->domain);
$this->assertEquals('2021-09-15T02:35:07.000Z', $result->cnames[0]->lastModified);
$this->assertEquals('Enabled', $result->cnames[0]->status);
$this->assertEquals('CAS', $result->cnames[0]->certificate->type);
$this->assertEquals('493****-cn-hangzhou', $result->cnames[0]->certificate->certId);
$this->assertEquals('Enabled', $result->cnames[0]->certificate->status);
$this->assertEquals('Wed, 15 Sep 2021 02:35:06 GMT', $result->cnames[0]->certificate->creationDate);
$this->assertEquals('DE:01:CF:EC:7C:A7:98:CB:D8:6E:FB:1D:97:EB:A9:64:1D:4E:**:**', $result->cnames[0]->certificate->fingerprint);
$this->assertEquals('Wed, 12 Apr 2023 10:14:51 GMT', $result->cnames[0]->certificate->validStartDate);
$this->assertEquals('Mon, 4 May 2048 10:14:51 GMT', $result->cnames[0]->certificate->validEndDate);
$this->assertEquals('example.org', $result->cnames[1]->domain);
$this->assertEquals('2021-09-15T02:34:58.000Z', $result->cnames[1]->lastModified);
$this->assertEquals('Enabled', $result->cnames[1]->status);
$this->assertEquals('example.edu', $result->cnames[2]->domain);
$this->assertEquals('2021-09-15T02:50:34.000Z', $result->cnames[2]->lastModified);
$this->assertEquals('Enabled', $result->cnames[2]->status);
}
public function testFromDeleteCname()
{
// miss required field
try {
$request = new Models\DeleteCnameRequest();
$input = BucketCname::fromDeleteCname($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DeleteCnameRequest('bucket-123');
$input = BucketCname::fromDeleteCname($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucketCnameConfiguration", (string)$e);
}
$request = new Models\DeleteCnameRequest('bucket-123', new Models\BucketCnameConfiguration(
new Models\Cname(
domain: 'example.com'
)
));
$input = BucketCname::fromDeleteCname($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketCnameConfiguration><Cname><Domain>example.com</Domain></Cname></BucketCnameConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToDeleteCname()
{
// empty output
$output = new OperationOutput();
$result = BucketCname::toDeleteCname($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
);
$result = BucketCname::toDeleteCname($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,271 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketCors;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketCorsTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketCors()
{
// miss required field
try {
$request = new Models\PutBucketCorsRequest();
$input = BucketCors::fromPutBucketCors($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketCorsRequest('bucket-123');
$input = BucketCors::fromPutBucketCors($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, corsConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketCorsRequest('bucket-123', new Models\CORSConfiguration(
[
new Models\CORSRule(
allowedHeaders: ['Authorization'],
allowedOrigins: ['*'],
allowedMethods: ['PUT', 'GET']
),
new Models\CORSRule(
allowedHeaders: ['Authorization'],
exposeHeaders: ["x-oss-test", "x-oss-test1"],
maxAgeSeconds: 100,
allowedOrigins: ["http://example.com", "http://example.net"],
allowedMethods: ['GET'],
),
],
responseVary: false
));
$input = BucketCors::fromPutBucketCors($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><CORSConfiguration><CORSRule><AllowedHeader>Authorization</AllowedHeader><AllowedOrigin>*</AllowedOrigin><AllowedMethod>PUT</AllowedMethod><AllowedMethod>GET</AllowedMethod></CORSRule><CORSRule><AllowedHeader>Authorization</AllowedHeader><ExposeHeader>x-oss-test</ExposeHeader><ExposeHeader>x-oss-test1</ExposeHeader><MaxAgeSeconds>100</MaxAgeSeconds><AllowedOrigin>http://example.com</AllowedOrigin><AllowedOrigin>http://example.net</AllowedOrigin><AllowedMethod>GET</AllowedMethod></CORSRule><ResponseVary>false</ResponseVary></CORSConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketCors()
{
// empty output
$output = new OperationOutput();
$result = BucketCors::toPutBucketCors($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketCors::toPutBucketCors($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketCors()
{
// miss required field
try {
$request = new Models\GetBucketCorsRequest();
$input = BucketCors::fromGetBucketCors($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketCorsRequest('bucket-123');
$input = BucketCors::fromGetBucketCors($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketCors()
{
// empty output
$output = new OperationOutput();
$result = BucketCors::toGetBucketCors($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<CORSConfiguration>
<CORSRule>
<AllowedOrigin>*</AllowedOrigin>
<AllowedMethod>PUT</AllowedMethod>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>Authorization</AllowedHeader>
</CORSRule>
<CORSRule>
<AllowedOrigin>http://example.com</AllowedOrigin>
<AllowedOrigin>http://example.net</AllowedOrigin>
<AllowedMethod>GET</AllowedMethod>
<AllowedHeader>Authorization</AllowedHeader>
<ExposeHeader>x-oss-test</ExposeHeader>
<ExposeHeader>x-oss-test1</ExposeHeader>
<MaxAgeSeconds>100</MaxAgeSeconds>
</CORSRule>
<ResponseVary>false</ResponseVary>
</CORSConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketCors::toGetBucketCors($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(2, count($result->corsConfiguration->corsRules));
$this->assertFalse($result->corsConfiguration->responseVary);
$this->assertEquals($result->corsConfiguration->corsRules[0]->allowedOrigins[0], '*');
$this->assertEquals(count($result->corsConfiguration->corsRules[0]->allowedMethods), 2);
$this->assertEquals($result->corsConfiguration->corsRules[0]->allowedMethods[0], 'PUT');
$this->assertEquals($result->corsConfiguration->corsRules[0]->allowedMethods[1], 'GET');
$this->assertEquals(count($result->corsConfiguration->corsRules[0]->allowedHeaders), 1);
$this->assertEquals($result->corsConfiguration->corsRules[0]->allowedHeaders[0], 'Authorization');
$this->assertEquals($result->corsConfiguration->corsRules[1]->allowedOrigins[0], 'http://example.com');
$this->assertEquals($result->corsConfiguration->corsRules[1]->allowedOrigins[1], 'http://example.net');
$this->assertEquals(count($result->corsConfiguration->corsRules[1]->allowedMethods), 1);
$this->assertEquals($result->corsConfiguration->corsRules[1]->allowedMethods[0], 'GET');
$this->assertEquals(count($result->corsConfiguration->corsRules[1]->allowedHeaders), 1);
$this->assertEquals($result->corsConfiguration->corsRules[1]->allowedHeaders[0], 'Authorization');
$this->assertEquals(count($result->corsConfiguration->corsRules[1]->exposeHeaders), 2);
$this->assertEquals($result->corsConfiguration->corsRules[1]->exposeHeaders[0], "x-oss-test");
$this->assertEquals($result->corsConfiguration->corsRules[1]->exposeHeaders[1], "x-oss-test1");
$this->assertEquals($result->corsConfiguration->corsRules[1]->maxAgeSeconds, 100);
}
public function testFromDeleteBucketCors()
{
// miss required field
try {
$request = new Models\DeleteBucketCorsRequest();
$input = BucketCors::fromDeleteBucketCors($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketCorsRequest('bucket-123');
$input = BucketCors::fromDeleteBucketCors($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketCors()
{
// empty output
$output = new OperationOutput();
$result = BucketCors::toDeleteBucketCors($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketCors::toDeleteBucketCors($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromOptionObject()
{
// miss required field
try {
$request = new Models\OptionObjectRequest();
$input = BucketCors::fromOptionObject($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\OptionObjectRequest('bucket-123');
$input = BucketCors::fromOptionObject($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, key", (string)$e);
}
try {
$request = new Models\OptionObjectRequest('bucket-123', 'key-123');
$input = BucketCors::fromOptionObject($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, origin", (string)$e);
}
try {
$request = new Models\OptionObjectRequest('bucket-123', 'key-123', 'http://www.example.com');
$input = BucketCors::fromOptionObject($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, accessControlRequestMethod", (string)$e);
}
$request = new Models\OptionObjectRequest('bucket-123', 'key-123', 'http://www.example.com', 'PUT');
$input = BucketCors::fromOptionObject($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToOptionObject()
{
// empty output
$output = new OperationOutput();
$result = BucketCors::toOptionObject($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'Access-Control-Allow-Origin' => 'http://www.example.com', 'Access-Control-Allow-Methods' => 'PUT', 'Access-Control-Allow-Headers' => 'x-oss-allow', 'Access-Control-Expose-Headers' => 'x-oss-test1,x-oss-test2', 'Access-Control-Max-Age' => "60"]
);
$result = BucketCors::toOptionObject($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(6, count($result->headers));
$this->assertEquals('http://www.example.com', $result->accessControlAllowOrigin);
$this->assertEquals('x-oss-test1,x-oss-test2', $result->accessControlExposeHeaders);
$this->assertEquals('x-oss-allow', $result->accessControlAllowHeaders);
$this->assertEquals('PUT', $result->accessControlAllowMethods);
$this->assertEquals(60, $result->accessControlMaxAge);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,232 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketEncryption;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketEncryptionTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketEncryption()
{
// miss required field
try {
$request = new Models\PutBucketEncryptionRequest();
$input = BucketEncryption::fromPutBucketEncryption($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketEncryptionRequest('bucket-123');
$input = BucketEncryption::fromPutBucketEncryption($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, serverSideEncryptionRule", (string)$e);
}
// demo1
$request = new Models\PutBucketEncryptionRequest('bucket-123', new Models\ServerSideEncryptionRule(
new Models\ApplyServerSideEncryptionByDefault(
sseAlgorithm: 'KMS',
kmsDataEncryption: 'SM4'
)));
$input = BucketEncryption::fromPutBucketEncryption($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>KMS</SSEAlgorithm><KMSDataEncryption>SM4</KMSDataEncryption></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo2
$request = new Models\PutBucketEncryptionRequest('bucket-123', new Models\ServerSideEncryptionRule(
new Models\ApplyServerSideEncryptionByDefault(
sseAlgorithm: 'KMS',
kmsMasterKeyID: '9468da86-3509-4f8d-a61e-6eab1eac****',
kmsDataEncryption: 'SM4'
)));
$input = BucketEncryption::fromPutBucketEncryption($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>KMS</SSEAlgorithm><KMSMasterKeyID>9468da86-3509-4f8d-a61e-6eab1eac****</KMSMasterKeyID><KMSDataEncryption>SM4</KMSDataEncryption></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo3
$request = new Models\PutBucketEncryptionRequest('bucket-123', new Models\ServerSideEncryptionRule(
new Models\ApplyServerSideEncryptionByDefault(
sseAlgorithm: 'AES256',
)));
$input = BucketEncryption::fromPutBucketEncryption($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ServerSideEncryptionRule><ApplyServerSideEncryptionByDefault><SSEAlgorithm>AES256</SSEAlgorithm></ApplyServerSideEncryptionByDefault></ServerSideEncryptionRule>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketEncryption()
{
// empty output
$output = new OperationOutput();
$result = BucketEncryption::toPutBucketEncryption($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketEncryption::toPutBucketEncryption($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketEncryption()
{
// miss required field
try {
$request = new Models\GetBucketEncryptionRequest();
$input = BucketEncryption::fromGetBucketEncryption($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketEncryptionRequest('bucket-123');
$input = BucketEncryption::fromGetBucketEncryption($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketEncryption()
{
// empty output
$output = new OperationOutput();
$result = BucketEncryption::toGetBucketEncryption($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ServerSideEncryptionRule>
<ApplyServerSideEncryptionByDefault>
<SSEAlgorithm>KMS</SSEAlgorithm>
<KMSMasterKeyID>9468da86-3509-4f8d-a61e-6eab1eac****</KMSMasterKeyID>
</ApplyServerSideEncryptionByDefault>
</ServerSideEncryptionRule>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketEncryption::toGetBucketEncryption($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('9468da86-3509-4f8d-a61e-6eab1eac****', $result->serverSideEncryptionRule->applyServerSideEncryptionByDefault->kmsMasterKeyID);
$this->assertEquals('KMS', $result->serverSideEncryptionRule->applyServerSideEncryptionByDefault->sseAlgorithm);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ServerSideEncryptionRule>
<ApplyServerSideEncryptionByDefault>
<SSEAlgorithm>KMS</SSEAlgorithm>
<KMSDataEncryption>SM4</KMSDataEncryption>
<KMSMasterKeyID>9468da86-3509-4f8d-a61e-6eab1eac****</KMSMasterKeyID>
</ApplyServerSideEncryptionByDefault>
</ServerSideEncryptionRule>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketEncryption::toGetBucketEncryption($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('9468da86-3509-4f8d-a61e-6eab1eac****', $result->serverSideEncryptionRule->applyServerSideEncryptionByDefault->kmsMasterKeyID);
$this->assertEquals('KMS', $result->serverSideEncryptionRule->applyServerSideEncryptionByDefault->sseAlgorithm);
$this->assertEquals('SM4', $result->serverSideEncryptionRule->applyServerSideEncryptionByDefault->kmsDataEncryption);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ServerSideEncryptionRule>
<ApplyServerSideEncryptionByDefault>
<SSEAlgorithm>AES256</SSEAlgorithm>
</ApplyServerSideEncryptionByDefault>
</ServerSideEncryptionRule>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketEncryption::toGetBucketEncryption($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('AES256', $result->serverSideEncryptionRule->applyServerSideEncryptionByDefault->sseAlgorithm);
}
public function testFromDeleteBucketEncryption()
{
// miss required field
try {
$request = new Models\DeleteBucketEncryptionRequest();
$input = BucketEncryption::fromDeleteBucketEncryption($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketEncryptionRequest('bucket-123');
$input = BucketEncryption::fromDeleteBucketEncryption($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketEncryption()
{
// empty output
$output = new OperationOutput();
$result = BucketEncryption::toDeleteBucketEncryption($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketEncryption::toDeleteBucketEncryption($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,177 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketHttpsConfig;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketHttpsConfigTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketHttpsConfig()
{
// miss required field
try {
$request = new Models\PutBucketHttpsConfigRequest();
$input = BucketHttpsConfig::fromPutBucketHttpsConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketHttpsConfigRequest('bucket-123');
$input = BucketHttpsConfig::fromPutBucketHttpsConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, httpsConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketHttpsConfigRequest('bucket-123', new Models\HttpsConfiguration(
tls: new Models\TLS(
tlsVersions: ['TLSv1.2', 'TLSv1.3'],
enable: true
)
));
$input = BucketHttpsConfig::fromPutBucketHttpsConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><HttpsConfiguration><TLS><TLSVersion>TLSv1.2</TLSVersion><TLSVersion>TLSv1.3</TLSVersion><Enable>true</Enable></TLS></HttpsConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo2
$request = new Models\PutBucketHttpsConfigRequest('bucket-123', new Models\HttpsConfiguration(
tls: new Models\TLS(
tlsVersions: ['TLSv1.2', 'TLSv1.3'],
enable: true
),
cipherSuite: new Models\CipherSuite(
enable: true,
strongCipherSuite: false,
customCipherSuites: ['ECDHE-ECDSA-AES128-SHA256', 'ECDHE-RSA-AES128-GCM-SHA256', 'ECDHE-ECDSA-AES256-CCM8'],
tls13CustomCipherSuites: ['ECDHE-ECDSA-AES256-CCM8', 'ECDHE-ECDSA-AES256-CCM8', 'ECDHE-ECDSA-AES256-CCM8'],
)
));
$input = BucketHttpsConfig::fromPutBucketHttpsConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><HttpsConfiguration><TLS><TLSVersion>TLSv1.2</TLSVersion><TLSVersion>TLSv1.3</TLSVersion><Enable>true</Enable></TLS><CipherSuite><Enable>true</Enable><StrongCipherSuite>false</StrongCipherSuite><CustomCipherSuite>ECDHE-ECDSA-AES128-SHA256</CustomCipherSuite><CustomCipherSuite>ECDHE-RSA-AES128-GCM-SHA256</CustomCipherSuite><CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</CustomCipherSuite><TLS13CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</TLS13CustomCipherSuite><TLS13CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</TLS13CustomCipherSuite><TLS13CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</TLS13CustomCipherSuite></CipherSuite></HttpsConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketHttpsConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketHttpsConfig::toPutBucketHttpsConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketHttpsConfig::toPutBucketHttpsConfig($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketHttpsConfig()
{
// miss required field
try {
$request = new Models\GetBucketHttpsConfigRequest();
$input = BucketHttpsConfig::fromGetBucketHttpsConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketHttpsConfigRequest('bucket-123');
$input = BucketHttpsConfig::fromGetBucketHttpsConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketHttpsConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketHttpsConfig::toGetBucketHttpsConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<HttpsConfiguration>
<TLS>
<Enable>true</Enable>
<TLSVersion>TLSv1.2</TLSVersion>
<TLSVersion>TLSv1.3</TLSVersion>
</TLS>
</HttpsConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketHttpsConfig::toGetBucketHttpsConfig($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertTrue($result->httpsConfiguration->tls->enable);
$this->assertEquals(2, count($result->httpsConfiguration->tls->tlsVersions));
$this->assertEquals("TLSv1.2", $result->httpsConfiguration->tls->tlsVersions[0]);
$this->assertEquals("TLSv1.3", $result->httpsConfiguration->tls->tlsVersions[1]);
$body = '<?xml version="1.0" encoding="UTF-8"?><HttpsConfiguration><TLS><TLSVersion>TLSv1.2</TLSVersion><TLSVersion>TLSv1.3</TLSVersion><Enable>true</Enable></TLS><CipherSuite><Enable>true</Enable><StrongCipherSuite>false</StrongCipherSuite><CustomCipherSuite>ECDHE-ECDSA-AES128-SHA256</CustomCipherSuite><CustomCipherSuite>ECDHE-RSA-AES128-GCM-SHA256</CustomCipherSuite><CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</CustomCipherSuite><TLS13CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</TLS13CustomCipherSuite><TLS13CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</TLS13CustomCipherSuite><TLS13CustomCipherSuite>ECDHE-ECDSA-AES256-CCM8</TLS13CustomCipherSuite></CipherSuite></HttpsConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketHttpsConfig::toGetBucketHttpsConfig($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertTrue($result->httpsConfiguration->tls->enable);
$this->assertEquals(2, count($result->httpsConfiguration->tls->tlsVersions));
$this->assertEquals("TLSv1.2", $result->httpsConfiguration->tls->tlsVersions[0]);
$this->assertEquals("TLSv1.3", $result->httpsConfiguration->tls->tlsVersions[1]);
$this->assertTrue($result->httpsConfiguration->cipherSuite->enable);
$this->assertFalse($result->httpsConfiguration->cipherSuite->strongCipherSuite);
$this->assertEquals(3, count($result->httpsConfiguration->cipherSuite->customCipherSuites));
$this->assertEquals('ECDHE-ECDSA-AES128-SHA256', $result->httpsConfiguration->cipherSuite->customCipherSuites[0]);
$this->assertEquals('ECDHE-RSA-AES128-GCM-SHA256', $result->httpsConfiguration->cipherSuite->customCipherSuites[1]);
$this->assertEquals('ECDHE-ECDSA-AES256-CCM8', $result->httpsConfiguration->cipherSuite->customCipherSuites[2]);
$this->assertEquals(3, count($result->httpsConfiguration->cipherSuite->tls13CustomCipherSuites));
$this->assertEquals('ECDHE-ECDSA-AES256-CCM8', $result->httpsConfiguration->cipherSuite->tls13CustomCipherSuites[0]);
$this->assertEquals('ECDHE-ECDSA-AES256-CCM8', $result->httpsConfiguration->cipherSuite->tls13CustomCipherSuites[1]);
$this->assertEquals('ECDHE-ECDSA-AES256-CCM8', $result->httpsConfiguration->cipherSuite->tls13CustomCipherSuites[2]);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,497 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketInventory;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketInventoryTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketInventory()
{
// miss required field
try {
$request = new Models\PutBucketInventoryRequest();
$input = BucketInventory::fromPutBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketInventoryRequest('bucket-123');
$input = BucketInventory::fromPutBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, inventoryId", (string)$e);
}
try {
$request = new Models\PutBucketInventoryRequest('bucket-123', 'inventory-id');
$input = BucketInventory::fromPutBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, inventoryConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketInventoryRequest('bucket-123', 'report1', inventoryConfiguration: new Models\InventoryConfiguration(
isEnabled: true,
destination: new Models\InventoryDestination(
ossBucketDestination: new Models\InventoryOSSBucketDestination(
bucket: 'acs:oss:::destination-bucket',
prefix: 'prefix1',
encryption: new Models\InventoryEncryption(
sseKms: new Models\SSEKMS('keyId')
),
format: Models\InventoryFormatType::CSV,
accountId: '1000000000000000', roleArn: 'acs:ram::1000000000000000:role/AliyunOSSRole'
)
),
filter: new Models\InventoryFilter(
prefix: 'filterPrefix',
lastModifyBeginTimeStamp: 1637883649,
lastModifyEndTimeStamp: 1638347592,
lowerSizeBound: 1024,
upperSizeBound: 1048576,
storageClass: 'Standard,IA'
),
includedObjectVersions: 'All',
optionalFields: new Models\OptionalFields(
[
Models\InventoryOptionalFieldType::SIZE,
Models\InventoryOptionalFieldType::LAST_MODIFIED_DATE,
Models\InventoryOptionalFieldType::ETAG,
Models\InventoryOptionalFieldType::STORAGE_CLASS,
Models\InventoryOptionalFieldType::IS_MULTIPART_UPLOADED,
Models\InventoryOptionalFieldType::ENCRYPTION_STATUS,
Models\InventoryOptionalFieldType::TRANSITION_TIME,
]
),
id: 'report1'
));
$input = BucketInventory::fromPutBucketInventory($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><InventoryConfiguration><IsEnabled>true</IsEnabled><Destination><OSSBucketDestination><Bucket>acs:oss:::destination-bucket</Bucket><Prefix>prefix1</Prefix><Encryption><SSE-KMS><KeyId>keyId</KeyId></SSE-KMS></Encryption><Format>CSV</Format><AccountId>1000000000000000</AccountId><RoleArn>acs:ram::1000000000000000:role/AliyunOSSRole</RoleArn></OSSBucketDestination></Destination><Filter><Prefix>filterPrefix</Prefix><LastModifyBeginTimeStamp>1637883649</LastModifyBeginTimeStamp><LastModifyEndTimeStamp>1638347592</LastModifyEndTimeStamp><LowerSizeBound>1024</LowerSizeBound><UpperSizeBound>1048576</UpperSizeBound><StorageClass>Standard,IA</StorageClass></Filter><IncludedObjectVersions>All</IncludedObjectVersions><OptionalFields><Field>Size</Field><Field>LastModifiedDate</Field><Field>ETag</Field><Field>StorageClass</Field><Field>IsMultipartUploaded</Field><Field>EncryptionStatus</Field><Field>TransitionTime</Field></OptionalFields><Id>report1</Id></InventoryConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo2
$request = new Models\PutBucketInventoryRequest('bucket-123', 'report1', inventoryConfiguration: new Models\InventoryConfiguration(
isEnabled: true,
destination: new Models\InventoryDestination(
ossBucketDestination: new Models\InventoryOSSBucketDestination(
bucket: 'acs:oss:::destination-bucket',
format: Models\InventoryFormatType::CSV,
accountId: '1000000000000000',
roleArn: 'acs:ram::1000000000000000:role/AliyunOSSRole'
)
),
schedule: new Models\InventorySchedule(
frequency: Models\InventoryFrequencyType::DAILY
),
filter: new Models\InventoryFilter(
prefix: 'filterPrefix',
lastModifyBeginTimeStamp: 1637883649,
lastModifyEndTimeStamp: 1638347592,
lowerSizeBound: 1024,
upperSizeBound: 1048576,
storageClass: 'Standard,IA'
),
includedObjectVersions: 'All',
id: 'report1'
));
$input = BucketInventory::fromPutBucketInventory($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><InventoryConfiguration><IsEnabled>true</IsEnabled><Destination><OSSBucketDestination><Bucket>acs:oss:::destination-bucket</Bucket><Format>CSV</Format><AccountId>1000000000000000</AccountId><RoleArn>acs:ram::1000000000000000:role/AliyunOSSRole</RoleArn></OSSBucketDestination></Destination><Schedule><Frequency>Daily</Frequency></Schedule><Filter><Prefix>filterPrefix</Prefix><LastModifyBeginTimeStamp>1637883649</LastModifyBeginTimeStamp><LastModifyEndTimeStamp>1638347592</LastModifyEndTimeStamp><LowerSizeBound>1024</LowerSizeBound><UpperSizeBound>1048576</UpperSizeBound><StorageClass>Standard,IA</StorageClass></Filter><IncludedObjectVersions>All</IncludedObjectVersions><Id>report1</Id></InventoryConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketInventory()
{
// empty output
$output = new OperationOutput();
$result = BucketInventory::toPutBucketInventory($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketInventory::toPutBucketInventory($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketInventory()
{
// miss required field
try {
$request = new Models\GetBucketInventoryRequest();
$input = BucketInventory::fromGetBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\GetBucketInventoryRequest('bucket-123');
$input = BucketInventory::fromGetBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, inventoryId", (string)$e);
}
$request = new Models\GetBucketInventoryRequest('bucket-123', 'inventoryId');
$input = BucketInventory::fromGetBucketInventory($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketInventory()
{
// empty output
$output = new OperationOutput();
$result = BucketInventory::toGetBucketInventory($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<InventoryConfiguration>
<Id>report1</Id>
<IsEnabled>true</IsEnabled>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>1000000000000000</AccountId>
<RoleArn>acs:ram::1000000000000000:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::bucket_0001</Bucket>
<Prefix>prefix1</Prefix>
<Encryption>
<SSE-KMS>
<KeyId>keyId</KeyId>
</SSE-KMS>
</Encryption>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Daily</Frequency>
</Schedule>
<Filter>
<LastModifyBeginTimeStamp>1637883649</LastModifyBeginTimeStamp>
<LastModifyEndTimeStamp>1638347592</LastModifyEndTimeStamp>
<LowerSizeBound>1024</LowerSizeBound>
<UpperSizeBound>1048576</UpperSizeBound>
<StorageClass>Standard,IA</StorageClass>
<Prefix>myprefix/</Prefix>
</Filter>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
<Field>IsMultipartUploaded</Field>
<Field>EncryptionStatus</Field>
<Field>TransitionTime</Field>
</OptionalFields>
</InventoryConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketInventory::toGetBucketInventory($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('report1', $result->inventoryConfiguration->id);
$this->assertTrue($result->inventoryConfiguration->isEnabled);
$this->assertEquals(Models\InventoryFormatType::CSV, $result->inventoryConfiguration->destination->ossBucketDestination->format);
$this->assertEquals('1000000000000000', $result->inventoryConfiguration->destination->ossBucketDestination->accountId);
$this->assertEquals('acs:ram::1000000000000000:role/AliyunOSSRole', $result->inventoryConfiguration->destination->ossBucketDestination->roleArn);
$this->assertEquals('acs:oss:::bucket_0001', $result->inventoryConfiguration->destination->ossBucketDestination->bucket);
$this->assertEquals('prefix1', $result->inventoryConfiguration->destination->ossBucketDestination->prefix);
$this->assertEquals('keyId', $result->inventoryConfiguration->destination->ossBucketDestination->encryption->sseKms->keyId);
$this->assertEquals(Models\InventoryFrequencyType::DAILY, $result->inventoryConfiguration->schedule->frequency);
$this->assertEquals('All', $result->inventoryConfiguration->includedObjectVersions);
$this->assertEquals(7, count($result->inventoryConfiguration->optionalFields->fields));
$this->assertEquals(Models\InventoryOptionalFieldType::STORAGE_CLASS, $result->inventoryConfiguration->optionalFields->fields[3]);
$this->assertEquals(Models\InventoryOptionalFieldType::TRANSITION_TIME, $result->inventoryConfiguration->optionalFields->fields[6]);
$this->assertEquals('myprefix/', $result->inventoryConfiguration->filter->prefix);
$this->assertEquals(1637883649, $result->inventoryConfiguration->filter->lastModifyBeginTimeStamp);
$this->assertEquals(1638347592, $result->inventoryConfiguration->filter->lastModifyEndTimeStamp);
$this->assertEquals(1024, $result->inventoryConfiguration->filter->lowerSizeBound);
$this->assertEquals(1048576, $result->inventoryConfiguration->filter->upperSizeBound);
$this->assertEquals('Standard,IA', $result->inventoryConfiguration->filter->storageClass);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<InventoryConfiguration>
<Id>report1</Id>
<IsEnabled>true</IsEnabled>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>1000000000000000</AccountId>
<RoleArn>acs:ram::1000000000000000:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::destination-bucket</Bucket>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Weekly</Frequency>
</Schedule>
<IncludedObjectVersions>Current</IncludedObjectVersions>
</InventoryConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketInventory::toGetBucketInventory($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('report1', $result->inventoryConfiguration->id);
$this->assertTrue($result->inventoryConfiguration->isEnabled);
$this->assertEquals(Models\InventoryFormatType::CSV, $result->inventoryConfiguration->destination->ossBucketDestination->format);
$this->assertEquals('1000000000000000', $result->inventoryConfiguration->destination->ossBucketDestination->accountId);
$this->assertEquals('acs:ram::1000000000000000:role/AliyunOSSRole', $result->inventoryConfiguration->destination->ossBucketDestination->roleArn);
$this->assertEquals('acs:oss:::destination-bucket', $result->inventoryConfiguration->destination->ossBucketDestination->bucket);
$this->assertEquals(Models\InventoryFrequencyType::WEEKLY, $result->inventoryConfiguration->schedule->frequency);
$this->assertEquals('Current', $result->inventoryConfiguration->includedObjectVersions);
}
public function testFromListBucketInventory()
{
// miss required field
try {
$request = new Models\ListBucketInventoryRequest();
$input = BucketInventory::fromListBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\ListBucketInventoryRequest('bucket-123');
$input = BucketInventory::fromListBucketInventory($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$request = new Models\ListBucketInventoryRequest('bucket-123', 'token');
$input = BucketInventory::fromListBucketInventory($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('token', $input->getParameters()['continuation-token']);
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToListBucketInventory()
{
// empty output
$output = new OperationOutput();
$result = BucketInventory::toListBucketInventory($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListInventoryConfigurationsResult>
<InventoryConfiguration>
<Id>report1</Id>
<IsEnabled>true</IsEnabled>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>1000000000000000</AccountId>
<RoleArn>acs:ram::1000000000000000:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::destination-bucket</Bucket>
<Prefix>prefix1</Prefix>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Daily</Frequency>
</Schedule>
<Filter>
<Prefix>prefix/One</Prefix>
</Filter>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
<Field>IsMultipartUploaded</Field>
<Field>EncryptionStatus</Field>
</OptionalFields>
</InventoryConfiguration>
<InventoryConfiguration>
<Id>report2</Id>
<IsEnabled>true</IsEnabled>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>1000000000000000</AccountId>
<RoleArn>acs:ram::1000000000000000:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::destination-bucket</Bucket>
<Prefix>prefix2</Prefix>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Daily</Frequency>
</Schedule>
<Filter>
<Prefix>prefix/Two</Prefix>
</Filter>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
<Field>IsMultipartUploaded</Field>
<Field>EncryptionStatus</Field>
</OptionalFields>
</InventoryConfiguration>
<InventoryConfiguration>
<Id>report3</Id>
<IsEnabled>true</IsEnabled>
<Destination>
<OSSBucketDestination>
<Format>CSV</Format>
<AccountId>1000000000000000</AccountId>
<RoleArn>acs:ram::1000000000000000:role/AliyunOSSRole</RoleArn>
<Bucket>acs:oss:::destination-bucket</Bucket>
<Prefix>prefix3</Prefix>
</OSSBucketDestination>
</Destination>
<Schedule>
<Frequency>Daily</Frequency>
</Schedule>
<Filter>
<Prefix>prefix/Three</Prefix>
</Filter>
<IncludedObjectVersions>All</IncludedObjectVersions>
<OptionalFields>
<Field>Size</Field>
<Field>LastModifiedDate</Field>
<Field>ETag</Field>
<Field>StorageClass</Field>
<Field>IsMultipartUploaded</Field>
<Field>EncryptionStatus</Field>
</OptionalFields>
</InventoryConfiguration>
<IsTruncated>false</IsTruncated>
</ListInventoryConfigurationsResult>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketInventory::toListBucketInventory($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(3, count($result->listInventoryConfigurationsResult->inventoryConfigurations));
$this->assertEquals('report1', $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->id);
$this->assertTrue($result->listInventoryConfigurationsResult->inventoryConfigurations[0]->isEnabled);
$this->assertEquals(Models\InventoryFormatType::CSV, $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->destination->ossBucketDestination->format);
$this->assertEquals('1000000000000000', $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->destination->ossBucketDestination->accountId);
$this->assertEquals('acs:ram::1000000000000000:role/AliyunOSSRole', $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->destination->ossBucketDestination->roleArn);
$this->assertEquals('acs:oss:::destination-bucket', $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->destination->ossBucketDestination->bucket);
$this->assertEquals('prefix1', $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->destination->ossBucketDestination->prefix);
$this->assertEquals(Models\InventoryFrequencyType::DAILY, $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->schedule->frequency);
$this->assertEquals('All', $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->includedObjectVersions);
$this->assertEquals(6, count($result->listInventoryConfigurationsResult->inventoryConfigurations[0]->optionalFields->fields));
$this->assertEquals(Models\InventoryOptionalFieldType::STORAGE_CLASS, $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->optionalFields->fields[3]);
$this->assertEquals('prefix/One', $result->listInventoryConfigurationsResult->inventoryConfigurations[0]->filter->prefix);
$this->assertEquals('report2', $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->id);
$this->assertTrue($result->listInventoryConfigurationsResult->inventoryConfigurations[1]->isEnabled);
$this->assertEquals(Models\InventoryFormatType::CSV, $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->destination->ossBucketDestination->format);
$this->assertEquals('1000000000000000', $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->destination->ossBucketDestination->accountId);
$this->assertEquals('acs:ram::1000000000000000:role/AliyunOSSRole', $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->destination->ossBucketDestination->roleArn);
$this->assertEquals('acs:oss:::destination-bucket', $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->destination->ossBucketDestination->bucket);
$this->assertEquals('prefix2', $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->destination->ossBucketDestination->prefix);
$this->assertEquals(Models\InventoryFrequencyType::DAILY, $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->schedule->frequency);
$this->assertEquals('All', $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->includedObjectVersions);
$this->assertEquals(6, count($result->listInventoryConfigurationsResult->inventoryConfigurations[1]->optionalFields->fields));
$this->assertEquals(Models\InventoryOptionalFieldType::STORAGE_CLASS, $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->optionalFields->fields[3]);
$this->assertEquals('prefix/Two', $result->listInventoryConfigurationsResult->inventoryConfigurations[1]->filter->prefix);
$this->assertFalse($result->listInventoryConfigurationsResult->isTruncated);
}
public function testFromDeleteBucketInventory()
{
// miss required field
try {
$request = new Models\DeleteBucketInventoryRequest();
$input = BucketInventory::fromDeleteBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DeleteBucketInventoryRequest('bucket-123');
$input = BucketInventory::fromDeleteBucketInventory($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, inventoryId", (string)$e);
}
$request = new Models\DeleteBucketInventoryRequest('bucket-123', 'inventoryId');
$input = BucketInventory::fromDeleteBucketInventory($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketInventory()
{
// empty output
$output = new OperationOutput();
$result = BucketInventory::toDeleteBucketInventory($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketInventory::toDeleteBucketInventory($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,538 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Models\NoncurrentVersionTransition;
use AlibabaCloud\Oss\V2\Transform\BucketLifecycle;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
use DateTime;
use DateTimeZone;
class BucketLifecycleTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketLifecycle()
{
// miss required field
try {
$request = new Models\PutBucketLifecycleRequest();
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, lifecycleConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(prefix: '', id: 'rule', expiration: new Models\LifecycleRuleExpiration(expiredObjectDeleteMarker: true), noncurrentVersionExpiration: new Models\NoncurrentVersionExpiration(noncurrentDays: 5), status: 'Enabled');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix></Prefix><ID>rule</ID><Expiration><ExpiredObjectDeleteMarker>true</ExpiredObjectDeleteMarker></Expiration><NoncurrentVersionExpiration><NoncurrentDays>5</NoncurrentDays></NoncurrentVersionExpiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo2
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(prefix: 'log/', id: 'rule', expiration: new Models\LifecycleRuleExpiration(days: 90), status: 'Enabled');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix>log/</Prefix><ID>rule</ID><Expiration><Days>90</Days></Expiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo3
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(prefix: 'log/', transitions: array(
new Models\LifecycleRuleTransition(days: 30, storageClass: 'IA'),
new Models\LifecycleRuleTransition(days: 60, storageClass: 'Archive'),
), id: 'rule', expiration: new Models\LifecycleRuleExpiration(days: 3600), status: 'Enabled');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix>log/</Prefix><Transition><Days>30</Days><StorageClass>IA</StorageClass></Transition><Transition><Days>60</Days><StorageClass>Archive</StorageClass></Transition><ID>rule</ID><Expiration><Days>3600</Days></Expiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo4
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(prefix: '', id: 'rule', expiration: new Models\LifecycleRuleExpiration(expiredObjectDeleteMarker: true), noncurrentVersionExpiration: new Models\NoncurrentVersionExpiration(noncurrentDays: 5), status: 'Enabled');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix></Prefix><ID>rule</ID><Expiration><ExpiredObjectDeleteMarker>true</ExpiredObjectDeleteMarker></Expiration><NoncurrentVersionExpiration><NoncurrentDays>5</NoncurrentDays></NoncurrentVersionExpiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo5
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(prefix: '', transitions: array(
new Models\LifecycleRuleTransition(days: 30, storageClass: 'Archive'),
), filter: new Models\LifecycleRuleFilter(nots: array(new Models\LifecycleRuleNot(tag: new Models\Tag(key: 'key1', value: 'value1'), prefix: 'log')
)), id: 'rule', expiration: new Models\LifecycleRuleExpiration(expiredObjectDeleteMarker: true), noncurrentVersionExpiration: new Models\NoncurrentVersionExpiration(noncurrentDays: 5), status: 'Enabled');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix></Prefix><Transition><Days>30</Days><StorageClass>Archive</StorageClass></Transition><Filter><Not><Tag><Key>key1</Key><Value>value1</Value></Tag><Prefix>log</Prefix></Not></Filter><ID>rule</ID><Expiration><ExpiredObjectDeleteMarker>true</ExpiredObjectDeleteMarker></Expiration><NoncurrentVersionExpiration><NoncurrentDays>5</NoncurrentDays></NoncurrentVersionExpiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(
prefix: '',
transitions: array(
new Models\LifecycleRuleTransition(days: 30, storageClass: 'Archive'),
),
filter: new Models\LifecycleRuleFilter(
nots: array(
new Models\LifecycleRuleNot(tag: new Models\Tag(key: 'key1', value: 'value1'), prefix: 'log'),
new Models\LifecycleRuleNot(tag: new Models\Tag(key: 'key2', value: 'value2'), prefix: 'pre')
)),
id: 'rule',
expiration: new Models\LifecycleRuleExpiration(expiredObjectDeleteMarker: true),
noncurrentVersionExpiration: new Models\NoncurrentVersionExpiration(noncurrentDays: 5),
status: 'Enabled'
);
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix></Prefix><Transition><Days>30</Days><StorageClass>Archive</StorageClass></Transition><Filter><Not><Tag><Key>key1</Key><Value>value1</Value></Tag><Prefix>log</Prefix></Not><Not><Tag><Key>key2</Key><Value>value2</Value></Tag><Prefix>pre</Prefix></Not></Filter><ID>rule</ID><Expiration><ExpiredObjectDeleteMarker>true</ExpiredObjectDeleteMarker></Expiration><NoncurrentVersionExpiration><NoncurrentDays>5</NoncurrentDays></NoncurrentVersionExpiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo6
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(prefix: '', transitions: array(
new Models\LifecycleRuleTransition(days: 30, storageClass: 'Archive', isAccessTime: true, returnToStdWhenVisit: true),
), status: 'Enabled');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix></Prefix><Transition><Days>30</Days><StorageClass>Archive</StorageClass><IsAccessTime>true</IsAccessTime><ReturnToStdWhenVisit>true</ReturnToStdWhenVisit></Transition><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo7
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$rule = new Models\LifecycleRule(prefix: '', id: 'rule', abortMultipartUpload: new Models\LifecycleRuleAbortMultipartUpload(days: 30), status: 'Enabled');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
$rule
)
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix></Prefix><ID>rule</ID><AbortMultipartUpload><Days>30</Days></AbortMultipartUpload><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo8
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
new Models\LifecycleRule(prefix: 'dir1', id: 'rule1', expiration: new Models\LifecycleRuleExpiration(days: 180), status: 'Enabled'),
new Models\LifecycleRule(prefix: 'dir1/dir2/', id: 'rule2', expiration: new Models\LifecycleRuleExpiration(days: 30), status: 'Enabled'),
),
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix>dir1</Prefix><ID>rule1</ID><Expiration><Days>180</Days></Expiration><Status>Enabled</Status></Rule><Rule><Prefix>dir1/dir2/</Prefix><ID>rule2</ID><Expiration><Days>30</Days></Expiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo9
$request = new Models\PutBucketLifecycleRequest('bucket-123');
$request->lifecycleConfiguration = new Models\LifecycleConfiguration(
array(
new Models\LifecycleRule(prefix: 'prefix0', id: 'r0', expiration: new Models\LifecycleRuleExpiration(days: 40, expiredObjectDeleteMarker: false), status: 'Enabled'),
new Models\LifecycleRule(prefix: 'prefix1', filter: new Models\LifecycleRuleFilter(objectSizeGreaterThan: 500, objectSizeLessThan: 64500), id: 'r1', expiration: new Models\LifecycleRuleExpiration(days: 40, expiredObjectDeleteMarker: false), status: 'Enabled'),
new Models\LifecycleRule(prefix: 'prefix3', transitions: array(new Models\LifecycleRuleTransition(days: 30, storageClass: 'IA', isAccessTime: false)), id: 'r3', expiration: new Models\LifecycleRuleExpiration(days: 40, expiredObjectDeleteMarker: false), status: 'Enabled'),
new Models\LifecycleRule(prefix: 'prefix4', transitions: array(new Models\LifecycleRuleTransition(days: 30, storageClass: 'IA', isAccessTime: false)), noncurrentVersionTransitions: array(new NoncurrentVersionTransition(noncurrentDays: 10, storageClass: 'IA', isAccessTime: true, returnToStdWhenVisit: true)), id: 'r4', abortMultipartUpload: new Models\LifecycleRuleAbortMultipartUpload(createdBeforeDate: new DateTime('2015-11-11T00:00:00.000Z', new DateTimeZone('UTC'))), status: 'Enabled'),
new Models\LifecycleRule(prefix: 'pre_', expiration: new Models\LifecycleRuleExpiration(days: 40, expiredObjectDeleteMarker: false), status: 'Enabled'),
),
);
$input = BucketLifecycle::fromPutBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><LifecycleConfiguration><Rule><Prefix>prefix0</Prefix><ID>r0</ID><Expiration><Days>40</Days><ExpiredObjectDeleteMarker>false</ExpiredObjectDeleteMarker></Expiration><Status>Enabled</Status></Rule><Rule><Prefix>prefix1</Prefix><Filter><ObjectSizeGreaterThan>500</ObjectSizeGreaterThan><ObjectSizeLessThan>64500</ObjectSizeLessThan></Filter><ID>r1</ID><Expiration><Days>40</Days><ExpiredObjectDeleteMarker>false</ExpiredObjectDeleteMarker></Expiration><Status>Enabled</Status></Rule><Rule><Prefix>prefix3</Prefix><Transition><Days>30</Days><StorageClass>IA</StorageClass><IsAccessTime>false</IsAccessTime></Transition><ID>r3</ID><Expiration><Days>40</Days><ExpiredObjectDeleteMarker>false</ExpiredObjectDeleteMarker></Expiration><Status>Enabled</Status></Rule><Rule><Prefix>prefix4</Prefix><Transition><Days>30</Days><StorageClass>IA</StorageClass><IsAccessTime>false</IsAccessTime></Transition><NoncurrentVersionTransition><NoncurrentDays>10</NoncurrentDays><StorageClass>IA</StorageClass><IsAccessTime>true</IsAccessTime><ReturnToStdWhenVisit>true</ReturnToStdWhenVisit></NoncurrentVersionTransition><ID>r4</ID><AbortMultipartUpload><CreatedBeforeDate>2015-11-11T00:00:00Z</CreatedBeforeDate></AbortMultipartUpload><Status>Enabled</Status></Rule><Rule><Prefix>pre_</Prefix><Expiration><Days>40</Days><ExpiredObjectDeleteMarker>false</ExpiredObjectDeleteMarker></Expiration><Status>Enabled</Status></Rule></LifecycleConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketLifecycle()
{
// empty output
$output = new OperationOutput();
$result = BucketLifecycle::toPutBucketLifecycle($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketLifecycle::toPutBucketLifecycle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketLifecycle()
{
// miss required field
try {
$request = new Models\GetBucketLifecycleRequest();
$input = BucketLifecycle::fromGetBucketLifecycle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketLifecycleRequest('bucket-123');
$input = BucketLifecycle::fromGetBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketLifecycle()
{
// empty output
$output = new OperationOutput();
$result = BucketLifecycle::toGetBucketLifecycle($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<ID>delete after one day</ID>
<Prefix>logs1/</Prefix>
<Status>Enabled</Status>
<Expiration>
<Days>1</Days>
</Expiration>
</Rule>
<Rule>
<ID>mtime transition1</ID>
<Prefix>logs2/</Prefix>
<Status>Enabled</Status>
<Transition>
<Days>30</Days>
<StorageClass>IA</StorageClass>
</Transition>
</Rule>
<Rule>
<ID>mtime transition2</ID>
<Prefix>logs3/</Prefix>
<Status>Enabled</Status>
<Transition>
<Days>30</Days>
<StorageClass>IA</StorageClass>
<IsAccessTime>false</IsAccessTime>
</Transition>
</Rule>
</LifecycleConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketLifecycle::toGetBucketLifecycle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(3, count($result->lifecycleConfiguration->rules));
$this->assertEquals('delete after one day', $result->lifecycleConfiguration->rules[0]->id);
$this->assertEquals('logs1/', $result->lifecycleConfiguration->rules[0]->prefix);
$this->assertEquals('Enabled', $result->lifecycleConfiguration->rules[0]->status);
$this->assertEquals(1, $result->lifecycleConfiguration->rules[0]->expiration->days);
$this->assertEquals('mtime transition1', $result->lifecycleConfiguration->rules[1]->id);
$this->assertEquals('logs2/', $result->lifecycleConfiguration->rules[1]->prefix);
$this->assertEquals('Enabled', $result->lifecycleConfiguration->rules[1]->status);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules[1]->transitions));
$this->assertEquals(30, $result->lifecycleConfiguration->rules[1]->transitions[0]->days);
$this->assertEquals('IA', $result->lifecycleConfiguration->rules[1]->transitions[0]->storageClass);
$this->assertEquals('mtime transition2', $result->lifecycleConfiguration->rules[2]->id);
$this->assertEquals('logs3/', $result->lifecycleConfiguration->rules[2]->prefix);
$this->assertEquals('Enabled', $result->lifecycleConfiguration->rules[2]->status);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules[2]->transitions));
$this->assertEquals(30, $result->lifecycleConfiguration->rules[2]->transitions[0]->days);
$this->assertEquals('IA', $result->lifecycleConfiguration->rules[2]->transitions[0]->storageClass);
$this->assertFalse($result->lifecycleConfiguration->rules[2]->transitions[0]->isAccessTime);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<ID>atime transition1</ID>
<Prefix>logs1/</Prefix>
<Status>Enabled</Status>
<Transition>
<Days>30</Days>
<StorageClass>IA</StorageClass>
<IsAccessTime>true</IsAccessTime>
<ReturnToStdWhenVisit>false</ReturnToStdWhenVisit>
</Transition>
<AtimeBase>1631698332</AtimeBase>
</Rule>
<Rule>
<ID>atime transition2</ID>
<Prefix>logs2/</Prefix>
<Status>Enabled</Status>
<NoncurrentVersionTransition>
<NoncurrentDays>10</NoncurrentDays>
<StorageClass>IA</StorageClass>
<IsAccessTime>true</IsAccessTime>
<ReturnToStdWhenVisit>false</ReturnToStdWhenVisit>
</NoncurrentVersionTransition>
<AtimeBase>1631698332</AtimeBase>
</Rule>
</LifecycleConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketLifecycle::toGetBucketLifecycle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(2, count($result->lifecycleConfiguration->rules));
$this->assertEquals('atime transition1', $result->lifecycleConfiguration->rules[0]->id);
$this->assertEquals('logs1/', $result->lifecycleConfiguration->rules[0]->prefix);
$this->assertEquals('Enabled', $result->lifecycleConfiguration->rules[0]->status);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules[0]->transitions));
$this->assertEquals(30, $result->lifecycleConfiguration->rules[0]->transitions[0]->days);
$this->assertEquals('IA', $result->lifecycleConfiguration->rules[0]->transitions[0]->storageClass);
$this->assertFalse($result->lifecycleConfiguration->rules[0]->transitions[0]->returnToStdWhenVisit);
$this->assertTrue($result->lifecycleConfiguration->rules[0]->transitions[0]->isAccessTime);
$this->assertEquals(1631698332, $result->lifecycleConfiguration->rules[0]->atimeBase);
$this->assertEquals('atime transition2', $result->lifecycleConfiguration->rules[1]->id);
$this->assertEquals('logs2/', $result->lifecycleConfiguration->rules[1]->prefix);
$this->assertEquals('Enabled', $result->lifecycleConfiguration->rules[1]->status);
$this->assertEquals(10, $result->lifecycleConfiguration->rules[1]->noncurrentVersionTransitions[0]->noncurrentDays);
$this->assertEquals('IA', $result->lifecycleConfiguration->rules[1]->noncurrentVersionTransitions[0]->storageClass);
$this->assertFalse($result->lifecycleConfiguration->rules[1]->noncurrentVersionTransitions[0]->returnToStdWhenVisit);
$this->assertTrue($result->lifecycleConfiguration->rules[1]->noncurrentVersionTransitions[0]->isAccessTime);
$this->assertEquals(1631698332, $result->lifecycleConfiguration->rules[1]->atimeBase);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<Prefix></Prefix>
<Transition>
<Days>30</Days>
<StorageClass>Archive</StorageClass>
</Transition>
<Filter>
<Not>
<Tag>
<Key>key1</Key>
<Value>value1</Value>
</Tag>
<Prefix>log</Prefix>
</Not>
</Filter>
<ID>rule</ID>
<Expiration>
<ExpiredObjectDeleteMarker>true</ExpiredObjectDeleteMarker>
</Expiration>
<NoncurrentVersionExpiration>
<NoncurrentDays>5</NoncurrentDays>
</NoncurrentVersionExpiration>
<Status>Enabled</Status>
</Rule>
</LifecycleConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketLifecycle::toGetBucketLifecycle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules));
$this->assertEquals('rule', $result->lifecycleConfiguration->rules[0]->id);
$this->assertEquals('', $result->lifecycleConfiguration->rules[0]->prefix);
$this->assertEquals('Enabled', $result->lifecycleConfiguration->rules[0]->status);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules[0]->transitions));
$this->assertEquals(30, $result->lifecycleConfiguration->rules[0]->transitions[0]->days);
$this->assertEquals('Archive', $result->lifecycleConfiguration->rules[0]->transitions[0]->storageClass);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules[0]->filter->nots));
$this->assertEquals('log', $result->lifecycleConfiguration->rules[0]->filter->nots[0]->prefix);
$this->assertEquals('key1', $result->lifecycleConfiguration->rules[0]->filter->nots[0]->tag->key);
$this->assertEquals('value1', $result->lifecycleConfiguration->rules[0]->filter->nots[0]->tag->value);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<LifecycleConfiguration>
<Rule>
<Prefix></Prefix>
<Transition>
<Days>30</Days>
<StorageClass>Archive</StorageClass>
</Transition>
<Filter>
<Not>
<Tag>
<Key>key1</Key>
<Value>value1</Value>
</Tag>
<Prefix>log</Prefix>
</Not>
<Not>
<Tag>
<Key>key2</Key>
<Value>value2</Value>
</Tag>
<Prefix>pre</Prefix>
</Not>
</Filter>
<ID>rule</ID>
<Expiration>
<ExpiredObjectDeleteMarker>true</ExpiredObjectDeleteMarker>
</Expiration>
<NoncurrentVersionExpiration>
<NoncurrentDays>5</NoncurrentDays>
</NoncurrentVersionExpiration>
<Status>Enabled</Status>
</Rule>
</LifecycleConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketLifecycle::toGetBucketLifecycle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules));
$this->assertEquals('rule', $result->lifecycleConfiguration->rules[0]->id);
$this->assertEquals('', $result->lifecycleConfiguration->rules[0]->prefix);
$this->assertEquals('Enabled', $result->lifecycleConfiguration->rules[0]->status);
$this->assertEquals(1, count($result->lifecycleConfiguration->rules[0]->transitions));
$this->assertEquals(30, $result->lifecycleConfiguration->rules[0]->transitions[0]->days);
$this->assertEquals('Archive', $result->lifecycleConfiguration->rules[0]->transitions[0]->storageClass);
$this->assertEquals(2, count($result->lifecycleConfiguration->rules[0]->filter->nots));
$this->assertEquals('log', $result->lifecycleConfiguration->rules[0]->filter->nots[0]->prefix);
$this->assertEquals('key1', $result->lifecycleConfiguration->rules[0]->filter->nots[0]->tag->key);
$this->assertEquals('value1', $result->lifecycleConfiguration->rules[0]->filter->nots[0]->tag->value);
$this->assertEquals('pre', $result->lifecycleConfiguration->rules[0]->filter->nots[1]->prefix);
$this->assertEquals('key2', $result->lifecycleConfiguration->rules[0]->filter->nots[1]->tag->key);
$this->assertEquals('value2', $result->lifecycleConfiguration->rules[0]->filter->nots[1]->tag->value);
}
public function testFromDeleteBucketLifecycle()
{
// miss required field
try {
$request = new Models\DeleteBucketLifecycleRequest();
$input = BucketLifecycle::fromDeleteBucketLifecycle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketLifecycleRequest('bucket-123');
$input = BucketLifecycle::fromDeleteBucketLifecycle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketLifecycle()
{
// empty output
$output = new OperationOutput();
$result = BucketLifecycle::toDeleteBucketLifecycle($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketLifecycle::toDeleteBucketLifecycle($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,354 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketLogging;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketLoggingTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketLogging()
{
// miss required field
try {
$request = new Models\PutBucketLoggingRequest();
$input = BucketLogging::fromPutBucketLogging($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketLoggingRequest('bucket-123');
$input = BucketLogging::fromPutBucketLogging($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucketLoggingStatus", (string)$e);
}
$request = new Models\PutBucketLoggingRequest('bucket-123', new Models\BucketLoggingStatus(new Models\LoggingEnabled(
targetBucket: 'TargetBucket', targetPrefix: 'TargetPrefix'
)));
$input = BucketLogging::fromPutBucketLogging($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketLoggingStatus><LoggingEnabled><TargetBucket>TargetBucket</TargetBucket><TargetPrefix>TargetPrefix</TargetPrefix></LoggingEnabled></BucketLoggingStatus>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\PutBucketLoggingRequest('bucket-123', new Models\BucketLoggingStatus(new Models\LoggingEnabled(
targetBucket: 'TargetBucket', targetPrefix: 'TargetPrefix', loggingRole: 'AliyunOSSLoggingDefaultRole'
)));
$input = BucketLogging::fromPutBucketLogging($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketLoggingStatus><LoggingEnabled><TargetBucket>TargetBucket</TargetBucket><TargetPrefix>TargetPrefix</TargetPrefix><LoggingRole>AliyunOSSLoggingDefaultRole</LoggingRole></LoggingEnabled></BucketLoggingStatus>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketLogging()
{
// empty output
$output = new OperationOutput();
$result = BucketLogging::toPutBucketLogging($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketLogging::toPutBucketLogging($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketLogging()
{
// miss required field
try {
$request = new Models\GetBucketLoggingRequest();
$input = BucketLogging::fromGetBucketLogging($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketLoggingRequest('bucket-123');
$input = BucketLogging::fromGetBucketLogging($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketLogging()
{
// empty output
$output = new OperationOutput();
$result = BucketLogging::toGetBucketLogging($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<BucketLoggingStatus>
<LoggingEnabled>
<TargetBucket>bucket-log</TargetBucket>
<TargetPrefix>prefix-access_log</TargetPrefix>
</LoggingEnabled>
</BucketLoggingStatus>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketLogging::toGetBucketLogging($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('bucket-log', $result->bucketLoggingStatus->loggingEnabled->targetBucket);
$this->assertEquals('prefix-access_log', $result->bucketLoggingStatus->loggingEnabled->targetPrefix);
$output = new OperationOutput();
$result = BucketLogging::toGetBucketLogging($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<BucketLoggingStatus>
<LoggingEnabled>
<TargetBucket>bucket-log</TargetBucket>
<TargetPrefix>prefix-access_log</TargetPrefix>
<LoggingRole>AliyunOSSLoggingDefaultRole</LoggingRole>
</LoggingEnabled>
</BucketLoggingStatus>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketLogging::toGetBucketLogging($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('bucket-log', $result->bucketLoggingStatus->loggingEnabled->targetBucket);
$this->assertEquals('prefix-access_log', $result->bucketLoggingStatus->loggingEnabled->targetPrefix);
$this->assertEquals('AliyunOSSLoggingDefaultRole', $result->bucketLoggingStatus->loggingEnabled->loggingRole);
}
public function testFromDeleteBucketLogging()
{
// miss required field
try {
$request = new Models\DeleteBucketLoggingRequest();
$input = BucketLogging::fromDeleteBucketLogging($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketLoggingRequest('bucket-123');
$input = BucketLogging::fromDeleteBucketLogging($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketLogging()
{
// empty output
$output = new OperationOutput();
$result = BucketLogging::toDeleteBucketLogging($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketLogging::toDeleteBucketLogging($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromPutUserDefinedLogFieldsConfig()
{
// miss required field
try {
$request = new Models\PutUserDefinedLogFieldsConfigRequest();
$input = BucketLogging::fromPutUserDefinedLogFieldsConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutUserDefinedLogFieldsConfigRequest('bucket-123');
$input = BucketLogging::fromPutUserDefinedLogFieldsConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, userDefinedLogFieldsConfiguration", (string)$e);
}
$request = new Models\PutUserDefinedLogFieldsConfigRequest('bucket-123', new Models\UserDefinedLogFieldsConfiguration(
new Models\LoggingParamSet(array("param1", "param2")),
new Models\LoggingHeaderSet(array("header1", "header2", "header3"))
));
$input = BucketLogging::fromPutUserDefinedLogFieldsConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><UserDefinedLogFieldsConfiguration><ParamSet><parameter>param1</parameter><parameter>param2</parameter></ParamSet><HeaderSet><header>header1</header><header>header2</header><header>header3</header></HeaderSet></UserDefinedLogFieldsConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutUserDefinedLogFieldsConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketLogging::toPutUserDefinedLogFieldsConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketLogging::toPutUserDefinedLogFieldsConfig($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetUserDefinedLogFieldsConfig()
{
// miss required field
try {
$request = new Models\GetUserDefinedLogFieldsConfigRequest();
$input = BucketLogging::fromGetUserDefinedLogFieldsConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetUserDefinedLogFieldsConfigRequest('bucket-123');
$input = BucketLogging::fromGetUserDefinedLogFieldsConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetUserDefinedLogFieldsConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketLogging::toGetUserDefinedLogFieldsConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<UserDefinedLogFieldsConfiguration>
<HeaderSet>
<header>header1</header>
<header>header2</header>
<header>header3</header>
</HeaderSet>
<ParamSet>
<parameter>param1</parameter>
<parameter>param2</parameter>
</ParamSet>
</UserDefinedLogFieldsConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketLogging::toGetUserDefinedLogFieldsConfig($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('header1', $result->userDefinedLogFieldsConfiguration->headerSet->headers[0]);
$this->assertEquals('header3', $result->userDefinedLogFieldsConfiguration->headerSet->headers[2]);
$this->assertEquals('param2', $result->userDefinedLogFieldsConfiguration->paramSet->parameters[1]);
}
public function testFromUserDefinedLogFieldsConfig()
{
// miss required field
try {
$request = new Models\DeleteUserDefinedLogFieldsConfigRequest();
$input = BucketLogging::fromDeleteUserDefinedLogFieldsConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteUserDefinedLogFieldsConfigRequest('bucket-123');
$input = BucketLogging::fromDeleteUserDefinedLogFieldsConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToUserDefinedLogFieldsConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketLogging::toDeleteUserDefinedLogFieldsConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketLogging::toDeleteUserDefinedLogFieldsConfig($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,639 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketMetaQuery;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketMetaQueryTest extends \PHPUnit\Framework\TestCase
{
public function testFromOpenMetaQuery()
{
// miss required field
try {
$request = new Models\OpenMetaQueryRequest();
$input = BucketMetaQuery::fromOpenMetaQuery($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\OpenMetaQueryRequest('bucket-123');
$input = BucketMetaQuery::fromOpenMetaQuery($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('add', $input->getParameters()['comp']);
$this->assertEquals('', $input->getParameters()['metaQuery']);
$request = new Models\OpenMetaQueryRequest('bucket-123', 'basic');
$input = BucketMetaQuery::fromOpenMetaQuery($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('add', $input->getParameters()['comp']);
$this->assertEquals('', $input->getParameters()['metaQuery']);
$this->assertEquals('basic', $input->getParameters()['mode']);
$request = new Models\OpenMetaQueryRequest('bucket-123', 'semantic');
$input = BucketMetaQuery::fromOpenMetaQuery($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('add', $input->getParameters()['comp']);
$this->assertEquals('', $input->getParameters()['metaQuery']);
$this->assertEquals('semantic', $input->getParameters()['mode']);
}
public function testToOpenMetaQuery()
{
// empty output
$output = new OperationOutput();
$result = BucketMetaQuery::toOpenMetaQuery($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketMetaQuery::toOpenMetaQuery($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetMetaQueryStatus()
{
// miss required field
try {
$request = new Models\GetMetaQueryStatusRequest();
$input = BucketMetaQuery::fromGetMetaQueryStatus($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetMetaQueryStatusRequest('bucket-123');
$input = BucketMetaQuery::fromGetMetaQueryStatus($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('', $input->getParameters()['metaQuery']);
}
public function testToGetMetaQueryStatus()
{
// empty output
$output = new OperationOutput();
$result = BucketMetaQuery::toGetMetaQueryStatus($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<MetaQueryStatus>
<State>Running</State>
<Phase>FullScanning</Phase>
<CreateTime>2021-08-02T10:49:17.289372919+08:00</CreateTime>
<UpdateTime>2021-08-02T10:49:17.289372919+08:00</UpdateTime>
</MetaQueryStatus>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = BucketMetaQuery::toGetMetaQueryStatus($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('Running', $result->metaQueryStatus->state);
$this->assertEquals('FullScanning', $result->metaQueryStatus->phase);
$this->assertEquals('2021-08-02T10:49:17.289372919+08:00', $result->metaQueryStatus->createTime);
$this->assertEquals('2021-08-02T10:49:17.289372919+08:00', $result->metaQueryStatus->updateTime);
}
public function testFromDoMetaQuery()
{
// miss required field
try {
$request = new Models\DoMetaQueryRequest();
$input = BucketMetaQuery::fromDoMetaQuery($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DoMetaQueryRequest('bucket-123');
$input = BucketMetaQuery::fromDoMetaQuery($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, metaQuery", (string)$e);
}
$request = new Models\DoMetaQueryRequest('bucket-123', new Models\MetaQuery(
maxResults: 5,
query: "{'Field': 'Size','Value': '1048576','Operation': 'gt'}",
sort: 'Size',
order: Models\MetaQueryOrderType::ASC,
aggregations: new Models\MetaQueryAggregations(
[
new Models\MetaQueryAggregation(
field: 'Size',
operation: 'sum'
),
new Models\MetaQueryAggregation(
field: 'Size',
operation: 'max'
),
]
),
nextToken: 'MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw****'
));
$input = BucketMetaQuery::fromDoMetaQuery($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><MetaQuery><MaxResults>5</MaxResults><Query>{'Field': 'Size','Value': '1048576','Operation': 'gt'}</Query><Sort>Size</Sort><Order>asc</Order><Aggregations><Aggregation><Field>Size</Field><Operation>sum</Operation></Aggregation><Aggregation><Field>Size</Field><Operation>max</Operation></Aggregation></Aggregations><NextToken>MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw****</NextToken></MetaQuery>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\DoMetaQueryRequest('bucket-123', new Models\MetaQuery(
maxResults: 99,
query: "Overlook the snow-covered forest",
nextToken: 'MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw****',
mediaTypes: new Models\MetaQueryMediaTypes('image'),
simpleQuery: "{'Operation':'gt', 'Field': 'Size', 'Value': '30'}"
), mode: 'semantic');
$input = BucketMetaQuery::fromDoMetaQuery($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><MetaQuery><MaxResults>99</MaxResults><Query>Overlook the snow-covered forest</Query><NextToken>MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw****</NextToken><MediaTypes><MediaType>image</MediaType></MediaTypes><SimpleQuery>{'Operation':'gt', 'Field': 'Size', 'Value': '30'}</SimpleQuery></MetaQuery>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToDoMetaQuery()
{
// empty output
$output = new OperationOutput();
$result = BucketMetaQuery::toDoMetaQuery($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<MetaQuery>
<NextToken>MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw****</NextToken>
<Files>
<File>
<Filename>exampleobject.txt</Filename>
<Size>120</Size>
<FileModifiedTime>2021-06-29T15:04:05.000000000Z07:00</FileModifiedTime>
<OSSObjectType>Normal</OSSObjectType>
<OSSStorageClass>Standard</OSSStorageClass>
<ObjectACL>default</ObjectACL>
<ETag>"fba9dede5f27731c9771645a3986****"</ETag>
<OSSCRC64>4858A48BD1466884</OSSCRC64>
<OSSTaggingCount>2</OSSTaggingCount>
<OSSTagging>
<Tagging>
<Key>owner</Key>
<Value>John</Value>
</Tagging>
<Tagging>
<Key>type</Key>
<Value>document</Value>
</Tagging>
</OSSTagging>
<OSSUserMeta>
<UserMeta>
<Key>x-oss-meta-location</Key>
<Value>hangzhou</Value>
</UserMeta>
</OSSUserMeta>
</File>
</Files>
<Aggregations>
<Aggregation>
<Field>Size</Field>
<Operation>sum</Operation>
<Value>4859250309</Value>
</Aggregation>
<Aggregation>
<Field>Size</Field>
<Operation>max</Operation>
<Value>2235483240</Value>
</Aggregation>
</Aggregations>
</MetaQuery>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = BucketMetaQuery::toDoMetaQuery($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw****', $result->nextToken);
$this->assertEquals(1, count($result->files->file));
$this->assertEquals('exampleobject.txt', $result->files->file[0]->filename);
$this->assertEquals(120, $result->files->file[0]->size);
$this->assertEquals('2021-06-29T15:04:05.000000000Z07:00', $result->files->file[0]->fileModifiedTime);
$this->assertEquals('Normal', $result->files->file[0]->ossObjectType);
$this->assertEquals('Standard', $result->files->file[0]->ossStorageClass);
$this->assertEquals('default', $result->files->file[0]->objectACL);
$this->assertEquals('"fba9dede5f27731c9771645a3986****"', $result->files->file[0]->etag);
$this->assertEquals(2, $result->files->file[0]->ossTaggingCount);
$this->assertEquals('owner', $result->files->file[0]->ossTagging->taggings[0]->key);
$this->assertEquals('John', $result->files->file[0]->ossTagging->taggings[0]->value);
$this->assertEquals('type', $result->files->file[0]->ossTagging->taggings[1]->key);
$this->assertEquals('document', $result->files->file[0]->ossTagging->taggings[1]->value);
$this->assertEquals(1, count($result->files->file[0]->ossUserMeta->userMetas));
$this->assertEquals('x-oss-meta-location', $result->files->file[0]->ossUserMeta->userMetas[0]->key);
$this->assertEquals('hangzhou', $result->files->file[0]->ossUserMeta->userMetas[0]->value);
$this->assertEquals('Size', $result->aggregations->aggregations[0]->field);
$this->assertEquals('sum', $result->aggregations->aggregations[0]->operation);
$this->assertEquals(4859250309, $result->aggregations->aggregations[0]->value);
$this->assertEquals('Size', $result->aggregations->aggregations[1]->field);
$this->assertEquals('max', $result->aggregations->aggregations[1]->operation);
$this->assertEquals(2235483240, $result->aggregations->aggregations[1]->value);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<MetaQuery>
<NextToken></NextToken>
<Aggregations>
<Aggregation>
<Field>Size</Field>
<Operation>sum</Operation>
<Value>30930054</Value>
</Aggregation>
<Aggregation>
<Field>Size</Field>
<Operation>group</Operation>
<Groups>
<Group>
<Value>1536000</Value>
<Count>1</Count>
</Group>
<Group>
<Value>5472362</Value>
<Count>1</Count>
</Group>
<Group>
<Value>10354204</Value>
<Count>1</Count>
</Group>
<Group>
<Value>1890304</Value>
<Count>3</Count>
</Group>
<Group>
<Value>2632192</Value>
<Count>3</Count>
</Group>
</Groups>
</Aggregation>
</Aggregations>
</MetaQuery>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = BucketMetaQuery::toDoMetaQuery($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals(2, count($result->aggregations->aggregations));
$this->assertEquals('Size', $result->aggregations->aggregations[0]->field);
$this->assertEquals('sum', $result->aggregations->aggregations[0]->operation);
$this->assertEquals(30930054, $result->aggregations->aggregations[0]->value);
$this->assertEquals('Size', $result->aggregations->aggregations[1]->field);
$this->assertEquals('group', $result->aggregations->aggregations[1]->operation);
$this->assertEquals(5, count($result->aggregations->aggregations[1]->groups->groups));
$this->assertEquals(1, $result->aggregations->aggregations[1]->groups->groups[0]->count);
$this->assertEquals('1536000', $result->aggregations->aggregations[1]->groups->groups[0]->value);
$this->assertEquals(1, $result->aggregations->aggregations[1]->groups->groups[1]->count);
$this->assertEquals('5472362', $result->aggregations->aggregations[1]->groups->groups[1]->value);
$this->assertEquals(1, $result->aggregations->aggregations[1]->groups->groups[2]->count);
$this->assertEquals('10354204', $result->aggregations->aggregations[1]->groups->groups[2]->value);
$this->assertEquals(3, $result->aggregations->aggregations[1]->groups->groups[3]->count);
$this->assertEquals('1890304', $result->aggregations->aggregations[1]->groups->groups[3]->value);
$this->assertEquals(3, $result->aggregations->aggregations[1]->groups->groups[4]->count);
$this->assertEquals('2632192', $result->aggregations->aggregations[1]->groups->groups[4]->value);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<MetaQuery>
<Files>
<File>
<URI>oss://bucket/sample-object.jpg</URI>
<Filename>sample-object.jpg</Filename>
<Size>1000</Size>
<ObjectACL>default</ObjectACL>
<FileModifiedTime>2021-06-29T14:50:14.011643661+08:00</FileModifiedTime>
<ServerSideEncryption>AES256</ServerSideEncryption>
<ServerSideEncryptionCustomerAlgorithm>SM4</ServerSideEncryptionCustomerAlgorithm>
<ETag>"1D9C280A7C4F67F7EF873E28449****"</ETag>
<OSSCRC64>559890638950338001</OSSCRC64>
<ProduceTime>2021-06-29T14:50:15.011643661+08:00</ProduceTime>
<ContentType>image/jpeg</ContentType>
<MediaType>image</MediaType>
<LatLong>30.134390,120.074997</LatLong>
<Title>test</Title>
<OSSExpiration>2024-12-01T12:00:00.000Z</OSSExpiration>
<AccessControlAllowOrigin>https://aliyundoc.com</AccessControlAllowOrigin>
<AccessControlRequestMethod>PUT</AccessControlRequestMethod>
<ServerSideDataEncryption>SM4</ServerSideDataEncryption>
<ServerSideEncryptionKeyId>9468da86-3509-4f8d-a61e-6eab1eac****</ServerSideEncryptionKeyId>
<CacheControl>no-cache</CacheControl>
<ContentDisposition>attachment; filename=test.jpg</ContentDisposition>
<ContentEncoding>UTF-8</ContentEncoding>
<ContentLanguage>zh-CN</ContentLanguage>
<ImageHeight>500</ImageHeight>
<ImageWidth>270</ImageWidth>
<VideoWidth>1080</VideoWidth>
<VideoHeight>1920</VideoHeight>
<VideoStreams>
<VideoStream>
<CodecName>h264</CodecName>
<Language>en</Language>
<Bitrate>5407765</Bitrate>
<FrameRate>25/1</FrameRate>
<StartTime>0</StartTime>
<Duration>22.88</Duration>
<FrameCount>572</FrameCount>
<BitDepth>8</BitDepth>
<PixelFormat>yuv420p</PixelFormat>
<ColorSpace>bt709</ColorSpace>
<Height>720</Height>
<Width>1280</Width>
</VideoStream>
<VideoStream>
<CodecName>h264</CodecName>
<Language>en</Language>
<Bitrate>5407765</Bitrate>
<FrameRate>25/1</FrameRate>
<StartTime>0</StartTime>
<Duration>22.88</Duration>
<FrameCount>572</FrameCount>
<BitDepth>8</BitDepth>
<PixelFormat>yuv420p</PixelFormat>
<ColorSpace>bt709</ColorSpace>
<Height>720</Height>
<Width>1280</Width>
</VideoStream>
</VideoStreams>
<AudioStreams>
<AudioStream>
<CodecName>aac</CodecName>
<Bitrate>1048576</Bitrate>
<SampleRate>48000</SampleRate>
<StartTime>0.0235</StartTime>
<Duration>3.690667</Duration>
<Channels>2</Channels>
<Language>en</Language>
</AudioStream>
</AudioStreams>
<Subtitles>
<Subtitle>
<CodecName>mov_text</CodecName>
<Language>en</Language>
<StartTime>0</StartTime>
<Duration>71.378</Duration>
</Subtitle>
<Subtitle>
<CodecName>mov_text</CodecName>
<Language>en</Language>
<StartTime>72</StartTime>
<Duration>71.378</Duration>
</Subtitle>
</Subtitles>
<Bitrate>5407765</Bitrate>
<Artist>Jane</Artist>
<AlbumArtist>Jenny</AlbumArtist>
<Composer>Jane</Composer>
<Performer>Jane</Performer>
<Album>FirstAlbum</Album>
<Duration>71.378</Duration>
<Addresses>
<Address>
<AddressLine>中国浙江省杭州市余杭区文一西路969号</AddressLine>
<City>杭州市</City>
<Country>中国</Country>
<District>余杭区</District>
<Language>zh-Hans</Language>
<Province>浙江省</Province>
<Township>文一西路</Township>
</Address>
<Address>
<AddressLine>中国浙江省杭州市余杭区文一西路970号</AddressLine>
<City>杭州市</City>
<Country>中国</Country>
<District>余杭区</District>
<Language>zh-Hans</Language>
<Province>浙江省</Province>
<Township>文一西路</Township>
</Address>
</Addresses>
<OSSObjectType>Normal</OSSObjectType>
<OSSStorageClass>Standard</OSSStorageClass>
<OSSTaggingCount>2</OSSTaggingCount>
<OSSTagging>
<Tagging>
<Key>key</Key>
<Value>val</Value>
</Tagging>
<Tagging>
<Key>key2</Key>
<Value>val2</Value>
</Tagging>
</OSSTagging>
<OSSUserMeta>
<UserMeta>
<Key>key</Key>
<Value>val</Value>
</UserMeta>
</OSSUserMeta>
</File>
</Files>
</MetaQuery>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = BucketMetaQuery::toDoMetaQuery($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals(1, count($result->files->file));
$this->assertEquals('oss://bucket/sample-object.jpg', $result->files->file[0]->uri);
$this->assertEquals('sample-object.jpg', $result->files->file[0]->filename);
$this->assertEquals(1000, $result->files->file[0]->size);
$this->assertEquals('2021-06-29T14:50:14.011643661+08:00', $result->files->file[0]->fileModifiedTime);
$this->assertEquals('AES256', $result->files->file[0]->serverSideEncryption);
$this->assertEquals('SM4', $result->files->file[0]->serverSideEncryptionCustomerAlgorithm);
$this->assertEquals('"1D9C280A7C4F67F7EF873E28449****"', $result->files->file[0]->etag);
$this->assertEquals('559890638950338001', $result->files->file[0]->ossCrc64);
$this->assertEquals('2021-06-29T14:50:15.011643661+08:00', $result->files->file[0]->produceTime);
$this->assertEquals('image/jpeg', $result->files->file[0]->contentType);
$this->assertEquals('image', $result->files->file[0]->mediaType);
$this->assertEquals('30.134390,120.074997', $result->files->file[0]->latLong);
$this->assertEquals('test', $result->files->file[0]->title);
$this->assertEquals('2024-12-01T12:00:00.000Z', $result->files->file[0]->ossExpiration);
$this->assertEquals('https://aliyundoc.com', $result->files->file[0]->accessControlAllowOrigin);
$this->assertEquals('PUT', $result->files->file[0]->accessControlRequestMethod);
$this->assertEquals('SM4', $result->files->file[0]->serverSideDataEncryption);
$this->assertEquals('9468da86-3509-4f8d-a61e-6eab1eac****', $result->files->file[0]->serverSideEncryptionKeyId);
$this->assertEquals('no-cache', $result->files->file[0]->cacheControl);
$this->assertEquals('attachment; filename=test.jpg', $result->files->file[0]->contentDisposition);
$this->assertEquals('UTF-8', $result->files->file[0]->contentEncoding);
$this->assertEquals('zh-CN', $result->files->file[0]->contentLanguage);
$this->assertEquals(500, $result->files->file[0]->imageHeight);
$this->assertEquals(270, $result->files->file[0]->imageWidth);
$this->assertEquals(1920, $result->files->file[0]->videoHeight);
$this->assertEquals(1080, $result->files->file[0]->videoWidth);
$this->assertEquals(2, count($result->files->file[0]->videoStreams->videoStream));
$this->assertEquals('h264', $result->files->file[0]->videoStreams->videoStream[0]->codecName);
$this->assertEquals('en', $result->files->file[0]->videoStreams->videoStream[0]->language);
$this->assertEquals(5407765, $result->files->file[0]->videoStreams->videoStream[0]->bitrate);
$this->assertEquals(8, $result->files->file[0]->videoStreams->videoStream[0]->bitDepth);
$this->assertEquals('25/1', $result->files->file[0]->videoStreams->videoStream[0]->frameRate);
$this->assertEquals(0, $result->files->file[0]->videoStreams->videoStream[0]->startTime);
$this->assertEquals(22.88, $result->files->file[0]->videoStreams->videoStream[0]->duration);
$this->assertEquals(572, $result->files->file[0]->videoStreams->videoStream[0]->frameCount);
$this->assertEquals('yuv420p', $result->files->file[0]->videoStreams->videoStream[0]->pixelFormat);
$this->assertEquals('bt709', $result->files->file[0]->videoStreams->videoStream[0]->colorSpace);
$this->assertEquals(720, $result->files->file[0]->videoStreams->videoStream[0]->height);
$this->assertEquals(1280, $result->files->file[0]->videoStreams->videoStream[0]->width);
$this->assertEquals('h264', $result->files->file[0]->videoStreams->videoStream[1]->codecName);
$this->assertEquals('en', $result->files->file[0]->videoStreams->videoStream[1]->language);
$this->assertEquals(5407765, $result->files->file[0]->videoStreams->videoStream[1]->bitrate);
$this->assertEquals('25/1', $result->files->file[0]->videoStreams->videoStream[1]->frameRate);
$this->assertEquals(0, $result->files->file[0]->videoStreams->videoStream[1]->startTime);
$this->assertEquals(22.88, $result->files->file[0]->videoStreams->videoStream[1]->duration);
$this->assertEquals(572, $result->files->file[0]->videoStreams->videoStream[1]->frameCount);
$this->assertEquals(8, $result->files->file[0]->videoStreams->videoStream[1]->bitDepth);
$this->assertEquals('yuv420p', $result->files->file[0]->videoStreams->videoStream[1]->pixelFormat);
$this->assertEquals('bt709', $result->files->file[0]->videoStreams->videoStream[1]->colorSpace);
$this->assertEquals(720, $result->files->file[0]->videoStreams->videoStream[1]->height);
$this->assertEquals(1280, $result->files->file[0]->videoStreams->videoStream[1]->width);
$this->assertEquals(1, count($result->files->file[0]->audioStreams->audioStream));
$this->assertEquals('aac', $result->files->file[0]->audioStreams->audioStream[0]->codecName);
$this->assertEquals(1048576, $result->files->file[0]->audioStreams->audioStream[0]->bitrate);
$this->assertEquals(48000, $result->files->file[0]->audioStreams->audioStream[0]->sampleRate);
$this->assertEquals(0.0235, $result->files->file[0]->audioStreams->audioStream[0]->startTime);
$this->assertEquals(3.690667, $result->files->file[0]->audioStreams->audioStream[0]->duration);
$this->assertEquals(2, $result->files->file[0]->audioStreams->audioStream[0]->channels);
$this->assertEquals('en', $result->files->file[0]->audioStreams->audioStream[0]->language);
$this->assertEquals(2, count($result->files->file[0]->subtitles->subtitle));
$this->assertEquals('mov_text', $result->files->file[0]->subtitles->subtitle[0]->codecName);
$this->assertEquals('en', $result->files->file[0]->subtitles->subtitle[0]->language);
$this->assertEquals(0, $result->files->file[0]->subtitles->subtitle[0]->startTime);
$this->assertEquals(71.378, $result->files->file[0]->subtitles->subtitle[0]->duration);
$this->assertEquals('mov_text', $result->files->file[0]->subtitles->subtitle[1]->codecName);
$this->assertEquals('en', $result->files->file[0]->subtitles->subtitle[1]->language);
$this->assertEquals(72, $result->files->file[0]->subtitles->subtitle[1]->startTime);
$this->assertEquals(71.378, $result->files->file[0]->subtitles->subtitle[1]->duration);
$this->assertEquals(5407765, $result->files->file[0]->bitrate);
$this->assertEquals('Jane', $result->files->file[0]->artist);
$this->assertEquals('Jenny', $result->files->file[0]->albumArtist);
$this->assertEquals('Jane', $result->files->file[0]->composer);
$this->assertEquals('Jane', $result->files->file[0]->performer);
$this->assertEquals('FirstAlbum', $result->files->file[0]->album);
$this->assertEquals(71.378, $result->files->file[0]->duration);
$this->assertEquals(2, count($result->files->file[0]->addresses->address));
$this->assertEquals('中国浙江省杭州市余杭区文一西路969号', $result->files->file[0]->addresses->address[0]->addressLine);
$this->assertEquals('杭州市', $result->files->file[0]->addresses->address[0]->city);
$this->assertEquals('中国', $result->files->file[0]->addresses->address[0]->country);
$this->assertEquals('余杭区', $result->files->file[0]->addresses->address[0]->district);
$this->assertEquals('zh-Hans', $result->files->file[0]->addresses->address[0]->language);
$this->assertEquals('浙江省', $result->files->file[0]->addresses->address[0]->province);
$this->assertEquals('文一西路', $result->files->file[0]->addresses->address[0]->township);
$this->assertEquals('中国浙江省杭州市余杭区文一西路970号', $result->files->file[0]->addresses->address[1]->addressLine);
$this->assertEquals('杭州市', $result->files->file[0]->addresses->address[1]->city);
$this->assertEquals('中国', $result->files->file[0]->addresses->address[1]->country);
$this->assertEquals('余杭区', $result->files->file[0]->addresses->address[1]->district);
$this->assertEquals('zh-Hans', $result->files->file[0]->addresses->address[1]->language);
$this->assertEquals('浙江省', $result->files->file[0]->addresses->address[1]->province);
$this->assertEquals('文一西路', $result->files->file[0]->addresses->address[1]->township);
$this->assertEquals('Normal', $result->files->file[0]->ossObjectType);
$this->assertEquals('Standard', $result->files->file[0]->ossStorageClass);
$this->assertEquals(2, $result->files->file[0]->ossTaggingCount);
$this->assertEquals('key', $result->files->file[0]->ossTagging->taggings[0]->key);
$this->assertEquals('val', $result->files->file[0]->ossTagging->taggings[0]->value);
$this->assertEquals('key2', $result->files->file[0]->ossTagging->taggings[1]->key);
$this->assertEquals('val2', $result->files->file[0]->ossTagging->taggings[1]->value);
$this->assertEquals(1, count($result->files->file[0]->ossUserMeta->userMetas));
$this->assertEquals('key', $result->files->file[0]->ossUserMeta->userMetas[0]->key);
$this->assertEquals('val', $result->files->file[0]->ossUserMeta->userMetas[0]->value);
}
public function testFromCloseMetaQuery()
{
// miss required field
try {
$request = new Models\CloseMetaQueryRequest();
$input = BucketMetaQuery::fromCloseMetaQuery($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\CloseMetaQueryRequest('bucket-123');
$input = BucketMetaQuery::fromCloseMetaQuery($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketMetaQuery()
{
// empty output
$output = new OperationOutput();
$result = BucketMetaQuery::toCloseMetaQuery($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
);
$result = BucketMetaQuery::toCloseMetaQuery($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,200 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketOverwriteConfig;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketOverwriteConfigTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketOverwriteConfig()
{
// miss required field
try {
$request = new Models\PutBucketOverwriteConfigRequest();
$input = BucketOverwriteConfig::fromPutBucketOverwriteConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketOverwriteConfigRequest('bucket-123');
$input = BucketOverwriteConfig::fromPutBucketOverwriteConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, overwriteConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketOverwriteConfigRequest('bucket-123', new Models\OverwriteConfiguration(
rules: array(
new Models\OverwriteRule(action: 'forbid', id: 'rule-001')
)
));
$input = BucketOverwriteConfig::fromPutBucketOverwriteConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><OverwriteConfiguration><Rule><Action>forbid</Action><ID>rule-001</ID></Rule></OverwriteConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo2
$request = new Models\PutBucketOverwriteConfigRequest('bucket-123', new Models\OverwriteConfiguration(
rules: array(
new Models\OverwriteRule(action: 'forbid', id: 'rule-001'),
new Models\OverwriteRule(action: 'forbid', prefix: 'pre', suffix: '.txt', principals: new Models\OverwritePrincipals(array('1234567890')), id: 'rule-002')
)
));
$input = BucketOverwriteConfig::fromPutBucketOverwriteConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><OverwriteConfiguration><Rule><Action>forbid</Action><ID>rule-001</ID></Rule><Rule><Action>forbid</Action><Prefix>pre</Prefix><Suffix>.txt</Suffix><Principals><Principal>1234567890</Principal></Principals><ID>rule-002</ID></Rule></OverwriteConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketOverwriteConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketOverwriteConfig::toPutBucketOverwriteConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketOverwriteConfig::toPutBucketOverwriteConfig($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketOverwriteConfig()
{
// miss required field
try {
$request = new Models\GetBucketOverwriteConfigRequest();
$input = BucketOverwriteConfig::fromGetBucketOverwriteConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketOverwriteConfigRequest('bucket-123');
$input = BucketOverwriteConfig::fromGetBucketOverwriteConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketOverwriteConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketOverwriteConfig::toGetBucketOverwriteConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<OverwriteConfiguration>
<Rule>
<ID>1</ID>
<Action>forbid</Action>
<Prefix></Prefix>
<Suffix></Suffix>
<Principals />
</Rule>
<Rule>
<ID>2</ID>
<Action>forbid</Action>
<Prefix>pre</Prefix>
<Suffix>.txt</Suffix>
<Principals>
<Principal>1234567890</Principal>
</Principals>
</Rule>
</OverwriteConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketOverwriteConfig::toGetBucketOverwriteConfig($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals(2, count($result->overwriteConfiguration->rules));
$this->assertEquals("1", $result->overwriteConfiguration->rules[0]->id);
$this->assertEquals("forbid", $result->overwriteConfiguration->rules[0]->action);
$this->assertEquals("", $result->overwriteConfiguration->rules[0]->prefix);
$this->assertEquals("", $result->overwriteConfiguration->rules[0]->suffix);
$this->assertEquals(new Models\OverwritePrincipals(), $result->overwriteConfiguration->rules[0]->principals);
$this->assertEquals("2", $result->overwriteConfiguration->rules[1]->id);
$this->assertEquals("forbid", $result->overwriteConfiguration->rules[1]->action);
$this->assertEquals("pre", $result->overwriteConfiguration->rules[1]->prefix);
$this->assertEquals(".txt", $result->overwriteConfiguration->rules[1]->suffix);
$this->assertEquals(1, count($result->overwriteConfiguration->rules[1]->principals->principals));
$this->assertEquals("1234567890", $result->overwriteConfiguration->rules[1]->principals->principals[0]);
}
public function testFromDeleteBucketOverwriteConfig()
{
// miss required field
try {
$request = new Models\DeleteBucketOverwriteConfigRequest();
$input = BucketOverwriteConfig::fromDeleteBucketOverwriteConfig($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketOverwriteConfigRequest('bucket-123');
$input = BucketOverwriteConfig::fromDeleteBucketOverwriteConfig($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketOverwriteConfig()
{
// empty output
$output = new OperationOutput();
$result = BucketOverwriteConfig::toDeleteBucketOverwriteConfig($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketOverwriteConfig::toDeleteBucketOverwriteConfig($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,197 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketPolicy;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketPolicyTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketPolicy()
{
// miss required field
try {
$request = new Models\PutBucketPolicyRequest();
$input = BucketPolicy::fromPutBucketPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketPolicyRequest('bucket-123');
$input = BucketPolicy::fromPutBucketPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, body.", (string)$e);
}
// all settings
$body = '{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["1234567890"],"Resource":["acs:oss:*:1234567890:*/*"]}]}';
$request = new Models\PutBucketPolicyRequest(
bucket: 'bucket-123',
body: $body
);
$json = <<<BBB
{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["1234567890"],"Resource":["acs:oss:*:1234567890:*/*"]}]}
BBB;
$input = BucketPolicy::fromPutBucketPolicy($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals($json, $input->getBody()->getContents());
$this->assertEquals(base64_encode(md5($input->getBody(), true)), $input->getHeaders()['content-md5']);
}
public function testToPutBucketPolicy()
{
// empty output
$output = new OperationOutput();
$result = BucketPolicy::toPutBucketPolicy($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketPolicy::toPutBucketPolicy($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketPolicy()
{
// miss required field
try {
$request = new Models\GetBucketPolicyRequest();
$input = BucketPolicy::fromGetBucketPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketPolicyRequest('bucket-123');
$input = BucketPolicy::fromGetBucketPolicy($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketPolicy()
{
// empty output
$output = new OperationOutput();
$result = BucketPolicy::toGetBucketPolicy($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor('{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["1234567890"],"Resource":["acs:oss:*:1234567890:*/*"]}]}')
);
$result = BucketPolicy::toGetBucketPolicy($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertCount(2, $result->headers);
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('{"Version":"1","Statement":[{"Action":["oss:PutObject","oss:GetObject"],"Effect":"Deny","Principal":["1234567890"],"Resource":["acs:oss:*:1234567890:*/*"]}]}', $result->body);
}
public function testFromGetBucketPolicyStatus()
{
// miss required field
try {
$request = new Models\GetBucketPolicyStatusRequest();
$input = BucketPolicy::fromGetBucketPolicyStatus($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketPolicyStatusRequest('bucket-123');
$input = BucketPolicy::fromGetBucketPolicyStatus($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketPolicyStatus()
{
// empty output
$output = new OperationOutput();
$result = BucketPolicy::toGetBucketPolicyStatus($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor('<?xml version="1.0" encoding="UTF-8"?>
<PolicyStatus>
<IsPublic>true</IsPublic>
</PolicyStatus>')
);
$result = BucketPolicy::toGetBucketPolicyStatus($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertCount(2, $result->headers);
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertTrue($result->policyStatus->isPublic);
}
public function testFromDeleteBucketPolicy()
{
// miss required field
try {
$request = new Models\DeleteBucketPolicyRequest();
$input = BucketPolicy::fromDeleteBucketPolicy($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketPolicyRequest('bucket-123');
$input = BucketPolicy::fromDeleteBucketPolicy($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketPolicy()
{
// empty output
$output = new OperationOutput();
$result = BucketPolicy::toDeleteBucketPolicy($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketPolicy::toDeleteBucketPolicy($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
}

View File

@@ -0,0 +1,155 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Models\PublicAccessBlockConfiguration;
use AlibabaCloud\Oss\V2\Transform\BucketPublicAccessBlock;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketPublicAccessBlockTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketPublicAccessBlock()
{
// miss required field
try {
$request = new Models\PutBucketPublicAccessBlockRequest();
$input = BucketPublicAccessBlock::fromPutBucketPublicAccessBlock($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketPublicAccessBlockRequest('bucket-123');
$input = BucketPublicAccessBlock::fromPutBucketPublicAccessBlock($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, publicAccessBlockConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketPublicAccessBlockRequest('bucket-123', new Models\PublicAccessBlockConfiguration(
true
));
$input = BucketPublicAccessBlock::fromPutBucketPublicAccessBlock($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><PublicAccessBlockConfiguration><BlockPublicAccess>true</BlockPublicAccess></PublicAccessBlockConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketPublicAccessBlock()
{
// empty output
$output = new OperationOutput();
$result = BucketPublicAccessBlock::toPutBucketPublicAccessBlock($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketPublicAccessBlock::toPutBucketPublicAccessBlock($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketPublicAccessBlock()
{
try {
$request = new Models\GetBucketPublicAccessBlockRequest();
$input = BucketPublicAccessBlock::fromGetBucketPublicAccessBlock($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketPublicAccessBlockRequest('bucket-123');
$input = BucketPublicAccessBlock::fromGetBucketPublicAccessBlock($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketPublicAccessBlock()
{
// empty output
$output = new OperationOutput();
$result = BucketPublicAccessBlock::toGetBucketPublicAccessBlock($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<PublicAccessBlockConfiguration>
<BlockPublicAccess>true</BlockPublicAccess>
</PublicAccessBlockConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketPublicAccessBlock::toGetBucketPublicAccessBlock($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertTrue($result->publicAccessBlockConfiguration->blockPublicAccess);
}
public function testFromDeleteBucketPublicAccessBlock()
{
try {
$request = new Models\DeleteBucketPublicAccessBlockRequest();
$input = BucketPublicAccessBlock::fromDeleteBucketPublicAccessBlock($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketPublicAccessBlockRequest('bucket-123');
$input = BucketPublicAccessBlock::fromDeleteBucketPublicAccessBlock($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketPublicAccessBlock()
{
// empty output
$output = new OperationOutput();
$result = BucketPublicAccessBlock::toDeleteBucketPublicAccessBlock($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketPublicAccessBlock::toDeleteBucketPublicAccessBlock($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,467 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketRedundancyTransition;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketRedundancyTransitionTest extends \PHPUnit\Framework\TestCase
{
public function testFromCreateBucketDataRedundancyTransition()
{
// miss required field
try {
$request = new Models\CreateBucketDataRedundancyTransitionRequest();
$input = BucketRedundancyTransition::fromCreateBucketDataRedundancyTransition($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\CreateBucketDataRedundancyTransitionRequest('bucket-123');
$input = BucketRedundancyTransition::fromCreateBucketDataRedundancyTransition($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, targetRedundancyType", (string)$e);
}
$request = new Models\CreateBucketDataRedundancyTransitionRequest('bucket-123', Models\DataRedundancyType::ZRS);
$input = BucketRedundancyTransition::fromCreateBucketDataRedundancyTransition($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals(Models\DataRedundancyType::ZRS, $input->getParameters()['x-oss-target-redundancy-type']);
}
public function testToCreateBucketDataRedundancyTransition()
{
// empty output
$output = new OperationOutput();
$result = BucketRedundancyTransition::toCreateBucketDataRedundancyTransition($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = <<<BBB
<?xml version="1.0" encoding="UTF-8"?>
<BucketDataRedundancyTransition>
<TaskId>4be5beb0f74f490186311b268bf6****</TaskId>
</BucketDataRedundancyTransition>
BBB;
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toCreateBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('4be5beb0f74f490186311b268bf6****', $result->bucketDataRedundancyTransition->taskId);
}
public function testFromGetBucketDataRedundancyTransition()
{
// miss required field
try {
$request = new Models\GetBucketDataRedundancyTransitionRequest();
$input = BucketRedundancyTransition::fromGetBucketDataRedundancyTransition($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\GetBucketDataRedundancyTransitionRequest('bucket-123');
$input = BucketRedundancyTransition::fromGetBucketDataRedundancyTransition($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, redundancyTransitionTaskid", (string)$e);
}
$request = new Models\GetBucketDataRedundancyTransitionRequest('bucket-123', 'task-123');
$input = BucketRedundancyTransition::fromGetBucketDataRedundancyTransition($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('task-123', $input->getParameters()['x-oss-redundancy-transition-taskid']);
}
public function testToGetBucketDataRedundancyTransition()
{
// empty output
$output = new OperationOutput();
$result = BucketRedundancyTransition::toGetBucketDataRedundancyTransition($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<BucketDataRedundancyTransition>
<Bucket>examplebucket</Bucket>
<TaskId>4be5beb0f74f490186311b268bf6****</TaskId>
<Status>Queueing</Status>
<CreateTime>2023-11-17T09:11:58.000Z</CreateTime>
</BucketDataRedundancyTransition>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toGetBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('examplebucket', $result->bucketDataRedundancyTransition->bucket);
$this->assertEquals('4be5beb0f74f490186311b268bf6****', $result->bucketDataRedundancyTransition->taskId);
$this->assertEquals('Queueing', $result->bucketDataRedundancyTransition->status);
$this->assertEquals('2023-11-17T09:11:58.000Z', $result->bucketDataRedundancyTransition->createTime);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<BucketDataRedundancyTransition>
<Bucket>examplebucket</Bucket>
<TaskId>909c6c818dd041d1a44e0fdc66aa****</TaskId>
<Status>Processing</Status>
<CreateTime>2023-11-17T09:14:39.000Z</CreateTime>
<StartTime>2023-11-17T09:14:39.000Z</StartTime>
<ProcessPercentage>0</ProcessPercentage>
<EstimatedRemainingTime>100</EstimatedRemainingTime>
</BucketDataRedundancyTransition>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toGetBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('examplebucket', $result->bucketDataRedundancyTransition->bucket);
$this->assertEquals('909c6c818dd041d1a44e0fdc66aa****', $result->bucketDataRedundancyTransition->taskId);
$this->assertEquals('Processing', $result->bucketDataRedundancyTransition->status);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->bucketDataRedundancyTransition->createTime);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->bucketDataRedundancyTransition->startTime);
$this->assertEquals(0, $result->bucketDataRedundancyTransition->processPercentage);
$this->assertEquals(100, $result->bucketDataRedundancyTransition->estimatedRemainingTime);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<BucketDataRedundancyTransition>
<Bucket>examplebucket</Bucket>
<TaskId>909c6c818dd041d1a44e0fdc66aa****</TaskId>
<Status>Finished</Status>
<CreateTime>2023-11-17T09:14:39.000Z</CreateTime>
<StartTime>2023-11-17T09:14:39.000Z</StartTime>
<ProcessPercentage>100</ProcessPercentage>
<EstimatedRemainingTime>0</EstimatedRemainingTime>
<EndTime>2023-11-18T09:14:39.000Z</EndTime>
</BucketDataRedundancyTransition>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toGetBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('examplebucket', $result->bucketDataRedundancyTransition->bucket);
$this->assertEquals('909c6c818dd041d1a44e0fdc66aa****', $result->bucketDataRedundancyTransition->taskId);
$this->assertEquals('Finished', $result->bucketDataRedundancyTransition->status);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->bucketDataRedundancyTransition->createTime);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->bucketDataRedundancyTransition->startTime);
$this->assertEquals(100, $result->bucketDataRedundancyTransition->processPercentage);
$this->assertEquals(0, $result->bucketDataRedundancyTransition->estimatedRemainingTime);
$this->assertEquals('2023-11-18T09:14:39.000Z', $result->bucketDataRedundancyTransition->endTime);
}
public function testFromDeleteBucketDataRedundancyTransition()
{
// miss required field
try {
$request = new Models\DeleteBucketDataRedundancyTransitionRequest();
$input = BucketRedundancyTransition::fromDeleteBucketDataRedundancyTransition($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DeleteBucketDataRedundancyTransitionRequest('bucket-123');
$input = BucketRedundancyTransition::fromDeleteBucketDataRedundancyTransition($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, redundancyTransitionTaskid", (string)$e);
}
$request = new Models\DeleteBucketDataRedundancyTransitionRequest('bucket-123', 'task-123');
$input = BucketRedundancyTransition::fromDeleteBucketDataRedundancyTransition($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('task-123', $input->getParameters()['x-oss-redundancy-transition-taskid']);
}
public function testToDeleteBucketDataRedundancyTransition()
{
// empty output
$output = new OperationOutput();
$result = BucketRedundancyTransition::toDeleteBucketDataRedundancyTransition($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketRedundancyTransition::toDeleteBucketDataRedundancyTransition($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromListBucketDataRedundancyTransition()
{
// miss required field
try {
$request = new Models\ListBucketDataRedundancyTransitionRequest();
$input = BucketRedundancyTransition::fromListBucketDataRedundancyTransition($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\ListBucketDataRedundancyTransitionRequest('bucket-123');
$input = BucketRedundancyTransition::fromListBucketDataRedundancyTransition($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToListBucketDataRedundancyTransition()
{
// empty output
$output = new OperationOutput();
$result = BucketRedundancyTransition::toListBucketDataRedundancyTransition($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListBucketDataRedundancyTransition>
<BucketDataRedundancyTransition>
<Bucket>examplebucket</Bucket>
<TaskId>4be5beb0f74f490186311b268bf6****</TaskId>
<Status>Queueing</Status>
<CreateTime>2023-11-17T09:11:58.000Z</CreateTime>
</BucketDataRedundancyTransition>
</ListBucketDataRedundancyTransition>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toListBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('examplebucket', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->bucket);
$this->assertEquals('4be5beb0f74f490186311b268bf6****', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->taskId);
$this->assertEquals('Queueing', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->status);
$this->assertEquals('2023-11-17T09:11:58.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->createTime);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListBucketDataRedundancyTransition>
<BucketDataRedundancyTransition>
<Bucket>examplebucket</Bucket>
<TaskId>909c6c818dd041d1a44e0fdc66aa****</TaskId>
<Status>Processing</Status>
<CreateTime>2023-11-17T09:14:39.000Z</CreateTime>
<StartTime>2023-11-17T09:14:39.000Z</StartTime>
<ProcessPercentage>0</ProcessPercentage>
<EstimatedRemainingTime>100</EstimatedRemainingTime>
</BucketDataRedundancyTransition>
</ListBucketDataRedundancyTransition>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toListBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('examplebucket', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->bucket);
$this->assertEquals('909c6c818dd041d1a44e0fdc66aa****', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->taskId);
$this->assertEquals('Processing', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->status);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->createTime);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->startTime);
$this->assertEquals(0, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->processPercentage);
$this->assertEquals(100, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->estimatedRemainingTime);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListBucketDataRedundancyTransition>
<BucketDataRedundancyTransition>
<Bucket>examplebucket</Bucket>
<TaskId>909c6c818dd041d1a44e0fdc66aa****</TaskId>
<Status>Finished</Status>
<CreateTime>2023-11-17T09:14:39.000Z</CreateTime>
<StartTime>2023-11-17T09:14:39.000Z</StartTime>
<ProcessPercentage>100</ProcessPercentage>
<EstimatedRemainingTime>0</EstimatedRemainingTime>
<EndTime>2023-11-18T09:14:39.000Z</EndTime>
</BucketDataRedundancyTransition>
</ListBucketDataRedundancyTransition>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toListBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('examplebucket', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->bucket);
$this->assertEquals('909c6c818dd041d1a44e0fdc66aa****', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->taskId);
$this->assertEquals('Finished', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->status);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->createTime);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->startTime);
$this->assertEquals(100, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->processPercentage);
$this->assertEquals(0, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->estimatedRemainingTime);
$this->assertEquals('2023-11-18T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->endTime);
}
public function testFromListUserDataRedundancyTransition()
{
$request = new Models\ListUserDataRedundancyTransitionRequest();
$input = BucketRedundancyTransition::fromListUserDataRedundancyTransition($request);
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$request = new Models\ListUserDataRedundancyTransitionRequest('token');
$input = BucketRedundancyTransition::fromListUserDataRedundancyTransition($request);
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('token', $input->getParameters()['continuation-token']);
$request = new Models\ListUserDataRedundancyTransitionRequest('token', '100');
$input = BucketRedundancyTransition::fromListUserDataRedundancyTransition($request);
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$this->assertEquals('token', $input->getParameters()['continuation-token']);
$this->assertEquals(100, $input->getParameters()['max-keys']);
}
public function testToListUserDataRedundancyTransition()
{
// empty output
$output = new OperationOutput();
$result = BucketRedundancyTransition::toListBucketDataRedundancyTransition($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListBucketDataRedundancyTransition>
<BucketDataRedundancyTransition>
<Bucket>examplebucket</Bucket>
<TaskId>4be5beb0f74f490186311b268bf6****</TaskId>
<Status>Queueing</Status>
<CreateTime>2023-11-17T09:11:58.000Z</CreateTime>
</BucketDataRedundancyTransition>
<BucketDataRedundancyTransition>
<Bucket>examplebucket1</Bucket>
<TaskId>909c6c818dd041d1a44e0fdc66aa****</TaskId>
<Status>Processing</Status>
<CreateTime>2023-11-17T09:14:39.000Z</CreateTime>
<StartTime>2023-11-17T09:14:39.000Z</StartTime>
<ProcessPercentage>0</ProcessPercentage>
<EstimatedRemainingTime>100</EstimatedRemainingTime>
</BucketDataRedundancyTransition>
<BucketDataRedundancyTransition>
<Bucket>examplebucket2</Bucket>
<TaskId>909c6c818dd041d1a44e0fdc66aa****</TaskId>
<Status>Finished</Status>
<CreateTime>2023-11-17T09:14:39.000Z</CreateTime>
<StartTime>2023-11-17T09:14:39.000Z</StartTime>
<ProcessPercentage>100</ProcessPercentage>
<EstimatedRemainingTime>0</EstimatedRemainingTime>
<EndTime>2023-11-18T09:14:39.000Z</EndTime>
</BucketDataRedundancyTransition>
<IsTruncated>false</IsTruncated>
<NextContinuationToken></NextContinuationToken>
</ListBucketDataRedundancyTransition>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketRedundancyTransition::toListBucketDataRedundancyTransition($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals(3, count($result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions));
$this->assertEquals('examplebucket', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->bucket);
$this->assertEquals('4be5beb0f74f490186311b268bf6****', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->taskId);
$this->assertEquals('Queueing', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->status);
$this->assertEquals('2023-11-17T09:11:58.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[0]->createTime);
$this->assertEquals('examplebucket1', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[1]->bucket);
$this->assertEquals('909c6c818dd041d1a44e0fdc66aa****', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[1]->taskId);
$this->assertEquals('Processing', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[1]->status);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[1]->createTime);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[1]->startTime);
$this->assertEquals(0, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[1]->processPercentage);
$this->assertEquals(100, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[1]->estimatedRemainingTime);
$this->assertEquals('examplebucket2', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->bucket);
$this->assertEquals('909c6c818dd041d1a44e0fdc66aa****', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->taskId);
$this->assertEquals('Finished', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->status);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->createTime);
$this->assertEquals('2023-11-17T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->startTime);
$this->assertEquals(100, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->processPercentage);
$this->assertEquals(0, $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->estimatedRemainingTime);
$this->assertEquals('2023-11-18T09:14:39.000Z', $result->listBucketDataRedundancyTransition->bucketDataRedundancyTransitions[2]->endTime);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,200 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketReferer;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
use DateTime;
use DateTimeZone;
class BucketRefererTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketReferer()
{
// miss required field
try {
$request = new Models\PutBucketRefererRequest();
$input = BucketReferer::fromPutBucketReferer($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketRefererRequest('bucket-123');
$input = BucketReferer::fromPutBucketReferer($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, refererConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketRefererRequest('bucket-123', new Models\RefererConfiguration(
allowEmptyReferer: false,
allowTruncateQueryString: true,
truncatePath: true,
refererList: new Models\RefererList(["http://www.aliyun.com", "https://www.aliyun.com", "http://www.*.com", "https://www.?.aliyuncs.com",]),
refererBlacklist: new Models\RefererBlacklist(["http://www.refuse.com", "https://*.hack.com", "http://ban.*.com", "https://www.?.deny.com",])
));
$input = BucketReferer::fromPutBucketReferer($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><RefererConfiguration><AllowEmptyReferer>false</AllowEmptyReferer><AllowTruncateQueryString>true</AllowTruncateQueryString><TruncatePath>true</TruncatePath><RefererList><Referer>http://www.aliyun.com</Referer><Referer>https://www.aliyun.com</Referer><Referer>http://www.*.com</Referer><Referer>https://www.?.aliyuncs.com</Referer></RefererList><RefererBlacklist><Referer>http://www.refuse.com</Referer><Referer>https://*.hack.com</Referer><Referer>http://ban.*.com</Referer><Referer>https://www.?.deny.com</Referer></RefererBlacklist></RefererConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo2
$request = new Models\PutBucketRefererRequest('bucket-123', new Models\RefererConfiguration(
allowEmptyReferer: false,
allowTruncateQueryString: true,
truncatePath: true,
refererList: new Models\RefererList(["http://www.aliyun.com", "https://www.aliyun.com", "http://www.*.com", "https://www.?.aliyuncs.com",]),
));
$input = BucketReferer::fromPutBucketReferer($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><RefererConfiguration><AllowEmptyReferer>false</AllowEmptyReferer><AllowTruncateQueryString>true</AllowTruncateQueryString><TruncatePath>true</TruncatePath><RefererList><Referer>http://www.aliyun.com</Referer><Referer>https://www.aliyun.com</Referer><Referer>http://www.*.com</Referer><Referer>https://www.?.aliyuncs.com</Referer></RefererList></RefererConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo3
$request = new Models\PutBucketRefererRequest('bucket-123', new Models\RefererConfiguration(
allowEmptyReferer: false,
refererList: new Models\RefererList([""]),
));
$input = BucketReferer::fromPutBucketReferer($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><RefererConfiguration><AllowEmptyReferer>false</AllowEmptyReferer><RefererList><Referer></Referer></RefererList></RefererConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketReferer()
{
// empty output
$output = new OperationOutput();
$result = BucketReferer::toPutBucketReferer($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketReferer::toPutBucketReferer($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketReferer()
{
// miss required field
try {
$request = new Models\GetBucketRefererRequest();
$input = BucketReferer::fromGetBucketReferer($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketRefererRequest('bucket-123');
$input = BucketReferer::fromGetBucketReferer($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketReferer()
{
// empty output
$output = new OperationOutput();
$result = BucketReferer::toGetBucketReferer($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<RefererConfiguration>
<AllowEmptyReferer>false</AllowEmptyReferer>
<AllowTruncateQueryString>true</AllowTruncateQueryString>
<TruncatePath>true</TruncatePath>
<RefererList>
<Referer>http://www.aliyun.com</Referer>
<Referer>https://www.aliyun.com</Referer>
<Referer>http://www.*.com</Referer>
<Referer>https://www.?.aliyuncs.com</Referer>
</RefererList>
</RefererConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketReferer::toGetBucketReferer($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertFalse($result->refererConfiguration->allowEmptyReferer);
$this->assertTrue($result->refererConfiguration->allowTruncateQueryString);
$this->assertTrue($result->refererConfiguration->truncatePath);
$this->assertEquals(4, count($result->refererConfiguration->refererList->referers));
$this->assertEquals("https://www.?.aliyuncs.com", ($result->refererConfiguration->refererList->referers[3]));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<RefererConfiguration>
<AllowEmptyReferer>false</AllowEmptyReferer>
<AllowTruncateQueryString>true</AllowTruncateQueryString>
<TruncatePath>true</TruncatePath>
<RefererList>
<Referer>http://www.aliyun.com</Referer>
<Referer>https://www.aliyun.com</Referer>
<Referer>http://www.*.com</Referer>
<Referer>https://www.?.aliyuncs.com</Referer>
</RefererList>
<RefererBlacklist>
<Referer>http://www.refuse.com</Referer>
<Referer>https://*.hack.com</Referer>
<Referer>http://ban.*.com</Referer>
<Referer>https://www.?.deny.com</Referer>
</RefererBlacklist>
</RefererConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketReferer::toGetBucketReferer($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertFalse($result->refererConfiguration->allowEmptyReferer);
$this->assertTrue($result->refererConfiguration->allowTruncateQueryString);
$this->assertTrue($result->refererConfiguration->truncatePath);
$this->assertEquals(4, count($result->refererConfiguration->refererList->referers));
$this->assertEquals(4, count($result->refererConfiguration->refererBlacklist->referers));
$this->assertEquals("https://www.?.aliyuncs.com", ($result->refererConfiguration->refererList->referers[3]));
$this->assertEquals("http://ban.*.com", ($result->refererConfiguration->refererBlacklist->referers[2]));
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,428 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketReplication;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketReplicationTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketRtc()
{
// miss required field
try {
$request = new Models\PutBucketRtcRequest();
$input = BucketReplication::fromPutBucketRtc($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketRtcRequest('bucket-123');
$input = BucketReplication::fromPutBucketRtc($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, rtcConfiguration", (string)$e);
}
$request = new Models\PutBucketRtcRequest('bucket-123', new Models\RtcConfiguration(
rtc: new Models\ReplicationTimeControl(
status: 'enabled'
),
id: 'test_replication_rule_1'
));
$input = BucketReplication::fromPutBucketRtc($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ReplicationRule><RTC><Status>enabled</Status></RTC><ID>test_replication_rule_1</ID></ReplicationRule>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketRtc()
{
// empty output
$output = new OperationOutput();
$result = BucketReplication::toPutBucketRtc($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketReplication::toPutBucketRtc($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromPutBucketReplication()
{
// miss required field
try {
$request = new Models\PutBucketReplicationRequest();
$input = BucketReplication::fromPutBucketReplication($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketReplicationRequest('bucket-123');
$input = BucketReplication::fromPutBucketReplication($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, replicationConfiguration", (string)$e);
}
$request = new Models\PutBucketReplicationRequest('bucket-123', new Models\ReplicationConfiguration(
array(new Models\ReplicationRule(
sourceSelectionCriteria: new Models\ReplicationSourceSelectionCriteria(
sseKmsEncryptedObjects: new Models\SseKmsEncryptedObjects(
status: 'Enabled',
)
),
destination: new Models\ReplicationDestination(
bucket: 'destBucket',
location: 'oss-cn-beijing',
transferType: Models\TransferType::OSS_ACC
),
historicalObjectReplication: Models\HistoricalObjectReplicationType::ENABLED,
syncRole: 'aliyunramrole',
encryptionConfiguration: new Models\ReplicationEncryptionConfiguration(
replicaKmsKeyID: 'c4d49f85-ee30-426b-a5ed-95e9139d****'
),
rtc: new Models\ReplicationTimeControl(
status: 'enabled'
)
))
));
$input = BucketReplication::fromPutBucketReplication($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ReplicationConfiguration><Rule><SourceSelectionCriteria><SseKmsEncryptedObjects><Status>Enabled</Status></SseKmsEncryptedObjects></SourceSelectionCriteria><Destination><Bucket>destBucket</Bucket><Location>oss-cn-beijing</Location><TransferType>oss_acc</TransferType></Destination><HistoricalObjectReplication>enabled</HistoricalObjectReplication><SyncRole>aliyunramrole</SyncRole><EncryptionConfiguration><ReplicaKmsKeyID>c4d49f85-ee30-426b-a5ed-95e9139d****</ReplicaKmsKeyID></EncryptionConfiguration><RTC><Status>enabled</Status></RTC></Rule></ReplicationConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketReplication()
{
// empty output
$output = new OperationOutput();
$result = BucketReplication::toPutBucketReplication($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'x-oss-replication-rule-id' => 'b890c26e-907e-4692-b9ac-ec4c11ec****']
);
$result = BucketReplication::toPutBucketReplication($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('b890c26e-907e-4692-b9ac-ec4c11ec****', $result->replicationRuleId);
}
public function testFromGetBucketReplication()
{
// miss required field
try {
$request = new Models\GetBucketReplicationRequest();
$input = BucketReplication::fromGetBucketReplication($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketReplicationRequest('bucket-123');
$input = BucketReplication::fromGetBucketReplication($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketReplication()
{
// empty output
$output = new OperationOutput();
$result = BucketReplication::toGetBucketReplication($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ReplicationConfiguration>
<Rule>
<ID>test_replication_1</ID>
<PrefixSet>
<Prefix>source1</Prefix>
<Prefix>video</Prefix>
</PrefixSet>
<Action>PUT</Action>
<Destination>
<Bucket>destbucket</Bucket>
<Location>oss-cn-beijing</Location>
<TransferType>oss_acc</TransferType>
</Destination>
<Status>doing</Status>
<HistoricalObjectReplication>enabled</HistoricalObjectReplication>
<SyncRole>aliyunramrole</SyncRole>
<RTC>
<Status>enabled</Status>
</RTC>
</Rule>
</ReplicationConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketReplication::toGetBucketReplication($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(1, count($result->replicationConfiguration->rules));
$this->assertEquals('enabled', $result->replicationConfiguration->rules[0]->rtc->status);
$this->assertEquals('test_replication_1', $result->replicationConfiguration->rules[0]->id);
$this->assertEquals('source1', $result->replicationConfiguration->rules[0]->prefixSet->prefixs[0]);
$this->assertEquals('video', $result->replicationConfiguration->rules[0]->prefixSet->prefixs[1]);
$this->assertEquals('PUT', $result->replicationConfiguration->rules[0]->action);
$this->assertEquals(Models\TransferType::OSS_ACC, $result->replicationConfiguration->rules[0]->destination->transferType);
$this->assertEquals('oss-cn-beijing', $result->replicationConfiguration->rules[0]->destination->location);
$this->assertEquals('doing', $result->replicationConfiguration->rules[0]->status);
$this->assertEquals(Models\HistoricalObjectReplicationType::ENABLED, $result->replicationConfiguration->rules[0]->historicalObjectReplication);
$this->assertEquals('aliyunramrole', $result->replicationConfiguration->rules[0]->syncRole);
}
public function testFromGetBucketReplicationLocation()
{
// miss required field
try {
$request = new Models\GetBucketReplicationLocationRequest();
$input = BucketReplication::fromGetBucketReplicationLocation($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketReplicationLocationRequest('bucket-123');
$input = BucketReplication::fromGetBucketReplicationLocation($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketReplicationLocation()
{
// empty output
$output = new OperationOutput();
$result = BucketReplication::toGetBucketReplicationLocation($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ReplicationLocation>
<Location>oss-cn-beijing</Location>
<Location>oss-cn-qingdao</Location>
<Location>oss-cn-shenzhen</Location>
<Location>oss-cn-hongkong</Location>
<Location>oss-us-west-1</Location>
<LocationTransferTypeConstraint>
<LocationTransferType>
<Location>oss-cn-hongkong</Location>
<TransferTypes>
<Type>oss_acc</Type>
</TransferTypes>
</LocationTransferType>
<LocationTransferType>
<Location>oss-us-west-1</Location>
<TransferTypes>
<Type>oss_acc</Type>
</TransferTypes>
</LocationTransferType>
</LocationTransferTypeConstraint>
</ReplicationLocation>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketReplication::toGetBucketReplicationLocation($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(5, count($result->replicationLocation->locations));
$this->assertEquals('oss-cn-beijing', $result->replicationLocation->locations[0]);
$this->assertEquals('oss-cn-qingdao', $result->replicationLocation->locations[1]);
$this->assertEquals('oss-cn-shenzhen', $result->replicationLocation->locations[2]);
$this->assertEquals('oss-cn-hongkong', $result->replicationLocation->locations[3]);
$this->assertEquals('oss-us-west-1', $result->replicationLocation->locations[4]);
$this->assertEquals(2, count($result->replicationLocation->locationTransferTypeConstraint->locationTransferTypes));
$this->assertEquals('oss-cn-hongkong', $result->replicationLocation->locationTransferTypeConstraint->locationTransferTypes[0]->location);
$this->assertEquals('oss_acc', $result->replicationLocation->locationTransferTypeConstraint->locationTransferTypes[0]->transferTypes->types[0]);
$this->assertEquals('oss-us-west-1', $result->replicationLocation->locationTransferTypeConstraint->locationTransferTypes[1]->location);
$this->assertEquals('oss_acc', $result->replicationLocation->locationTransferTypeConstraint->locationTransferTypes[1]->transferTypes->types[0]);
}
public function testFromGetBucketReplicationProgress()
{
// miss required field
try {
$request = new Models\GetBucketReplicationProgressRequest();
$input = BucketReplication::fromGetBucketReplicationProgress($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\GetBucketReplicationProgressRequest('bucket-123');
$input = BucketReplication::fromGetBucketReplicationProgress($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, ruleId", (string)$e);
}
$request = new Models\GetBucketReplicationProgressRequest('bucket-123', 'rule-1');
$input = BucketReplication::fromGetBucketReplicationProgress($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketReplicationProgress()
{
// empty output
$output = new OperationOutput();
$result = BucketReplication::toGetBucketReplicationProgress($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ReplicationProgress>
<Rule>
<ID>test_replication_1</ID>
<PrefixSet>
<Prefix>source_image</Prefix>
<Prefix>video</Prefix>
</PrefixSet>
<Action>PUT</Action>
<Destination>
<Bucket>target-bucket</Bucket>
<Location>oss-cn-beijing</Location>
<TransferType>oss_acc</TransferType>
</Destination>
<Status>doing</Status>
<HistoricalObjectReplication>enabled</HistoricalObjectReplication>
<Progress>
<HistoricalObject>0.85</HistoricalObject>
<NewObject>2015-09-24T15:28:14.000Z</NewObject>
</Progress>
</Rule>
</ReplicationProgress>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketReplication::toGetBucketReplicationProgress($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals(1, count($result->replicationProgress->rules));
$this->assertEquals('test_replication_1', $result->replicationProgress->rules[0]->id);
$this->assertEquals('source_image', $result->replicationProgress->rules[0]->prefixSet->prefixs[0]);
$this->assertEquals('video', $result->replicationProgress->rules[0]->prefixSet->prefixs[1]);
$this->assertEquals('PUT', $result->replicationProgress->rules[0]->action);
$this->assertEquals(Models\TransferType::OSS_ACC, $result->replicationProgress->rules[0]->destination->transferType);
$this->assertEquals('target-bucket', $result->replicationProgress->rules[0]->destination->bucket);
$this->assertEquals('oss-cn-beijing', $result->replicationProgress->rules[0]->destination->location);
$this->assertEquals('doing', $result->replicationProgress->rules[0]->status);
$this->assertEquals('0.85', $result->replicationProgress->rules[0]->progress->historicalObject);
$this->assertEquals('2015-09-24T15:28:14.000Z', $result->replicationProgress->rules[0]->progress->newObject);
}
public function testFromDeleteBucketReplication()
{
// miss required field
try {
$request = new Models\DeleteBucketReplicationRequest();
$input = BucketReplication::fromDeleteBucketReplication($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DeleteBucketReplicationRequest('bucket-123');
$input = BucketReplication::fromDeleteBucketReplication($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, replicationRules", (string)$e);
}
$request = new Models\DeleteBucketReplicationRequest('bucket-123', new Models\ReplicationRules(
ids: ['test_replication_1']
));
$input = BucketReplication::fromDeleteBucketReplication($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ReplicationRules><ID>test_replication_1</ID></ReplicationRules>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToDeleteBucketReplication()
{
// empty output
$output = new OperationOutput();
$result = BucketReplication::toGetBucketReplicationProgress($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
);
$result = BucketReplication::toGetBucketReplicationProgress($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,143 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketRequestPayment;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketRequestPaymentTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketRequestPayment()
{
// miss required field
try {
$request = new Models\PutBucketRequestPaymentRequest();
$input = BucketRequestPayment::fromPutBucketRequestPayment($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketRequestPaymentRequest('bucket-123');
$input = BucketRequestPayment::fromPutBucketRequestPayment($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, requestPaymentConfiguration", (string)$e);
}
$request = new Models\PutBucketRequestPaymentRequest('bucket-123', new Models\RequestPaymentConfiguration(
'Requester'
));
$input = BucketRequestPayment::fromPutBucketRequestPayment($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><RequestPaymentConfiguration><Payer>Requester</Payer></RequestPaymentConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\PutBucketRequestPaymentRequest('bucket-123', new Models\RequestPaymentConfiguration(
'BucketOwner'
));
$input = BucketRequestPayment::fromPutBucketRequestPayment($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><RequestPaymentConfiguration><Payer>BucketOwner</Payer></RequestPaymentConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketRequestPayment()
{
// empty output
$output = new OperationOutput();
$result = BucketRequestPayment::toPutBucketRequestPayment($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketRequestPayment::toPutBucketRequestPayment($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketRequestPayment()
{
// miss required field
try {
$request = new Models\GetBucketRequestPaymentRequest();
$input = BucketRequestPayment::fromGetBucketRequestPayment($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketRequestPaymentRequest('bucket-123');
$input = BucketRequestPayment::fromGetBucketRequestPayment($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketRequestPayment()
{
// empty output
$output = new OperationOutput();
$result = BucketRequestPayment::toGetBucketRequestPayment($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<RequestPaymentConfiguration>
<Payer>Requester</Payer>
</RequestPaymentConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketRequestPayment::toGetBucketRequestPayment($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('Requester', $result->requestPaymentConfiguration->payer);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<RequestPaymentConfiguration>
<Payer>BucketOwner</Payer>
</RequestPaymentConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketRequestPayment::toGetBucketRequestPayment($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('BucketOwner', $result->requestPaymentConfiguration->payer);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,115 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketResourceGroup;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketResourceGroupTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketResourceGroup()
{
// miss required field
try {
$request = new Models\PutBucketResourceGroupRequest();
$input = BucketResourceGroup::fromPutBucketResourceGroup($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketResourceGroupRequest('bucket-123');
$input = BucketResourceGroup::fromPutBucketResourceGroup($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucketResourceGroupConfiguration", (string)$e);
}
$request = new Models\PutBucketResourceGroupRequest('bucket-123', new Models\BucketResourceGroupConfiguration(
'rg-aekz****'
));
$input = BucketResourceGroup::fromPutBucketResourceGroup($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><BucketResourceGroupConfiguration><ResourceGroupId>rg-aekz****</ResourceGroupId></BucketResourceGroupConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketResourceGroup()
{
// empty output
$output = new OperationOutput();
$result = BucketResourceGroup::toPutBucketResourceGroup($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketResourceGroup::toPutBucketResourceGroup($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketResourceGroup()
{
// miss required field
try {
$request = new Models\GetBucketResourceGroupRequest();
$input = BucketResourceGroup::fromGetBucketResourceGroup($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketResourceGroupRequest('bucket-123');
$input = BucketResourceGroup::fromGetBucketResourceGroup($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketResourceGroup()
{
// empty output
$output = new OperationOutput();
$result = BucketResourceGroup::toGetBucketResourceGroup($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<BucketResourceGroupConfiguration>
<ResourceGroupId>rg-aekz****</ResourceGroupId>
</BucketResourceGroupConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketResourceGroup::toGetBucketResourceGroup($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('rg-aekz****', $result->bucketResourceGroupConfiguration->resourceGroupId);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,274 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketStyle;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketStyleTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutStyle()
{
// miss required field
try {
$request = new Models\PutStyleRequest();
$input = BucketStyle::fromPutStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutStyleRequest('bucket-123');
$input = BucketStyle::fromPutStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, styleName", (string)$e);
}
try {
$request = new Models\PutStyleRequest('bucket-123', 'test');
$input = BucketStyle::fromPutStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, style", (string)$e);
}
// demo1
$request = new Models\PutStyleRequest('bucket-123',
styleName: 'test',
style: new Models\StyleContent(
'image/resize,p_50'
)
);
$input = BucketStyle::fromPutStyle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><Style><Content>image/resize,p_50</Content></Style>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutStyle()
{
// empty output
$output = new OperationOutput();
$result = BucketStyle::toPutStyle($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketStyle::toPutStyle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetStyle()
{
// miss required field
try {
$request = new Models\GetStyleRequest();
$input = BucketStyle::fromGetStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\GetStyleRequest('bucket-123');
$input = BucketStyle::fromGetStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, styleName", (string)$e);
}
$request = new Models\GetStyleRequest('bucket-123', 'style-123');
$input = BucketStyle::fromGetStyle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetStyle()
{
// empty output
$output = new OperationOutput();
$result = BucketStyle::toGetStyle($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<Style>
<Name>imagestyle</Name>
<Content>image/resize,p_50</Content>
<Category>image</Category>
<CreateTime>Wed, 20 May 2020 12:07:15 GMT</CreateTime>
<LastModifyTime>Wed, 21 May 2020 12:07:15 GMT</LastModifyTime>
</Style>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketStyle::toGetStyle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('imagestyle', $result->style->name);
$this->assertEquals('image/resize,p_50', $result->style->content);
$this->assertEquals('image', $result->style->category);
$this->assertEquals('Wed, 20 May 2020 12:07:15 GMT', $result->style->createTime);
$this->assertEquals('Wed, 21 May 2020 12:07:15 GMT', $result->style->lastModifyTime);
}
public function testFromListStyle()
{
// miss required field
try {
$request = new Models\ListStyleRequest();
$input = BucketStyle::fromListStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\ListStyleRequest('bucket-123');
$input = BucketStyle::fromListStyle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToListStyle()
{
// empty output
$output = new OperationOutput();
$result = BucketStyle::toListStyle($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<StyleList>
<Style>
<Name>imagestyle</Name>
<Content>image/resize,p_50</Content>
<Category>image</Category>
<CreateTime>Wed, 20 May 2020 12:07:15 GMT</CreateTime>
<LastModifyTime>Wed, 21 May 2020 12:07:15 GMT</LastModifyTime>
</Style>
<Style>
<Name>imagestyle1</Name>
<Content>image/resize,w_200</Content>
<Category>image</Category>
<CreateTime>Wed, 20 May 2020 12:08:04 GMT</CreateTime>
<LastModifyTime>Wed, 21 May 2020 12:08:04 GMT</LastModifyTime>
</Style>
<Style>
<Name>imagestyle2</Name>
<Content>image/resize,w_300</Content>
<Category>image</Category>
<CreateTime>Fri, 12 Mar 2021 06:19:13 GMT</CreateTime>
<LastModifyTime>Fri, 13 Mar 2021 06:27:21 GMT</LastModifyTime>
</Style>
</StyleList>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketStyle::toListStyle($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('imagestyle', $result->styleList->styles[0]->name);
$this->assertEquals('image/resize,p_50', $result->styleList->styles[0]->content);
$this->assertEquals('image', $result->styleList->styles[0]->category);
$this->assertEquals('Wed, 20 May 2020 12:07:15 GMT', $result->styleList->styles[0]->createTime);
$this->assertEquals('Wed, 21 May 2020 12:07:15 GMT', $result->styleList->styles[0]->lastModifyTime);
$this->assertEquals('imagestyle1', $result->styleList->styles[1]->name);
$this->assertEquals('image/resize,w_200', $result->styleList->styles[1]->content);
$this->assertEquals('image', $result->styleList->styles[1]->category);
$this->assertEquals('Wed, 20 May 2020 12:08:04 GMT', $result->styleList->styles[1]->createTime);
$this->assertEquals('Wed, 21 May 2020 12:08:04 GMT', $result->styleList->styles[1]->lastModifyTime);
$this->assertEquals('imagestyle2', $result->styleList->styles[2]->name);
$this->assertEquals('image/resize,w_300', $result->styleList->styles[2]->content);
$this->assertEquals('image', $result->styleList->styles[2]->category);
$this->assertEquals('Fri, 12 Mar 2021 06:19:13 GMT', $result->styleList->styles[2]->createTime);
$this->assertEquals('Fri, 13 Mar 2021 06:27:21 GMT', $result->styleList->styles[2]->lastModifyTime);
}
public function testFromDeleteStyle()
{
// miss required field
try {
$request = new Models\DeleteStyleRequest();
$input = BucketStyle::fromDeleteStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\DeleteStyleRequest('bucket-123');
$input = BucketStyle::fromDeleteStyle($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, styleName", (string)$e);
}
$request = new Models\DeleteStyleRequest('bucket-123', 'style-123');
$input = BucketStyle::fromDeleteStyle($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteStyle()
{
// empty output
$output = new OperationOutput();
$result = BucketStyle::toDeleteStyle($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketStyle::toDeleteStyle($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,177 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketTags;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketTagsTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketTags()
{
// miss required field
try {
$request = new Models\PutBucketTagsRequest();
$input = BucketTags::fromPutBucketTags($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketTagsRequest('bucket-123');
$input = BucketTags::fromPutBucketTags($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, tagging", (string)$e);
}
// demo1
$request = new Models\PutBucketTagsRequest('bucket-123',
tagging: new Models\Tagging(
tagSet: new Models\TagSet(
[new Models\Tag(key: 'key1', value: 'value1'), new Models\Tag(key: 'key2', value: 'value2')])
)
);
$input = BucketTags::fromPutBucketTags($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><Tagging><TagSet><Tag><Key>key1</Key><Value>value1</Value></Tag><Tag><Key>key2</Key><Value>value2</Value></Tag></TagSet></Tagging>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketTags()
{
// empty output
$output = new OperationOutput();
$result = BucketTags::toPutBucketTags($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketTags::toPutBucketTags($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketTags()
{
// miss required field
try {
$request = new Models\GetBucketTagsRequest();
$input = BucketTags::fromGetBucketTags($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketTagsRequest('bucket-123');
$input = BucketTags::fromGetBucketTags($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketTags()
{
// empty output
$output = new OperationOutput();
$result = BucketTags::toGetBucketTags($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<Tagging>
<TagSet>
<Tag>
<Key>testa</Key>
<Value>testv1</Value>
</Tag>
<Tag>
<Key>testb</Key>
<Value>testv2</Value>
</Tag>
</TagSet>
</Tagging>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor($body)
);
$result = BucketTags::toGetBucketTags($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals(2, count($result->tagging->tagSet->tags));
$this->assertEquals('testa', $result->tagging->tagSet->tags[0]->key);
$this->assertEquals('testv2', $result->tagging->tagSet->tags[1]->value);
}
public function testFromDeleteBucketTags()
{
// miss required field
try {
$request = new Models\DeleteBucketTagsRequest();
$input = BucketTags::fromDeleteBucketTags($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketTagsRequest('bucket-123');
$input = BucketTags::fromDeleteBucketTags($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
$request = new Models\DeleteBucketTagsRequest('bucket-123', tagging: 'k1,k2');
$input = BucketTags::fromDeleteBucketTags($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('k1,k2', $input->getParameters()['tagging']);
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketTags()
{
// empty output
$output = new OperationOutput();
$result = BucketTags::toDeleteBucketTags($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketTags::toDeleteBucketTags($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,133 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketTransferAcceleration;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketTransferAccelerationTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketTransferAcceleration()
{
// miss required field
try {
$request = new Models\PutBucketTransferAccelerationRequest();
$input = BucketTransferAcceleration::fromPutBucketTransferAcceleration($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketTransferAccelerationRequest('bucket-123');
$input = BucketTransferAcceleration::fromPutBucketTransferAcceleration($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, transferAccelerationConfiguration", (string)$e);
}
$request = new Models\PutBucketTransferAccelerationRequest('bucket-123', new Models\TransferAccelerationConfiguration(
true
));
$input = BucketTransferAcceleration::fromPutBucketTransferAcceleration($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><TransferAccelerationConfiguration><Enabled>true</Enabled></TransferAccelerationConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketTransferAcceleration()
{
// empty output
$output = new OperationOutput();
$result = BucketTransferAcceleration::toPutBucketTransferAcceleration($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketTransferAcceleration::toPutBucketTransferAcceleration($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketTransferAcceleration()
{
// miss required field
try {
$request = new Models\GetBucketTransferAccelerationRequest();
$input = BucketTransferAcceleration::fromGetBucketTransferAcceleration($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketTransferAccelerationRequest('bucket-123');
$input = BucketTransferAcceleration::fromGetBucketTransferAcceleration($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketTransferAcceleration()
{
// empty output
$output = new OperationOutput();
$result = BucketTransferAcceleration::toGetBucketTransferAcceleration($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<TransferAccelerationConfiguration>
<Enabled>true</Enabled>
</TransferAccelerationConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketTransferAcceleration::toGetBucketTransferAcceleration($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertTrue($result->transferAccelerationConfiguration->enabled);
$body = '<?xml version="1.0" encoding="UTF-8"?>
<TransferAccelerationConfiguration>
<Enabled>false</Enabled>
</TransferAccelerationConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketTransferAcceleration::toGetBucketTransferAcceleration($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertFalse($result->transferAccelerationConfiguration->enabled);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,590 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketWebsite;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketWebsiteTest extends \PHPUnit\Framework\TestCase
{
public function testFromPutBucketWebsite()
{
// miss required field
try {
$request = new Models\PutBucketWebsiteRequest();
$input = BucketWebsite::fromPutBucketWebsite($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\PutBucketWebsiteRequest('bucket-123');
$input = BucketWebsite::fromPutBucketWebsite($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, websiteConfiguration", (string)$e);
}
// demo1
$request = new Models\PutBucketWebsiteRequest('bucket-123');
$request->websiteConfiguration = new Models\WebsiteConfiguration(
new Models\IndexDocument(
suffix: 'index.html', supportSubDir: true, type: 0
),
new Models\ErrorDocument(
key: 'error.html', httpStatus: 404
),
new Models\RoutingRules([
new Models\RoutingRule(
redirect: new Models\RoutingRuleRedirect(
redirectType: 'Mirror',
mirrorURL: 'http://example.com/',
mirrorPassQueryString: true,
mirrorCheckMd5: true,
mirrorFollowRedirect: true,
mirrorHeaders: new Models\MirrorHeaders(
passs: ["myheader-key1", "myheader-key2"],
sets: array(
new Models\MirrorHeaderSet(key: 'myheader-key5', value: 'myheader-value5'),
),
passAll: true,
),
passQueryString: true,
),
ruleNumber: 1,
condition: new Models\RoutingRuleCondition(
keyPrefixEquals: 'abc/',
httpErrorCodeReturnedEquals: 404,
)
),
new Models\RoutingRule(
redirect: new Models\RoutingRuleRedirect(
redirectType: 'AliCDN',
protocol: 'http',
replaceKeyPrefixWith: 'prefix/${key}.suffix',
hostName: 'example.com',
passQueryString: false,
httpRedirectCode: 301
),
ruleNumber: 2,
condition: new Models\RoutingRuleCondition(
keyPrefixEquals: 'abc/',
httpErrorCodeReturnedEquals: 404,
includeHeaders: [
new Models\RoutingRuleIncludeHeader(
key: 'host',
equals: 'test.oss-cn-beijing-internal.aliyuncs.com',
)
]
)
),
new Models\RoutingRule(
redirect: new Models\RoutingRuleRedirect(
redirectType: 'External',
protocol: 'http',
replaceKeyPrefixWith: 'prefix/${key}',
hostName: 'example.com',
passQueryString: false,
enableReplacePrefix: false,
httpRedirectCode: 302,
),
ruleNumber: 3,
condition: new Models\RoutingRuleCondition(
httpErrorCodeReturnedEquals: 404,
)
)
])
);
$input = BucketWebsite::fromPutBucketWebsite($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = '<?xml version="1.0" encoding="UTF-8"?><WebsiteConfiguration><IndexDocument><Suffix>index.html</Suffix><SupportSubDir>true</SupportSubDir><Type>0</Type></IndexDocument><ErrorDocument><Key>error.html</Key><HttpStatus>404</HttpStatus></ErrorDocument><RoutingRules><RoutingRule><Redirect><RedirectType>Mirror</RedirectType><MirrorURL>http://example.com/</MirrorURL><MirrorPassQueryString>true</MirrorPassQueryString><MirrorCheckMd5>true</MirrorCheckMd5><MirrorFollowRedirect>true</MirrorFollowRedirect><MirrorHeaders><Pass>myheader-key1</Pass><Pass>myheader-key2</Pass><Set><Key>myheader-key5</Key><Value>myheader-value5</Value></Set><PassAll>true</PassAll></MirrorHeaders><PassQueryString>true</PassQueryString></Redirect><RuleNumber>1</RuleNumber><Condition><KeyPrefixEquals>abc/</KeyPrefixEquals><HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals></Condition></RoutingRule><RoutingRule><Redirect><RedirectType>AliCDN</RedirectType><Protocol>http</Protocol><ReplaceKeyPrefixWith>prefix/${key}.suffix</ReplaceKeyPrefixWith><HostName>example.com</HostName><PassQueryString>false</PassQueryString><HttpRedirectCode>301</HttpRedirectCode></Redirect><RuleNumber>2</RuleNumber><Condition><KeyPrefixEquals>abc/</KeyPrefixEquals><HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals><IncludeHeader><Key>host</Key><Equals>test.oss-cn-beijing-internal.aliyuncs.com</Equals></IncludeHeader></Condition></RoutingRule><RoutingRule><Redirect><RedirectType>External</RedirectType><Protocol>http</Protocol><ReplaceKeyPrefixWith>prefix/${key}</ReplaceKeyPrefixWith><HostName>example.com</HostName><PassQueryString>false</PassQueryString><EnableReplacePrefix>false</EnableReplacePrefix><HttpRedirectCode>302</HttpRedirectCode></Redirect><RuleNumber>3</RuleNumber><Condition><HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals></Condition></RoutingRule></RoutingRules></WebsiteConfiguration>';
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
// demo2
$request = new Models\PutBucketWebsiteRequest('bucket-123');
$request->websiteConfiguration = new Models\WebsiteConfiguration(
new Models\IndexDocument(
suffix: 'index.html', supportSubDir: true, type: 0
),
new Models\ErrorDocument(
key: 'error.html', httpStatus: 404
),
new Models\RoutingRules([
new Models\RoutingRule(
redirect: new Models\RoutingRuleRedirect(
mirrorPassOriginalSlashes: false,
redirectType: 'Mirror',
mirrorURL: 'http://example.com/',
mirrorPassQueryString: true,
mirrorCheckMd5: true,
mirrorSNI: true,
replaceKeyPrefixWith: "def/",
mirrorFollowRedirect: true,
hostName: "example.com",
mirrorHeaders: new Models\MirrorHeaders(
passs: ["myheader-key1", "myheader-key2"],
sets: array(
new Models\MirrorHeaderSet(key: 'myheader-key5', value: 'myheader-value5'),
),
passAll: true,
),
passQueryString: true,
enableReplacePrefix: true,
httpRedirectCode: 301,
mirrorURLSlave: 'http://example.com/',
mirrorSaveOssMeta: true,
mirrorProxyPass: false,
mirrorAllowGetImageInfo: true,
mirrorAllowVideoSnapshot: false,
mirrorIsExpressTunnel: true,
mirrorDstRegion: 'cn-hangzhou',
mirrorDstVpcId: 'vpc-test-id',
mirrorDstSlaveVpcId: 'vpc-test-id',
mirrorUserLastModified: false,
mirrorSwitchAllErrors: true,
mirrorTunnelId: 'test-tunnel-id',
mirrorUsingRole: false,
mirrorRole: 'aliyun-test-role',
mirrorAllowHeadObject: true,
transparentMirrorResponseCodes: '400',
mirrorAsyncStatus: 303,
mirrorTaggings: new Models\MirrorTaggings(
taggings: [new Models\MirrorTagging(
value: 'v',
key: 'k'
)]
),
mirrorReturnHeaders: new Models\MirrorReturnHeaders(
returnHeaders: [
new Models\ReturnHeader(
key: 'k',
value: 'v'
)
]
),
mirrorAuth: new Models\MirrorAuth(
'S3V4', 'ap-southeast-1', 'TESTAK', 'TESTSK'
),
mirrorMultiAlternates: new Models\MirrorMultiAlternates(
[
new Models\MirrorMultiAlternate(
mirrorMultiAlternateNumber: 32, mirrorMultiAlternateURL: 'https://test-multi-alter.example.com', mirrorMultiAlternateVpcId: 'vpc-test-id', mirrorMultiAlternateDstRegion: 'ap-southeast-1'
)
]
)
),
ruleNumber: 1,
condition: new Models\RoutingRuleCondition(
keyPrefixEquals: 'abc/',
keySuffixEquals: ".txt",
httpErrorCodeReturnedEquals: 404,
),
luaConfig: new Models\RoutingRuleLuaConfig(
script: "test.lua",
)
),
new Models\RoutingRule(
redirect: new Models\RoutingRuleRedirect(
redirectType: 'AliCDN',
mirrorURL: 'http://example.com/',
mirrorPassQueryString: true,
mirrorCheckMd5: true,
mirrorSNI: true,
protocol: 'http',
mirrorFollowRedirect: true,
mirrorHeaders: new Models\MirrorHeaders(
passs: ["myheader-key1", "myheader-key2"],
sets: array(
new Models\MirrorHeaderSet(key: 'myheader-key5', value: 'myheader-value5'),
),
passAll: true,
),
passQueryString: true,
replaceKeyWith: "abc",
),
ruleNumber: 2,
condition: new Models\RoutingRuleCondition(
keyPrefixEquals: 'abc/',
keySuffixEquals: ".txt",
httpErrorCodeReturnedEquals: 404,
),
luaConfig: new Models\RoutingRuleLuaConfig(
script: "test.lua",
)
),
]),
);
$input = BucketWebsite::fromPutBucketWebsite($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><WebsiteConfiguration><IndexDocument><Suffix>index.html</Suffix><SupportSubDir>true</SupportSubDir><Type>0</Type></IndexDocument><ErrorDocument><Key>error.html</Key><HttpStatus>404</HttpStatus></ErrorDocument><RoutingRules><RoutingRule><Redirect><MirrorPassOriginalSlashes>false</MirrorPassOriginalSlashes><RedirectType>Mirror</RedirectType><MirrorURL>http://example.com/</MirrorURL><MirrorPassQueryString>true</MirrorPassQueryString><MirrorCheckMd5>true</MirrorCheckMd5><MirrorSNI>true</MirrorSNI><ReplaceKeyPrefixWith>def/</ReplaceKeyPrefixWith><MirrorFollowRedirect>true</MirrorFollowRedirect><HostName>example.com</HostName><MirrorHeaders><Pass>myheader-key1</Pass><Pass>myheader-key2</Pass><Set><Key>myheader-key5</Key><Value>myheader-value5</Value></Set><PassAll>true</PassAll></MirrorHeaders><PassQueryString>true</PassQueryString><EnableReplacePrefix>true</EnableReplacePrefix><HttpRedirectCode>301</HttpRedirectCode><MirrorURLSlave>http://example.com/</MirrorURLSlave><MirrorSaveOssMeta>true</MirrorSaveOssMeta><MirrorProxyPass>false</MirrorProxyPass><MirrorAllowGetImageInfo>true</MirrorAllowGetImageInfo><MirrorAllowVideoSnapshot>false</MirrorAllowVideoSnapshot><MirrorIsExpressTunnel>true</MirrorIsExpressTunnel><MirrorDstRegion>cn-hangzhou</MirrorDstRegion><MirrorDstVpcId>vpc-test-id</MirrorDstVpcId><MirrorDstSlaveVpcId>vpc-test-id</MirrorDstSlaveVpcId><MirrorUserLastModified>false</MirrorUserLastModified><MirrorSwitchAllErrors>true</MirrorSwitchAllErrors><MirrorTunnelId>test-tunnel-id</MirrorTunnelId><MirrorUsingRole>false</MirrorUsingRole><MirrorRole>aliyun-test-role</MirrorRole><MirrorAllowHeadObject>true</MirrorAllowHeadObject><TransparentMirrorResponseCodes>400</TransparentMirrorResponseCodes><MirrorAsyncStatus>303</MirrorAsyncStatus><MirrorTaggings><Taggings><Value>v</Value><Key>k</Key></Taggings></MirrorTaggings><MirrorReturnHeaders><ReturnHeader><Key>k</Key><Value>v</Value></ReturnHeader></MirrorReturnHeaders><MirrorAuth><AuthType>S3V4</AuthType><Region>ap-southeast-1</Region><AccessKeyId>TESTAK</AccessKeyId><AccessKeySecret>TESTSK</AccessKeySecret></MirrorAuth><MirrorMultiAlternates><MirrorMultiAlternate><MirrorMultiAlternateNumber>32</MirrorMultiAlternateNumber><MirrorMultiAlternateURL>https://test-multi-alter.example.com</MirrorMultiAlternateURL><MirrorMultiAlternateVpcId>vpc-test-id</MirrorMultiAlternateVpcId><MirrorMultiAlternateDstRegion>ap-southeast-1</MirrorMultiAlternateDstRegion></MirrorMultiAlternate></MirrorMultiAlternates></Redirect><RuleNumber>1</RuleNumber><Condition><KeyPrefixEquals>abc/</KeyPrefixEquals><KeySuffixEquals>.txt</KeySuffixEquals><HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals></Condition><LuaConfig><Script>test.lua</Script></LuaConfig></RoutingRule><RoutingRule><Redirect><RedirectType>AliCDN</RedirectType><MirrorURL>http://example.com/</MirrorURL><MirrorPassQueryString>true</MirrorPassQueryString><MirrorCheckMd5>true</MirrorCheckMd5><MirrorSNI>true</MirrorSNI><Protocol>http</Protocol><MirrorFollowRedirect>true</MirrorFollowRedirect><MirrorHeaders><Pass>myheader-key1</Pass><Pass>myheader-key2</Pass><Set><Key>myheader-key5</Key><Value>myheader-value5</Value></Set><PassAll>true</PassAll></MirrorHeaders><PassQueryString>true</PassQueryString><ReplaceKeyWith>abc</ReplaceKeyWith></Redirect><RuleNumber>2</RuleNumber><Condition><KeyPrefixEquals>abc/</KeyPrefixEquals><KeySuffixEquals>.txt</KeySuffixEquals><HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals></Condition><LuaConfig><Script>test.lua</Script></LuaConfig></RoutingRule></RoutingRules></WebsiteConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$request = new Models\PutBucketWebsiteRequest('bucket-123');
$request->websiteConfiguration = new Models\WebsiteConfiguration(
new Models\IndexDocument(
suffix: 'index.html', supportSubDir: true, type: 0
),
new Models\ErrorDocument(
key: 'error.html', httpStatus: 404
)
);
$input = BucketWebsite::fromPutBucketWebsite($request);
$this->assertEquals('bucket-123', $input->getBucket());
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><WebsiteConfiguration><IndexDocument><Suffix>index.html</Suffix><SupportSubDir>true</SupportSubDir><Type>0</Type></IndexDocument><ErrorDocument><Key>error.html</Key><HttpStatus>404</HttpStatus></ErrorDocument></WebsiteConfiguration>
BBB;
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
}
public function testToPutBucketWebsite()
{
// empty output
$output = new OperationOutput();
$result = BucketWebsite::toPutBucketWebsite($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketWebsite::toPutBucketWebsite($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketWebsite()
{
// miss required field
try {
$request = new Models\GetBucketWebsiteRequest();
$input = BucketWebsite::fromGetBucketWebsite($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketWebsiteRequest('bucket-123');
$input = BucketWebsite::fromGetBucketWebsite($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketWebsite()
{
// empty output
$output = new OperationOutput();
$result = BucketWebsite::toGetBucketWebsite($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<WebsiteConfiguration>
<IndexDocument>
<Suffix>index.html</Suffix>
</IndexDocument>
<ErrorDocument>
<Key>error.html</Key>
<HttpStatus>404</HttpStatus>
</ErrorDocument>
</WebsiteConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketWebsite::toGetBucketWebsite($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('index.html', $result->websiteConfiguration->indexDocument->suffix);
$this->assertNull($result->websiteConfiguration->indexDocument->supportSubDir);
$this->assertNull($result->websiteConfiguration->indexDocument->type);
$this->assertEquals('error.html', $result->websiteConfiguration->errorDocument->key);
$this->assertEquals('404', $result->websiteConfiguration->errorDocument->httpStatus);
$body = '<WebsiteConfiguration>
<IndexDocument>
<Suffix>index.html</Suffix>
<SupportSubDir>true</SupportSubDir>
<Type>0</Type>
</IndexDocument>
<ErrorDocument>
<Key>error.html</Key>
<HttpStatus>404</HttpStatus>
</ErrorDocument>
<RoutingRules>
<RoutingRule>
<RuleNumber>1</RuleNumber>
<Condition>
<KeyPrefixEquals>abc/</KeyPrefixEquals>
<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
</Condition>
<Redirect>
<RedirectType>Mirror</RedirectType>
<PassQueryString>true</PassQueryString>
<MirrorURL>http://example.com/</MirrorURL>
<MirrorPassQueryString>true</MirrorPassQueryString>
<MirrorFollowRedirect>true</MirrorFollowRedirect>
<MirrorCheckMd5>false</MirrorCheckMd5>
<MirrorHeaders>
<PassAll>true</PassAll>
<Pass>myheader-key1</Pass>
<Pass>myheader-key2</Pass>
<Remove>myheader-key3</Remove>
<Remove>myheader-key4</Remove>
<Set>
<Key>myheader-key5</Key>
<Value>myheader-value5</Value>
</Set>
</MirrorHeaders>
</Redirect>
</RoutingRule>
<RoutingRule>
<RuleNumber>2</RuleNumber>
<Condition>
<KeyPrefixEquals>abc/</KeyPrefixEquals>
<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
<IncludeHeader>
<Key>host</Key>
<Equals>test.oss-cn-beijing-internal.aliyuncs.com</Equals>
</IncludeHeader>
</Condition>
<Redirect>
<RedirectType>AliCDN</RedirectType>
<Protocol>http</Protocol>
<HostName>example.com</HostName>
<PassQueryString>false</PassQueryString>
<ReplaceKeyWith>prefix/${key}.suffix</ReplaceKeyWith>
<HttpRedirectCode>301</HttpRedirectCode>
</Redirect>
</RoutingRule>
<RoutingRule>
<Condition>
<HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals>
</Condition>
<RuleNumber>3</RuleNumber>
<Redirect>
<ReplaceKeyWith>prefix/${key}</ReplaceKeyWith>
<HttpRedirectCode>302</HttpRedirectCode>
<EnableReplacePrefix>false</EnableReplacePrefix>
<PassQueryString>false</PassQueryString>
<Protocol>http</Protocol>
<HostName>example.com</HostName>
<RedirectType>External</RedirectType>
</Redirect>
</RoutingRule>
</RoutingRules>
</WebsiteConfiguration>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketWebsite::toGetBucketWebsite($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('index.html', $result->websiteConfiguration->indexDocument->suffix);
$this->assertTrue($result->websiteConfiguration->indexDocument->supportSubDir);
$this->assertEquals(0, $result->websiteConfiguration->indexDocument->type);
$this->assertEquals('error.html', $result->websiteConfiguration->errorDocument->key);
$this->assertEquals('404', $result->websiteConfiguration->errorDocument->httpStatus);
$this->assertEquals(3, count($result->websiteConfiguration->routingRules->routingRules));
$this->assertEquals(1, $result->websiteConfiguration->routingRules->routingRules[0]->ruleNumber);
$this->assertEquals('abc/', $result->websiteConfiguration->routingRules->routingRules[0]->condition->keyPrefixEquals);
$this->assertEquals(404, $result->websiteConfiguration->routingRules->routingRules[0]->condition->httpErrorCodeReturnedEquals);
$this->assertEquals('Mirror', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->redirectType);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->passQueryString);
$this->assertEquals('http://example.com/', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorURL);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorPassQueryString);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorFollowRedirect);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorCheckMd5);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->passAll);
$this->assertEquals('myheader-key1', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->passs[0]);
$this->assertEquals('myheader-key2', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->passs[1]);
$this->assertEquals('myheader-key3', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->removes[0]);
$this->assertEquals('myheader-key4', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->removes[1]);
$this->assertEquals('myheader-key5', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->sets[0]->key);
$this->assertEquals('myheader-value5', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->sets[0]->value);
$this->assertEquals(2, $result->websiteConfiguration->routingRules->routingRules[1]->ruleNumber);
$this->assertEquals('abc/', $result->websiteConfiguration->routingRules->routingRules[1]->condition->keyPrefixEquals);
$this->assertEquals(404, $result->websiteConfiguration->routingRules->routingRules[1]->condition->httpErrorCodeReturnedEquals);
$this->assertEquals('host', $result->websiteConfiguration->routingRules->routingRules[1]->condition->includeHeaders[0]->key);
$this->assertEquals('test.oss-cn-beijing-internal.aliyuncs.com', $result->websiteConfiguration->routingRules->routingRules[1]->condition->includeHeaders[0]->equals);
$this->assertEquals('AliCDN', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->redirectType);
$this->assertEquals('http', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->protocol);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[1]->redirect->passQueryString);
$this->assertEquals('prefix/${key}.suffix', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->replaceKeyWith);
$this->assertEquals(301, $result->websiteConfiguration->routingRules->routingRules[1]->redirect->httpRedirectCode);
$this->assertEquals(3, $result->websiteConfiguration->routingRules->routingRules[2]->ruleNumber);
$this->assertEquals('External', $result->websiteConfiguration->routingRules->routingRules[2]->redirect->redirectType);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[2]->redirect->passQueryString);
$this->assertEquals('prefix/${key}', $result->websiteConfiguration->routingRules->routingRules[2]->redirect->replaceKeyWith);
$this->assertEquals(302, $result->websiteConfiguration->routingRules->routingRules[2]->redirect->httpRedirectCode);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[2]->redirect->enableReplacePrefix);
$this->assertEquals('http', $result->websiteConfiguration->routingRules->routingRules[2]->redirect->protocol);
$this->assertEquals('example.com', $result->websiteConfiguration->routingRules->routingRules[2]->redirect->hostName);
$body = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><WebsiteConfiguration><IndexDocument><Suffix>index.html</Suffix><SupportSubDir>true</SupportSubDir><Type>0</Type></IndexDocument><ErrorDocument><Key>error.html</Key><HttpStatus>404</HttpStatus></ErrorDocument><RoutingRules><RoutingRule><Redirect><MirrorPassOriginalSlashes>false</MirrorPassOriginalSlashes><RedirectType>Mirror</RedirectType><MirrorURL>http://example.com/</MirrorURL><MirrorPassQueryString>true</MirrorPassQueryString><MirrorCheckMd5>true</MirrorCheckMd5><MirrorSNI>true</MirrorSNI><ReplaceKeyPrefixWith>def/</ReplaceKeyPrefixWith><MirrorFollowRedirect>true</MirrorFollowRedirect><HostName>example.com</HostName><MirrorHeaders><Pass>myheader-key1</Pass><Pass>myheader-key2</Pass><Set><Key>myheader-key5</Key><Value>myheader-value5</Value></Set><PassAll>true</PassAll></MirrorHeaders><PassQueryString>true</PassQueryString><EnableReplacePrefix>true</EnableReplacePrefix><HttpRedirectCode>301</HttpRedirectCode><MirrorURLSlave>http://example.com/</MirrorURLSlave><MirrorSaveOssMeta>true</MirrorSaveOssMeta><MirrorProxyPass>false</MirrorProxyPass><MirrorAllowGetImageInfo>true</MirrorAllowGetImageInfo><MirrorAllowVideoSnapshot>false</MirrorAllowVideoSnapshot><MirrorIsExpressTunnel>true</MirrorIsExpressTunnel><MirrorDstRegion>cn-hangzhou</MirrorDstRegion><MirrorDstVpcId>vpc-test-id</MirrorDstVpcId><MirrorDstSlaveVpcId>vpc-test-id</MirrorDstSlaveVpcId><MirrorUserLastModified>false</MirrorUserLastModified><MirrorSwitchAllErrors>true</MirrorSwitchAllErrors><MirrorTunnelId>test-tunnel-id</MirrorTunnelId><MirrorUsingRole>false</MirrorUsingRole><MirrorRole>aliyun-test-role</MirrorRole><MirrorAllowHeadObject>true</MirrorAllowHeadObject><TransparentMirrorResponseCodes>400</TransparentMirrorResponseCodes><MirrorAsyncStatus>303</MirrorAsyncStatus><MirrorTaggings><Taggings><Value>v</Value><Key>k</Key></Taggings></MirrorTaggings><MirrorReturnHeaders><ReturnHeader><Key>k</Key><Value>v</Value></ReturnHeader></MirrorReturnHeaders><MirrorAuth><AuthType>S3V4</AuthType><Region>ap-southeast-1</Region><AccessKeyId>TESTAK</AccessKeyId><AccessKeySecret>TESTSK</AccessKeySecret></MirrorAuth><MirrorMultiAlternates><MirrorMultiAlternate><MirrorMultiAlternateNumber>32</MirrorMultiAlternateNumber><MirrorMultiAlternateURL>https://test-multi-alter.example.com</MirrorMultiAlternateURL><MirrorMultiAlternateVpcId>vpc-test-id</MirrorMultiAlternateVpcId><MirrorMultiAlternateDstRegion>ap-southeast-1</MirrorMultiAlternateDstRegion></MirrorMultiAlternate></MirrorMultiAlternates></Redirect><RuleNumber>1</RuleNumber><Condition><KeyPrefixEquals>abc/</KeyPrefixEquals><KeySuffixEquals>.txt</KeySuffixEquals><HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals></Condition><LuaConfig><Script>test.lua</Script></LuaConfig></RoutingRule><RoutingRule><Redirect><RedirectType>AliCDN</RedirectType><MirrorURL>http://example.com/</MirrorURL><MirrorPassQueryString>true</MirrorPassQueryString><MirrorCheckMd5>true</MirrorCheckMd5><MirrorSNI>true</MirrorSNI><Protocol>http</Protocol><MirrorFollowRedirect>true</MirrorFollowRedirect><MirrorHeaders><Pass>myheader-key1</Pass><Pass>myheader-key2</Pass><Set><Key>myheader-key5</Key><Value>myheader-value5</Value></Set><PassAll>true</PassAll></MirrorHeaders><PassQueryString>true</PassQueryString><ReplaceKeyWith>abc</ReplaceKeyWith></Redirect><RuleNumber>2</RuleNumber><Condition><KeyPrefixEquals>abc/</KeyPrefixEquals><KeySuffixEquals>.txt</KeySuffixEquals><HttpErrorCodeReturnedEquals>404</HttpErrorCodeReturnedEquals></Condition><LuaConfig><Script>test.lua</Script></LuaConfig></RoutingRule></RoutingRules></WebsiteConfiguration>
BBB;
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123'],
Utils::streamFor($body)
);
$result = BucketWebsite::toGetBucketWebsite($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('index.html', $result->websiteConfiguration->indexDocument->suffix);
$this->assertTrue($result->websiteConfiguration->indexDocument->supportSubDir);
$this->assertEquals(0, $result->websiteConfiguration->indexDocument->type);
$this->assertEquals('error.html', $result->websiteConfiguration->errorDocument->key);
$this->assertEquals('404', $result->websiteConfiguration->errorDocument->httpStatus);
$this->assertEquals(2, count($result->websiteConfiguration->routingRules->routingRules));
$this->assertEquals(1, $result->websiteConfiguration->routingRules->routingRules[0]->ruleNumber);
$this->assertEquals('abc/', $result->websiteConfiguration->routingRules->routingRules[0]->condition->keyPrefixEquals);
$this->assertEquals('.txt', $result->websiteConfiguration->routingRules->routingRules[0]->condition->keySuffixEquals);
$this->assertEquals(404, $result->websiteConfiguration->routingRules->routingRules[0]->condition->httpErrorCodeReturnedEquals);
$this->assertEquals('Mirror', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->redirectType);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorPassOriginalSlashes);
$this->assertEquals('http://example.com/', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorURL);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorPassQueryString);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorCheckMd5);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorSNI);
$this->assertEquals('def/', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->replaceKeyPrefixWith);
$this->assertEquals('example.com', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->hostName);
$this->assertEquals('myheader-key1', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->passs[0]);
$this->assertEquals('myheader-key2', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->passs[1]);
$this->assertEquals('myheader-key5', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->sets[0]->key);
$this->assertEquals('myheader-value5', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->sets[0]->value);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorHeaders->passAll);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->passQueryString);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->enableReplacePrefix);
$this->assertEquals(301, $result->websiteConfiguration->routingRules->routingRules[0]->redirect->httpRedirectCode);
$this->assertEquals('http://example.com/', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorURLSlave);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorSaveOssMeta);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorProxyPass);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAllowGetImageInfo);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAllowVideoSnapshot);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorIsExpressTunnel);
$this->assertEquals('cn-hangzhou', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorDstRegion);
$this->assertEquals('vpc-test-id', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorDstVpcId);
$this->assertEquals('vpc-test-id', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorDstSlaveVpcId);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorUserLastModified);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorSwitchAllErrors);
$this->assertEquals('test-tunnel-id', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorTunnelId);
$this->assertFalse($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorUsingRole);
$this->assertEquals('aliyun-test-role', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorRole);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAllowHeadObject);
$this->assertEquals("400", $result->websiteConfiguration->routingRules->routingRules[0]->redirect->transparentMirrorResponseCodes);
$this->assertEquals(303, $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAsyncStatus);
$this->assertEquals('k', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorTaggings->taggings[0]->key);
$this->assertEquals('v', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorTaggings->taggings[0]->value);
$this->assertEquals('k', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorReturnHeaders->returnHeaders[0]->key);
$this->assertEquals('v', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorReturnHeaders->returnHeaders[0]->value);
$this->assertEquals('S3V4', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAuth->authType);
$this->assertEquals('ap-southeast-1', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAuth->region);
$this->assertEquals('TESTAK', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAuth->accessKeyId);
$this->assertEquals('TESTSK', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorAuth->accessKeySecret);
$this->assertEquals(32, $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorMultiAlternates->mirrorMultiAlternates[0]->mirrorMultiAlternateNumber);
$this->assertEquals('https://test-multi-alter.example.com', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorMultiAlternates->mirrorMultiAlternates[0]->mirrorMultiAlternateURL);
$this->assertEquals('vpc-test-id', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorMultiAlternates->mirrorMultiAlternates[0]->mirrorMultiAlternateVpcId);
$this->assertEquals('ap-southeast-1', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorMultiAlternates->mirrorMultiAlternates[0]->mirrorMultiAlternateDstRegion);
$this->assertEquals('test.lua', $result->websiteConfiguration->routingRules->routingRules[0]->luaConfig->script);
$this->assertEquals(2, $result->websiteConfiguration->routingRules->routingRules[1]->ruleNumber);
$this->assertEquals('abc/', $result->websiteConfiguration->routingRules->routingRules[1]->condition->keyPrefixEquals);
$this->assertEquals('.txt', $result->websiteConfiguration->routingRules->routingRules[1]->condition->keySuffixEquals);
$this->assertEquals(404, $result->websiteConfiguration->routingRules->routingRules[1]->condition->httpErrorCodeReturnedEquals);
$this->assertEquals('AliCDN', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->redirectType);
$this->assertEquals('http', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->protocol);
$this->assertEquals('test.lua', $result->websiteConfiguration->routingRules->routingRules[0]->luaConfig->script);
$this->assertEquals('http://example.com/', $result->websiteConfiguration->routingRules->routingRules[0]->redirect->mirrorURL);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorPassQueryString);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorCheckMd5);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorSNI);
$this->assertEquals('myheader-key1', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorHeaders->passs[0]);
$this->assertEquals('myheader-key2', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorHeaders->passs[1]);
$this->assertEquals('myheader-key5', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorHeaders->sets[0]->key);
$this->assertEquals('myheader-value5', $result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorHeaders->sets[0]->value);
$this->assertTrue($result->websiteConfiguration->routingRules->routingRules[1]->redirect->mirrorHeaders->passAll);
}
public function testFromDeleteBucketWebsite()
{
// miss required field
try {
$request = new Models\DeleteBucketWebsiteRequest();
$input = BucketWebsite::fromDeleteBucketWebsite($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\DeleteBucketWebsiteRequest('bucket-123');
$input = BucketWebsite::fromDeleteBucketWebsite($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToDeleteBucketWebsite()
{
// empty output
$output = new OperationOutput();
$result = BucketWebsite::toDeleteBucketWebsite($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketWebsite::toDeleteBucketWebsite($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,276 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\BucketWorm;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class BucketWormTest extends \PHPUnit\Framework\TestCase
{
public function testFromInitiateBucketWorm()
{
// miss required field
try {
$request = new Models\InitiateBucketWormRequest();
$input = BucketWorm::fromInitiateBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\InitiateBucketWormRequest('bucket-123');
$input = BucketWorm::fromInitiateBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, initiateWormConfiguration", (string)$e);
}
// all settings
$request = new Models\InitiateBucketWormRequest(
bucket: 'bucket-123',
initiateWormConfiguration: new Models\InitiateWormConfiguration(retentionPeriodInDays: 3)
);
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><InitiateWormConfiguration><RetentionPeriodInDays>3</RetentionPeriodInDays></InitiateWormConfiguration>
BBB;
$input = BucketWorm::fromInitiateBucketWorm($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$this->assertEquals('application/xml', $input->getHeaders()['content-type']);
$this->assertEquals(base64_encode(md5($input->getBody(), true)), $input->getHeaders()['content-md5']);
}
public function testToInitiateBucketWorm()
{
// empty output
$output = new OperationOutput();
$result = BucketWorm::toInitiateBucketWorm($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'x-oss-worm-id' => '234']
);
$result = BucketWorm::toInitiateBucketWorm($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals('234', $result->wormId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromAbortBucketWorm()
{
// miss required field
try {
$request = new Models\AbortBucketWormRequest();
$input = BucketWorm::fromAbortBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\AbortBucketWormRequest('bucket-123');
$input = BucketWorm::fromAbortBucketWorm($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToAbortBucketWorm()
{
// empty output
$output = new OperationOutput();
$result = BucketWorm::toAbortBucketWorm($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'No Content',
204,
['x-oss-request-id' => '123']
);
$result = BucketWorm::toAbortBucketWorm($output);
$this->assertEquals('No Content', $result->status);
$this->assertEquals(204, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromCompleteBucketWorm()
{
// miss required field
try {
$request = new Models\CompleteBucketWormRequest();
$input = BucketWorm::fromCompleteBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\CompleteBucketWormRequest('bucket-123');
$input = BucketWorm::fromCompleteBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, wormId", (string)$e);
}
$request = new Models\CompleteBucketWormRequest('bucket-123', 'wormId-123');
$input = BucketWorm::fromCompleteBucketWorm($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('wormId-123', $input->getParameters()['wormId']);
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToCompleteBucketWorm()
{
// empty output
$output = new OperationOutput();
$result = BucketWorm::toCompleteBucketWorm($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketWorm::toCompleteBucketWorm($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromExtendBucketWorm()
{
// miss required field
try {
$request = new Models\ExtendBucketWormRequest();
$input = BucketWorm::fromExtendBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
try {
$request = new Models\ExtendBucketWormRequest('bucket-123');
$input = BucketWorm::fromExtendBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, wormId", (string)$e);
}
try {
$request = new Models\ExtendBucketWormRequest('bucket-123', 'wormId-123');
$input = BucketWorm::fromExtendBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString($e->getMessage(), "missing required field, extendWormConfiguration.", (string)$e);
}
$xml = <<<BBB
<?xml version="1.0" encoding="UTF-8"?><ExtendWormConfiguration><RetentionPeriodInDays>3</RetentionPeriodInDays></ExtendWormConfiguration>
BBB;
$request = new Models\ExtendBucketWormRequest('bucket-123', 'wormId-123', new Models\ExtendWormConfiguration(3));
$input = BucketWorm::fromExtendBucketWorm($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('wormId-123', $input->getParameters()['wormId']);
$this->assertEquals($xml, $this->cleanXml($input->getBody()->getContents()));
$this->assertEquals(base64_encode(md5($input->getBody(), true)), $input->getHeaders()['content-md5']);
}
public function testToExtendBucketWorm()
{
// empty output
$output = new OperationOutput();
$result = BucketWorm::toExtendBucketWorm($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123']
);
$result = BucketWorm::toCompleteBucketWorm($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(1, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
}
public function testFromGetBucketWorm()
{
// miss required field
try {
$request = new Models\GetBucketWormRequest();
$input = BucketWorm::fromGetBucketWorm($request);
$this->assertTrue(false, "should not here");
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString("missing required field, bucket", (string)$e);
}
$request = new Models\GetBucketWormRequest('bucket-123');
$input = BucketWorm::fromGetBucketWorm($request);
$this->assertEquals('bucket-123', $input->getBucket());
$this->assertEquals('1B2M2Y8AsgTpgAmY7PhCfg==', $input->getHeaders()['content-md5']);
}
public function testToGetBucketWorm()
{
// empty output
$output = new OperationOutput();
$result = BucketWorm::toGetBucketWorm($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
Utils::streamFor('<WormConfiguration>
<WormId>1666E2CFB2B3418****</WormId>
<State>Locked</State>
<RetentionPeriodInDays>1</RetentionPeriodInDays>
<CreationDate>2020-10-15T15:50:32</CreationDate>
</WormConfiguration>')
);
$result = BucketWorm::toGetBucketWorm($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertCount(2, $result->headers);
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('1666E2CFB2B3418****', $result->wormConfiguration->wormId);
$this->assertEquals('Locked', $result->wormConfiguration->state);
$this->assertEquals(1, $result->wormConfiguration->retentionPeriodInDays);
$this->assertEquals("2020-10-15T15:50:32", $result->wormConfiguration->creationDate);
}
private function cleanXml($xml): array|string
{
return str_replace("\n", "", str_replace("\r", "", $xml));
}
}

View File

@@ -0,0 +1,85 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Models;
use AlibabaCloud\Oss\V2\Transform\CloudBoxes;
use AlibabaCloud\Oss\V2\OperationOutput;
use AlibabaCloud\Oss\V2\Utils;
class CloudBoxesTest extends \PHPUnit\Framework\TestCase
{
public function testFromListCloudBoxes()
{
$request = new Models\ListCloudBoxesRequest();
$input = CloudBoxes::fromListCloudBoxes($request);
$request = new Models\ListCloudBoxesRequest(marker: '', maxKeys: 10, prefix: '/');
$input = CloudBoxes::fromListCloudBoxes($request);
$this->assertEquals('', $input->getParameters()['cloudboxes']);
$this->assertEquals('', $input->getParameters()['marker']);
$this->assertEquals('10', $input->getParameters()['max-keys']);
$this->assertEquals('/', $input->getParameters()['prefix']);
}
public function testToListCloudBoxes()
{
// empty output
$output = new OperationOutput();
$result = CloudBoxes::toListCloudBoxes($output);
$this->assertEquals('', $result->status);
$this->assertEquals(0, $result->statusCode);
$this->assertEquals('', $result->requestId);
$this->assertEquals(0, count($result->headers));
$body = '<?xml version="1.0" encoding="UTF-8"?>
<ListCloudBoxResult>
<Owner>
<ID>51264</ID>
<DisplayName>51264</DisplayName>
</Owner>
<CloudBoxes>
<CloudBox>
<ID>cb-f8z7yvzgwfkl9q0h****</ID>
<Name>bucket1</Name>
<Region>cn-shanghai</Region>
<ControlEndpoint>cb-f8z7yvzgwfkl9q0h****.cn-shanghai.oss-cloudbox-control.aliyuncs.com</ControlEndpoint>
<DataEndpoint>cb-f8z7yvzgwfkl9q0h****.cn-shanghai.oss-cloudbox.aliyuncs.com</DataEndpoint>
</CloudBox>
<CloudBox>
<ID>cb-f9z7yvzgwfkl9q0h****</ID>
<Name>bucket2</Name>
<Region>cn-hangzhou</Region>
<ControlEndpoint>cb-f9z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox-control.aliyuncs.com</ControlEndpoint>
<DataEndpoint>cb-f9z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com</DataEndpoint>
</CloudBox>
</CloudBoxes>
</ListCloudBoxResult>';
$output = new OperationOutput(
'OK',
200,
['x-oss-request-id' => '123', 'content-type' => 'application/xml'],
body: Utils::streamFor($body)
);
$result = CloudBoxes::toListCloudBoxes($output);
$this->assertEquals('OK', $result->status);
$this->assertEquals(200, $result->statusCode);
$this->assertEquals('123', $result->requestId);
$this->assertEquals(2, count($result->headers));
$this->assertEquals('123', $result->headers['x-oss-request-id']);
$this->assertEquals('application/xml', $result->headers['content-type']);
$this->assertEquals('51264', $result->listCloudBoxes->owner->id);
$this->assertEquals('51264', $result->listCloudBoxes->owner->displayName);
$this->assertEquals(2, count($result->listCloudBoxes->cloudBoxes->cloudBox));
$this->assertEquals('cb-f8z7yvzgwfkl9q0h****', $result->listCloudBoxes->cloudBoxes->cloudBox[0]->id);
$this->assertEquals('cb-f8z7yvzgwfkl9q0h****.cn-shanghai.oss-cloudbox.aliyuncs.com', $result->listCloudBoxes->cloudBoxes->cloudBox[0]->dataEndpoint);
$this->assertEquals('cb-f8z7yvzgwfkl9q0h****.cn-shanghai.oss-cloudbox-control.aliyuncs.com', $result->listCloudBoxes->cloudBoxes->cloudBox[0]->controlEndpoint);
$this->assertEquals('bucket1', $result->listCloudBoxes->cloudBoxes->cloudBox[0]->name);
$this->assertEquals('cn-shanghai', $result->listCloudBoxes->cloudBoxes->cloudBox[0]->region);
$this->assertEquals('cb-f9z7yvzgwfkl9q0h****', $result->listCloudBoxes->cloudBoxes->cloudBox[1]->id);
$this->assertEquals('cb-f9z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox.aliyuncs.com', $result->listCloudBoxes->cloudBoxes->cloudBox[1]->dataEndpoint);
$this->assertEquals('cb-f9z7yvzgwfkl9q0h****.cn-hangzhou.oss-cloudbox-control.aliyuncs.com', $result->listCloudBoxes->cloudBoxes->cloudBox[1]->controlEndpoint);
$this->assertEquals('bucket2', $result->listCloudBoxes->cloudBoxes->cloudBox[1]->name);
$this->assertEquals('cn-hangzhou', $result->listCloudBoxes->cloudBoxes->cloudBox[1]->region);
}
}

View File

@@ -0,0 +1,105 @@
<?php
namespace UnitTests\Transform;
use AlibabaCloud\Oss\V2\Transform\Functions;
use AlibabaCloud\Oss\V2\Exception;
class FunctionsTest extends \PHPUnit\Framework\TestCase
{
public function testAssertFieldRequired()
{
try {
Functions::assertFieldRequired('field', null);
} catch (\InvalidArgumentException $e) {
$this->assertStringContainsString('missing required field, field', $e);
}
Functions::assertFieldRequired('field', 'hello world');
}
public function testAssertXmlRoot()
{
try {
Functions::assertXmlRoot('', '');
} catch (Exception\DeserializationExecption $e) {
$this->assertStringContainsString('Not found tag', $e);
}
try {
Functions::assertXmlRoot('<Root></Root>', '');
} catch (Exception\DeserializationExecption $e) {
$this->assertStringContainsString('Not found tag', $e);
}
try {
Functions::assertXmlRoot('<Root></Root>', '123');
} catch (Exception\DeserializationExecption $e) {
$this->assertStringContainsString('Not found tag', $e);
}
Functions::assertXmlRoot('<Root></Root>', 'Root');
Functions::assertXmlRoot('<Root xmlns="http://doc.oss-cn-hangzhou.aliyuncs.com"></Root>', 'Root');
Functions::assertXmlRoot('<Root any char></Root>', 'Root');
$str = '<?xml version="1.0" encoding="UTF-8"?>
<RootConfiguration>
<Id>str1</Id>
<Text>str2</Text>
<SubConfiguration>
<StrField>str-sub</StrField>
<IntField>1234</IntField>
</SubConfiguration>
</RootConfiguration>';
try {
Functions::assertXmlRoot($str, 'Configuration');
$this->assertTrue(false, 'should not here');
} catch (Exception\DeserializationExecption $e) {
$this->assertStringContainsString('Not found tag', $e);
}
}
public function testtryToDatetime()
{
$elem = new \SimpleXMLElement('<Root><Data>2023-12-17T03:30:09Z</Data><Data1>invalid value</Data1></Root>');
$this->assertNull(Functions::tryToDatetime($elem->NoNode));
$this->assertNull(Functions::tryToDatetime($elem->Data1));
$datetimeUtc = new \DateTime();
$datetimeUtc->setTimestamp(1702783809);
$this->assertEquals($datetimeUtc, Functions::tryToDatetime($elem->Data));
}
public function testtryToBool()
{
$elem = new \SimpleXMLElement('<Root><Data>True</Data><Data1>true</Data1><Data2>false</Data2><DataEmpty></DataEmpty></Root>');
$this->assertNull(Functions::tryToBool($elem->NoNode));
$this->assertEquals(true, Functions::tryToBool($elem->Data));
$this->assertEquals(true, Functions::tryToBool($elem->Data1));
$this->assertEquals(false, Functions::tryToBool($elem->Data2));
$this->assertNotNull(Functions::tryToBool($elem->DataEmpty));
$this->assertEquals(false, Functions::tryToBool($elem->DataEmpty));
}
public function testtryToInt()
{
$elem = new \SimpleXMLElement('<Root><Data>123</Data><Data1>0</Data1><Data2>invalid value</Data2><DataEmpty></DataEmpty></Root>');
$this->assertNull(Functions::tryToInt($elem->NoNode));
$this->assertEquals(123, Functions::tryToInt($elem->Data));
$this->assertEquals(0, Functions::tryToInt($elem->Data1));
$this->assertEquals(0, Functions::tryToInt($elem->Data2));
$this->assertNotNull(Functions::tryToInt($elem->DataEmpty));
$this->assertEquals(0, Functions::tryToInt($elem->DataEmpty));
}
public function testtryToString()
{
$elem = new \SimpleXMLElement('<Root><Data>123</Data><Data1>0</Data1><Data2></Data2></Root>');
$this->assertNull(Functions::tryToString($elem->NoNode));
$this->assertEquals('123', Functions::tryToString($elem->Data));
$this->assertEquals('0', Functions::tryToString($elem->Data1));
$this->assertNotNull(Functions::tryToString($elem->Data2));
$this->assertEquals('', Functions::tryToString($elem->Data2));
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More