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 = ' Running FullScanning 2021-08-02T10:49:17.289372919+08:00 2021-08-02T10:49:17.289372919+08:00 '; $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 = <<5{'Field': 'Size','Value': '1048576','Operation': 'gt'}SizeascSizesumSizemaxMTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw**** 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 = <<99Overlook the snow-covered forestMTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw****image{'Operation':'gt', 'Field': 'Size', 'Value': '30'} 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 = ' MTIzNDU2Nzg6aW1tdGVzdDpleGFtcGxlYnVja2V0OmRhdGFzZXQwMDE6b3NzOi8vZXhhbXBsZWJ1Y2tldC9zYW1wbGVvYmplY3QxLmpw**** exampleobject.txt 120 2021-06-29T15:04:05.000000000Z07:00 Normal Standard default "fba9dede5f27731c9771645a3986****" 4858A48BD1466884 2 owner John type document x-oss-meta-location hangzhou Size sum 4859250309 Size max 2235483240 '; $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 = ' Size sum 30930054 Size group 1536000 1 5472362 1 10354204 1 1890304 3 2632192 3 '; $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 = ' oss://bucket/sample-object.jpg sample-object.jpg 1000 default 2021-06-29T14:50:14.011643661+08:00 AES256 SM4 "1D9C280A7C4F67F7EF873E28449****" 559890638950338001 2021-06-29T14:50:15.011643661+08:00 image/jpeg image 30.134390,120.074997 test 2024-12-01T12:00:00.000Z https://aliyundoc.com PUT SM4 9468da86-3509-4f8d-a61e-6eab1eac**** no-cache attachment; filename=test.jpg UTF-8 zh-CN 500 270 1080 1920 h264 en 5407765 25/1 0 22.88 572 8 yuv420p bt709 720 1280 h264 en 5407765 25/1 0 22.88 572 8 yuv420p bt709 720 1280 aac 1048576 48000 0.0235 3.690667 2 en mov_text en 0 71.378 mov_text en 72 71.378 5407765 Jane Jenny Jane Jane FirstAlbum 71.378
中国浙江省杭州市余杭区文一西路969号 杭州市 中国 余杭区 zh-Hans 浙江省 文一西路
中国浙江省杭州市余杭区文一西路970号 杭州市 中国 余杭区 zh-Hans 浙江省 文一西路
Normal Standard 2 key val key2 val2 key val
'; $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)); } }