| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610 | <?phpnamespace OSS\Tests;use OSS\Core\OssException;use OSS\OssClient;use OSS\Model\TaggingConfig;use OSS\Model\Tag;use OSS\Model\DeleteObjectInfo;use OSS\Core\OssUtil;require_once __DIR__ . DIRECTORY_SEPARATOR . 'TestOssClientBase.php';class OssClientObjectVersioningTest extends TestOssClientBase{    public function testObjectBasic()    {        $object = 'object';        $content1 = 'hello';        $content2 = 'hello world';        $ret1 = $this->ossClient->putObject($this->bucket, $object, $content1, array(OssClient::OSS_HEADERS => array('x-oss-object-acl' => 'public-read', 'x-oss-tagging' => 'key1=value1')));        $ret2 = $this->ossClient->putObject($this->bucket, $object, $content2, array(OssClient::OSS_HEADERS => array('x-oss-object-acl' => 'private', 'x-oss-tagging' => 'key2=value2')));        $this->assertTrue(isset($ret1[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($ret2[OssClient::OSS_HEADER_VERSION_ID]));        $versionId1 = $ret1[OssClient::OSS_HEADER_VERSION_ID];        $versionId2 = $ret2[OssClient::OSS_HEADER_VERSION_ID];        //get object        $res = $this->ossClient->getObject($this->bucket, $object);        $res1 = $this->ossClient->getObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $res2 = $this->ossClient->getObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId2));        $this->assertEquals($content1, $res1);        $this->assertEquals($content2, $res2);        $this->assertEquals($content2, $res);        //meta        $headers = $this->ossClient->getObjectMeta($this->bucket, $object);        $headers1 = $this->ossClient->getObjectMeta($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $headers2 = $this->ossClient->getObjectMeta($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId2));        $this->assertTrue(isset($headers[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($headers1[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($headers2[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertEquals($versionId1, $headers1[OssClient::OSS_HEADER_VERSION_ID]);        $this->assertEquals($versionId2, $headers2[OssClient::OSS_HEADER_VERSION_ID]);        $this->assertEquals($versionId2, $headers[OssClient::OSS_HEADER_VERSION_ID]);        $sheaders = $this->ossClient->getSimplifiedObjectMeta($this->bucket, $object);        $sheaders1 = $this->ossClient->getSimplifiedObjectMeta($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $sheaders2 = $this->ossClient->getSimplifiedObjectMeta($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId2));        $this->assertTrue(isset($sheaders[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($sheaders1[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($sheaders2[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertEquals($versionId1, $sheaders1[OssClient::OSS_HEADER_VERSION_ID]);        $this->assertEquals($versionId2, $sheaders2[OssClient::OSS_HEADER_VERSION_ID]);        $this->assertEquals($versionId2, $sheaders[OssClient::OSS_HEADER_VERSION_ID]);        //acl        $acl = $this->ossClient->getObjectAcl($this->bucket, $object);        $acl1 = $this->ossClient->getObjectAcl($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $acl2 = $this->ossClient->getObjectAcl($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId2));        $this->assertEquals('public-read', $acl1);        $this->assertEquals('private', $acl2);        $this->assertEquals('private', $acl);        $this->ossClient->putObjectAcl($this->bucket, $object, 'public-read-write', array(OssClient::OSS_VERSION_ID => $versionId1));        $acl = $this->ossClient->getObjectAcl($this->bucket, $object);        $acl1 = $this->ossClient->getObjectAcl($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $this->assertEquals('public-read-write', $acl1);        $this->assertEquals('private', $acl);        //tagging        $tag = $this->ossClient->getObjectTagging($this->bucket, $object);        $tag1 = $this->ossClient->getObjectTagging($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $tag2 = $this->ossClient->getObjectTagging($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId2));        $this->assertEquals(1, count($tag1->getTags()));        $this->assertEquals("key1", $tag1->getTags()[0]->getKey());        $this->assertEquals("value1", $tag1->getTags()[0]->getValue());        $this->assertEquals(1, count($tag2->getTags()));        $this->assertEquals("key2", $tag2->getTags()[0]->getKey());        $this->assertEquals("value2", $tag2->getTags()[0]->getValue());        $this->assertEquals(1, count($tag->getTags()));        $this->assertEquals("key2", $tag->getTags()[0]->getKey());        $this->assertEquals("value2", $tag->getTags()[0]->getValue());        $config = new TaggingConfig();        $config->addTag(new Tag("key11", "value11"));        $this->ossClient->putObjectTagging($this->bucket, $object, $config, array(OssClient::OSS_VERSION_ID => $versionId1));        $tag = $this->ossClient->getObjectTagging($this->bucket, $object);        $tag1 = $this->ossClient->getObjectTagging($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $this->assertEquals(1, count($tag1->getTags()));        $this->assertEquals("key11", $tag1->getTags()[0]->getKey());        $this->assertEquals("value11", $tag1->getTags()[0]->getValue());        $this->assertEquals(1, count($tag->getTags()));        $this->assertEquals("key2", $tag->getTags()[0]->getKey());        $this->assertEquals("value2", $tag->getTags()[0]->getValue());        $this->ossClient->deleteObjectTagging($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $tag = $this->ossClient->getObjectTagging($this->bucket, $object);        $tag1 = $this->ossClient->getObjectTagging($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $this->assertEquals(0, count($tag1->getTags()));        $this->assertEquals(1, count($tag->getTags()));        $this->assertEquals("key2", $tag->getTags()[0]->getKey());        $this->assertEquals("value2", $tag->getTags()[0]->getValue());        //delete        $dret = $this->ossClient->deleteObject($this->bucket, $object);        $this->assertTrue(isset($dret['x-oss-delete-marker']));        $this->assertTrue(isset($dret['x-oss-version-id']));        $this->assertEquals("true", $dret['x-oss-delete-marker']);        $this->assertFalse($this->ossClient->doesObjectExist($this->bucket, $object));        $this->assertTrue($this->ossClient->doesObjectExist($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1)));        $this->assertTrue($this->ossClient->doesObjectExist($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId2)));        $dret1 = $this->ossClient->deleteObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        $this->assertFalse(isset($dret1['x-oss-delete-marker']));        $this->assertTrue(isset($dret1['x-oss-version-id']));        $this->assertEquals($versionId1, $dret1['x-oss-version-id']);        $this->assertFalse($this->ossClient->doesObjectExist($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1)));        $dret_ = $this->ossClient->deleteObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $dret['x-oss-version-id']));        $this->assertTrue(isset($dret_['x-oss-delete-marker']));        $this->assertTrue(isset($dret_['x-oss-version-id']));        $this->assertEquals($dret['x-oss-version-id'], $dret_['x-oss-version-id']);        $this->assertTrue($this->ossClient->doesObjectExist($this->bucket, $object));    }    public function testObjectSymlink()    {        $object1 = 'object-target-1';        $object2 = 'object-target-2';        $symlink = 'object-symlink';        $content1 = 'hello';        $content2 = 'hello world';        $ret1 = $this->ossClient->putObject($this->bucket, $object1, $content1);        $sym1 = $this->ossClient->putSymlink($this->bucket, $symlink, $object1);        $ret2 = $this->ossClient->putObject($this->bucket, $object2, $content2);        $sym2 = $this->ossClient->putSymlink($this->bucket, $symlink, $object2);        $this->assertTrue(isset($ret1[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($ret2[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($sym1[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($sym2[OssClient::OSS_HEADER_VERSION_ID]));        $versionId1 = $ret1[OssClient::OSS_HEADER_VERSION_ID];        $versionId2 = $ret2[OssClient::OSS_HEADER_VERSION_ID];        $sym_versionId1 = $sym1[OssClient::OSS_HEADER_VERSION_ID];        $sym_versionId2 = $sym2[OssClient::OSS_HEADER_VERSION_ID];        $sym_ret = $this->ossClient->getSymlink($this->bucket, $symlink);        $sym_ret1 = $this->ossClient->getSymlink($this->bucket, $symlink, array(OssClient::OSS_VERSION_ID => $sym_versionId1));        $sym_ret2 = $this->ossClient->getSymlink($this->bucket, $symlink, array(OssClient::OSS_VERSION_ID => $sym_versionId2));        $this->assertTrue(isset($sym_ret['x-oss-version-id']));        $this->assertTrue(isset($sym_ret1['x-oss-version-id']));        $this->assertTrue(isset($sym_ret2['x-oss-version-id']));        $this->assertEquals($sym_versionId1, $sym_ret1['x-oss-version-id']);        $this->assertEquals($sym_versionId2, $sym_ret2['x-oss-version-id']);        $this->assertEquals($sym_versionId2, $sym_ret['x-oss-version-id']);        $res = $this->ossClient->getObject($this->bucket, $symlink);        $res1 = $this->ossClient->getObject($this->bucket, $symlink, array(OssClient::OSS_VERSION_ID => $sym_versionId1));        $res2 = $this->ossClient->getObject($this->bucket, $symlink, array(OssClient::OSS_VERSION_ID => $sym_versionId2));        $this->assertEquals($content1, $res1);        $this->assertEquals($content2, $res2);        $this->assertEquals($content2, $res);    }    public function testObjectCopy()    {        $object = 'copy-= +object';        $content1 = 'hello';        $content2 = 'hello world';        $to_bucket = $this->bucket;        $to_object = $object . '.copy';        $to_object1 = $object . '.copy1';        $to_object2 = $object . '.copy2';        $ret1 = $this->ossClient->putObject($this->bucket, $object, $content1);        $ret2 = $this->ossClient->putObject($this->bucket, $object, $content2);        $versionId1 = $ret1[OssClient::OSS_HEADER_VERSION_ID];        $versionId2 = $ret2[OssClient::OSS_HEADER_VERSION_ID];        $cret = $this->ossClient->copyObject($this->bucket, $object, $to_bucket, $to_object);        $cret1 = $this->ossClient->copyObject($this->bucket, $object, $to_bucket, $to_object1, array(OssClient::OSS_VERSION_ID => $versionId1));        $cret2 = $this->ossClient->copyObject($this->bucket, $object, $to_bucket, $to_object2, array(OssClient::OSS_VERSION_ID => $versionId2));        $this->assertFalse(empty($cret1));        $this->assertEquals(strlen("2016-11-21T03:46:58.000Z"), strlen($cret1[0]));        $this->assertEquals(trim($ret1['etag'], '"'), trim($cret1[1], '"'));        $this->assertTrue(isset($cret1['x-oss-version-id']));        $this->assertEquals($versionId1, $cret1['x-oss-copy-source-version-id']);        $this->assertFalse(empty($cret2));        $this->assertEquals(strlen("2016-11-21T03:46:58.000Z"), strlen($cret2[0]));        $this->assertEquals(trim($ret2['etag'], '"'), trim($cret2[1], '"'));        $this->assertTrue(isset($cret2['x-oss-version-id']));        $this->assertEquals($versionId2, $cret2['x-oss-copy-source-version-id']);        $this->assertFalse(empty($cret));        $this->assertEquals(strlen("2016-11-21T03:46:58.000Z"), strlen($cret[0]));        $this->assertEquals(trim($ret2['etag'], '"'), trim($cret[1], '"'));        $this->assertTrue(isset($cret2['x-oss-version-id']));        $this->assertEquals($versionId2, $cret['x-oss-copy-source-version-id']);        $res = $this->ossClient->getObject($this->bucket, $to_object);        $res1 = $this->ossClient->getObject($this->bucket, $to_object1);        $res2 = $this->ossClient->getObject($this->bucket, $to_object2);        $this->assertEquals($content1, $res1);        $this->assertEquals($content2, $res2);        $this->assertEquals($content2, $res);    }    public function testObjectRestore()    {        $object = 'retore-object';        $content1 = 'hello';        $content2 = 'hello world';        $ret1 = $this->ossClient->putObject($this->bucket, $object, $content1, array(OssClient::OSS_HEADERS => array('x-oss-storage-class' => 'Archive')));        $ret2 = $this->ossClient->putObject($this->bucket, $object, $content2);        $versionId1 = $ret1[OssClient::OSS_HEADER_VERSION_ID];        $versionId2 = $ret2[OssClient::OSS_HEADER_VERSION_ID];        try{            $this->ossClient->getObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));            $this->assertTrue(false);        }catch (OssException $e){            $this->assertEquals('403', $e->getHTTPStatus());            $this->assertEquals('InvalidObjectState', $e->getErrorCode());        }        try{            $this->ossClient->restoreObject($this->bucket, $object);            $this->assertTrue(false);        }catch(OssException $e){            $this->assertEquals('400', $e->getHTTPStatus());            $this->assertEquals('OperationNotSupported', $e->getErrorCode());        }                $result = $this->ossClient->restoreObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        common::waitMetaSync();        $this->assertEquals('202', $result['info']['http_code']);        try{            $this->ossClient->restoreObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $versionId1));        }catch(OssException $e){            $this->assertEquals('409', $e->getHTTPStatus());            $this->assertEquals('RestoreAlreadyInProgress', $e->getErrorCode());        }    }    public function testObjectMultiPart()    {        $object_src = 'multi-= +object.src';        $content1 = 'hello';        $content2 = 'hello world';        $ret1 = $this->ossClient->putObject($this->bucket, $object_src, $content1);        $ret2 = $this->ossClient->putObject($this->bucket, $object_src, $content2);        $this->assertTrue(isset($ret1[OssClient::OSS_HEADER_VERSION_ID]));        $this->assertTrue(isset($ret2[OssClient::OSS_HEADER_VERSION_ID]));        $versionId1 = $ret1[OssClient::OSS_HEADER_VERSION_ID];        $versionId2 = $ret2[OssClient::OSS_HEADER_VERSION_ID];        //object        $object = "multi-object";        $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object);        $copyId = 1;        $eTag = $this->ossClient->uploadPartCopy($this->bucket, $object_src, $this->bucket, $object, $copyId, $upload_id);        $upload_parts[] = array(            'PartNumber' => $copyId,            'ETag' => $eTag,        );        $ret = $this->ossClient->completeMultipartUpload($this->bucket, $object, $upload_id, $upload_parts);        //object-1        $object1 = "multi-object-1";        $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object1);        $copyId = 1;        $eTag = $this->ossClient->uploadPartCopy($this->bucket, $object_src, $this->bucket, $object1, $copyId, $upload_id, array(OssClient::OSS_VERSION_ID => $versionId1));        $upload_parts1[] = array(            'PartNumber' => $copyId,            'ETag' => $eTag,        );        $ret1 = $this->ossClient->completeMultipartUpload($this->bucket, $object1, $upload_id, $upload_parts1);        //object-2        $object2 = "multi-object-2";        $upload_id = $this->ossClient->initiateMultipartUpload($this->bucket, $object2);        $copyId = 1;        $eTag = $this->ossClient->uploadPartCopy($this->bucket, $object_src, $this->bucket, $object2, $copyId, $upload_id, array(OssClient::OSS_VERSION_ID => $versionId2));        $upload_parts2[] = array(            'PartNumber' => $copyId,            'ETag' => $eTag,        );        $ret2 = $this->ossClient->completeMultipartUpload($this->bucket, $object2, $upload_id, $upload_parts2);        $res = $this->ossClient->getObject($this->bucket, $object);        $res1 = $this->ossClient->getObject($this->bucket, $object1);        $res2 = $this->ossClient->getObject($this->bucket, $object2);        $this->assertEquals($content1, $res1);        $this->assertEquals($content2, $res2);        $this->assertEquals($content2, $res);    }    public function testObjectMisc()    {        //use multipart        $options = array(            OssClient::OSS_PART_SIZE => 1,        );                $object = 'misc-object';        $smallFile1 = __DIR__ . DIRECTORY_SEPARATOR . "/smallfile1.tmp";        $smallFile2 = __DIR__ . DIRECTORY_SEPARATOR . "/smallfile2.tmp";        $bigFile1 = __DIR__ . DIRECTORY_SEPARATOR . "/bigfile1.tmp";        $bigFile2 = __DIR__ . DIRECTORY_SEPARATOR . "/bigfile2.tmp";        OssUtil::generateFile($smallFile1, 5);        OssUtil::generateFile($smallFile2, 10);        OssUtil::generateFile($bigFile1, 128 * 1024);        OssUtil::generateFile($bigFile2, 256 * 1024);                $sret1 = $this->ossClient->multiuploadFile($this->bucket, $object, $smallFile1, $options);        $sret2 = $this->ossClient->multiuploadFile($this->bucket, $object, $smallFile2, $options);        $bret1 = $this->ossClient->multiuploadFile($this->bucket, $object, $bigFile1, $options);        $bret2 = $this->ossClient->multiuploadFile($this->bucket, $object, $bigFile2, $options);        $res = $this->ossClient->getObject($this->bucket, $object);        $sres1 = $this->ossClient->getObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $sret1['x-oss-version-id']));        $sres2 = $this->ossClient->getObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $sret2['x-oss-version-id']));        $bres1 = $this->ossClient->getObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $bret1['x-oss-version-id']));        $bres2 = $this->ossClient->getObject($this->bucket, $object, array(OssClient::OSS_VERSION_ID => $bret2['x-oss-version-id']));                $this->assertEquals(file_get_contents($smallFile1), $sres1);        $this->assertEquals(file_get_contents($smallFile2), $sres2);        $this->assertEquals(file_get_contents($bigFile1), $bres1);        $this->assertEquals(file_get_contents($bigFile2), $bres2);        $this->assertEquals(file_get_contents($bigFile2), $res);        unlink($smallFile1);        unlink($smallFile2);        unlink($bigFile1);        unlink($bigFile2);    }    public function testListObjects()    {        //folder         for ($i = 0; $i < 12; $i++) {            $key = 'folder/'. sprintf("%02d",$i);            $this->ossClient->putObject($this->bucket, $key, "content");            $this->ossClient->putObject($this->bucket, $key, "content");            $this->ossClient->deleteObject($this->bucket, $key);        }        //test        for ($i = 0; $i < 8; $i++) {            $key = 'test/'. sprintf("%02d",$i);            $this->ossClient->putObject($this->bucket, $key, "content");            $this->ossClient->deleteObject($this->bucket, $key);            $this->ossClient->putObject($this->bucket, $key, "content");        }        //work        for ($i = 0; $i < 5; $i++) {            $key = 'work/'. sprintf("%02d",$i);            $this->ossClient->putObject($this->bucket, $key, "content");        }        //sub++        for ($i = 0; $i < 3; $i++) {            $key = 'sub++/'. sprintf("%02d",$i);            $this->ossClient->putObject($this->bucket, $key, "content");            $this->ossClient->putObject($this->bucket, $key, "content");            $this->ossClient->putObject($this->bucket, $key, "content");        }        //file++        for ($i = 0; $i < 2; $i++) {            $key = 'file++'. sprintf("%02d",$i);            $this->ossClient->putObject($this->bucket, $key, "content");            $this->ossClient->deleteObject($this->bucket, $key);        }        //list default        $result = $this->ossClient->listObjectVersions($this->bucket);        $versionList = $result->getObjectVersionList();        $deleteMarkerList = $result->getDeleteMarkerList();        $prefixList = $result->getPrefixList();        $this->assertNotNull($versionList);        $this->assertNotNull($deleteMarkerList);        $this->assertNotNull($prefixList);        $this->assertTrue(is_array($versionList));        $this->assertTrue(is_array($deleteMarkerList));        $this->assertTrue(is_array($prefixList));        $this->assertEquals(2, count($versionList));        $this->assertEquals(2, count($deleteMarkerList));        $this->assertEquals(4, count($prefixList));        $this->assertEquals('file++00', $versionList[0]->getKey());        $this->assertEquals('false', $versionList[0]->getIsLatest());        $this->assertEquals('file++01', $versionList[1]->getKey());        $this->assertEquals('false', $versionList[1]->getIsLatest());        $this->assertEquals('file++00', $deleteMarkerList[0]->getKey());        $this->assertEquals('true', $deleteMarkerList[0]->getIsLatest());        $this->assertEquals('file++01', $deleteMarkerList[1]->getKey());        $this->assertEquals('true', $deleteMarkerList[1]->getIsLatest());        $this->assertEquals('folder/', $prefixList[0]->getPrefix());        $this->assertEquals('sub++/', $prefixList[1]->getPrefix());        $this->assertEquals('test/', $prefixList[2]->getPrefix());        $this->assertEquals('work/', $prefixList[3]->getPrefix());        //list by prefix        $prefix = 'folder/';        $delimiter = '';        $next_marker = '';        $maxkeys = 1000;        $options = array(            'delimiter' => $delimiter,            'prefix' => $prefix,            'max-keys' => $maxkeys,            'key-marker' => $next_marker,        );        $result = $this->ossClient->listObjectVersions($this->bucket, $options);        $versionList = $result->getObjectVersionList();        $deleteMarkerList = $result->getDeleteMarkerList();        $prefixList = $result->getPrefixList();        $this->assertEquals(24, count($versionList));        $this->assertEquals(12, count($deleteMarkerList));        $this->assertEquals(0, count($prefixList));        $this->assertEquals('folder/00', $versionList[0]->getKey());        $this->assertEquals('folder/00', $versionList[1]->getKey());        $this->assertEquals('folder/00', $deleteMarkerList[0]->getKey());        $this->assertEquals('folder/01', $deleteMarkerList[1]->getKey());        //max-key & key-marker & version-id-marker        $count = 0;        $markerCount = 0;        $nextMarker = '';        $nextVersionIdMarker = '';        while (true) {            $options = array(                'delimiter' => '',                'key-marker' => $nextMarker,                'max-keys' => 1,                'version-id-marker' => $nextVersionIdMarker,            );            $result = $this->ossClient->listObjectVersions($this->bucket, $options);            $nextMarker = $result->getNextKeyMarker();            $nextVersionIdMarker = $result->getNextVersionIdMarker();            $count += count($result->getObjectVersionList());            $markerCount += count($result->getDeleteMarkerList());            $this->assertEquals(1, count($result->getObjectVersionList()) + count($result->getDeleteMarkerList()));            if ($result->getIsTruncated() !== "true") {                break;            }        }        $this->assertEquals(12*3 + 8*3 + 5 + 3*3 + 2*2, $count + $markerCount);    }    public function testDeleteObjects()    {        //deletes         for ($i = 0; $i < 5; $i++) {            $key = 'deletes/'. sprintf("%02d",$i);            $this->ossClient->putObject($this->bucket, $key, "content");            $this->ossClient->putObject($this->bucket, $key, "content");        }        $options = array(            'delimiter' => '',            'prefix' => 'deletes/',            'max-keys' => 1000,        );        $result = $this->ossClient->listObjects($this->bucket, $options);        $this->assertEquals(5, count($result->getObjectList()));        //delete without version-id        $objects = array();         for ($i = 0; $i < 5; $i++) {            $key = 'deletes/'. sprintf("%02d",$i);            $objects[] = new DeleteObjectInfo($key);        }        $dresult = $this->ossClient->deleteObjectVersions($this->bucket, $objects);        $this->assertEquals(5, count($dresult));        $this->assertEquals('deletes/00', $dresult[0]->getKey());        $this->assertEquals('true', $dresult[0]->getDeleteMarker());        $this->assertEquals('', $dresult[0]->getVersionId());        $this->assertFalse(empty($dresult[0]->getDeleteMarkerVersionId()));        $result = $this->ossClient->listObjects($this->bucket, $options);        $this->assertEquals(0, count($result->getObjectList()));        //delete by version-id        $vresult = $this->ossClient->listObjectVersions($this->bucket, $options);        $versions = $vresult->getObjectVersionList();        $deleteMarkerList = $vresult->getDeleteMarkerList();        $this->assertEquals(10, count($versions));        $this->assertEquals(5, count($deleteMarkerList));        $objects = array();         foreach ($versions as $obj) {            $objects[] = new DeleteObjectInfo($obj->getKey(), $obj->getVersionId());        }        $dresult = $this->ossClient->deleteObjectVersions($this->bucket, $objects);        $this->assertEquals(10, count($dresult));        $this->assertEquals('deletes/00', $dresult[0]->getKey());        $this->assertEquals('', $dresult[0]->getDeleteMarker());        $this->assertFalse(empty($dresult[0]->getVersionId()));        $this->assertTrue(empty($dresult[0]->getDeleteMarkerVersionId()));        $this->assertEquals('deletes/00', $dresult[1]->getKey());        $this->assertEquals('', $dresult[1]->getDeleteMarker());        $this->assertFalse(empty($dresult[1]->getVersionId()));        $this->assertTrue(empty($dresult[1]->getDeleteMarkerVersionId()));        $vresult = $this->ossClient->listObjectVersions($this->bucket, $options);        $versions = $vresult->getObjectVersionList();        $deleteMarkerList = $vresult->getDeleteMarkerList();        $this->assertEquals(0, count($versions));        $this->assertEquals(5, count($deleteMarkerList));        $objects = array();         foreach ($deleteMarkerList as $obj) {            $objects[] = new DeleteObjectInfo($obj->getKey(), $obj->getVersionId());        }        $dresult = $this->ossClient->deleteObjectVersions($this->bucket, $objects);        $this->assertEquals(5, count($dresult));        $this->assertEquals('deletes/00', $dresult[0]->getKey());        $this->assertEquals('true', $dresult[0]->getDeleteMarker());        $this->assertFalse(empty($dresult[1]->getVersionId()));        $this->assertFalse(empty($dresult[1]->getDeleteMarkerVersionId()));        $vresult = $this->ossClient->listObjectVersions($this->bucket, $options);        $versions = $vresult->getObjectVersionList();        $deleteMarkerList = $vresult->getDeleteMarkerList();        $this->assertEquals(0, count($versions));        $this->assertEquals(0, count($deleteMarkerList));    }    protected function setUp(): void    {        parent::setUp();        $this->ossClient->putBucketVersioning($this->bucket, "Enabled");    }    protected function tearDown(): void    {        if (!$this->ossClient->doesBucketExist($this->bucket)) {            return;        }        $this->ossClient->putBucketVersioning($this->bucket, "Suspended");        $result = $this->ossClient->listObjectVersions(            $this->bucket, array('max-keys' => 1000, 'delimiter' => ''));        $versions = $result->getObjectVersionList();        $deleteMarkers = $result->getDeleteMarkerList();        foreach ($versions as $obj) {            $options = array(                OssClient::OSS_VERSION_ID => $obj->getVersionId(),            );            $this->ossClient->deleteObject($this->bucket, $obj->getKey(), $options);        }        foreach ($deleteMarkers as $del) {            $options = array(                OssClient::OSS_VERSION_ID => $del->getVersionId(),            );            $this->ossClient->deleteObject($this->bucket, $del->getKey(), $options);        }        parent::tearDown();    }}
 |