"""Model/GPU-free installed Receiver contract probe; run each value in a fresh process."""
import os
import sys
import time
import json
import threading

reader, writer = os.pipe()
os.dup2(reader, 0)
os.close(reader)
from pyservicemaker import Pipeline, BufferRetriever, Receiver

value = int(sys.argv[1])
assert value in (0, 1)
calls = []
messages = []

class Consumer(BufferRetriever):
    def consume(self, buffer):
        calls.append(time.monotonic())
        return value

p = Pipeline('receiver-return')
p.add('fakesrc', 'source', {'num-buffers': 3, 'sizetype': 2, 'sizemax': 16})
p.add('appsink', 'sink', {'emit-signals': True, 'sync': False, 'async': False})
p.link('source', 'sink')
p.attach('sink', Receiver('receiver', Consumer()), tips='new-sample')
start = time.monotonic()
p.start(lambda msg: messages.append(type(msg).__name__))
worker = threading.Thread(target=p.wait, daemon=True)
worker.start()
worker.join(8)
elapsed = time.monotonic() - start
out = dict(return_value=value, calls=len(calls), elapsed_s=elapsed, wait_alive=worker.is_alive(),
           eos='EOSMessage' in messages, gaps_s=[b-a for a,b in zip(calls,calls[1:])])
print(json.dumps(out), flush=True)
os.close(writer)
os._exit(0 if len(calls)==3 and not worker.is_alive() and out['eos'] else 2)
