diff --git a/test/py/RunClientServer.py b/test/py/RunClientServer.py
index d5ebd6a..98ead43 100755
--- a/test/py/RunClientServer.py
+++ b/test/py/RunClientServer.py
@@ -37,13 +37,13 @@
 DEFAULT_LIBDIR_PY3 = os.path.join(ROOT_DIR, 'lib', 'py', 'build', 'lib')
 
 SCRIPTS = [
-  'FastbinaryTest.py',
-  'TestFrozen.py',
-  'TSimpleJSONProtocolTest.py',
-  'SerializationTest.py',
-  'TestEof.py',
-  'TestSyntax.py',
-  'TestSocket.py',
+    'FastbinaryTest.py',
+    'TestFrozen.py',
+    'TSimpleJSONProtocolTest.py',
+    'SerializationTest.py',
+    'TestEof.py',
+    'TestSyntax.py',
+    'TestSocket.py',
 ]
 FRAMED = ["TNonblockingServer"]
 SKIP_ZLIB = ['TNonblockingServer', 'THttpServer']
@@ -51,20 +51,20 @@
 EXTRA_DELAY = dict(TProcessPoolServer=5.5)
 
 PROTOS = [
-  'accel',
-  'binary',
-  'compact',
-  'json',
+    'accel',
+    'binary',
+    'compact',
+    'json',
 ]
 
 SERVERS = [
-  "TSimpleServer",
-  "TThreadedServer",
-  "TThreadPoolServer",
-  "TProcessPoolServer",
-  "TForkingServer",
-  "TNonblockingServer",
-  "THttpServer",
+    "TSimpleServer",
+    "TThreadedServer",
+    "TThreadPoolServer",
+    "TProcessPoolServer",
+    "TForkingServer",
+    "TNonblockingServer",
+    "THttpServer",
 ]
 
 
@@ -73,246 +73,246 @@
 
 
 def setup_pypath(libdir, gendir):
-  dirs = [libdir, gendir]
-  env = copy.deepcopy(os.environ)
-  pypath = env.get('PYTHONPATH', None)
-  if pypath:
-    dirs.append(pypath)
-  env['PYTHONPATH'] = ':'.join(dirs)
-  if gendir.endswith('gen-py-no_utf8strings'):
-    env['THRIFT_TEST_PY_NO_UTF8STRINGS'] = '1'
-  return env
+    dirs = [libdir, gendir]
+    env = copy.deepcopy(os.environ)
+    pypath = env.get('PYTHONPATH', None)
+    if pypath:
+        dirs.append(pypath)
+    env['PYTHONPATH'] = ':'.join(dirs)
+    if gendir.endswith('gen-py-no_utf8strings'):
+        env['THRIFT_TEST_PY_NO_UTF8STRINGS'] = '1'
+    return env
 
 
 def runScriptTest(libdir, genbase, genpydir, script):
-  env = setup_pypath(libdir, os.path.join(genbase, genpydir))
-  script_args = [sys.executable, relfile(script)]
-  print('\nTesting script: %s\n----' % (' '.join(script_args)))
-  ret = subprocess.call(script_args, env=env)
-  if ret != 0:
-    print('*** FAILED ***', file=sys.stderr)
-    print('LIBDIR: %s' % libdir, file=sys.stderr)
-    print('PY_GEN: %s' % genpydir, file=sys.stderr)
-    print('SCRIPT: %s' % script, file=sys.stderr)
-    raise Exception("Script subprocess failed, retcode=%d, args: %s" % (ret, ' '.join(script_args)))
+    env = setup_pypath(libdir, os.path.join(genbase, genpydir))
+    script_args = [sys.executable, relfile(script)]
+    print('\nTesting script: %s\n----' % (' '.join(script_args)))
+    ret = subprocess.call(script_args, env=env)
+    if ret != 0:
+        print('*** FAILED ***', file=sys.stderr)
+        print('LIBDIR: %s' % libdir, file=sys.stderr)
+        print('PY_GEN: %s' % genpydir, file=sys.stderr)
+        print('SCRIPT: %s' % script, file=sys.stderr)
+        raise Exception("Script subprocess failed, retcode=%d, args: %s" % (ret, ' '.join(script_args)))
 
 
 def runServiceTest(libdir, genbase, genpydir, server_class, proto, port, use_zlib, use_ssl, verbose):
-  env = setup_pypath(libdir, os.path.join(genbase, genpydir))
-  # Build command line arguments
-  server_args = [sys.executable, relfile('TestServer.py')]
-  cli_args = [sys.executable, relfile('TestClient.py')]
-  for which in (server_args, cli_args):
-    which.append('--protocol=%s' % proto)  # accel, binary, compact or json
-    which.append('--port=%d' % port)  # default to 9090
-    if use_zlib:
-      which.append('--zlib')
-    if use_ssl:
-      which.append('--ssl')
-    if verbose == 0:
-      which.append('-q')
-    if verbose == 2:
-      which.append('-v')
-  # server-specific option to select server class
-  server_args.append(server_class)
-  # client-specific cmdline options
-  if server_class in FRAMED:
-    cli_args.append('--transport=framed')
-  else:
-     cli_args.append('--transport=buffered')
-  if server_class == 'THttpServer':
-    cli_args.append('--http=/')
-  if verbose > 0:
-    print('Testing server %s: %s' % (server_class, ' '.join(server_args)))
-  serverproc = subprocess.Popen(server_args, env=env)
-
-  def ensureServerAlive():
-    if serverproc.poll() is not None:
-      print(('FAIL: Server process (%s) failed with retcode %d')
-            % (' '.join(server_args), serverproc.returncode))
-      raise Exception('Server subprocess %s died, args: %s'
-                      % (server_class, ' '.join(server_args)))
-
-  # Wait for the server to start accepting connections on the given port.
-  sock = socket.socket()
-  sleep_time = 0.1  # Seconds
-  max_attempts = 100
-  try:
-    attempt = 0
-    while sock.connect_ex(('127.0.0.1', port)) != 0:
-      attempt += 1
-      if attempt >= max_attempts:
-        raise Exception("TestServer not ready on port %d after %.2f seconds"
-                        % (port, sleep_time * attempt))
-      ensureServerAlive()
-      time.sleep(sleep_time)
-  finally:
-    sock.close()
-
-  try:
+    env = setup_pypath(libdir, os.path.join(genbase, genpydir))
+    # Build command line arguments
+    server_args = [sys.executable, relfile('TestServer.py')]
+    cli_args = [sys.executable, relfile('TestClient.py')]
+    for which in (server_args, cli_args):
+        which.append('--protocol=%s' % proto)  # accel, binary, compact or json
+        which.append('--port=%d' % port)  # default to 9090
+        if use_zlib:
+            which.append('--zlib')
+        if use_ssl:
+            which.append('--ssl')
+        if verbose == 0:
+            which.append('-q')
+        if verbose == 2:
+            which.append('-v')
+    # server-specific option to select server class
+    server_args.append(server_class)
+    # client-specific cmdline options
+    if server_class in FRAMED:
+        cli_args.append('--transport=framed')
+    else:
+        cli_args.append('--transport=buffered')
+    if server_class == 'THttpServer':
+        cli_args.append('--http=/')
     if verbose > 0:
-      print('Testing client: %s' % (' '.join(cli_args)))
-    ret = subprocess.call(cli_args, env=env)
-    if ret != 0:
-      print('*** FAILED ***', file=sys.stderr)
-      print('LIBDIR: %s' % libdir, file=sys.stderr)
-      print('PY_GEN: %s' % genpydir, file=sys.stderr)
-      raise Exception("Client subprocess failed, retcode=%d, args: %s" % (ret, ' '.join(cli_args)))
-  finally:
-    # check that server didn't die
-    ensureServerAlive()
-    extra_sleep = EXTRA_DELAY.get(server_class, 0)
-    if extra_sleep > 0 and verbose > 0:
-      print('Giving %s (proto=%s,zlib=%s,ssl=%s) an extra %d seconds for child'
-            'processes to terminate via alarm'
-            % (server_class, proto, use_zlib, use_ssl, extra_sleep))
-      time.sleep(extra_sleep)
-    os.kill(serverproc.pid, signal.SIGKILL)
-    serverproc.wait()
+        print('Testing server %s: %s' % (server_class, ' '.join(server_args)))
+    serverproc = subprocess.Popen(server_args, env=env)
+
+    def ensureServerAlive():
+        if serverproc.poll() is not None:
+            print(('FAIL: Server process (%s) failed with retcode %d')
+                  % (' '.join(server_args), serverproc.returncode))
+            raise Exception('Server subprocess %s died, args: %s'
+                            % (server_class, ' '.join(server_args)))
+
+    # Wait for the server to start accepting connections on the given port.
+    sock = socket.socket()
+    sleep_time = 0.1  # Seconds
+    max_attempts = 100
+    try:
+        attempt = 0
+        while sock.connect_ex(('127.0.0.1', port)) != 0:
+            attempt += 1
+            if attempt >= max_attempts:
+                raise Exception("TestServer not ready on port %d after %.2f seconds"
+                                % (port, sleep_time * attempt))
+            ensureServerAlive()
+            time.sleep(sleep_time)
+    finally:
+        sock.close()
+
+    try:
+        if verbose > 0:
+            print('Testing client: %s' % (' '.join(cli_args)))
+        ret = subprocess.call(cli_args, env=env)
+        if ret != 0:
+            print('*** FAILED ***', file=sys.stderr)
+            print('LIBDIR: %s' % libdir, file=sys.stderr)
+            print('PY_GEN: %s' % genpydir, file=sys.stderr)
+            raise Exception("Client subprocess failed, retcode=%d, args: %s" % (ret, ' '.join(cli_args)))
+    finally:
+        # check that server didn't die
+        ensureServerAlive()
+        extra_sleep = EXTRA_DELAY.get(server_class, 0)
+        if extra_sleep > 0 and verbose > 0:
+            print('Giving %s (proto=%s,zlib=%s,ssl=%s) an extra %d seconds for child'
+                  'processes to terminate via alarm'
+                  % (server_class, proto, use_zlib, use_ssl, extra_sleep))
+            time.sleep(extra_sleep)
+        os.kill(serverproc.pid, signal.SIGKILL)
+        serverproc.wait()
 
 
 class TestCases(object):
-  def __init__(self, genbase, libdir, port, gendirs, servers, verbose):
-    self.genbase = genbase
-    self.libdir = libdir
-    self.port = port
-    self.verbose = verbose
-    self.gendirs = gendirs
-    self.servers = servers
+    def __init__(self, genbase, libdir, port, gendirs, servers, verbose):
+        self.genbase = genbase
+        self.libdir = libdir
+        self.port = port
+        self.verbose = verbose
+        self.gendirs = gendirs
+        self.servers = servers
 
-  def default_conf(self):
-    return {
-      'gendir': self.gendirs[0],
-      'server': self.servers[0],
-      'proto': PROTOS[0],
-      'zlib': False,
-      'ssl': False,
-    }
+    def default_conf(self):
+        return {
+            'gendir': self.gendirs[0],
+            'server': self.servers[0],
+            'proto': PROTOS[0],
+            'zlib': False,
+            'ssl': False,
+        }
 
-  def run(self, conf, test_count):
-    with_zlib = conf['zlib']
-    with_ssl = conf['ssl']
-    try_server = conf['server']
-    try_proto = conf['proto']
-    genpydir = conf['gendir']
-    # skip any servers that don't work with the Zlib transport
-    if with_zlib and try_server in SKIP_ZLIB:
-      return False
-    # skip any servers that don't work with SSL
-    if with_ssl and try_server in SKIP_SSL:
-      return False
-    if self.verbose > 0:
-      print('\nTest run #%d:  (includes %s) Server=%s,  Proto=%s,  zlib=%s,  SSL=%s'
-            % (test_count, genpydir, try_server, try_proto, with_zlib, with_ssl))
-    runServiceTest(self.libdir, self.genbase, genpydir, try_server, try_proto, self.port, with_zlib, with_ssl, self.verbose)
-    if self.verbose > 0:
-      print('OK: Finished (includes %s)  %s / %s proto / zlib=%s / SSL=%s.   %d combinations tested.'
-            % (genpydir, try_server, try_proto, with_zlib, with_ssl, test_count))
-    return True
+    def run(self, conf, test_count):
+        with_zlib = conf['zlib']
+        with_ssl = conf['ssl']
+        try_server = conf['server']
+        try_proto = conf['proto']
+        genpydir = conf['gendir']
+        # skip any servers that don't work with the Zlib transport
+        if with_zlib and try_server in SKIP_ZLIB:
+            return False
+        # skip any servers that don't work with SSL
+        if with_ssl and try_server in SKIP_SSL:
+            return False
+        if self.verbose > 0:
+            print('\nTest run #%d:  (includes %s) Server=%s,  Proto=%s,  zlib=%s,  SSL=%s'
+                  % (test_count, genpydir, try_server, try_proto, with_zlib, with_ssl))
+        runServiceTest(self.libdir, self.genbase, genpydir, try_server, try_proto, self.port, with_zlib, with_ssl, self.verbose)
+        if self.verbose > 0:
+            print('OK: Finished (includes %s)  %s / %s proto / zlib=%s / SSL=%s.   %d combinations tested.'
+                  % (genpydir, try_server, try_proto, with_zlib, with_ssl, test_count))
+        return True
 
-  def test_feature(self, name, values):
-    test_count = 0
-    conf = self.default_conf()
-    for try_server in values:
-      conf[name] = try_server
-      if self.run(conf, test_count):
-        test_count += 1
-    return test_count
+    def test_feature(self, name, values):
+        test_count = 0
+        conf = self.default_conf()
+        for try_server in values:
+            conf[name] = try_server
+            if self.run(conf, test_count):
+                test_count += 1
+        return test_count
 
-  def run_all_tests(self):
-    test_count = 0
-    for try_server in self.servers:
-      for genpydir in self.gendirs:
-        for try_proto in PROTOS:
-          for with_zlib in (False, True):
-            # skip any servers that don't work with the Zlib transport
-            if with_zlib and try_server in SKIP_ZLIB:
-              continue
-            for with_ssl in (False, True):
-              # skip any servers that don't work with SSL
-              if with_ssl and try_server in SKIP_SSL:
-                continue
-              test_count += 1
-              if self.verbose > 0:
-                print('\nTest run #%d:  (includes %s) Server=%s,  Proto=%s,  zlib=%s,  SSL=%s'
-                      % (test_count, genpydir, try_server, try_proto, with_zlib, with_ssl))
-              runServiceTest(self.libdir, self.genbase, genpydir, try_server, try_proto, self.port, with_zlib, with_ssl)
-              if self.verbose > 0:
-                print('OK: Finished (includes %s)  %s / %s proto / zlib=%s / SSL=%s.   %d combinations tested.'
-                      % (genpydir, try_server, try_proto, with_zlib, with_ssl, test_count))
-    return test_count
+    def run_all_tests(self):
+        test_count = 0
+        for try_server in self.servers:
+            for genpydir in self.gendirs:
+                for try_proto in PROTOS:
+                    for with_zlib in (False, True):
+                        # skip any servers that don't work with the Zlib transport
+                        if with_zlib and try_server in SKIP_ZLIB:
+                            continue
+                        for with_ssl in (False, True):
+                            # skip any servers that don't work with SSL
+                            if with_ssl and try_server in SKIP_SSL:
+                                continue
+                            test_count += 1
+                            if self.verbose > 0:
+                                print('\nTest run #%d:  (includes %s) Server=%s,  Proto=%s,  zlib=%s,  SSL=%s'
+                                      % (test_count, genpydir, try_server, try_proto, with_zlib, with_ssl))
+                            runServiceTest(self.libdir, self.genbase, genpydir, try_server, try_proto, self.port, with_zlib, with_ssl)
+                            if self.verbose > 0:
+                                print('OK: Finished (includes %s)  %s / %s proto / zlib=%s / SSL=%s.   %d combinations tested.'
+                                      % (genpydir, try_server, try_proto, with_zlib, with_ssl, test_count))
+        return test_count
 
 
 def default_libdir():
-  if sys.version_info[0] == 2:
-    return glob.glob(DEFAULT_LIBDIR_GLOB)[0]
-  else:
-    return DEFAULT_LIBDIR_PY3
+    if sys.version_info[0] == 2:
+        return glob.glob(DEFAULT_LIBDIR_GLOB)[0]
+    else:
+        return DEFAULT_LIBDIR_PY3
 
 
 def main():
-  parser = OptionParser()
-  parser.add_option('--all', action="store_true", dest='all')
-  parser.add_option('--genpydirs', type='string', dest='genpydirs',
-                    default='default,slots,oldstyle,no_utf8strings,dynamic,dynamicslots',
-                    help='directory extensions for generated code, used as suffixes for \"gen-py-*\" added sys.path for individual tests')
-  parser.add_option("--port", type="int", dest="port", default=9090,
-                    help="port number for server to listen on")
-  parser.add_option('-v', '--verbose', action="store_const",
-                    dest="verbose", const=2,
-                    help="verbose output")
-  parser.add_option('-q', '--quiet', action="store_const",
-                    dest="verbose", const=0,
-                    help="minimal output")
-  parser.add_option('-L', '--libdir', dest="libdir", default=default_libdir(),
-                    help="directory path that contains Thrift Python library")
-  parser.add_option('--gen-base', dest="gen_base", default=SCRIPT_DIR,
-                    help="directory path that contains Thrift Python library")
-  parser.set_defaults(verbose=1)
-  options, args = parser.parse_args()
+    parser = OptionParser()
+    parser.add_option('--all', action="store_true", dest='all')
+    parser.add_option('--genpydirs', type='string', dest='genpydirs',
+                      default='default,slots,oldstyle,no_utf8strings,dynamic,dynamicslots',
+                      help='directory extensions for generated code, used as suffixes for \"gen-py-*\" added sys.path for individual tests')
+    parser.add_option("--port", type="int", dest="port", default=9090,
+                      help="port number for server to listen on")
+    parser.add_option('-v', '--verbose', action="store_const",
+                      dest="verbose", const=2,
+                      help="verbose output")
+    parser.add_option('-q', '--quiet', action="store_const",
+                      dest="verbose", const=0,
+                      help="minimal output")
+    parser.add_option('-L', '--libdir', dest="libdir", default=default_libdir(),
+                      help="directory path that contains Thrift Python library")
+    parser.add_option('--gen-base', dest="gen_base", default=SCRIPT_DIR,
+                      help="directory path that contains Thrift Python library")
+    parser.set_defaults(verbose=1)
+    options, args = parser.parse_args()
 
-  generated_dirs = []
-  for gp_dir in options.genpydirs.split(','):
-    generated_dirs.append('gen-py-%s' % (gp_dir))
+    generated_dirs = []
+    for gp_dir in options.genpydirs.split(','):
+        generated_dirs.append('gen-py-%s' % (gp_dir))
 
-  # commandline permits a single class name to be specified to override SERVERS=[...]
-  servers = SERVERS
-  if len(args) == 1:
-    if args[0] in SERVERS:
-      servers = args
+    # commandline permits a single class name to be specified to override SERVERS=[...]
+    servers = SERVERS
+    if len(args) == 1:
+        if args[0] in SERVERS:
+            servers = args
+        else:
+            print('Unavailable server type "%s", please choose one of: %s' % (args[0], servers))
+            sys.exit(0)
+
+    tests = TestCases(options.gen_base, options.libdir, options.port, generated_dirs, servers, options.verbose)
+
+    # run tests without a client/server first
+    print('----------------')
+    print(' Executing individual test scripts with various generated code directories')
+    print(' Directories to be tested: ' + ', '.join(generated_dirs))
+    print(' Scripts to be tested: ' + ', '.join(SCRIPTS))
+    print('----------------')
+    for genpydir in generated_dirs:
+        for script in SCRIPTS:
+            runScriptTest(options.libdir, options.gen_base, genpydir, script)
+
+    print('----------------')
+    print(' Executing Client/Server tests with various generated code directories')
+    print(' Servers to be tested: ' + ', '.join(servers))
+    print(' Directories to be tested: ' + ', '.join(generated_dirs))
+    print(' Protocols to be tested: ' + ', '.join(PROTOS))
+    print(' Options to be tested: ZLIB(yes/no), SSL(yes/no)')
+    print('----------------')
+
+    if options.all:
+        tests.run_all_tests()
     else:
-      print('Unavailable server type "%s", please choose one of: %s' % (args[0], servers))
-      sys.exit(0)
-
-  tests = TestCases(options.gen_base, options.libdir, options.port, generated_dirs, servers, options.verbose)
-
-  # run tests without a client/server first
-  print('----------------')
-  print(' Executing individual test scripts with various generated code directories')
-  print(' Directories to be tested: ' + ', '.join(generated_dirs))
-  print(' Scripts to be tested: ' + ', '.join(SCRIPTS))
-  print('----------------')
-  for genpydir in generated_dirs:
-    for script in SCRIPTS:
-      runScriptTest(options.libdir, options.gen_base, genpydir, script)
-
-  print('----------------')
-  print(' Executing Client/Server tests with various generated code directories')
-  print(' Servers to be tested: ' + ', '.join(servers))
-  print(' Directories to be tested: ' + ', '.join(generated_dirs))
-  print(' Protocols to be tested: ' + ', '.join(PROTOS))
-  print(' Options to be tested: ZLIB(yes/no), SSL(yes/no)')
-  print('----------------')
-
-  if options.all:
-    tests.run_all_tests()
-  else:
-    tests.test_feature('gendir', generated_dirs)
-    tests.test_feature('server', servers)
-    tests.test_feature('proto', PROTOS)
-    tests.test_feature('zlib', [False, True])
-    tests.test_feature('ssl', [False, True])
+        tests.test_feature('gendir', generated_dirs)
+        tests.test_feature('server', servers)
+        tests.test_feature('proto', PROTOS)
+        tests.test_feature('zlib', [False, True])
+        tests.test_feature('ssl', [False, True])
 
 
 if __name__ == '__main__':
-  sys.exit(main())
+    sys.exit(main())
