# -*- coding: utf-8 -*-
"""只操作本程序创建的临时对象；全部数据为合成样本。"""
import os, sys, json, sqlite3, tempfile, pathlib, subprocess, time, socket, stat
from pathlib import Path
def emit(**kw):
    print(json.dumps(kw, ensure_ascii=False, sort_keys=True))
assert os.name=='posix', '本实验要求Unix pathname socket；Windows不能替代此生命周期'
with tempfile.TemporaryDirectory(prefix='ywebs-next132-b2-sock-') as d:
    p=str(Path(d)/'demo.sock'); a=socket.socket(socket.AF_UNIX); a.bind(p); a.listen(1)
    def bind_fails():
        b=socket.socket(socket.AF_UNIX)
        try: b.bind(p); return False
        except OSError: return True
        finally: b.close()
    active_conflict=bind_fails(); a.close(); remains=Path(p).exists()
    probe=socket.socket(socket.AF_UNIX); probe.settimeout(.5)
    try: probe.connect(p); refused=False
    except OSError: refused=True
    finally: probe.close()
    stale_conflict=bind_fails()
    def own_unlink(q):
        assert Path(q).parent==Path(d)
        if not stat.S_ISSOCK(os.lstat(q).st_mode): raise ValueError('拒绝删除非socket节点')
        os.unlink(q)
    ordinary=Path(d)/'config.txt'; ordinary.write_text('demo')
    try: own_unlink(str(ordinary)); rejected=False
    except ValueError: rejected=True
    own_unlink(p); b=socket.socket(socket.AF_UNIX); b.bind(p); b.close()
    assert active_conflict and remains and refused and stale_conflict and rejected
    emit(active_bind_rejected=active_conflict,closed_path_remains=remains,connect_refused=refused,stale_bind_rejected=stale_conflict,rebound=True,ordinary_file_preserved=ordinary.exists())
