diff --git a/.github/workflows/php.yml b/.github/workflows/php.yml index 21ea2503..a2bcd4fe 100644 --- a/.github/workflows/php.yml +++ b/.github/workflows/php.yml @@ -64,6 +64,37 @@ jobs: composer global require php-coveralls/php-coveralls php-coveralls --coverage_clover=./build/logs/clover.xml -v + latest_dependency_tests: + name: Latest Deps (PHP ${{ matrix.php-versions }}) + needs: [ linting ] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + php-versions: [ '8.1', '8.2' ] + steps: + - name: Checkout code + uses: actions/checkout@v3 + - name: Set up PHP v${{ matrix.php-versions }} + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + - name: Install latest supported dependencies + run: composer update justinrainbow/json-schema lastguest/murmurhash --with-dependencies + - name: Verify latest majors resolved + run: | + php -r ' + require "vendor/autoload.php"; + $jsonSchema = Composer\InstalledVersions::getVersion("justinrainbow/json-schema"); + $murmur = Composer\InstalledVersions::getVersion("lastguest/murmurhash"); + echo "json-schema: $jsonSchema\nmurmurhash: $murmur\n"; + exit((version_compare($jsonSchema, "6.0.0", ">=") && version_compare($murmur, "2.1.0", ">=")) ? 0 : 1); + ' + - name: Run tests + run: | + mkdir -p ./build/logs + ./vendor/bin/phpunit + integration_tests: name: Integration Tests needs: [ unit_tests ] diff --git a/composer.json b/composer.json index 2a28d4cd..7789d037 100644 --- a/composer.json +++ b/composer.json @@ -17,8 +17,8 @@ "require": { "php": ">=8.1", "guzzlehttp/guzzle": ">=6.2", - "justinrainbow/json-schema": "^1.6 || ^2.0 || ^4.0 || ^5.0", - "lastguest/murmurhash": "^1.3.0", + "justinrainbow/json-schema": "^1.6 || ^2.0 || ^4.0 || ^5.0 || ^6.0", + "lastguest/murmurhash": "^1.3.0 || ^2.1", "monolog/monolog": ">=1.21" }, "require-dev": { diff --git a/composer.lock b/composer.lock index 50ece972..1b2c5812 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "82b1237943c87584a7fd69a882570e14", + "content-hash": "99b7de4d0fca1025e6148d0d08fd66fc", "packages": [ { "name": "guzzlehttp/guzzle", @@ -336,12 +336,12 @@ "version": "5.2.12", "source": { "type": "git", - "url": "https://github.com/justinrainbow/json-schema.git", + "url": "https://github.com/jsonrainbow/json-schema.git", "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/justinrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", + "url": "https://api.github.com/repos/jsonrainbow/json-schema/zipball/ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "reference": "ad87d5a5ca981228e0e205c2bc7dfb8e24559b60", "shasum": "" }, @@ -2808,12 +2808,12 @@ "version": "3.7.0", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", "reference": "a2cd51b45bcaef9c1f2a4bda48f2dd2fa2b95563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/a2cd51b45bcaef9c1f2a4bda48f2dd2fa2b95563", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/a2cd51b45bcaef9c1f2a4bda48f2dd2fa2b95563", "reference": "a2cd51b45bcaef9c1f2a4bda48f2dd2fa2b95563", "shasum": "" }, @@ -3785,12 +3785,12 @@ ], "aliases": [], "minimum-stability": "stable", - "stability-flags": [], + "stability-flags": {}, "prefer-stable": false, "prefer-lowest": false, "platform": { "php": ">=8.1" }, - "platform-dev": [], - "plugin-api-version": "2.3.0" + "platform-dev": {}, + "plugin-api-version": "2.9.0" } diff --git a/src/Optimizely/Bucketer.php b/src/Optimizely/Bucketer.php index 5891649a..908b083c 100644 --- a/src/Optimizely/Bucketer.php +++ b/src/Optimizely/Bucketer.php @@ -72,7 +72,11 @@ public function __construct(LoggerInterface $logger) */ private function generateHashCode($bucketingKey) { - return murmurhash3_int($bucketingKey, Bucketer::$HASH_SEED) & Bucketer::$UNSIGNED_MAX_32_BIT_VALUE; + // murmurhash v2 replaced the global function with a static class method + $hash = function_exists('murmurhash3_int') + ? murmurhash3_int($bucketingKey, Bucketer::$HASH_SEED) + : \lastguest\Murmur::hash3_int($bucketingKey, Bucketer::$HASH_SEED); + return $hash & Bucketer::$UNSIGNED_MAX_32_BIT_VALUE; } /** diff --git a/tests/BucketerTest.php b/tests/BucketerTest.php index 4cbcf8a4..6125d5aa 100644 --- a/tests/BucketerTest.php +++ b/tests/BucketerTest.php @@ -88,6 +88,15 @@ public function testGenerateBucketValue() ) ) ); + // Edge cases: empty string and multibyte UTF-8 + $this->assertSame( + 3175, + $generateBucketValueMethod->invoke(new Bucketer($this->loggerMock), '') + ); + $this->assertSame( + 8308, + $generateBucketValueMethod->invoke(new Bucketer($this->loggerMock), '日本語テスト1886780721') + ); } public function testBucketValidExperimentNotInGroup()