#!/usr/bin/python
#
# Run a test on the ARM version of acc.

import unittest
import subprocess
import os
import sys

def compile(args):
    proc = subprocess.Popen(["acc"] + args, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
    result = proc.communicate()
    return result

def runCmd(args):
    proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
    result = proc.communicate()
    return result[0].strip()

def uname():
    return runCmd(["uname"])

def unameM():
    return runCmd(["uname", "-m"])

def which(item):
    return runCmd(["which", item])

def adb(args):
    return runCmd(["adb"] + args)

def setupArm(file):
    print "Setting up arm"
    adb(["remount"])
    adb(["shell", "rm", "/system/bin/acc"])
    adb(["shell", "mkdir", "/system/bin/accdata"])
    adb(["shell", "mkdir", "/system/bin/accdata/data"])

    remoteFileName = os.path.join("/system/bin/accdata", file)
    adb(["push", file, remoteFileName])

    # Copy over compiler
    adb(["sync"])
    return remoteFileName

def compileArm(args):
    remoteArgs = []
    fileName = ""
    for arg in sys.argv[1:]:
        if arg.startswith('-'):
            remoteArgs.append(arg)
        else:
            fileName = arg

    remoteFileName = setupArm(fileName)
    remoteArgs.append(remoteFileName)
    remoteCmdLine = ["adb", "shell", "/system/bin/acc"] + remoteArgs
    proc = subprocess.Popen(remoteCmdLine, stdout=subprocess.PIPE)
    result = proc.communicate()
    return result[0].replace("\r","")


def main():
    print compileArm(sys.argv[1:])

if __name__ == '__main__':
    main()


