diff options
Diffstat (limited to 'tests')
-rw-r--r-- | tests/freealut/CMakeLists.txt | 55 | ||||
-rwxr-xr-x | tests/runner.py | 24 | ||||
-rw-r--r-- | tests/test_browser.py | 101 |
3 files changed, 106 insertions, 74 deletions
diff --git a/tests/freealut/CMakeLists.txt b/tests/freealut/CMakeLists.txt index 640f35bf..c11680cd 100644 --- a/tests/freealut/CMakeLists.txt +++ b/tests/freealut/CMakeLists.txt @@ -72,20 +72,39 @@ ADD_DEFINE("__NO_CTYPE 1") ADD_DEFINITIONS(-DHAVE_CONFIG_H) ADD_DEFINITIONS(-DNDEBUG) -FIND_LIBRARY(OPENAL_LIB NAMES openal openal32 PATHS /usr/lib /usr/local/lib ${OPENAL_LIB_DIR}) -IF(OPENAL_LIB MATCHES "NOTFOUND") - MESSAGE(FATAL_ERROR "OpenAL not installed, cannot build alut - aborting.") -ENDIF(OPENAL_LIB MATCHES "NOTFOUND") - -IF(UNIX) - SET(ADD_LIBS ${ADD_LIBS} m) -ENDIF(UNIX) +if (EMSCRIPTEN) + # Emscripten cannot use FIND_LIBRARY, since that seaches for linkable library files, but Emscripten supports + # OpenAL in core and there are no library files to link against. Instead, use a custom OpenAL package finder + # provided by Emscripten. + FIND_PACKAGE(OpenAL) + + # All the include file checks bloew are no-ops for Emscripten, so for that platform, just define the flags we support. + SET(HAVE_STDINT_H 1) + SET(HAVE_STAT 1) + SET(HAVE_NANOSLEEP 1) + SET(HAVE_TIME_H 1) + ADD_DEFINITIONS(-DHAVE_STDINT_H=1 -DHAVE_STAT=1 -DHAVE_NANOSLEEP=1 -DHAVE_TIME_H=1) + SET(CMAKE_EXECUTABLE_SUFFIX ".bc") +else() + FIND_LIBRARY(OPENAL_LIB NAMES openal openal32 PATHS /usr/lib /usr/local/lib ${OPENAL_LIB_DIR}) + + IF(OPENAL_LIB MATCHES "NOTFOUND") + MESSAGE(FATAL_ERROR "OpenAL not installed, cannot build alut - aborting.") + ENDIF(OPENAL_LIB MATCHES "NOTFOUND") + + IF(UNIX) + SET(ADD_LIBS ${ADD_LIBS} m) + ENDIF(UNIX) +endif() SET(CMAKE_REQUIRED_INCLUDES ${OPENAL_INCLUDE_DIR}) -CHECK_INCLUDE_FILES("AL/alc.h;AL/al.h" AL_HEADERS) -IF(NOT AL_HEADERS) - MESSAGE(FATAL_ERROR "OpenAL header files not found - aborting.") -ENDIF(NOT AL_HEADERS) + +if (NOT EMSCRIPTEN) # Emscripten is a cross-compiler and cannot verify paths of include files with CHECK_INCLUDE_FILES, since that requires building native executables. + CHECK_INCLUDE_FILES("AL/alc.h;AL/al.h" AL_HEADERS) + IF(NOT AL_HEADERS) + MESSAGE(FATAL_ERROR "OpenAL header files not found - aborting.") + ENDIF(NOT AL_HEADERS) +endif() IF(DEFINED OPENAL_INCLUDE_DIR) INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR}) @@ -178,10 +197,18 @@ INSTALL_FILES(/lib/pkgconfig FILES admin/pkgconfig/freealut.pc) IF(BUILD_TESTS) # examples ADD_EXECUTABLE(hello_world examples/hello_world.c) - TARGET_LINK_LIBRARIES(hello_world ${OPENAL_LIB} ${ADD_LIBS} alut) + if (EMSCRIPTEN) + TARGET_LINK_LIBRARIES(hello_world ${OPENAL_LIB} ${ADD_LIBS} alut_static) + else() + TARGET_LINK_LIBRARIES(hello_world ${OPENAL_LIB} ${ADD_LIBS} alut) + endif() ADD_EXECUTABLE(playfile examples/playfile.c) - TARGET_LINK_LIBRARIES(playfile ${OPENAL_LIB} ${ADD_LIBS} alut) + if (EMSCRIPTEN) + TARGET_LINK_LIBRARIES(playfile ${OPENAL_LIB} ${ADD_LIBS} alut_static) + else() + TARGET_LINK_LIBRARIES(playfile ${OPENAL_LIB} ${ADD_LIBS} alut) + endif() SET(TESTS errorstuff diff --git a/tests/runner.py b/tests/runner.py index 7f513635..34435383 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -16,7 +16,7 @@ so you may prefer to use fewer cores here. ''' from subprocess import Popen, PIPE, STDOUT -import os, unittest, tempfile, shutil, time, inspect, sys, math, glob, re, difflib, webbrowser, hashlib, threading, platform, BaseHTTPServer, multiprocessing, functools, stat, string +import os, unittest, tempfile, shutil, time, inspect, sys, math, glob, re, difflib, webbrowser, hashlib, threading, platform, BaseHTTPServer, SimpleHTTPServer, multiprocessing, functools, stat, string # Setup @@ -491,22 +491,14 @@ def harness_server_func(q): httpd.serve_forever() # test runner will kill us def server_func(dir, q): - class TestServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): - def do_GET(s): - if 'report_' in s.path: - q.put(s.path) + class TestServerHandler(SimpleHTTPServer.SimpleHTTPRequestHandler): + def do_GET(self): + if 'report_' in self.path: + q.put(self.path) else: - filename = s.path.split('?')[0][1:] - if os.path.exists(filename): - s.send_response(200) - s.send_header("Content-type", "text/html") - s.end_headers() - s.wfile.write(open(filename).read()) - s.wfile.close() - else: - s.send_response(500) - s.send_header("Content-type", "text/html") - s.end_headers() + # Use SimpleHTTPServer default file serving operation for GET. + SimpleHTTPServer.SimpleHTTPRequestHandler.do_GET(self) + def log_request(code=0, size=0): # don't log; too noisy pass diff --git a/tests/test_browser.py b/tests/test_browser.py index 65bccb38..f2bcaa93 100644 --- a/tests/test_browser.py +++ b/tests/test_browser.py @@ -1,4 +1,4 @@ -import BaseHTTPServer, multiprocessing, os, shutil, subprocess, unittest +import BaseHTTPServer, multiprocessing, os, shutil, subprocess, unittest, zlib from runner import BrowserCore, path_from_root from tools.shared import * @@ -8,6 +8,45 @@ def run_in_other_browser(url): webbrowser.open_new = run_in_other_browser ''' +def test_chunked_synchronous_xhr_server(support_byte_ranges, chunkSize, data, checksum): + class ChunkedServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): + def sendheaders(s, extra=[], length=len(data)): + s.send_response(200) + s.send_header("Content-Length", str(length)) + s.send_header("Access-Control-Allow-Origin", "http://localhost:8888") + s.send_header("Access-Control-Expose-Headers", "Content-Length, Accept-Ranges") + s.send_header("Content-type", "application/octet-stream") + if support_byte_ranges: + s.send_header("Accept-Ranges", "bytes") + for i in extra: + s.send_header(i[0], i[1]) + s.end_headers() + + def do_HEAD(s): + s.sendheaders() + + def do_OPTIONS(s): + s.sendheaders([("Access-Control-Allow-Headers", "Range")], 0) + + def do_GET(s): + if not support_byte_ranges: + s.sendheaders() + s.wfile.write(data) + else: + (start, end) = s.headers.get("range").split("=")[1].split("-") + start = int(start) + end = int(end) + end = min(len(data)-1, end) + length = end-start+1 + s.sendheaders([],length) + s.wfile.write(data[start:end+1]) + s.wfile.close() + + expectedConns = 11 + httpd = BaseHTTPServer.HTTPServer(('localhost', 11111), ChunkedServerHandler) + for i in range(expectedConns+1): + httpd.handle_request() + class browser(BrowserCore): @staticmethod def audio(): @@ -85,7 +124,10 @@ If manually bisecting: cwd = os.getcwd() try: os.chdir(path_from_root('third_party', 'lzma.js')) - Popen(['sh', './doit.sh']).communicate() + if WINDOWS and Building.which('mingw32-make'): # On Windows prefer using MinGW make if it exists, otherwise fall back to hoping we have cygwin make. + Popen(['doit.bat']).communicate() + else: + Popen(['sh', './doit.sh']).communicate() finally: os.chdir(cwd) @@ -185,7 +227,7 @@ If manually bisecting: self.reftest(path_from_root('tests', 'htmltest.png')) output = Popen([PYTHON, EMCC, path_from_root('tests', 'hello_world_sdl.cpp'), '-o', 'something.js', '-g', '--split', '100', '--pre-js', 'reftest.js']).communicate() assert os.path.exists(os.path.join(self.get_dir(), 'something.js')), 'must be main js file' - assert os.path.exists(self.get_dir() + '/something/' + path_from_root('tests', 'hello_world_sdl.cpp.js')), 'must be functions js file' + assert os.path.exists(os.path.join(self.get_dir(), 'something', 'hello_world_sdl.cpp.js')), 'must be functions js file' assert os.path.exists(os.path.join(self.get_dir(), 'something.include.html')), 'must be js include file' open(os.path.join(self.get_dir(), 'something.html'), 'w').write(''' @@ -1159,8 +1201,14 @@ keydown(100);keyup(100); // trigger the end Popen([PYTHON, EMCC, '-O2', os.path.join(self.get_dir(), 'test_egl_width_height.c'), '-o', 'page.html']).communicate() self.run_browser('page.html', 'Should print "(300, 150)" -- the size of the canvas in pixels', '/report_result?1') + def get_freealut_library(self): + if WINDOWS and Building.which('cmake'): + return self.get_library('freealut', os.path.join('hello_world.bc'), configure=['cmake', '.'], configure_args=['-DBUILD_TESTS=ON']) + else: + return self.get_library('freealut', os.path.join('examples', '.libs', 'hello_world.bc'), make_args=['EXEEXT=.bc']) + def test_freealut(self): - programs = self.get_library('freealut', os.path.join('examples', '.libs', 'hello_world.bc'), make_args=['EXEEXT=.bc']) + programs = self.get_freealut_library() for program in programs: assert os.path.exists(program) Popen([PYTHON, EMCC, '-O2', program, '-o', 'page.html']).communicate() @@ -1256,51 +1304,16 @@ keydown(100);keyup(100); // trigger the end chunkSize = 1024 data = os.urandom(10*chunkSize+1) # 10 full chunks and one 1 byte chunk - expectedConns = 11 - import zlib checksum = zlib.adler32(data) - def chunked_server(support_byte_ranges): - class ChunkedServerHandler(BaseHTTPServer.BaseHTTPRequestHandler): - def sendheaders(s, extra=[], length=len(data)): - s.send_response(200) - s.send_header("Content-Length", str(length)) - s.send_header("Access-Control-Allow-Origin", "http://localhost:8888") - s.send_header("Access-Control-Expose-Headers", "Content-Length, Accept-Ranges") - s.send_header("Content-type", "application/octet-stream") - if support_byte_ranges: - s.send_header("Accept-Ranges", "bytes") - for i in extra: - s.send_header(i[0], i[1]) - s.end_headers() - - def do_HEAD(s): - s.sendheaders() - - def do_OPTIONS(s): - s.sendheaders([("Access-Control-Allow-Headers", "Range")], 0) - - def do_GET(s): - if not support_byte_ranges: - s.sendheaders() - s.wfile.write(data) - else: - (start, end) = s.headers.get("range").split("=")[1].split("-") - start = int(start) - end = int(end) - end = min(len(data)-1, end) - length = end-start+1 - s.sendheaders([],length) - s.wfile.write(data[start:end+1]) - s.wfile.close() - httpd = BaseHTTPServer.HTTPServer(('localhost', 11111), ChunkedServerHandler) - for i in range(expectedConns+1): - httpd.handle_request() - - server = multiprocessing.Process(target=chunked_server, args=(True,)) + server = multiprocessing.Process(target=test_chunked_synchronous_xhr_server, args=(True,chunkSize,data,checksum,)) server.start() self.run_browser(main, 'Chunked binary synchronous XHR in Web Workers!', '/report_result?' + str(checksum)) server.terminate() + # Avoid race condition on cleanup, wait a bit so that processes have released file locks so that test tearDown won't + # attempt to rmdir() files in use. + if WINDOWS: + time.sleep(2) def test_glgears(self): self.btest('hello_world_gles.c', reference='gears.png', reference_slack=1, |