123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """
- Copyright (c) Contributors to the Open 3D Engine Project.
- For complete copyright and license terms please see the LICENSE at the root of this distribution.
- SPDX-License-Identifier: Apache-2.0 OR MIT
- """
- import sys
- import os
- import platform
- import datetime
- import subprocess
- from subprocess import check_output
- import os.path
- import shutil
- from argparse import ArgumentParser
- from os.path import join, normpath, basename
- import re
- import importlib
- sys.path.append("tests")
- from tests.clr import *
- testList = ['Syntax', 'Semantic', 'Advanced', 'Samples']
- os.system('') # activate VT100 mode for windows console
- azslcRelease = ""
- azslcDebug = ""
- az3rdParty = ""
- parser = ArgumentParser()
- parser.add_argument(
- '--j', dest='jenkin',
- action='store_true', default=False,
- help="Use jenkin configuration to build and test",
- )
- parser.add_argument(
- '--dev', dest='atomDev',
- type=str,
- help="The path of atom dev(to locate DXC-az version), If not specified, default windows 10 Dxc.exe will be used",
- )
- args = parser.parse_args()
- isJenkin = "OFF"
- if args.jenkin is True:
- isJenkin = "ON"
- if args.atomDev is not None:
- az3rdParty = args.atomDev + "/Gems/Atom/Asset/Shader/External"
- # Part 0 - Prerequisites
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + " Building AZSLc ..." + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- missingCritical = 0
- missingOptional = 0
- # Windows
- if os.name == 'nt':
- from shutil import which
- if which("cmake") is None:
- print ( fg.RED + style.BRIGHT + "[ X ] Expected CMake 3.15+ (in {} or as command)".format(criticalCMake) + style.RESET_ALL )
- missingCritical = missingCritical + 1
- try:
- import yaml
- except ImportError as err:
- print ( fg.YELLOW + style.BRIGHT + "[ ! ] Trying to run pip install pyyaml ..." + style.RESET_ALL )
- subprocess.check_call([sys.executable, "-m", "pip", "install", "pyyaml"])
- try:
- import yaml
- except ImportError:
- print ( fg.RED + style.BRIGHT + "[ ! ] Please run pip install pyyaml, otherwise some tests will fail to validate" + style.RESET_ALL )
- missingCritical = missingCritical + 1
- try:
- jversion = subprocess.check_output(['java', '-version'], stderr=subprocess.STDOUT)
- pattern = '\"(\d+\.\d+).*\"'
- jversionTrim = re.search(pattern, jversion.decode("utf-8") ).groups()[0]
- except Exception:
- jversionTrim = ""
- # We could compare using 'Version' instead but it requires installing the 'packaging' package
- if jversionTrim < "1.6":
- print ( fg.YELLOW + style.BRIGHT + "[ ! ] You need java (JDK 1.6 or newer) if you want to rebuild the ANTLR4 generated grammar files" + style.RESET_ALL )
- missingOptional = missingOptional + 1
- if missingOptional > 0:
- print ( fg.YELLOW + style.BRIGHT + "{} optional component(s) could be better".format(missingOptional) + style.RESET_ALL )
- if missingCritical > 0:
- print ( fg.RED + style.BRIGHT + "{} critical component(s) are still missing!".format(missingCritical) + style.RESET_ALL )
- sys.exit(1)
- # Part 1 - Build, ...
- if os.name == 'nt':
- print (fg.CYAN + style.BRIGHT + "Prepare solution..." + style.RESET_ALL)
- subprocess.call(["prepare_solution_win.bat", "nopause", isJenkin])
- print (fg.CYAN + style.BRIGHT + "... done" + style.RESET_ALL)
- print (fg.CYAN + style.BRIGHT + "Build Release ..." + style.RESET_ALL )
- ret = subprocess.call(["build_win.bat", "Release", isJenkin])
- if ret != 0:
- if ret < 0:
- print ( "Killed by signal" + -ret )
- sys.exit(1)
- else:
- print ( fg.RED + style.BRIGHT + "Could not complete test execution!" + style.RESET_ALL )
- sys.exit(1)
- else:
- print ( fg.CYAN + style.BRIGHT + "... done" + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + "Build Debug ..." + style.RESET_ALL )
- ret = subprocess.call(["build_win.bat", "Debug", isJenkin])
- if ret != 0:
- if ret < 0:
- print ( "Killed by signal" + -ret )
- sys.exit(1)
- else:
- print ( fg.RED + style.BRIGHT + "Could not complete test execution!" + style.RESET_ALL )
- sys.exit(1)
- else:
- print ( fg.CYAN + style.BRIGHT + "... done" + style.RESET_ALL )
- azslcRelease = "bin/win_x64/Release/azslc.exe"
- if not os.path.isfile(azslcRelease):
- print ( "Release build failed (expected at {})".format(azslcRelease) )
- sys.exit(1)
- azslcDebug = "bin/win_x64/Debug/azslc.exe"
- if not os.path.isfile(azslcDebug):
- print ( "Debug build failed (expected at {})".format(azslcDebug) )
- sys.exit(1)
- if platform.system() == 'Darwin':
- print ( fg.CYAN + style.BRIGHT + "Prepare solution..." + style.RESET_ALL )
- subprocess.call(["./prepare_solution_darwin.sh"])
- print ( fg.CYAN + style.BRIGHT + "... done" + style.RESET_ALL )
- azslcRelease = "bin/darwin/release/azslc"
- if not os.path.isfile(azslcRelease):
- print ( "Release build failed (expected at {})".format(azslcRelease) )
- sys.exit(1)
- azslcDebug = "bin/darwin/debug/azslc"
- if not os.path.isfile(azslcDebug):
- print ( "Debug build failed (expected at {})".format(azslcDebug) )
- sys.exit(1)
- if platform.system() == 'Linux':
- print ( fg.CYAN + style.BRIGHT + "Prepare solution..." + style.RESET_ALL )
- subprocess.call(["./prepare_solution_linux.sh"])
- print ( fg.CYAN + style.BRIGHT + "... done" + style.RESET_ALL )
- azslcRelease = "bin/linux/release/azslc"
- if not os.path.isfile(azslcRelease):
- print ( "Release build failed (expected at {})".format(azslcRelease) )
- sys.exit(1)
- azslcDebug = "bin/linux/debug/azslc"
- if not os.path.isfile(azslcDebug):
- print ( "Debug build failed (expected at {})".format(azslcDebug) )
- sys.exit(1)
- # Part 2 - ... test and ...
- expectCorrect = 230
- allowIncorrect = 0
- testScriptModule = importlib.import_module("testapp")
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + " Testing Release ..." + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- numAllTests = testScriptModule.runAll("./tests", testList, azslcRelease, 0, az3rdParty)
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- print ( fg.GREEN + style.BRIGHT + "OK: {}".format(numAllTests.numPass) + style.RESET_ALL )
- print ( fg.YELLOW + style.BRIGHT + "TODO: {}".format(numAllTests.numTodo) + style.RESET_ALL )
- print ( fg.RED + style.BRIGHT + "FAILED: {}".format(numAllTests.numFail) + style.RESET_ALL )
- if numAllTests.numPass < expectCorrect:
- print ( fg.RED + style.BRIGHT + "Fix your code! (expected {} passing tests)".format(expectCorrect) + style.RESET_ALL )
- sys.exit(0)
- if numAllTests.numFail > allowIncorrect:
- print ( fg.RED + style.BRIGHT + "Wow, we shouldn't ship with that many broken tests! (allows {} tests to be failing)".format(allowIncorrect) + style.RESET_ALL )
- sys.exit(1)
- print ( fg.CYAN + style.BRIGHT + " GOOD ENOUGH" + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + " Testing Debug ..." + style.RESET_ALL )
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- numAllTests = testScriptModule.runAll("./tests", testList, azslcDebug, 0, az3rdParty)
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL )
- print ( fg.GREEN + style.BRIGHT + "OK: {}".format(numAllTests.numPass) + style.RESET_ALL )
- print ( fg.YELLOW + style.BRIGHT + "TODO: {}".format(numAllTests.numTodo) + style.RESET_ALL )
- print ( fg.RED + style.BRIGHT + "FAILED: {}".format(numAllTests.numFail) + style.RESET_ALL )
- if numAllTests.numPass < expectCorrect:
- print ( fg.RED, style.BRIGHT + "Fix your code! (expected {} passing tests)".format(expectCorrect) + style.RESET_ALL)
- sys.exit(0)
- if numAllTests.numFail > allowIncorrect:
- print ( fg.RED + style.BRIGHT + "Wow, we shouldn't ship with that many broken tests! (allows {} tests to be failing)".format(allowIncorrect) + style.RESET_ALL)
- sys.exit(1)
- print ( fg.CYAN + style.BRIGHT + " GOOD ENOUGH" + style.RESET_ALL)
- print ( fg.CYAN + style.BRIGHT + "*****************************************************" + style.RESET_ALL)
|