diff --git a/runsamples.py b/runsamples.py new file mode 100644 index 0000000..ef559ee --- /dev/null +++ b/runsamples.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python +"""Execute all sample applications. + +Runs over all the sample applications, determines their type (App Engine, +Django, or a command-line application), and then runs them checking for a good +return status in the case of command-line applications and a 200 OK response in +the case of the App Engine and Django samples. +""" +import gflags +import httplib2 +import logging +import os +import signal +import subprocess +import sys +import time + +FLAGS = gflags.FLAGS + +gflags.DEFINE_list('samples_to_skip', ['latitude'], + 'A comma separated list of project directory names to be skipped.') + +gflags.DEFINE_enum('logging_level', 'INFO', + ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL'], + 'Set the level of logging detail.') + +gflags.DEFINE_string('app_engine_dir', '../google_appengine/', + 'Directory where Google App Engine is installed.') + +gflags.DEFINE_string('sample_root', 'samples/oauth2', + 'The root directory for all the samples.') + + +def main(argv): + try: + argv = FLAGS(argv) + except gflags.FlagsError, e: + print '%s\\nUsage: %s ARGS\\n%s' % (e, argv[0], FLAGS) + sys.exit(1) + + logging.getLogger().setLevel(getattr(logging, FLAGS.logging_level)) + + for dirname in os.listdir(FLAGS.sample_root): + if dirname in FLAGS.samples_to_skip: + logging.debug('Skipping ' + fulldirname + ' (blacklist)') + continue + fulldirname = os.path.join(FLAGS.sample_root, dirname) + filelist = os.listdir(fulldirname) + if 'settings.py' in filelist and 'manage.py' in filelist: + logging.info(fulldirname + ' [Django]') + proc = subprocess.Popen( + [os.path.join(fulldirname, 'manage.py'), + 'runserver']) + # Now just wait, because Django actually spawns a sub-process that does + # the I/O and does something funky with stdout so we can't read it and + # figure out when it is started. + time.sleep(3) + h = httplib2.Http() + resp, content = h.request('http://localhost:8000/') + assert(200 == resp.status) + time.sleep(1) + logging.debug('Django ppid: %d', proc.pid) + # Find and kill the sub-process manage.py forked. + findpids = subprocess.Popen(['ps', '--ppid', str(proc.pid), 'o', 'pid',], + stdout=subprocess.PIPE) + for p in findpids.stdout.readlines(): + if 'PID' not in p: + os.kill(int(p), signal.SIGINT) + os.kill(proc.pid, signal.SIGINT) + proc.wait() + elif 'app.yaml' in filelist: + logging.info(fulldirname + ' [App Engine]') + proc = subprocess.Popen( + [os.path.join(FLAGS.app_engine_dir, 'dev_appserver.py'), + fulldirname], + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT) + line = proc.stdout.readline() + logging.debug('READ: ' + line) + while '] Running application' not in line: + line = proc.stdout.readline() + logging.debug('READ: ' + line) + h = httplib2.Http() + resp, content = h.request('http://localhost:8080/') + assert(200 == resp.status) + time.sleep(1) + os.kill(proc.pid, signal.SIGINT) + proc.wait() + else: + logging.info(fulldirname + ' [Command-line]') + for filename in os.listdir(fulldirname): + if filename.endswith('.py'): + logging.info('Running: ' + filename) + proc = subprocess.Popen(['python', + os.path.join(fulldirname, filename)]) + returncode = proc.wait() + assert(returncode == 0) + + +if __name__ == '__main__': + main(sys.argv) + diff --git a/samples/appengine/gflags.py b/samples/appengine/gflags.py new file mode 120000 index 0000000..5a2ff94 --- /dev/null +++ b/samples/appengine/gflags.py @@ -0,0 +1 @@ +../../gflags.py \ No newline at end of file diff --git a/samples/appengine/gflags_validators.py b/samples/appengine/gflags_validators.py new file mode 120000 index 0000000..25d8ce8 --- /dev/null +++ b/samples/appengine/gflags_validators.py @@ -0,0 +1 @@ +../../gflags_validators.py \ No newline at end of file