#!/usr/bin/python
#-- coding:utf8 --
import os
import sys

def run_cmd(args):
    cmd = args[0]
    for i in range(1, len(args)):
        cmd += ' ' + args[i]
    stdout = os.popen(cmd).read()
    return stdout

gWrong = []
gRight = 0

serial = ''
# serial='-s 30.x.x.x:x' # Specify test phone ip address

def test(model_root_dir, parameters):
    global gRight
    print("all parameters: ", parameters)
    root_dir = model_root_dir + '/TestResource'
    print('root: ', root_dir)
    for name in os.listdir(root_dir):
        if name == '.DS_Store':
            continue
        modelName = os.path.join(root_dir, name, 'temp.bin')
        inputName = os.path.join(root_dir, name, 'input_0.txt')
        outputName = os.path.join(root_dir, name, 'output.txt')
        print(modelName)
        run_cmd(['adb', serial, 'push', modelName, '/data/local/tmp/MNN/temp.bin'])
        run_cmd(['adb', serial, 'push', inputName, '/data/local/tmp/MNN/input_0.txt'])
        run_cmd(['adb', serial, 'push', outputName, '/data/local/tmp/MNN/output.txt'])
        message = run_cmd(['adb', serial, 'shell', '\"cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH && ./testModel.out temp.bin input_0.txt output.txt %s\"' %(parameters)])
        print(str(message))
        if (message.find('Correct') < 0):
            gWrong.append(modelName)
        else:
            gRight += 1
    root_dir = model_root_dir + '/OpTestResource'
    print('root: ', root_dir)
    for name in os.listdir(root_dir):
        if name == '.DS_Store':
            continue
        modelName = os.path.join(root_dir, name, 'temp.bin')
        inputName = os.path.join(root_dir, name, 'input_0.txt')
        outputName = os.path.join(root_dir, name, 'output_0.txt')
        print(modelName)
        run_cmd(['adb', serial, 'push', modelName, '/data/local/tmp/MNN/temp.bin'])
        run_cmd(['adb', serial, 'push', inputName, '/data/local/tmp/MNN/input_0.txt'])
        run_cmd(['adb', serial, 'push', outputName, '/data/local/tmp/MNN/output_0.txt'])
        message = run_cmd(['adb', serial, 'shell', '\"cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH && ./testModel.out temp.bin input_0.txt output_0.txt %s\"' % (parameters)])
        print(message)
        if (message.find('Correct') == -1):
            gWrong.append(modelName)
        else:
            gRight += 1
    # total model test
    root_dir = os.path.join(model_root_dir, 'TestWithDescribe')
    print('Model Root Path: ' + root_dir + '\n')
    for name in os.listdir(root_dir):
        if name == '.DS_Store':
            continue
        modelDir = os.path.join(root_dir, name)
        modelName = os.path.join(modelDir, 'temp.bin')
        if not os.path.exists(modelName):
            continue
        print(run_cmd(['adb', serial, 'push', modelDir, '/data/local/tmp/MNN/']))
        print(modelDir)
        print(">>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Running...")
        message = run_cmd(['adb', serial, 'shell', '\"cd /data/local/tmp/MNN&&export LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH && ./testModelWithDescrisbe.out %s/temp.bin %s/config.txt %s\"' %(name, name, parameters)])
        run_cmd(['adb', serial, 'shell', 'rm -rf /data/local/tmp/MNN/%s'%(name)])
        if (message.find('Correct') == -1):
            gWrong.append(modelDir)
        else:
            gRight += 1
        print(message)
    print('Wrong: ', len(gWrong))
    for w in gWrong:
        print(w)

def android_test(root_dir, forwardType, thredhold, bits):
    test(root_dir, str(forwardType) + str(thredhold))
    print("TEST_NAME_MODEL%d: 模型测试%d\nTEST_CASE_AMOUNT_MODEL%d: {\"blocked\":0,\"failed\":%d,\"passed\":%d,\"skipped\":0}\n"%(bits, bits, bits, len(gWrong), gRight))

if __name__ == '__main__':
    root_dir = sys.argv[1]
    forwardType = " 0 "
    if len(sys.argv) > 2:
        forwardType = ' ' + sys.argv[2] + ' '
    thredhold = ' 0.001 '
    if len(sys.argv) > 3:
        thredhold = ' ' + sys.argv[3] + ' '
    precision = ' 1 '
    if len(sys.argv) > 4:
        precision = ' ' + sys.argv[4] + ' '
    input_dims = ''
    if len(sys.argv) > 5:
        input_dims = ' ' + sys.argv[5] + ' '

    test(root_dir, forwardType + thredhold + precision + input_dims)


