fifa17-recon: decouple contract suite from the Python implementation
test_fut_contract.py no longer imports ACCOUNT from fut_account. The expected persona comes from FUT_TEST_PERSONA_ID and the target from FUT_TEST_BASE, so the suite now imports nothing but stdlib and talks to a server at a URL. That is what lets these 380 checks certify ANY implementation of the reversed spec, a future Rust openfut-core included, without replaying the reverse engineering. The original reason for reading ACCOUNT still holds and is preserved in the comment: suite and server must not each hold a private copy of the constant, or the identity-consistency checks would only prove two copies matched. Also adds pileSizeClientData(0x227) behind FUT_PILESIZES (default off). A probe run with 16 uniquely-valued entries did NOT move the MY CLUB counter, so that member is eliminated as its source; the code is kept for the record and flagged off. Docs: OPENFUT_PROJECT_REPORT.md and OPENFUT_HANDOFF.md. The report now separates "built but untested" from "never requested by the client" -- the server log records User-Agent, and splitting real client traffic (ProtoHttp) from this project's own probes shows /season, /tournament, /champion, /match, /clubUser and /user/list are at ZERO client requests. /clubUser (0 client, 93 probe) and /user/list (0 client, 180 probe) are the starkest: work was done on both assuming the client wanted them. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VUT92pz6RWKih9dSr8ZpxW
This commit is contained in:
@@ -20,16 +20,26 @@ Exit 0 = all pass. No pytest dependency (stdlib only).
|
||||
"""
|
||||
import json, os, sys, urllib.error, urllib.request
|
||||
|
||||
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
||||
from fut_account import ACCOUNT # the identity every layer must agree on
|
||||
|
||||
BASE = "http://127.0.0.1:8099"
|
||||
BASE = os.environ.get("FUT_TEST_BASE", "http://127.0.0.1:8099")
|
||||
G = "/ut/game/fifa17"
|
||||
V2 = "/ut/v2/game/fifa17"
|
||||
# No PERSONA_ID literal here any more. This suite and the server MUST read the
|
||||
# same source or the "identity is consistent" checks below would only be proving
|
||||
# that two copies of a constant were copied correctly.
|
||||
PERSONA_ID = ACCOUNT.persona_id
|
||||
|
||||
# IMPLEMENTATION-INDEPENDENT BY CONSTRUCTION.
|
||||
# This suite talks to a server at a URL and imports NOTHING from the server's own
|
||||
# code. That is what lets it verify ANY implementation of the reversed spec -- a
|
||||
# future Rust openfut-core included -- without replaying the reverse engineering.
|
||||
#
|
||||
# It used to do `from fut_account import ACCOUNT` for the persona, which was a
|
||||
# Python import against the Python implementation and quietly made the suite
|
||||
# unable to certify a non-Python server. The expected persona now comes from the
|
||||
# environment, defaulting to the value every layer has agreed on all along.
|
||||
#
|
||||
# The original reason for reading ACCOUNT still stands and is preserved: the suite
|
||||
# and the server must not each hold their own copy of the constant, or the
|
||||
# "identity is consistent" checks would only prove that two copies were copied
|
||||
# correctly. Point FUT_TEST_PERSONA_ID at whatever the server under test is
|
||||
# configured with; the default matches the shipped default.
|
||||
PERSONA_ID = int(os.environ.get("FUT_TEST_PERSONA_ID", "33068179"))
|
||||
|
||||
_fail = []
|
||||
_pass = 0
|
||||
|
||||
Reference in New Issue
Block a user