def __init__(self,
                 protocol,
                 host,
                 port,
                 product,
                 endpoint,
                 auto_handle_connection=True,
                 session_token=None):
        # Import only if necessary; some tests may not add this to PYTHONPATH.
        from codechecker_api.codeCheckerDBAccess_v6 import codeCheckerDBAccess
        from codechecker_api.codeCheckerDBAccess_v6.constants \
            import MAX_QUERY_SIZE
        from codechecker_client.credential_manager import SESSION_COOKIE_NAME

        self.max_query_size = MAX_QUERY_SIZE
        url = create_product_url(protocol, host, port,
                                 '/' + product + '/v' + VERSION + endpoint)
        print("Setup viewer client: " + url)
        transport = THttpClient.THttpClient(url)
        protocol = TJSONProtocol.TJSONProtocol(transport)
        client = codeCheckerDBAccess.Client(protocol)
        if session_token:
            headers = {'Cookie': SESSION_COOKIE_NAME + '=' + session_token}
            transport.setCustomHeaders(headers)
        super(CCViewerHelper, self).__init__(transport, client,
                                             auto_handle_connection)
Exemplo n.º 2
0
    def __init__(self,
                 protocol,
                 host,
                 port,
                 uri,
                 session_token=None,
                 get_new_token=None):
        """
        @param get_new_token: a function which can generate a new token.
        """
        self.__host = host
        self.__port = port
        url = create_product_url(protocol, host, port, uri)

        self.transport = None

        try:
            self.transport = THttpClient.THttpClient(url)
        except ValueError:
            # Initalizing THttpClient may raise an exception if proxy settings
            # are used but the port number is not a valid integer.
            pass

        # Thrift do not handle the use case when invalid proxy format is
        # used (e.g.: no schema is specified). For this reason we need to
        # verify the proxy format in our side.
        self._validate_proxy_format()

        self.protocol = TJSONProtocol.TJSONProtocol(self.transport)
        self.client = None

        self.get_new_token = get_new_token
        self._set_token(session_token)
Exemplo n.º 3
0
def add_test_package_product(server_data,
                             test_folder,
                             check_env=None,
                             protocol='http'):
    """
    Add a product for a test suite to the server provided by server_data.
    Server must be running before called.

    server_data must contain three keys: viewer_{host, port, product}.
    """

    if not check_env:
        check_env = env.test_env(test_folder)

    codechecker_cfg = {'check_env': check_env}
    codechecker_cfg.update(server_data)

    # Clean the previous session if any exists.
    logout(codechecker_cfg, test_folder, protocol)

    url = create_product_url(protocol, server_data['viewer_host'],
                             str(server_data['viewer_port']), '')

    add_command = [
        'CodeChecker', 'cmd', 'products', 'add', server_data['viewer_product'],
        '--url', url, '--name',
        os.path.basename(test_folder), '--description',
        "Automatically created product for test."
    ]

    # If tests are running on postgres, we need to create a database.
    pg_config = env.get_postgresql_cfg()
    if pg_config:
        env.add_database(server_data['viewer_product'], check_env)

        add_command.append('--postgresql')
        pg_config['dbname'] = server_data['viewer_product']
        add_command += _pg_db_config_to_cmdline_params(pg_config)
    else:
        # SQLite databases are put under the workspace of the appropriate test.
        add_command += ['--sqlite', os.path.join(test_folder, 'data.sqlite')]

    print(' '.join(add_command))

    # Authenticate as SUPERUSER to be able to create the product.
    login(codechecker_cfg, test_folder, "root", "root", protocol)
    # The schema creation is a synchronous call.
    returncode = subprocess.call(add_command, env=check_env)
    logout(codechecker_cfg, test_folder, protocol)

    # After login as SUPERUSER, continue running the test as a normal user.
    # login() saves the relevant administrative file
    login(codechecker_cfg, test_folder, "cc", "test", protocol)

    if returncode:
        raise Exception("Failed to add the product to the test server!")
Exemplo n.º 4
0
 def __init__(self, proto, host, port, uri, auto_handle_connection=True,
              session_token=None):
     # Import only if necessary; some tests may not add this to PYTHONPATH.
     from codechecker_api.Authentication_v6 import codeCheckerAuthentication
     from codechecker_client.credential_manager import SESSION_COOKIE_NAME
     url = create_product_url(proto, host, port, '/v' + VERSION + uri)
     transport = THttpClient.THttpClient(url)
     protocol = TJSONProtocol.TJSONProtocol(transport)
     client = codeCheckerAuthentication.Client(protocol)
     if session_token:
         headers = {'Cookie': SESSION_COOKIE_NAME + '=' + session_token}
         transport.setCustomHeaders(headers)
     super(CCAuthHelper, self).__init__(transport,
                                        client, auto_handle_connection)
Exemplo n.º 5
0
    def __init__(self, proto, host, port, uri, auto_handle_connection=True,
                 session_token=None):

        from codechecker_api.Configuration_v6 import configurationService
        from codechecker_client.credential_manager import SESSION_COOKIE_NAME

        full_uri = '/v' + VERSION + uri
        url = create_product_url(proto, host, port, full_uri)
        transport = THttpClient.THttpClient(url)
        protocol = TJSONProtocol.TJSONProtocol(transport)
        client = configurationService.Client(protocol)
        if session_token:
            headers = {'Cookie': SESSION_COOKIE_NAME + '=' + session_token}
            transport.setCustomHeaders(headers)
        super(CCConfigHelper, self).__init__(transport,
                                             client, auto_handle_connection)
Exemplo n.º 6
0
def remove_test_package_product(test_folder, check_env=None, protocol='http'):
    """
    Remove the product associated with the given test folder.
    The folder must exist, as the server configuration is read from the folder.
    """

    if not check_env:
        check_env = env.test_env(test_folder)

    server_data = env.import_test_cfg(test_folder)['codechecker_cfg']
    print(server_data)

    if 'check_env' not in server_data:
        server_data['check_env'] = check_env

    # Clean the previous session if any exists.
    logout(server_data, test_folder, protocol)
    url = create_product_url(protocol, server_data['viewer_host'],
                             str(server_data['viewer_port']), '')
    del_command = [
        'CodeChecker', 'cmd', 'products', 'del', server_data['viewer_product'],
        '--url', url
    ]

    print(' '.join(del_command))

    # Authenticate as SUPERUSER to be able to create the product.
    login(server_data, test_folder, "root", "root", protocol)
    returncode = subprocess.call(del_command,
                                 env=check_env,
                                 encoding="utf-8",
                                 errors="ignore")
    logout(server_data, test_folder, protocol)

    # If tests are running on postgres, we need to delete the database.
    # SQLite databases are deleted automatically as part of the
    # workspace removal.
    if env.get_postgresql_cfg():
        env.del_database(server_data['viewer_product'], check_env)

    if returncode:
        raise Exception("Failed to remove the product from the test server!")
Exemplo n.º 7
0
    def __init__(self,
                 protocol,
                 host,
                 port,
                 uri,
                 session_token=None,
                 get_new_token=None):
        """
        @param get_new_token: a function which can generate a new token.
        """
        self.__host = host
        self.__port = port
        url = create_product_url(protocol, host, port, uri)

        self.transport = THttpClient.THttpClient(url)
        self.protocol = TJSONProtocol.TJSONProtocol(self.transport)
        self.client = None

        self.get_new_token = get_new_token
        self._set_token(session_token)
Exemplo n.º 8
0
def add_test_package_product(server_data,
                             test_folder,
                             check_env=None,
                             protocol='http',
                             user_permissions=DEFAULT_USER_PERMISSIONS):
    """
    Add a product for a test suite to the server provided by server_data.
    Server must be running before called.

    server_data must contain three keys: viewer_{host, port, product}.
    """

    if not check_env:
        check_env = env.test_env(test_folder)

    codechecker_cfg = {'check_env': check_env}
    codechecker_cfg.update(server_data)

    # Clean the previous session if any exists.
    logout(codechecker_cfg, test_folder, protocol)

    url = create_product_url(protocol, server_data['viewer_host'],
                             str(server_data['viewer_port']), '')

    add_command = [
        'CodeChecker', 'cmd', 'products', 'add', server_data['viewer_product'],
        '--url', url, '--name',
        os.path.basename(test_folder), '--description',
        "Automatically created product for test.", '--verbose', 'debug'
    ]

    # If tests are running on postgres, we need to create a database.
    pg_config = env.get_postgresql_cfg()
    if pg_config:
        env.add_database(server_data['viewer_product'], check_env)

        add_command.append('--postgresql')
        pg_config['dbname'] = server_data['viewer_product']

        if os.environ.get('PGPASSWORD'):
            pg_config['dbpassword'] = os.environ['PGPASSWORD']

        add_command += _pg_db_config_to_cmdline_params(pg_config)
    else:
        # SQLite databases are put under the workspace of the appropriate test.
        add_command += ['--sqlite', os.path.join(test_folder, 'data.sqlite')]

    print(' '.join(add_command))

    # Authenticate as SUPERUSER to be able to create the product.
    login(codechecker_cfg, test_folder, "root", "root", protocol)
    # The schema creation is a synchronous call.
    returncode = subprocess.call(add_command,
                                 env=check_env,
                                 encoding="utf-8",
                                 errors="ignore")

    pr_client = env.setup_product_client(test_folder,
                                         product=server_data['viewer_product'],
                                         host=server_data['viewer_host'],
                                         port=server_data['viewer_port'])
    product_id = pr_client.getCurrentProduct().id

    # Setup an authentication client for creating sessions.
    auth_client = env.setup_auth_client(test_folder,
                                        host=server_data['viewer_host'],
                                        port=server_data['viewer_port'])

    extra_params = '{"productID":' + str(product_id) + '}'

    # Give permissions for the users.
    for user, permission in user_permissions:
        ret = auth_client.addPermission(permission, user, False, extra_params)
        if not ret:
            raise Exception("Failed to add permission to " + user)

    logout(codechecker_cfg, test_folder, protocol)

    # After login as SUPERUSER, continue running the test as a normal user.
    # login() saves the relevant administrative file
    login(codechecker_cfg, test_folder, "cc", "test", protocol)

    if returncode:
        raise Exception("Failed to add the product to the test server!")