michael@0: # This Source Code Form is subject to the terms of the Mozilla Public michael@0: # License, v. 2.0. If a copy of the MPL was not distributed with this michael@0: # file, You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: michael@0: import string, sys michael@0: michael@0: def usage(): michael@0: print >>sys.stderr, """ michael@0: %s template_file -t unit_tests... -e extra_protocols... michael@0: michael@0: TEMPLATE_FILE is used to generate to generate the unit-tester .cpp michael@0: UNIT_TESTS are the top-level protocols defining unit tests michael@0: EXTRA_PROTOCOLS are top-level protocols for subprocesses that can be michael@0: spawned in tests but are not unit tests in and of michael@0: themselves michael@0: """% (sys.argv[0]) michael@0: sys.exit(1) michael@0: michael@0: def main(argv): michael@0: template = argv[1] michael@0: michael@0: if argv[2] != '-t': usage() michael@0: i = 3 michael@0: unittests = [] michael@0: while argv[i] != '-e': michael@0: unittests.append(argv[i]) michael@0: i += 1 michael@0: michael@0: extras = argv[(i+1):] michael@0: michael@0: includes = '\n'.join([ michael@0: '#include "%s.h"'% (t) for t in unittests ]) michael@0: michael@0: michael@0: enum_values = '\n'.join([ michael@0: ' %s,'% (t) for t in unittests+extras ]) michael@0: last_enum = unittests[-1] michael@0: michael@0: michael@0: string_to_enums = '\n'.join([ michael@0: ''' else if (!strcmp(aString, "%s")) michael@0: return %s;'''% (t, t) for t in unittests+extras ]) michael@0: michael@0: enum_to_strings = '\n'.join([ michael@0: ''' case %s: michael@0: return "%s";'''%(t, t) for t in unittests+extras ]) michael@0: michael@0: parent_delete_cases = '\n'.join([ michael@0: ''' case %s: { michael@0: delete reinterpret_cast<%sParent*>(gParentActor); michael@0: return; michael@0: } michael@0: '''% (t, t) for t in unittests ]) michael@0: michael@0: parent_enabled_cases_proc = '\n'.join([ michael@0: ''' case %s: { michael@0: if (!%sParent::RunTestInProcesses()) { michael@0: passed("N/A to proc"); michael@0: DeferredParentShutdown(); michael@0: return; michael@0: } michael@0: break; michael@0: } michael@0: ''' % (t, t) for t in unittests ]) michael@0: michael@0: parent_main_cases_proc = '\n'.join([ michael@0: ''' case %s: { michael@0: %sParent** parent = michael@0: reinterpret_cast<%sParent**>(&gParentActor); michael@0: *parent = new %sParent(); michael@0: (*parent)->Open(transport, child); michael@0: return (*parent)->Main(); michael@0: } michael@0: '''% (t, t, t, t) for t in unittests ]) michael@0: michael@0: parent_enabled_cases_thread = '\n'.join([ michael@0: ''' case %s: { michael@0: if (!%sParent::RunTestInThreads()) { michael@0: passed("N/A to threads"); michael@0: DeferredParentShutdown(); michael@0: return; michael@0: } michael@0: break; michael@0: } michael@0: ''' % (t, t) for t in unittests ]) michael@0: michael@0: parent_main_cases_thread = '\n'.join([ michael@0: ''' case %s: { michael@0: %sParent** parent = michael@0: reinterpret_cast<%sParent**>(&gParentActor); michael@0: *parent = new %sParent(); michael@0: michael@0: %sChild** child = michael@0: reinterpret_cast<%sChild**>(&gChildActor); michael@0: *child = new %sChild(); michael@0: michael@0: ::mozilla::ipc::MessageChannel *childChannel = (*child)->GetIPCChannel(); michael@0: ::mozilla::ipc::Side parentSide = michael@0: ::mozilla::ipc::ParentSide; michael@0: michael@0: (*parent)->Open(childChannel, childMessageLoop, parentSide); michael@0: return (*parent)->Main(); michael@0: } michael@0: '''% (t, t, t, t, t, t, t) for t in unittests ]) michael@0: michael@0: child_delete_cases = '\n'.join([ michael@0: ''' case %s: { michael@0: delete reinterpret_cast<%sChild*>(gChildActor); michael@0: return; michael@0: } michael@0: '''% (t, t) for t in unittests+extras ]) michael@0: michael@0: michael@0: child_init_cases = '\n'.join([ michael@0: ''' case %s: { michael@0: %sChild** child = michael@0: reinterpret_cast<%sChild**>(&gChildActor); michael@0: *child = new %sChild(); michael@0: (*child)->Open(transport, parent, worker); michael@0: return; michael@0: } michael@0: '''% (t, t, t, t) for t in unittests+extras ]) michael@0: michael@0: templatefile = open(template, 'r') michael@0: sys.stdout.write( michael@0: string.Template(templatefile.read()).substitute( michael@0: INCLUDES=includes, michael@0: ENUM_VALUES=enum_values, LAST_ENUM=last_enum, michael@0: STRING_TO_ENUMS=string_to_enums, michael@0: ENUM_TO_STRINGS=enum_to_strings, michael@0: PARENT_DELETE_CASES=parent_delete_cases, michael@0: PARENT_ENABLED_CASES_PROC=parent_enabled_cases_proc, michael@0: PARENT_MAIN_CASES_PROC=parent_main_cases_proc, michael@0: PARENT_ENABLED_CASES_THREAD=parent_enabled_cases_thread, michael@0: PARENT_MAIN_CASES_THREAD=parent_main_cases_thread, michael@0: CHILD_DELETE_CASES=child_delete_cases, michael@0: CHILD_INIT_CASES=child_init_cases)) michael@0: templatefile.close() michael@0: michael@0: if __name__ == '__main__': michael@0: main(sys.argv)