Skip to content

Commit 1546493

Browse files
committed
Merge remote-tracking branch 'origin/main' into codex/recover-fingerprint-value-0930
Signed-off-by: huangruiteng <huangrt01@163.com>
2 parents 2927775 + a9ee074 commit 1546493

2 files changed

Lines changed: 47 additions & 0 deletions

File tree

‎examples/claude-install-optin-smoke.py‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ def _isolated_host_env(home: Path) -> dict[str, str]:
4242
"HOME": str(home),
4343
"PATH": os.environ.get("PATH", os.defpath),
4444
"SHELL": "/bin/zsh",
45+
# Rebuilding the environment must not restore telemetry in synthetic runs.
46+
"LOOPX_USAGE_PING": "0",
4547
"CODEX_HOME": str(home / ".codex"),
4648
"CLAUDE_HOME": str(home / ".claude"),
4749
"OPENCODE_CONFIG_DIR": str(home / ".config" / "opencode"),

‎tests/test_usage_ping.py‎

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@
44
import json
55
import io
66
import os
7+
import runpy
78
import select
89
import socket
910
import subprocess
1011
import sys
1112
import threading
1213
import time
1314
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
15+
from pathlib import Path
1416

1517
import pytest
1618

@@ -176,6 +178,49 @@ def test_real_agent_cli_keeps_json_clean_and_sends_only_after_disclosure(isolate
176178
assert usage_ping.control('status')['consent'] == 'disabled'
177179

178180

181+
@pytest.mark.parametrize('parent_opt_out', [None, '0', '1'])
182+
def test_claude_smoke_environment_disables_real_cli_and_sender(
183+
isolated, collector, monkeypatch, parent_opt_out,
184+
):
185+
endpoint, received, accepted, release = collector
186+
release.set()
187+
monkeypatch.setenv('LOOPX_USAGE_PING_ENDPOINT', endpoint)
188+
# An already acknowledged installation must still obey synthetic isolation.
189+
usage_ping.control('enable')
190+
path = usage_ping.state_path()
191+
before = path.read_bytes()
192+
generation = json.loads(before)['generation']
193+
if parent_opt_out is None:
194+
monkeypatch.delenv('LOOPX_USAGE_PING', raising=False)
195+
else:
196+
monkeypatch.setenv('LOOPX_USAGE_PING', parent_opt_out)
197+
smoke = runpy.run_path(str(Path(__file__).resolve().parents[1] / 'examples/claude-install-optin-smoke.py'))
198+
env = smoke['_isolated_host_env'](isolated / 'home')
199+
# Even a regression may only reach this disposable collector.
200+
env['LOOPX_USAGE_PING_ENDPOINT'] = endpoint
201+
setup = (
202+
'import json,sys; from pathlib import Path; from loopx import usage_ping; '
203+
'usage_ping.DEFAULT_RUNTIME_ROOT=Path(sys.argv[1]); '
204+
)
205+
cli = subprocess.run(
206+
[sys.executable, '-c', setup + 'from loopx.cli_runtime import main; '
207+
'raise SystemExit(main(["version", "--format", "json"]))', str(isolated)],
208+
env=env, capture_output=True, text=True, timeout=30,
209+
)
210+
assert cli.returncode == 0 and json.loads(cli.stdout)['ok'], cli.stderr
211+
assert cli.stderr == ''
212+
sender = subprocess.run(
213+
[sys.executable, '-c', setup +
214+
'print(json.dumps(usage_ping.control("start", generation=sys.argv[2])))',
215+
str(isolated), generation],
216+
env=env, capture_output=True, text=True, timeout=30,
217+
)
218+
assert sender.returncode == 0, sender.stderr
219+
assert json.loads(sender.stdout) == {'sent': False, 'reason': 'blocked'}
220+
assert not accepted.wait(0.3) and received == []
221+
assert path.read_bytes() == before
222+
223+
179224
def test_real_cli_returns_while_http_response_is_held_and_disable_survives(isolated, collector, monkeypatch):
180225
endpoint, received, accepted, release = collector
181226
monkeypatch.setenv('LOOPX_USAGE_PING_ENDPOINT', endpoint)

0 commit comments

Comments
 (0)