assertEquals([ 115, 116, 114, 105, 110, 103, ], Utils::toBytes('string')); $this->assertEquals([ 115, 116, 114, 105, 110, 103, ], Utils::toBytes([ 115, 116, 114, 105, 110, 103, ])); } public function testToString() { $this->assertEquals('string', Utils::toString([ 115, 116, 114, 105, 110, 103, ])); $this->assertEquals('string', Utils::toString('string')); } public function testParseJSON() { $this->assertEquals([ 'a' => 'b', ], Utils::parseJSON('{"a":"b"}')); } public function testReadAsBytes() { $bytes = Utils::readAsBytes($this->getStream()); $this->assertEquals(123, $bytes[0]); } public function testReadAsString() { $string = Utils::readAsString($this->getStream()); $this->assertEquals($string[0], '{'); } public function testReadAsJSON() { $result = Utils::readAsJSON($this->getStream()); $this->assertEquals('http://httpbin.org/get', $result['url']); } public function testGetNonce() { $nonce1 = Utils::getNonce(); $nonce2 = Utils::getNonce(); $this->assertNotEquals($nonce1, $nonce2); } public function testGetDateUTCString() { $gmdate = Utils::getDateUTCString(); $now = time(); $this->assertTrue(abs($now - strtotime($gmdate)) <= 1); } public function testDefaultString() { $this->assertEquals('', Utils::defaultString(null)); $this->assertEquals('default', Utils::defaultString(null, 'default')); $this->assertEquals('real', Utils::defaultString('real', 'default')); } public function testDefaultNumber() { $this->assertEquals(0, Utils::defaultNumber(null)); $this->assertEquals(0, Utils::defaultNumber(0, 3)); $this->assertEquals(404, Utils::defaultNumber(null, 404)); $this->assertEquals(200, Utils::defaultNumber(200, 404)); } public function testToFormString() { $query = [ 'foo' => 'bar', 'empty' => '', 'a' => null, 'withWhiteSpace' => 'a b', ]; $this->assertEquals('foo=bar&empty=&withWhiteSpace=a%20b', Utils::toFormString($query)); $object = json_decode(json_encode($query)); $this->assertEquals('foo=bar&empty=&withWhiteSpace=a%20b', Utils::toFormString($object)); } public function testToJSONString() { $object = new \stdClass(); $this->assertJson(Utils::toJSONString($object)); $this->assertEquals('[]', Utils::toJSONString([])); $this->assertEquals('["foo"]', Utils::toJSONString(['foo'])); $this->assertEquals( '{"str":"test","number":1,"bool":false,"null":null,"chinese":"中文","http":"https://aliyun.com:8080/zh/中文.html"}', Utils::toJSONString([ 'str' => 'test', 'number' => 1, 'bool' => FALSE, 'null' => null, 'chinese' => '中文', 'http' => 'https://aliyun.com:8080/zh/中文.html', ]) ); $this->assertEquals('1', Utils::toJSONString(1)); $this->assertEquals('true', Utils::toJSONString(TRUE)); $this->assertEquals('null', Utils::toJSONString(null)); } public function testEmpty() { $this->assertTrue(Utils::_empty('')); $this->assertFalse(Utils::_empty('not empty')); } public function testEqualString() { $this->assertTrue(Utils::equalString('a', 'a')); $this->assertFalse(Utils::equalString('a', 'b')); } public function testEqualNumber() { $this->assertTrue(Utils::equalNumber(1, 1)); $this->assertFalse(Utils::equalNumber(1, 2)); } public function testIsUnset() { $this->assertTrue(Utils::isUnset($a)); $b = 1; $this->assertFalse(Utils::isUnset($b)); } public function testStringifyMapValue() { $this->assertEquals([], Utils::stringifyMapValue(null)); $this->assertEquals([ 'foo' => 'bar', 'null' => '', 'true' => 'true', 'false' => 'false', 'number' => '1000', ], Utils::stringifyMapValue([ 'foo' => 'bar', 'null' => null, 'true' => true, 'false' => false, 'number' => 1000, ])); } public function testAnyifyMapValue() { $this->assertEquals([ 'foo' => 'bar', 'null' => null, 'true' => true, 'false' => false, 'number' => 1000, ], Utils::anyifyMapValue([ 'foo' => 'bar', 'null' => null, 'true' => true, 'false' => false, 'number' => 1000, ])); } public function testAssertAsBoolean() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a boolean value.'); Utils::assertAsBoolean('true'); try { $map = true; $this->assertEquals($map, Utils::assertAsBoolean($map)); } catch (\Exception $e) { // should not be here $this->assertTrue(false); } } public function testAssertAsString() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a string value.'); Utils::assertAsString(123); try { $map = '123'; $this->assertEquals($map, Utils::assertAsString($map)); } catch (\Exception $e) { // should not be here $this->assertTrue(false); } } public function testAssertAsBytes() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a bytes value.'); // failed because $var is not array Utils::assertAsBytes('test'); // failed because $var is map not array Utils::assertAsBytes(['foo' => 1]); // failed because item value is not int Utils::assertAsBytes(['1']); // failed because item value is out off range Utils::assertAsBytes([256]); try { // success $map = [1, 2, 3]; $this->assertEquals($map, Utils::assertAsBytes($map)); $this->assertEquals([ 115, 116, 114, 105, 110, 103, ], Utils::assertAsBytes(Utils::toBytes('string'))); } catch (\Exception $e) { // should not be here $this->assertTrue(false); } } public function testAssertAsNumber() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a number value.'); Utils::assertAsNumber('is not number'); try { $map = 123; $this->assertEquals($map, Utils::assertAsNumber($map)); } catch (\Exception $e) { // should not be here $this->assertTrue(false); } } public function testAssertAsInteger() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a int value.'); Utils::assertAsInteger('is not int'); try { $map = 123; $this->assertEquals($map, Utils::assertAsInteger($map)); } catch (\Exception $e) { // should not be here $this->assertTrue(false); } } public function testAssertAsMap() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a map value.'); Utils::assertAsMap('is not array'); try { $map = ['foo' => 'bar']; $this->assertEquals($map, Utils::assertAsMap($map)); } catch (\Exception $e) { // should not be here $this->assertTrue(false); } } public function testAssertAsArray() { $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a array value.'); Utils::assertAsArray('is not array'); try { $map = ['foo']; $this->assertEquals($map, Utils::assertAsArray($map)); } catch (\Exception $e) { // should not be here $this->assertTrue(false); } } public function testGetUserAgent() { $this->assertTrue(false !== strpos(Utils::getUserAgent('CustomUserAgent'), 'CustomUserAgent')); } public function testIs2xx() { $this->assertTrue(Utils::is2xx(200)); $this->assertFalse(Utils::is2xx(300)); } public function testIs3xx() { $this->assertTrue(Utils::is3xx(300)); $this->assertFalse(Utils::is3xx(400)); } public function testIs4xx() { $this->assertTrue(Utils::is4xx(400)); $this->assertFalse(Utils::is4xx(500)); } public function testIs5xx() { $this->assertTrue(Utils::is5xx(500)); $this->assertFalse(Utils::is5xx(600)); } public function testToMap() { $from = new RequestTest(); $from->query = new RequestTestQuery([ 'booleanParamInQuery' => true, 'mapParamInQuery' => [1, 2, 3], ]); $this->assertTrue($from->query->booleanParamInQuery); $this->assertEquals([1, 2, 3], $from->query->mapParamInQuery); $target = new RequestShrinkTest([]); $this->convert($from, $target); $this->assertEquals([ 'BooleanParamInQuery' => true, 'MapParamInQuery' => [1, 2, 3], ], $target->query->toMap()); $target->query->mapParamInQueryShrink = json_encode($from->query->mapParamInQuery); $this->assertEquals([ 'BooleanParamInQuery' => true, 'MapParamInQuery' => '[1,2,3]', ], Utils::toMap($target->query)); } public function testSleep() { $before = microtime(true) * 1000; Utils::sleep(1000); $after = microtime(true) * 1000; $sub = $after - $before; $this->assertTrue(990 <= $sub && $sub <= 1100); } public function testToArray() { $model = new RequestTest(); $model->query = 'foo'; $this->assertEquals([ ['query' => 'foo'], ], Utils::toArray([$model])); $subModel = new RequestTest(); $subModel->query = 'bar'; $model->query = $subModel; $this->assertEquals([ ['query' => ['query' => 'bar']], ], Utils::toArray([$model])); } public function testAssertAsReadable() { $s0 = Utils::assertAsReadable('string content'); $this->assertTrue($s0 instanceof Stream); $s1 = Utils::assertAsReadable($s0); $this->assertEquals($s1, $s0); $this->expectException(\InvalidArgumentException::class); $this->expectExceptionMessage('It is not a stream value.'); Utils::assertAsReadable(0); } public function testRuntimeOptions() { $opts = new RuntimeOptions([ "autoretry" => false, "ignoreSSL" => false, "key" => "key", "cert" => "cert", "ca" => "ca", "maxAttempts" => 3, "backoffPolicy" => "backoffPolicy", "backoffPeriod" => 10, "readTimeout" => 3000, "connectTimeout" => 3000, "httpProxy" => "httpProxy", "httpsProxy" => "httpsProxy", "noProxy" => "noProxy", "maxIdleConns" => 300, "keepAlive" => true, ]); $this->assertEquals(false, $opts->autoretry); $this->assertEquals(false, $opts->ignoreSSL); $this->assertEquals("key", $opts->key); $this->assertEquals("cert", $opts->cert); $this->assertEquals("ca", $opts->ca); $this->assertEquals(3, $opts->maxAttempts); $this->assertEquals("backoffPolicy", $opts->backoffPolicy); $this->assertEquals(10, $opts->backoffPeriod); $this->assertEquals(3000, $opts->readTimeout); $this->assertEquals(3000, $opts->connectTimeout); $this->assertEquals("httpProxy", $opts->httpProxy); $this->assertEquals("httpsProxy", $opts->httpsProxy); $this->assertEquals("noProxy", $opts->noProxy); $this->assertEquals(300, $opts->maxIdleConns); $this->assertEquals(true, $opts->keepAlive); } private function convert($body, &$content) { $class = new \ReflectionClass($body); foreach ($class->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) { $name = $property->getName(); if (!$property->isStatic()) { $value = $property->getValue($body); if ($value instanceof StreamInterface) { continue; } $content->{$name} = $value; } } } } /** * @internal * @coversNothing */ class RequestTest extends Model { /** * @var RequestTestQuery */ public $query; } /** * @internal * @coversNothing */ class RequestShrinkTest extends Model { /** * @var RequestTestShrinkQuery */ public $query; } class RequestTestQuery extends Model { /** * @description test * * @var bool */ public $booleanParamInQuery; /** * @description test * * @var array */ public $mapParamInQuery; protected $_name = [ 'booleanParamInQuery' => 'BooleanParamInQuery', 'mapParamInQuery' => 'MapParamInQuery', ]; public function toMap() { $res = []; if (null !== $this->booleanParamInQuery) { $res['BooleanParamInQuery'] = $this->booleanParamInQuery; } if (null !== $this->mapParamInQuery) { $res['MapParamInQuery'] = $this->mapParamInQuery; } return $res; } } class RequestTestShrinkQuery extends Model { /** * @description test * * @var float */ public $booleanParamInQuery; /** * @description test * * @var string */ public $mapParamInQueryShrink; protected $_name = [ 'booleanParamInQuery' => 'BooleanParamInQuery', 'mapParamInQueryShrink' => 'MapParamInQuery', ]; public function toMap() { $res = []; if (null !== $this->booleanParamInQuery) { $res['BooleanParamInQuery'] = $this->booleanParamInQuery; } if (null !== $this->mapParamInQueryShrink) { $res['MapParamInQuery'] = $this->mapParamInQueryShrink; } return $res; } }