#!/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): fulldirname = os.path.join(FLAGS.sample_root, dirname) if dirname in FLAGS.samples_to_skip: logging.debug('Skipping ' + fulldirname + ' (blacklist)') continue 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)