#!/usr/bin/python
import os
import sys
import subprocess
import socket
import time

HOST_MAC = 'localhost'
HOST_ANDROID = ''
HOST_IOS = '10.10.30.61'
PORT = 5678

suc_build_mac = 0
suc_build_android = 0

TYPE_MAC = 0
TYPE_ANDROID = 1
TYPE_IOS = 2

sleep_time = 1.5

#
def getADBDeviceIP():
	output = os.popen("adb shell netcfg")
	configs = output.read().split('\r\n')
	for l in configs:
		items = l.split()
		if(items[1] == 'UP'):
			if(items[2] != '127.0.0.1'):
				return items[2]

def autotest(type):
	soc = socket.socket( socket.AF_INET, socket.SOCK_STREAM )
	if type == TYPE_MAC:
		soc.connect((HOST_MAC, PORT))
	if type == TYPE_ANDROID:
		HOST_ANDROID = getADBDeviceIP()
		soc.connect((HOST_ANDROID, PORT))
	if type == TYPE_IOS:
		soc.connect((HOST_IOS, PORT))
	time.sleep(1)
	print 'autotest run:'
	soc.send('autotest run\r\n')

	while True:
		data = soc.recv(1024)
		print data
		if data == 'TestEnd':
			lastTestInfo = True
			break
		global lastTestInfo
		if len(data) > len('\n') :
			lastTestInfo = data
		if not data: break
	
	soc.send('director end\r\n')
	print 'test end and close socket.'
	soc.close()

#----------------autotest build and run----------------#
def MAC_BUILD():
	def cleanProj():
		infoClean = os.system('xcodebuild -project ./build/cocos2d_tests.xcodeproj -target cpp-tests\ Mac clean')
		print 'infoClean: ', infoClean
		if infoClean != 0:
			return False
		time.sleep(sleep_time)
		return True
	def buildProj():
		infoBuild = os.system('xcodebuild -project ./build/cocos2d_tests.xcodeproj -target cpp-tests\ Mac')
		print 'infoBuild: ', infoBuild
		if infoBuild != 0:
			return False
		time.sleep(sleep_time)
		return True
	def openProj():
		cmd = 'open ./build/build/Debug/cpp-tests\ Mac.app'
		print 'cmd: ', cmd
		infoOpen = os.system(cmd)
		print 'infoOpen: ', infoOpen
		if infoOpen != 0:
			return False
		time.sleep(sleep_time)
		return True
	def buildAndRun():
		if not cleanProj():
			print '**CLEAN FAILED**'
		if not buildProj():
			print '**BUILD FAILED**'
			return False
		if not openProj():
			return False
		time.sleep(sleep_time)
		return True
	return buildAndRun()
#----------------autotest build and run end----------------#

PATH_ANDROID_SRC = 'tests/cpp-tests/proj.android/'
FILE_ANDROID_DELETE = ['libs','gen','assets','bin','obj']
#----------------autotest-android build and run----------------#
def ANDROID_BUILD():
	def checkDevice():
		cmd = 'adb devices'
		infoDev = os.popen(cmd).readlines()
		firstDev = infoDev[1]
		if len(firstDev) < 5 or firstDev.find('device') < 0:
			print 'no android device.'
			return False
		else:
			print 'device info:', firstDev
		return True
	def cleanProj():
		for strFile in FILE_ANDROID_DELETE:
			infoClean = os.system('rm -rf '+PATH_ANDROID_SRC+strFile)
		infoClean = os.system('adb uninstall org.cocos2dx.cpp_tests');
		print 'infoClean: ', infoClean
		if infoClean != 0:
			print 'clean **CLEAN FAILED**'
		time.sleep(sleep_time)
	def updateProperty():
		infoUpdate = os.system('android update project -p  ./cocos/2d/platform/android/java/ -t 12')
		print 'cocos update:', infoUpdate
		infoUpdate = os.system('android update project -p '+PATH_ANDROID_SRC+' -t 12')
		print 'test update:', infoUpdate
	def buildProj():
		infoBuild = os.system('./build/android-build.py  -p 13 cpp-tests')
		print 'infoBuild cpp_tests: ', infoBuild
		infoBuild = os.system('ant -buildfile '+PATH_ANDROID_SRC+' debug')
		print 'infoBuild: ', infoBuild
		if infoBuild != 0:
			print 'build **BUILD FAILED**'
		time.sleep(sleep_time)
		return infoBuild
	def installProj():
		cmd = 'adb install '+PATH_ANDROID_SRC+'bin/CppTests-debug.apk'
		infoInstall = os.system(cmd)
		print 'infoInstall:', infoInstall
		if infoInstall != 0:
			print 'install **INSTALL FAILED**'
		return infoInstall
	def openProj():
		cmd = 'adb shell am start -n org.cocos2dx.cpp_tests/org.cocos2dx.cpp_tests.Cocos2dxActivity'
		print 'cmd: ', cmd
		infoOpen = os.system(cmd)
		print 'infoOpen: ', infoOpen
		if infoOpen != 0:
			return False
		time.sleep(sleep_time)
		return True
	def buildAndRun():
		if not checkDevice():
			return False
		cleanProj()
		updateProperty()
		buildProj()
		installProj()
		return openProj()
	return buildAndRun()
#----------------autotest-android build and run end----------------#

def main():
	print 'will build mac project.'
	suc_build_mac = MAC_BUILD()
	# print 'will build android project.'
	# suc_build_android = ANDROID_BUILD()
	if suc_build_mac:
		autotest(TYPE_MAC)
	if suc_build_android:
		print 'will run android autotest.'
		autotest(TYPE_ANDROID)


# -------------- main --------------
if __name__ == '__main__':
    sys_ret = 0
    try:    
        sys_ret = main()
    except:
        traceback.print_exc()
        sys_ret = 1
    finally:
        sys.exit(sys_ret)