from __future__ import print_function
import subprocess
import time
import sys

def logrun(cmd, file, timeout):
  sys.stderr.write("\n\n" + ("=" * 80) + "\n")
  sys.stderr.write("RUNNING: ")
  sys.stderr.write(" ".join(cmd) + "\n\n")
  sys.stderr.flush()
  with open(file, 'w') as outf:
    # We need to set log_level so we see ALL messages, for testing
    p = subprocess.Popen(cmd + ["--log_level", "0"], stdout=outf, stderr=outf)
  start = time.time()
  oldContents = ""
  lastOutput = time.time()
  while (p.poll() is None) and ((time.time() - start) < timeout):
    if (time.time() - lastOutput) > 300:
      sys.stderr.write(".")
      sys.stderr.flush()
      lastOutput = time.time()
    with open(file, 'r') as inf:
      contents = inf.read()
    if len(contents) > len(oldContents):
      sys.stderr.write(contents[len(oldContents):])
      sys.stderr.flush()
      oldContents = contents
      lastOutput = time.time()
    time.sleep(0.05)
  totalTime = time.time() - start
  sys.stderr.write("\n")
  rv = (p.returncode, contents)
  if p.poll() is None:
    rv = ("TIMEOUT", contents)
  if "Traceback (most recent call last)" in contents:
    rv = ("EXCEPTION RAISED", contents)
  if "internal error" in contents:
    rv = ("INTERNAL ERROR", contents)
  sys.stderr.write("\nDONE\n\n")
  sys.stderr.write("TOTAL EXECUTION TIME: " + str(totalTime) + "\n")
  sys.stderr.write("RETURN VALUE: " + str(p.returncode) + "\n")
  sys.stderr.write("RETURNING AS RESULT: " + str(rv[0]) + "\n")
  sys.stderr.write("=" * 80 + "\n")

  return rv



