blob: 918e6aa34cb3114b6214facb3df0e31d8f33bb37 [file] [log] [blame]
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
#
import concurrent.futures
from json import dumps
import os
import ssl
import pytest
import logging
import queue
from gremlin_python.driver import serializer
from gremlin_python.driver.client import Client
from gremlin_python.driver.connection import Connection
from gremlin_python.driver.driver_remote_connection import DriverRemoteConnection
from gremlin_python.driver.protocol import GremlinServerHTTPProtocol
from gremlin_python.driver.serializer import GraphBinarySerializersV4
from gremlin_python.driver.aiohttp.transport import AiohttpHTTPTransport
from gremlin_python.driver.auth import basic, sigv4
"""HTTP server testing variables"""
gremlin_server_url = os.environ.get('GREMLIN_SERVER_URL', 'http://localhost:{}/gremlin')
gremlin_basic_auth_url = os.environ.get('GREMLIN_SERVER_BASIC_AUTH_URL', 'https://localhost:{}/gremlin')
anonymous_url = gremlin_server_url.format(45940)
basic_url = gremlin_basic_auth_url.format(45941)
verbose_logging = False
logging.basicConfig(format='%(asctime)s [%(levelname)8s] [%(filename)15s:%(lineno)d - %(funcName)10s()] - %(message)s',
level=logging.DEBUG if verbose_logging else logging.INFO)
"""
Tests below are for the HTTP server with GraphBinaryV4
"""
@pytest.fixture
def connection(request):
protocol = GremlinServerHTTPProtocol(
GraphBinarySerializersV4(), GraphBinarySerializersV4(),
auth=basic('stephen', 'password'))
executor = concurrent.futures.ThreadPoolExecutor(5)
pool = queue.Queue()
try:
conn = Connection(anonymous_url, 'gmodern', protocol,
lambda: AiohttpHTTPTransport(), executor, pool)
except OSError:
executor.shutdown()
pytest.skip('Gremlin Server is not running')
else:
def fin():
executor.shutdown()
conn.close()
request.addfinalizer(fin)
return conn
@pytest.fixture
def client(request):
try:
client = Client(anonymous_url, 'gmodern')
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
client.close()
request.addfinalizer(fin)
return client
@pytest.fixture(params=['basic'])
def authenticated_client(request):
try:
if request.param == 'basic':
# turn off certificate verification for testing purposes only
ssl_opts = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
ssl_opts.verify_mode = ssl.CERT_NONE
client = Client(basic_url, 'gmodern',
auth=basic('stephen', 'password'),
transport_factory=lambda: AiohttpHTTPTransport(ssl_options=ssl_opts))
else:
raise ValueError("Invalid authentication option - " + request.param)
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
client.close()
request.addfinalizer(fin)
return client
@pytest.fixture
def graphbinary_serializer_v4(request):
return GraphBinarySerializersV4()
@pytest.fixture(params=['graphbinaryv4','graphsonv4'])
def remote_connection(request):
try:
if request.param == 'graphbinaryv4':
remote_conn = DriverRemoteConnection(anonymous_url, 'gmodern',
request_serializer=serializer.GraphBinarySerializersV4(),
response_serializer=serializer.GraphBinarySerializersV4())
elif request.param == 'graphsonv4':
remote_conn = DriverRemoteConnection(anonymous_url, 'gmodern',
request_serializer=serializer.GraphSONSerializersV4(),
response_serializer=serializer.GraphSONSerializersV4())
else:
raise ValueError("Invalid serializer option - " + request.param)
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
remote_conn.close()
request.addfinalizer(fin)
return remote_conn
@pytest.fixture(params=['graphbinaryv4','graphsonv4'])
def remote_connection_crew(request):
try:
if request.param == 'graphbinaryv4':
remote_conn = DriverRemoteConnection(anonymous_url, 'gcrew')
elif request.param == 'graphsonv4':
remote_conn = DriverRemoteConnection(anonymous_url, 'gcrew',
request_serializer=serializer.GraphSONSerializersV4(),
response_serializer=serializer.GraphSONSerializersV4())
else:
raise ValueError("Invalid serializer option - " + request.param)
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
remote_conn.close()
request.addfinalizer(fin)
return remote_conn
# TODO: revisit once testing for multiple types of auth is enabled
@pytest.fixture(params=['basic'])
def remote_connection_authenticated(request):
try:
if request.param == 'basic':
# turn off certificate verification for testing purposes only
ssl_opts = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
ssl_opts.verify_mode = ssl.CERT_NONE
remote_conn = DriverRemoteConnection(basic_url, 'gmodern',
auth=basic('stephen', 'password'),
transport_factory=lambda: AiohttpHTTPTransport(ssl_options=ssl_opts))
else:
raise ValueError("Invalid authentication option - " + request.param)
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
remote_conn.close()
request.addfinalizer(fin)
return remote_conn
@pytest.fixture(params=['graphbinaryv4'])
def invalid_alias_remote_connection(request):
try:
if request.param == 'graphbinaryv4':
remote_conn = DriverRemoteConnection(anonymous_url, 'does_not_exist')
else:
raise ValueError("Invalid serializer option - " + request.param)
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
remote_conn.close()
request.addfinalizer(fin)
return remote_conn
@pytest.fixture()
def remote_connection_with_interceptor(request):
try:
remote_conn = DriverRemoteConnection(anonymous_url, 'gmodern',
request_serializer=None,
interceptors=json_interceptor)
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
remote_conn.close()
request.addfinalizer(fin)
return remote_conn
@pytest.fixture()
def client_with_interceptor(request):
try:
client = Client(anonymous_url, 'gmodern', request_serializer=None,
response_serializer=GraphBinarySerializersV4(),
interceptors=json_interceptor)
except OSError:
pytest.skip('Gremlin Server is not running')
else:
def fin():
client.close()
request.addfinalizer(fin)
return client
def json_interceptor(request):
request['headers']['content-type'] = "application/json"
request['payload'] = dumps({"gremlin": "g.inject(2)", "g": "g"})
return request