mirror of
https://github.com/awslabs/aws-crt-php.git
synced 2026-08-18 01:57:13 +00:00
Removed FFI support (#45)
* Removed FFI support * run_tests and ci-test.sh should never have differed. Fixing now * run_tests can now update composer
This commit is contained in:
+3
-3
@@ -12,8 +12,8 @@ CMAKE_BUILD = $(CMAKE) --build
|
|||||||
CMAKE_BUILD_TYPE ?= RelWithDebInfo
|
CMAKE_BUILD_TYPE ?= RelWithDebInfo
|
||||||
CMAKE_TARGET = --config $(CMAKE_BUILD_TYPE) --target install
|
CMAKE_TARGET = --config $(CMAKE_BUILD_TYPE) --target install
|
||||||
|
|
||||||
all: extension ffi
|
all: extension
|
||||||
.PHONY: all extension ffi
|
.PHONY: all extension
|
||||||
|
|
||||||
# configure for static aws-crt-ffi.a
|
# configure for static aws-crt-ffi.a
|
||||||
build/aws-crt-ffi-static/CMakeCache.txt:
|
build/aws-crt-ffi-static/CMakeCache.txt:
|
||||||
@@ -51,7 +51,7 @@ vendor/bin/phpunit:
|
|||||||
composer update
|
composer update
|
||||||
|
|
||||||
test-extension: vendor/bin/phpunit extension
|
test-extension: vendor/bin/phpunit extension
|
||||||
AWS_CRT_PHP_EXTENSION=1 composer run test-extension
|
composer run test-extension
|
||||||
|
|
||||||
# Use PHPUnit to run tests
|
# Use PHPUnit to run tests
|
||||||
test: test-extension
|
test: test-extension
|
||||||
|
|||||||
+1
-1
@@ -32,6 +32,6 @@
|
|||||||
"NO_INTERACTION": "1"
|
"NO_INTERACTION": "1"
|
||||||
},
|
},
|
||||||
"test_steps": [
|
"test_steps": [
|
||||||
["./ci-test.sh"]
|
["./run_tests"]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
-11
@@ -1,11 +0,0 @@
|
|||||||
#!/usr/bin/env bash
|
|
||||||
|
|
||||||
set -ex
|
|
||||||
|
|
||||||
HAS_FFI=$(php -m | grep FFI | wc -l | xargs)
|
|
||||||
|
|
||||||
make test-extension
|
|
||||||
|
|
||||||
if [[ $HAS_FFI -gt 0 ]]; then
|
|
||||||
make test-ffi
|
|
||||||
fi
|
|
||||||
@@ -31,7 +31,6 @@
|
|||||||
"scripts": {
|
"scripts": {
|
||||||
"test": "./run_tests",
|
"test": "./run_tests",
|
||||||
"test-extension": "@test",
|
"test-extension": "@test",
|
||||||
"test-ffi": "@php vendor/bin/phpunit tests",
|
|
||||||
"test-win": "run_tests"
|
"test-win": "run_tests"
|
||||||
},
|
},
|
||||||
"license": "Apache-2.0"
|
"license": "Apache-2.0"
|
||||||
|
|||||||
@@ -2,4 +2,13 @@
|
|||||||
|
|
||||||
set -ex
|
set -ex
|
||||||
|
|
||||||
|
if [ -z $PHP_BINARY ]; then
|
||||||
|
PHP_BINARY=$(which php)
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ ! -d vendor ]; then
|
||||||
|
composer update
|
||||||
|
fi
|
||||||
|
|
||||||
$PHP_BINARY -c php.ini vendor/bin/phpunit tests --debug
|
$PHP_BINARY -c php.ini vendor/bin/phpunit tests --debug
|
||||||
|
|
||||||
|
|||||||
+3
-37
@@ -22,30 +22,10 @@ final class CRT {
|
|||||||
|
|
||||||
function __construct() {
|
function __construct() {
|
||||||
if (is_null(self::$impl)) {
|
if (is_null(self::$impl)) {
|
||||||
// Figure out what backends are/should be available
|
|
||||||
$backends = ['Extension'];
|
|
||||||
if (extension_loaded('ffi')) {
|
|
||||||
$backends = ['Extension', 'FFI'];
|
|
||||||
if (getenv('AWS_CRT_PHP_EXTENSION')) {
|
|
||||||
$backends = ['Extension'];
|
|
||||||
} else if (getenv('AWS_CRT_PHP_FFI')) {
|
|
||||||
$backends = ['FFI'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to load each backend, give up if none succeed
|
|
||||||
$exceptions = [];
|
|
||||||
foreach ($backends as $backend) {
|
|
||||||
try {
|
try {
|
||||||
$backend = 'AWS\\CRT\\Internal\\' . $backend;
|
self::$impl = new Extension();
|
||||||
self::$impl = new $backend();
|
|
||||||
break;
|
|
||||||
} catch (RuntimeException $rex) {
|
} catch (RuntimeException $rex) {
|
||||||
array_push($exceptions, $rex);
|
throw new RuntimeException("Unable to initialize AWS CRT via awscrt extension: \n$rex", -1);
|
||||||
}
|
|
||||||
}
|
|
||||||
if (is_null(self::$impl)) {
|
|
||||||
throw new RuntimeException('Unable to initialize AWS CRT via ' . join(', ', $backends) . ": \n" . join("\n", $exceptions), -1);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
++self::$refcount;
|
++self::$refcount;
|
||||||
@@ -58,7 +38,7 @@ final class CRT {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return bool whether or not the CRT is currently loaded with an active backend
|
* @return bool whether or not the CRT is currently loaded
|
||||||
*/
|
*/
|
||||||
public static function isLoaded() {
|
public static function isLoaded() {
|
||||||
return !is_null(self::$impl);
|
return !is_null(self::$impl);
|
||||||
@@ -76,20 +56,6 @@ final class CRT {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool true if using PHP FFI (PHP 7.4+)
|
|
||||||
*/
|
|
||||||
public static function isFFI() {
|
|
||||||
return self::isLoaded() && strstr(get_class(self::$impl), 'FFI');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return bool true if using PHP Extension awscrt
|
|
||||||
*/
|
|
||||||
public static function isExtension() {
|
|
||||||
return self::isLoaded() && strstr(get_class(self::$impl), 'Extension');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return integer last error code reported within the CRT
|
* @return integer last error code reported within the CRT
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,82 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
namespace AWS\CRT\Internal;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use RuntimeException;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @internal
|
|
||||||
* Forwards calls on to libaws-crt-ffi via FFI
|
|
||||||
*/
|
|
||||||
final class FFI {
|
|
||||||
private static $ffi = null;
|
|
||||||
private static $refcount = 0;
|
|
||||||
|
|
||||||
function __construct() {
|
|
||||||
if (is_null(self::$ffi)) {
|
|
||||||
try {
|
|
||||||
$shlib_ext = 'so';
|
|
||||||
$uname_s = php_uname('s');
|
|
||||||
if ($uname_s == 'Darwin') {
|
|
||||||
$shlib_ext = 'dylib';
|
|
||||||
} else if ($uname_s == 'WINNT') {
|
|
||||||
$shlib_ext = 'dll';
|
|
||||||
}
|
|
||||||
self::$ffi = \FFI::cdef(
|
|
||||||
file_get_contents(__DIR__ . "/../../../api.h"),
|
|
||||||
__DIR__ . "/../../../libaws-crt-ffi." . $shlib_ext);
|
|
||||||
self::init();
|
|
||||||
} catch (Exception $e) {
|
|
||||||
throw new RuntimeException('Exception while initializing CRT via FFI', 0, $e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
++self::$refcount;
|
|
||||||
}
|
|
||||||
|
|
||||||
function __destruct() {
|
|
||||||
if (--self::$refcount == 0) {
|
|
||||||
self::clean_up();
|
|
||||||
self::$ffi = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Forwards any call made on this object to the FFI function of the
|
|
||||||
* same name with the supplied arguments. Argument type hinting and checking
|
|
||||||
* occurs at the CRT wrapper.
|
|
||||||
*/
|
|
||||||
function __call(string $name, $args) {
|
|
||||||
// Expand strings to (string, length)
|
|
||||||
$ffi_args =[];
|
|
||||||
foreach ($args as $arg) {
|
|
||||||
if (is_string($arg)) {
|
|
||||||
$len = strlen($arg);
|
|
||||||
if ($len > 0) {
|
|
||||||
$uint8_t = \FFI::type('uint8_t');
|
|
||||||
$uint8_array = \FFI::arrayType($uint8_t, [$len]);
|
|
||||||
$buf = \FFI::new($uint8_array);
|
|
||||||
\FFI::memcpy($buf, $arg, $len);
|
|
||||||
$ffi_args [] = $buf;
|
|
||||||
$ffi_args [] = $len;
|
|
||||||
} else {
|
|
||||||
$ffi_args [] = null;
|
|
||||||
$ffi_args [] = 0;
|
|
||||||
}
|
|
||||||
} else if (is_resource($arg)) {
|
|
||||||
throw new RuntimeException("Resource types are not supported for FFI");
|
|
||||||
} else {
|
|
||||||
$ffi_args []= $arg;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return call_user_func_array([self::$ffi, $name], $ffi_args);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static function init() {
|
|
||||||
return self::$ffi->aws_crt_init();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static function clean_up() {
|
|
||||||
return self::$ffi->aws_crt_clean_up();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -10,7 +10,6 @@ require_once('common.inc');
|
|||||||
class LogTest extends CrtTestCase {
|
class LogTest extends CrtTestCase {
|
||||||
|
|
||||||
public function testLogToStream() {
|
public function testLogToStream() {
|
||||||
$this->skipFFI();
|
|
||||||
$log_stream = fopen("php://memory", "r+");
|
$log_stream = fopen("php://memory", "r+");
|
||||||
$this->assertNotNull($log_stream);
|
$this->assertNotNull($log_stream);
|
||||||
Log::toStream($log_stream);
|
Log::toStream($log_stream);
|
||||||
|
|||||||
@@ -39,7 +39,6 @@ final class SigningTest extends CrtTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testSignableFromChunkLifetime() {
|
public function testSignableFromChunkLifetime() {
|
||||||
$this->skipFFI();
|
|
||||||
$chunk = "THIS IS A TEST CHUNK IT CONTAINS MULTITUDES";
|
$chunk = "THIS IS A TEST CHUNK IT CONTAINS MULTITUDES";
|
||||||
$stream = fopen("php://memory", 'r+');
|
$stream = fopen("php://memory", 'r+');
|
||||||
fputs($stream, $chunk);
|
fputs($stream, $chunk);
|
||||||
@@ -66,8 +65,6 @@ final class SigningTest extends CrtTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testShouldSignHeader() {
|
public function testShouldSignHeader() {
|
||||||
$this->skipFFI();
|
|
||||||
|
|
||||||
$credentials_provider = new StaticCredentialsProvider([
|
$credentials_provider = new StaticCredentialsProvider([
|
||||||
'access_key_id' => self::SIGV4TEST_ACCESS_KEY_ID,
|
'access_key_id' => self::SIGV4TEST_ACCESS_KEY_ID,
|
||||||
'secret_access_key' => self::SIGV4TEST_SECRET_ACCESS_KEY,
|
'secret_access_key' => self::SIGV4TEST_SECRET_ACCESS_KEY,
|
||||||
@@ -107,8 +104,6 @@ final class SigningTest extends CrtTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testSigv4HeaderSigning() {
|
public function testSigv4HeaderSigning() {
|
||||||
$this->skipFFI();
|
|
||||||
|
|
||||||
$credentials_provider = new StaticCredentialsProvider([
|
$credentials_provider = new StaticCredentialsProvider([
|
||||||
'access_key_id' => self::SIGV4TEST_ACCESS_KEY_ID,
|
'access_key_id' => self::SIGV4TEST_ACCESS_KEY_ID,
|
||||||
'secret_access_key' => self::SIGV4TEST_SECRET_ACCESS_KEY,
|
'secret_access_key' => self::SIGV4TEST_SECRET_ACCESS_KEY,
|
||||||
@@ -143,8 +138,6 @@ final class SigningTest extends CrtTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testSigV4aHeaderSigning() {
|
public function testSigV4aHeaderSigning() {
|
||||||
$this->skipFFI();
|
|
||||||
|
|
||||||
$credentials_provider = new StaticCredentialsProvider([
|
$credentials_provider = new StaticCredentialsProvider([
|
||||||
'access_key_id' => self::SIGV4TEST_ACCESS_KEY_ID,
|
'access_key_id' => self::SIGV4TEST_ACCESS_KEY_ID,
|
||||||
'secret_access_key' => self::SIGV4TEST_SECRET_ACCESS_KEY,
|
'secret_access_key' => self::SIGV4TEST_SECRET_ACCESS_KEY,
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ final class InputStreamTest extends CrtTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public function testMemoryStream() {
|
public function testMemoryStream() {
|
||||||
$this->skipFFI();
|
|
||||||
$mem_stream = $this->getMemoryStream();
|
$mem_stream = $this->getMemoryStream();
|
||||||
$stream = new InputStream($mem_stream);
|
$stream = new InputStream($mem_stream);
|
||||||
$this->assertNotNull($stream, "Failed to create InputStream from PHP memory stream");
|
$this->assertNotNull($stream, "Failed to create InputStream from PHP memory stream");
|
||||||
|
|||||||
@@ -31,10 +31,4 @@ abstract class CrtTestCase extends PHPUnit_Framework_TestCase {
|
|||||||
$this->setExpectedException($arguments[0]);
|
$this->setExpectedException($arguments[0]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function skipFFI() {
|
|
||||||
if (CRT::isFFI()) {
|
|
||||||
$this->markTestSkipped();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user