# -*- coding: utf-8 -*-

import os
import sys
import shutil
import random
import subprocess

def die (msg):
	print msg
	exit(-1)

def shellquote(s):
	return '"%s"' % s.replace('\\', '\\\\').replace('"', '\"').replace('$', '\$').replace('`', '\`')

def execute (args, workDir = None):
	curPath = os.getcwd()
	if workDir != None:
		os.chdir(workDir)
	retcode	= subprocess.call(args)
	os.chdir(curPath)
	if retcode != 0:
		raise Exception("Failed to execute %s, got %d" % (str(args), retcode))

class Config:
	def __init__ (self, name, srcPath, buildPath, genParams, buildParams, testBinaryName, executor = 'executor', execserver = 'execserver', junitTool = 'testlog-to-junit'):
		self.name				= name
		self.srcPath			= srcPath
		self.buildPath			= buildPath
		self.genParams			= genParams
		self.buildParams		= buildParams
		self.testBinaryName		= testBinaryName
		self.executor			= executor
		self.execserver			= execserver
		self.junitTool			= junitTool

def initBuildDir (config):
	if os.path.exists(config.buildPath):
		shutil.rmtree(config.buildPath)

	os.makedirs(config.buildPath)
	execute(["cmake", os.path.realpath(config.srcPath)] + config.genParams, workDir = config.buildPath)

def prepareBuildDir (config):
	# If build dir exists, try to refresh
	if os.path.exists(config.buildPath):
		try:
			execute(["cmake", "."], workDir = config.buildPath)
		except:
			print "WARNING: Failed to refresh build dir, recreating"
			initBuildDir(config)
	else:
		initBuildDir(config)

def build (config):
	prepareBuildDir(config)
	execute(["cmake", "--build", "."] + config.buildParams, workDir = config.buildPath)

def runInternalTests (config):
	batchResultFile	= config.name + ".qpa"
	infoLogFile		= config.name + ".txt"
	junitFile		= config.name + ".xml"

	testWorkDir		= os.path.join(config.buildPath, "modules", "internal")
	junitToolPath	= os.path.join(config.buildPath, 'executor', config.junitTool)

	# Remove old files
	for file in [batchResultFile, junitFile]:
		if os.path.exists(file):
			os.remove(file)

	build(config)

	# Dump case list
	execute([config.testBinaryName, "--deqp-runmode=xml-caselist"], workDir = testWorkDir)

	# Run test binary using executor
	args = [
		os.path.join(config.buildPath, 'executor', config.executor),
		'--port=%d' % random.randint(50000, 60000),
		'--start-server=%s' % os.path.join(config.buildPath, 'execserver', config.execserver),
		'--binaryname=%s' % config.testBinaryName,
		'--cmdline=--deqp-crashhandler=enable --deqp-watchdog=enable',
		'--workdir=%s' % testWorkDir,
		'--caselistdir=%s' % os.path.join(testWorkDir),
		'--testset=dE-IT.*',
		'--out=%s' % batchResultFile,
		'--info=%s' % infoLogFile
	]
	execute(args)

	# Convert log to junit format
	execute([junitToolPath, batchResultFile, junitFile])

SRC_PATH		= os.path.normpath(os.path.join(os.path.dirname(__file__), ".."))
BASE_BUILD_PATH	= os.path.normpath(os.path.join(SRC_PATH, "..", "de-internal-tests"))

CONFIGS = [
	Config(
		"win32-vs10-debug",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "win32-vs10-debug"),
		['-GVisual Studio 10', '-DDEQP_TARGET=no_modules'],
		['--config', 'Debug', '--', '/m'],
		'Debug\\de-internal-tests.exe',
		'Debug\\executor.exe',
		'Debug\\execserver.exe',
		'Debug\\testlog-to-junit.exe'
	),
	Config(
		"win32-vs10-release",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "win32-vs10-release"),
		['-GVisual Studio 10', '-DDEQP_TARGET=no_modules'],
		['--config', 'Release', '--', '/m'],
		'Release\\de-internal-tests.exe',
		'Release\\executor.exe',
		'Release\\execserver.exe',
		'Release\\testlog-to-junit.exe'
	),
	Config(
		"win64-vs10-debug",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "win64-vs10-debug"),
		['-GVisual Studio 10 Win64', '-DDEQP_TARGET=no_modules'],
		['--config', 'Debug', '--', '/m'],
		'Debug\\de-internal-tests.exe',
		'Debug\\executor.exe',
		'Debug\\execserver.exe',
		'Debug\\testlog-to-junit.exe'
	),
	Config(
		"win64-vs10-release",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "win64-vs10-release"),
		['-GVisual Studio 10 Win64', '-DDEQP_TARGET=no_modules'],
		['--config', 'Release', '--', '/m'],
		'Release\\de-internal-tests.exe',
		'Release\\executor.exe',
		'Release\\execserver.exe',
		'Release\\testlog-to-junit.exe'
	),

	# GCC configs
	Config(
		"linux32-gcc-debug",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux32-gcc-debug"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu'],
		['--', '-j', '2'],
		'./de-internal-tests'
	),
	Config(
		"linux32-gcc-release",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux32-gcc-release"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu'],
		['--', '-j', '2'],
		'./de-internal-tests'
	),
	Config(
		"linux64-gcc-debug",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux64-gcc-debug"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'],
		['--', '-j', '2'],
		'./de-internal-tests'
	),
	Config(
		"linux64-gcc-release",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux64-gcc-release"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64'],
		['--', '-j', '2'],
		'./de-internal-tests'
	),

	# Clang configs
	Config(
		"linux32-clang-debug",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux32-clang-debug"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'],
		['--', '-j', '2'],
		'./de-internal-tests'
	),
	Config(
		"linux32-clang-release",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux32-clang-release"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m32', '-DCMAKE_CXX_FLAGS=-m32', '-DCMAKE_LIBRARY_PATH=/usr/lib32;usr/lib/i386-linux-gnu', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'],
		['--', '-j', '2'],
		'./de-internal-tests'
	),
	Config(
		"linux64-clang-debug",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux64-clang-debug"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Debug', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'],
		['--', '-j', '2'],
		'./de-internal-tests'
	),
	Config(
		"linux64-clang-release",
		SRC_PATH,
		os.path.join(BASE_BUILD_PATH, "linux64-clang-release"),
		['-DDEQP_TARGET=no_modules', '-DCMAKE_BUILD_TYPE=Release', '-DCMAKE_C_FLAGS=-m64', '-DCMAKE_CXX_FLAGS=-m64', '-DCMAKE_C_COMPILER=clang', '-DCMAKE_CXX_COMPILER=clang++', '-DDE_COMPILER=DE_COMPILER_CLANG'],
		['--', '-j', '2'],
		'./de-internal-tests'
	)
]

def findConfig (name):
	for config in CONFIGS:
		if config.name == name:
			return config
	return None

if __name__ == "__main__":
	if len(sys.argv) != 2:
		die("%s: [config]" % sys.argv[0])

	config = findConfig(sys.argv[1])
	if config == None:
		die("Config '%s' not found" % sys.argv[1])

	random.seed()
	runInternalTests(config)
