普通文本  |  78行  |  2.56 KB

# Copyright (c) 2016 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import sys
import urllib2
from multiprocessing import Process

from autotest_lib.client.bin import utils

policy_testserver = None


class FakeDMServer(object):
    """Utility class for policy tests."""

    def __init__(self, proto_path):
        """
        Import the DM testserver from chrome source.

        @param proto_path: location of proto files.

        """
        self.server_url = None
        telemetry_src = '/usr/local/telemetry/src'
        for path in ['chrome/browser/policy/test',
                     'net/tools/testserver',
                     'third_party/protobuf/python/google',
                     'third_party/tlslite']:
            sys.path.append(os.path.join(telemetry_src, path))
        sys.path.append(proto_path)
        global policy_testserver
        import policy_testserver

    def start(self, tmpdir, debugdir):
        """
        Start the local DM testserver.

        @param tmpdir: location of the Autotest tmp dir.
        @param debugdir: location of the Autotest debug directory.

        """
        policy_server_runner = policy_testserver.PolicyServerRunner()
        self._policy_location = os.path.join(tmpdir, 'policy.json')
        port = utils.get_unused_port()
        # The first argument is always ignored since it is expected to be the
        # path to the executable. Hence passing an empty string for first
        # argument.
        sys.argv = ['',
                    '--config-file=%s' % self._policy_location,
                    '--host=127.0.0.1',
                    '--log-file=%s/dm_server.log' % debugdir,
                    '--log-level=DEBUG',
                    '--port=%d' % port

                   ]
        self.process = Process(target=policy_server_runner.main)
        self.process.start()
        self.server_url = 'http://127.0.0.1:%d/' % port

    def stop(self):
        """Terminate the fake DM server instance."""
        if urllib2.urlopen('%stest/ping' % self.server_url).getcode() == 200:
            urllib2.urlopen('%sconfiguration/test/exit' % self.server_url)
        if self.process.is_alive():
            self.process.join()

    def setup_policy(self, policy_blob):
        """
        Write policy blob to file used by the DM server to read policy.

        @param policy_blob: JSON policy blob to be written to the policy file.

        """
        with open(self._policy_location, 'w') as f:
            f.write(policy_blob)