#!@PYTHONEXE@

import os
import sys
import shutil
import re
import subprocess
import time

raw_tmp = True
if os.name == "nt":
    tmp = os.getenv("TEMP")
elif None != os.environ.get("TMPDIR"):
    tmp = os.getenv("TMPDIR")
elif None != os.environ.get("TMP"):
    tmp = os.getenv("TMP")
else:
    raw_tmp = False
    tmp = subprocess.check_output(["gnunet-config", "-f", "-s", "PATHS", "-o", "GNUNET_TMP"],
                                  text=True)

if os.name == 'nt':
    st = './gnunet-statistics.exe'
    arm = 'gnunet-arm.exe'
else:
    st = './gnunet-statistics'
    arm = 'gnunet-arm'

run_st = [st, '-c', 'test_statistics_api_data.conf']
run_arm = [arm, '-c', 'test_statistics_api_data.conf']
debug = os.getenv('DEBUG')
if debug:
    run_arm += [debug.split(' ')]


if raw_tmp:
    cleanup_path = "gnunet/test-gnunet-statistics"
else:
    cleanup_path = "test-gnunet-statistics"


def cleanup():
    shutil.rmtree(os.path.join(tmp, cleanup_path), True)


def sub_run(args, want_stdo=True, want_stde=False, nofail=False):
    if want_stdo:
        stdo = subprocess.PIPE
    else:
        stdo = None
    if want_stde:
        stde = subprocess.PIPE
    else:
        stde = None
    p = subprocess.Popen(args, stdout=stdo, stderr=stde)
    stdo, stde = p.communicate()
    if not nofail:
        if p.returncode != 0:
            sys.exit(p.returncode)
    return (p.returncode, stdo, stde)


def fail(result):
    print(result)
    r_arm(['-e'], want_stdo=False)
    sys.exit(1)


def r_arm(extra_args, **kw):
    rc, stdo, stde = sub_run(run_arm + extra_args, **kw)
    if rc != 0:
        fail("FAIL: error running {}".format(run_arm))
    return (rc, stdo, stde)


def r_st(extra_args, normal=True, **kw):
    rc, stdo, stde = sub_run(run_st + extra_args, **kw)
    if normal:
        if rc != 0:
            fail("FAIL: error running {}".format(run_st))
    else:
        if rc == 0:
            fail("FAIL: expected error while running {}".format(run_st))
    return (rc, stdo, stde)


def restart():
    print("Restarting service...")
    t = r_arm(['-k', 'statistics'])
    time.sleep(1)
    t = r_arm(['-i', 'statistics'])
    time.sleep(1)


cleanup()

print("Preparing: Starting service...")
t = r_arm(['-s'], want_stdo=False)
time.sleep(1)
t = r_arm(['-i', 'statistics'], want_stdo=False)
time.sleep(1)

print("TEST: Bad argument checking...", end='')
r_st(['-x'], normal=False, nofail=True, want_stdo=False, want_stde=True)
print("PASS")

print("TEST: Set value...", end='')
r_st(['-n', 'test', '-s', 'subsystem', b'42'], nofail=True, want_stdo=False)
print("PASS")

print("TEST: Set another value...", end='')
r_st(['-n', 'other', '-s', 'osystem', b'43'], nofail=True, want_stdo=False)
print("PASS")

#print("TEST: Viewing all stats...", end='')
#rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
#if len(stdo.splitlines()) != 2:
#    fail("FAIL: unexpected output:\n{}".format(stdo))
#print("PASS")

print("TEST: Viewing stats by name...", end='')
rc, stdo, stde = r_st(['-n', 'other'], nofail=True, want_stdo=True)
if len([x for x in stdo.splitlines() if re.search(b'43', x)]) != 1:
    fail("FAIL: unexpected output:\n{}".format(stdo))
print("PASS")

print("TEST: Viewing stats by subsystem...", end='')
rc, stdo, stde = r_st(['-s', 'subsystem'], nofail=True, want_stdo=True)
if len([x for x in stdo.splitlines() if re.search(b'42', x)]) != 1:
    fail("FAIL: unexpected output:\n{}".format(stdo))
print("PASS")

print("TEST: Set persistent value...", end='')
rc, stdo, stde = r_st(['-n', 'lasting', '-s', 'subsystem', '40', '-p'],
                      nofail=True,
                      want_stdo=False)
rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
if len([x for x in stdo.splitlines() if re.search(b'40', x)]) != 1:
    fail("FAIL: unexpected output:\n{}".format(stdo))
print("PASS")

restart()

print("TEST: Checking persistence...", end='')
rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
if len([x for x in stdo.splitlines() if re.search(b'40', x)]) != 1:
    fail("FAIL: unexpected output:\n{}".format(stdo))
print("PASS")

print("TEST: Removing persistence...", end='')
rc, stdo, stde = r_st(['-n', 'lasting', '-s', 'subsystem', '40'],
                      nofail=True,
                      want_stdo=False)
rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
if len([x for x in stdo.splitlines() if re.search(b'!', x)]) != 0:
    fail("FAIL: unexpected output:\n{}".format(stdo))
print("PASS")

restart()

print("TEST: Checking removed persistence...", end='')
rc, stdo, stde = r_st([], nofail=True, want_stdo=True)
if len([x for x in stdo.splitlines() if re.search(b'40', x)]) != 0:
    fail("FAIL: unexpected output:\n{}".format(stdo))
print("PASS")

print("Stopping service...")
t = r_arm(['-e'], want_stdo=False)
time.sleep(1)

cleanup()
