1
|
|
|
# Copyright 2016 David M. Brown |
2
|
|
|
# |
3
|
|
|
# This file is part of Goblin. |
4
|
|
|
# |
5
|
|
|
# Goblin is free software: you can redistribute it and/or modify |
6
|
|
|
# it under the terms of the GNU Affero General Public License as published by |
7
|
|
|
# the Free Software Foundation, either version 3 of the License, or |
8
|
|
|
# (at your option) any later version. |
9
|
|
|
# |
10
|
|
|
# Goblin is distributed in the hope that it will be useful, |
11
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
12
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13
|
|
|
# GNU Affero General Public License for more details. |
14
|
|
|
# |
15
|
|
|
# You should have received a copy of the GNU Affero General Public License |
16
|
|
|
# along with Goblin. If not, see <http://www.gnu.org/licenses/>. |
17
|
|
|
import asyncio |
18
|
|
|
import pytest |
19
|
|
|
|
20
|
|
|
from aiogremlin.structure.graph import Graph |
21
|
|
|
from gremlin_python.process.traversal import T |
22
|
|
|
from aiogremlin import driver |
23
|
|
|
from aiogremlin.driver.provider import TinkerGraph |
24
|
|
|
from gremlin_python.driver import serializer |
25
|
|
|
from aiogremlin.remote.driver_remote_connection import DriverRemoteConnection |
26
|
|
|
|
27
|
|
|
|
28
|
|
|
# def pytest_generate_tests(metafunc): |
29
|
|
|
# if 'cluster' in metafunc.fixturenames: |
30
|
|
|
# metafunc.parametrize("cluster", ['c1', 'c2'], indirect=True) |
31
|
|
|
|
32
|
|
|
|
33
|
|
|
def pytest_addoption(parser): |
34
|
|
|
parser.addoption('--provider', default='tinkergraph', |
35
|
|
|
choices=('tinkergraph', 'dse',)) |
36
|
|
|
parser.addoption('--gremlin-host', default='gremlin-server') |
37
|
|
|
parser.addoption('--gremlin-port', default='8182') |
38
|
|
|
|
39
|
|
|
|
40
|
|
|
@pytest.fixture |
41
|
|
|
def provider(request): |
42
|
|
|
provider = request.config.getoption('provider') |
43
|
|
|
if provider == 'tinkergraph': |
44
|
|
|
return TinkerGraph |
45
|
|
|
elif provider == 'dse': |
46
|
|
|
try: |
47
|
|
|
import goblin_dse |
48
|
|
|
except ImportError: |
49
|
|
|
raise RuntimeError("Couldn't run tests with DSEGraph provider: the goblin_dse package " |
50
|
|
|
"must be installed") |
51
|
|
|
else: |
52
|
|
|
return goblin_dse.DSEGraph |
53
|
|
|
|
54
|
|
|
|
55
|
|
|
@pytest.fixture |
56
|
|
|
def aliases(request): |
57
|
|
|
if request.config.getoption('provider') == 'tinkergraph': |
58
|
|
|
return {'g': 'g'} |
59
|
|
|
elif request.config.getoption('provider') == 'dse': |
60
|
|
|
return {'g': 'testgraph.g'} |
61
|
|
|
|
62
|
|
|
|
63
|
|
|
@pytest.fixture |
64
|
|
|
def gremlin_server(): |
65
|
|
|
return driver.GremlinServer |
66
|
|
|
|
67
|
|
|
|
68
|
|
|
@pytest.fixture |
69
|
|
|
def unused_server_url(unused_tcp_port): |
70
|
|
|
return 'https://localhost:{}/gremlin'.format(unused_tcp_port) |
71
|
|
|
|
72
|
|
|
|
73
|
|
|
@pytest.fixture |
74
|
|
|
def gremlin_host(request): |
75
|
|
|
return request.config.getoption('gremlin_host') |
76
|
|
|
|
77
|
|
|
|
78
|
|
|
@pytest.fixture |
79
|
|
|
def gremlin_port(request): |
80
|
|
|
return request.config.getoption('gremlin_port') |
81
|
|
|
|
82
|
|
|
|
83
|
|
|
@pytest.fixture |
84
|
|
|
def gremlin_url(gremlin_host, gremlin_port): |
85
|
|
|
return "ws://{}:{}/gremlin".format(gremlin_host, gremlin_port) |
86
|
|
|
|
87
|
|
|
|
88
|
|
|
@pytest.fixture |
89
|
|
|
def connection(gremlin_url, event_loop, provider): |
90
|
|
|
try: |
91
|
|
|
conn = event_loop.run_until_complete( |
92
|
|
|
driver.Connection.open( |
93
|
|
|
gremlin_url, event_loop, |
94
|
|
|
message_serializer=serializer.GraphSONMessageSerializer, |
95
|
|
|
provider=provider |
96
|
|
|
)) |
97
|
|
|
except OSError: |
98
|
|
|
pytest.skip('Gremlin Server is not running') |
99
|
|
|
return conn |
100
|
|
|
|
101
|
|
|
|
102
|
|
|
@pytest.fixture |
103
|
|
|
def connection_pool(gremlin_url, event_loop, provider): |
104
|
|
|
return driver.ConnectionPool( |
105
|
|
|
gremlin_url, event_loop, None, '', '', 4, 1, 16, |
106
|
|
|
64, None, serializer.GraphSONMessageSerializer, provider=provider) |
107
|
|
|
|
108
|
|
|
|
109
|
|
|
@pytest.fixture |
110
|
|
|
def cluster(request, gremlin_host, gremlin_port, event_loop, provider, aliases): |
111
|
|
|
# if request.param == 'c1': |
112
|
|
|
cluster = driver.Cluster( |
113
|
|
|
event_loop, |
114
|
|
|
hosts=[gremlin_host], |
115
|
|
|
port=gremlin_port, |
116
|
|
|
aliases=aliases, |
117
|
|
|
message_serializer=serializer.GraphSONMessageSerializer, |
118
|
|
|
provider=provider |
119
|
|
|
) |
120
|
|
|
# elif request.param == 'c2': |
121
|
|
|
# cluster = driver.Cluster( |
122
|
|
|
# event_loop, |
123
|
|
|
# hosts=[gremlin_host], |
124
|
|
|
# port=gremlin_port, |
125
|
|
|
# aliases=aliases, |
126
|
|
|
# message_serializer=serializer.GraphSONMessageSerializer, |
127
|
|
|
# provider=provider |
128
|
|
|
# ) |
129
|
|
|
return cluster |
130
|
|
|
|
131
|
|
|
# TOOO FIX |
132
|
|
|
# @pytest.fixture |
133
|
|
|
# def remote_graph(): |
134
|
|
|
# return driver.AsyncGraph() |
135
|
|
|
|
136
|
|
|
# Class fixtures |
137
|
|
|
@pytest.fixture |
138
|
|
|
def cluster_class(event_loop): |
139
|
|
|
return driver.Cluster |
140
|
|
|
|
141
|
|
|
@pytest.fixture |
142
|
|
|
def remote_connection(event_loop, gremlin_url): |
143
|
|
|
try: |
144
|
|
|
remote_conn = event_loop.run_until_complete( |
145
|
|
|
DriverRemoteConnection.open(gremlin_url, 'g')) |
146
|
|
|
except OSError: |
147
|
|
|
pytest.skip('Gremlin Server is not running') |
148
|
|
|
else: |
149
|
|
|
return remote_conn |
150
|
|
|
|
151
|
|
View Code Duplication |
@pytest.fixture(autouse=True) |
|
|
|
|
152
|
|
|
def run_around_tests(remote_connection, event_loop): |
153
|
|
|
g = Graph().traversal().withRemote(remote_connection) |
154
|
|
|
|
155
|
|
|
async def create_graph(): |
156
|
|
|
await g.V().drop().iterate() |
157
|
|
|
software1 = await g.addV("software").property("name", "lop").property("lang", "java").property(T.id, 3).next() |
158
|
|
|
software2 = await g.addV("software").property("name", "ripple").property("lang", "java").property(T.id, 5).next() |
159
|
|
|
person1 = await g.addV("person").property("name", "marko").property("age", "29").property(T.id, 1).next() |
160
|
|
|
person2 = await g.addV("person").property("name", "vadas").property("age", "27").property(T.id, 2).next() |
161
|
|
|
person3 = await g.addV("person").property("name", "josh").property("age", "32").property(T.id, 4).next() |
162
|
|
|
person4 = await g.addV("person").property("name", "peter").property("age", "35").property(T.id, 6).next() |
163
|
|
|
|
164
|
|
|
knows1 = await g.addE("knows").from_(person1).to(person2).property("weight", 0.5).property(T.id, 7).next() |
165
|
|
|
knows2 = await g.addE("knows").from_(person1).to(person3).property("weight", 1,0).property(T.id, 8).next() |
166
|
|
|
created1 = await g.addE("created").from_(person1).to(software1).property("weight", 0.4).property(T.id, 9).next() |
167
|
|
|
created2 = await g.addE("created").from_(person3).to(software2).property("weight", 1.0).property(T.id, 10).next() |
168
|
|
|
created3 = await g.addE("created").from_(person3).to(software1).property("weight", 1.0).property(T.id, 11).next() |
169
|
|
|
created4 = await g.addE("created").from_(person4).to(software1).property("weight", 0.2).property(T.id, 12).next() |
170
|
|
|
|
171
|
|
|
event_loop.run_until_complete(create_graph()) |
172
|
|
|
|
173
|
|
|
yield |
174
|
|
|
|