view test_compliance.py @ 35:6ddc83bb61f8 default tip

added another gc test
author Atul Varma <avarma@mozilla.com>
date Mon, 10 May 2010 21:01:58 -0700
parents 9fe3f115f951
children
line wrap: on
line source

# ***** BEGIN LICENSE BLOCK *****
# Version: MPL 1.1/GPL 2.0/LGPL 2.1
#
# The contents of this file are subject to the Mozilla Public License Version
# 1.1 (the "License"); you may not use this file except in compliance with
# the License. You may obtain a copy of the License at
# http://www.mozilla.org/MPL/
#
# Software distributed under the License is distributed on an "AS IS" basis,
# WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
# for the specific language governing rights and limitations under the
# License.
#
# The Original Code is Pydertron.
#
# The Initial Developer of the Original Code is Mozilla.
# Portions created by the Initial Developer are Copyright (C) 2007
# the Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Atul Varma <atul@mozilla.com>
#
# Alternatively, the contents of this file may be used under the terms of
# either the GNU General Public License Version 2 or later (the "GPL"), or
# the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
# in which case the provisions of the GPL or the LGPL are applicable instead
# of those above. If you wish to allow use of your version of this file only
# under the terms of either the GPL or the LGPL, and not to allow others to
# use your version of this file under the terms of the MPL, indicate your
# decision by deleting the provisions above and replace them with the notice
# and other provisions required by the GPL or the LGPL. If you do not delete
# the provisions above, a recipient may use your version of this file under
# the terms of any one of the MPL, the GPL or the LGPL.
#
# ***** END LICENSE BLOCK *****

"""
    CommonJS SecurableModule standard compliance tests for Pydertron.
"""

import os
import sys

import pydermonkey
from pydertron import JsSandbox, jsexposed
from pydertron import LocalFileSystem, HttpFileSystem

def run_test(name, fs):
    sandbox = JsSandbox(fs)
    stats = {'pass': 0, 'fail': 0, 'info': 0}

    @jsexposed(name='print')
    def jsprint(message, label):
        stats[label] += 1
        print "%s %s" % (message, label)

    sandbox.set_globals(
        sys = sandbox.new_object(**{'print': jsprint}),
        environment = sandbox.new_object()
        )

    retval = sandbox.run_script("require('program')")
    sandbox.finish()
    print

    if retval != 0:
        stats['fail'] += 1
    return stats

if __name__ == '__main__':
    base_libpath = os.path.join("interoperablejs-read-only",
                                "compliance")

    if len(sys.argv) == 2 and sys.argv[1] == '--with-http':
        with_http = True
    else:
        with_http = False

    if not os.path.exists(base_libpath) and not with_http:
        print "Please run the following command and then re-run "
        print "this script:"
        print
        print ("svn checkout "
               "http://interoperablejs.googlecode.com/svn/trunk/ "
               "interoperablejs-read-only")
        print
        print "Alternatively, run this script with the '--with-http' "
        print "option to run the tests over http."
        sys.exit(1)

    BASE_URL = "http://interoperablejs.googlecode.com/svn/trunk/compliance/"

    if with_http:
        names = ['absolute', 'cyclic', 'determinism', 'exactExports',
                 'hasOwnProperty', 'method', 'missing', 'monkeys',
                 'nested', 'reflexive', 'relative', 'transitive']
        dirs = [("%s%s/"% (BASE_URL, name), name)
                for name in names]
        fsfactory = HttpFileSystem
    else:
        dirs = [(os.path.join(base_libpath, name), name)
                for name in os.listdir(base_libpath)
                if name not in ['.svn', 'ORACLE']]
        fsfactory = LocalFileSystem

    totals = {'pass': 0, 'fail': 0}

    for libpath, name in dirs:
        fs = fsfactory(libpath)
        stats = run_test(name, fs)
        totals['pass'] += stats['pass']
        totals['fail'] += stats['fail']

    print "passed: %(pass)d  failed: %(fail)d" % totals

    import gc
    gc.collect()
    if pydermonkey.get_debug_info()['runtime_count']:
        sys.stderr.write("WARNING: JS runtime was not destroyed.\n")

    sys.exit(totals['fail'])