563 lines
16 KiB
JSON
563 lines
16 KiB
JSON
{
|
|
"recorded_at_utc": "2026-10-27T02:52:00.131691+00:00",
|
|
"reference": {
|
|
"upstream_commit": "3516c776a1fcbd83d234efc007e3a49807d6ed91",
|
|
"php": "8.4.27",
|
|
"laravel": "13.29.0",
|
|
"composer_lock_sha256": "b1376d21c517d700bc48b196e9dc2b30257caf25774e315ff9d1bf8a2411241a",
|
|
"database": "fresh disposable SQLite, all 42 migrations completed; independent temporary application storage",
|
|
"production_dependencies": 110,
|
|
"required_extensions_loaded": true,
|
|
"composer_dependencies_total_with_dev": 153,
|
|
"materialized_sqlite_ddl": "sqlite-reference-schema.sql",
|
|
"tables": 22,
|
|
"explicit_indexes": 34
|
|
},
|
|
"candidate": {
|
|
"artifact": "preexisting target/release/twofauth-rs, predates current source changes",
|
|
"sha256": "e3d2f4435197bad611e2150c128b0edfcf97ce90d61156a430e948f1461438ba"
|
|
},
|
|
"limits": [
|
|
"This is a limited differential result, not replacement certification.",
|
|
"Random CSRF output and cookie protocols are not normalized.",
|
|
"Only synthetic fixture data was used.",
|
|
"Body IDs ignored only for account create/read as specified in cases.stateful.json.",
|
|
"State effects checked through API readback, not SQL table comparison.",
|
|
"New source changes must be rebuilt and compared again."
|
|
],
|
|
"results": {
|
|
"default": {
|
|
"exit_code": 1,
|
|
"cases": [
|
|
{
|
|
"case": 0,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": false,
|
|
"body": false
|
|
}
|
|
},
|
|
{
|
|
"case": 1,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false
|
|
}
|
|
},
|
|
{
|
|
"case": 2,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": false,
|
|
"content_type": true,
|
|
"body": false
|
|
}
|
|
},
|
|
{
|
|
"case": 3,
|
|
"result": "different",
|
|
"reference_status": 404,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"stateful": {
|
|
"exit_code": 1,
|
|
"cases": [
|
|
{
|
|
"case": 0,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": false,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 1,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 2,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 3,
|
|
"result": "equal",
|
|
"reference_status": 201,
|
|
"candidate_status": 201,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 4,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 5,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 6,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 7,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 8,
|
|
"result": "equal",
|
|
"reference_status": 204,
|
|
"candidate_status": 204,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 9,
|
|
"result": "different",
|
|
"reference_status": 404,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 10,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 11,
|
|
"result": "different",
|
|
"reference_status": 401,
|
|
"candidate_status": 401,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
}
|
|
]
|
|
},
|
|
"extended": {
|
|
"exit_code": 1,
|
|
"cases": [
|
|
{
|
|
"case": 0,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": false,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 1,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 2,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 3,
|
|
"result": "equal",
|
|
"reference_status": 201,
|
|
"candidate_status": 201,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 4,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 5,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 6,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 7,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 8,
|
|
"result": "different",
|
|
"reference_status": 201,
|
|
"candidate_status": 201,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 9,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 10,
|
|
"result": "equal",
|
|
"reference_status": 204,
|
|
"candidate_status": 204,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 11,
|
|
"result": "different",
|
|
"reference_status": 403,
|
|
"candidate_status": 403,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 12,
|
|
"result": "different",
|
|
"reference_status": 403,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": false,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": false
|
|
}
|
|
},
|
|
{
|
|
"case": 13,
|
|
"result": "different",
|
|
"reference_status": 403,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": false,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": false
|
|
}
|
|
},
|
|
{
|
|
"case": 14,
|
|
"result": "different",
|
|
"reference_status": 200,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": false,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": false
|
|
}
|
|
},
|
|
{
|
|
"case": 15,
|
|
"result": "different",
|
|
"reference_status": 422,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": false,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": false
|
|
}
|
|
},
|
|
{
|
|
"case": 16,
|
|
"result": "different",
|
|
"reference_status": 422,
|
|
"candidate_status": 405,
|
|
"checks": {
|
|
"status": false,
|
|
"content_type": false,
|
|
"body": false,
|
|
"expected_status": false
|
|
}
|
|
},
|
|
{
|
|
"case": 17,
|
|
"result": "different",
|
|
"reference_status": 422,
|
|
"candidate_status": 422,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 18,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 19,
|
|
"result": "equal",
|
|
"reference_status": 204,
|
|
"candidate_status": 204,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 20,
|
|
"result": "different",
|
|
"reference_status": 404,
|
|
"candidate_status": 404,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 21,
|
|
"result": "equal",
|
|
"reference_status": 200,
|
|
"candidate_status": 200,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": true,
|
|
"expected_status": true
|
|
}
|
|
},
|
|
{
|
|
"case": 22,
|
|
"result": "different",
|
|
"reference_status": 401,
|
|
"candidate_status": 401,
|
|
"checks": {
|
|
"status": true,
|
|
"content_type": true,
|
|
"body": false,
|
|
"expected_status": true
|
|
}
|
|
}
|
|
]
|
|
}
|
|
},
|
|
"reproduction": "PHPRC=<php.ini path> python tools/run_reference.py --php <php executable or wrapper> --source ../upstream --candidate-binary target/release/twofauth-rs --output <result.json>",
|
|
"upstream_suite": {
|
|
"command": "PHPRC=<php.ini> PATH=<php runtime>:$PATH php artisan config:clear; php vendor/bin/phpunit",
|
|
"tests": 1518,
|
|
"assertions": 4573,
|
|
"errors": 5,
|
|
"failures": 2,
|
|
"failure_details": [
|
|
{
|
|
"test": "Tests.Feature.Models.TwoFAccountModelTest::test_fill_with_custom_totp_uri_returns_correct_value",
|
|
"kind": "failure",
|
|
"message": "Tests\\Feature\\Models\\TwoFAccountModelTest::test_fill_with_custom_totp_uri_returns_correct_value"
|
|
},
|
|
{
|
|
"test": "Tests.Feature.Models.TwoFAccountModelTest::test_fill_with_custom_hotp_uri_returns_correct_value",
|
|
"kind": "failure",
|
|
"message": "Tests\\Feature\\Models\\TwoFAccountModelTest::test_fill_with_custom_hotp_uri_returns_correct_value"
|
|
},
|
|
{
|
|
"test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"PNG\"",
|
|
"kind": "error",
|
|
"message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"PNG\""
|
|
},
|
|
{
|
|
"test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"JPEG\"",
|
|
"kind": "error",
|
|
"message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"JPEG\""
|
|
},
|
|
{
|
|
"test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"WEBP\"",
|
|
"kind": "error",
|
|
"message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"WEBP\""
|
|
},
|
|
{
|
|
"test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"BPM\"",
|
|
"kind": "error",
|
|
"message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"BPM\""
|
|
},
|
|
{
|
|
"test": "Tests.Feature.Services.IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"SVG\"",
|
|
"kind": "error",
|
|
"message": "Tests\\Feature\\Services\\IconServiceTest::test_build_from_remote_image_stores_icon_and_returns_name with data set \"SVG\""
|
|
}
|
|
],
|
|
"limitations": [
|
|
"All seven remaining failing cases depend on real DNS resolution before mocked HTTP. dns_get_record returned false with a temporary server error for the image hosts.",
|
|
"No upstream source was patched to suppress those failures."
|
|
]
|
|
},
|
|
"crypto": {
|
|
"php_openssl": "6/6 fixtures passed",
|
|
"laravel_encrypter": "Laravel 13.29.0 Encrypter::decryptString accepted 6/6 independent Python envelopes"
|
|
}
|
|
}
|