You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2017/03/23 19:37:28 UTC
[2/4] tinkerpop git commit: TINKERPOP-1653 Added gremlin.sh test
framework
TINKERPOP-1653 Added gremlin.sh test framework
Uses python and pexpect to send inputs and test outputs of the Console. Builds with the standard maven process.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c91bb19a
Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c91bb19a
Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c91bb19a
Branch: refs/heads/master
Commit: c91bb19a42f2c0fc6dbc748374c35b9c4d620aa2
Parents: 1503311
Author: Stephen Mallette <sp...@genoprime.com>
Authored: Wed Mar 22 16:02:42 2017 -0400
Committer: Stephen Mallette <sp...@genoprime.com>
Committed: Wed Mar 22 16:02:42 2017 -0400
----------------------------------------------------------------------
.../developer/development-environment.asciidoc | 8 ++
gremlin-console/pom.xml | 117 +++++++++++++++++++
gremlin-console/src/test/python/setup.cfg | 22 ++++
gremlin-console/src/test/python/setup.py | 36 ++++++
.../src/test/python/tests/__init__.py | 20 ++++
.../src/test/python/tests/test_console.py | 95 +++++++++++++++
gremlin-console/src/test/python/x.groovy | 20 ++++
gremlin-console/src/test/python/y.groovy | 20 ++++
gremlin-console/src/test/python/z.groovy | 20 ++++
9 files changed, 358 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/docs/src/dev/developer/development-environment.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/dev/developer/development-environment.asciidoc b/docs/src/dev/developer/development-environment.asciidoc
index 83cdf38..2508bb7 100644
--- a/docs/src/dev/developer/development-environment.asciidoc
+++ b/docs/src/dev/developer/development-environment.asciidoc
@@ -77,6 +77,14 @@ which enables the "glv-python" Maven profile or in a more automated fashion simp
`gremlin-python` module which will signify to Maven that the environment is Python-ready. The `.glv` file need not have
any contents and is ignored by Git. A standard `mvn clean install` will then build `gremlin-python` in full.
+As of TinkerPop 3.2.5, the build also requires Python to execute `gremlin-console` integration tests. The integration
+test is configured by a "console-integration-tests" Maven profile. This profile can be activated manually or can more
+simply piggy-back on the `.glv` file in `gremlin-python`. Note that unlike `gremlin-python` the tests are actually
+integration tests and therefore must be actively switched on with `-DskipIntegrationTests=false`:
+
+[source,text
+mvn clean install -pl gremlin-console -DskipIntegrationTests=false
+
[[release-environment]]
Release Environment
~~~~~~~~~~~~~~~~~~~
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/pom.xml
----------------------------------------------------------------------
diff --git a/gremlin-console/pom.xml b/gremlin-console/pom.xml
index ef747c6..08d91a7 100644
--- a/gremlin-console/pom.xml
+++ b/gremlin-console/pom.xml
@@ -206,4 +206,121 @@ limitations under the License.
</plugin>
</plugins>
</build>
+
+ <profiles>
+ <!-- activates the building of python components and requires that python be installed on the system. use
+ the .glv file in gremlin-python as an indicator to activate -->
+ <profile>
+ <id>console-integration-tests</id>
+ <activation>
+ <activeByDefault>false</activeByDefault>
+ <file>
+ <!-- can't use variable here - maven no likey -->
+ <exists>../gremlin-python/.glv</exists>
+ </file>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>create-python-reports-directory</id>
+ <phase>initialize</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <skip>${skipIntegrationTests}</skip>
+ <tasks>
+ <mkdir dir="${project.build.directory}/python-reports"/>
+ <mkdir dir="${project.build.directory}/python/env"/>
+ </tasks>
+ </configuration>
+ </execution>
+ <!-- copy files in python directory to target/python and run virtual env to sandbox python.
+ there is no need to "activate" the virtualenv because all calls to python occur
+ directly from bin/ -->
+ <execution>
+ <id>setup-py-env</id>
+ <phase>process-resources</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <skip>${skipIntegrationTests}</skip>
+ <tasks>
+ <copy todir="${project.build.directory}/python">
+ <fileset dir="src/test/python"/>
+ </copy>
+ <exec dir="${project.build.directory}/python" executable="virtualenv"
+ failonerror="true">
+ <arg line="--python=python env"/>
+ </exec>
+ </tasks>
+ </configuration>
+ </execution>
+ <execution>
+ <id>native-python-build</id>
+ <phase>compile</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <skip>${skipIntegrationTests}</skip>
+ <target>
+ <exec executable="env/bin/python" dir="${project.build.directory}/python"
+ failonerror="true">
+ <env key="PYTHONPATH" value=""/>
+ <arg line="setup.py build --build-lib ${project.build.outputDirectory}/Lib"/>
+ </exec>
+ </target>
+ </configuration>
+ </execution>
+
+ <execution>
+ <id>copy-gremlinsh</id>
+ <phase>pre-integration-test</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <skip>${skipIntegrationTests}</skip>
+ <tasks>
+ <copy todir="${project.build.directory}/python/gremlin-console">
+ <fileset dir="${project.build.directory}/apache-tinkerpop-gremlin-console-${project.version}-standalone"/>
+ </copy>
+ </tasks>
+ </configuration>
+ </execution>
+
+ <!--
+ use pytest to execute native python tests - output of xunit output is configured in setup.cfg.
+ must run on integration tests because package phase has to execute to get the console binaries
+ available for testing
+ -->
+ <execution>
+ <id>native-python-test</id>
+ <phase>integration-test</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <skip>${skipIntegrationTests}</skip>
+ <target>
+ <exec executable="env/bin/python" dir="${project.build.directory}/python"
+ failonerror="true">
+ <env key="PYTHONPATH" value=""/>
+ <arg line="setup.py test"/>
+ </exec>
+ </target>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
</project>
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/src/test/python/setup.cfg
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/python/setup.cfg b/gremlin-console/src/test/python/setup.cfg
new file mode 100644
index 0000000..4d69389
--- /dev/null
+++ b/gremlin-console/src/test/python/setup.cfg
@@ -0,0 +1,22 @@
+# 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.
+[aliases]
+test=pytest
+
+[tool:pytest]
+addopts = --junitxml=../python-reports/TEST-native-python.xml
+norecursedirs = '.*', 'build', 'dist', 'CVS', '_darcs', '{arch}', '*.egg' lib lib64
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/src/test/python/setup.py
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/python/setup.py b/gremlin-console/src/test/python/setup.py
new file mode 100644
index 0000000..a973ae5
--- /dev/null
+++ b/gremlin-console/src/test/python/setup.py
@@ -0,0 +1,36 @@
+'''
+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 codecs
+import os
+import sys
+import time
+from setuptools import setup
+
+setup(
+ name='gremlinconsoletest',
+ test_suite="tests",
+ setup_requires=[
+ 'pytest-runner',
+ ],
+ tests_require=[
+ 'pytest',
+ 'mock',
+ 'pexpect'
+ ]
+)
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/src/test/python/tests/__init__.py
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/python/tests/__init__.py b/gremlin-console/src/test/python/tests/__init__.py
new file mode 100644
index 0000000..599f5ca
--- /dev/null
+++ b/gremlin-console/src/test/python/tests/__init__.py
@@ -0,0 +1,20 @@
+'''
+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.
+'''
+
+__author__ = 'Stephen Mallette (http://stephen.genoprime.com)'
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/src/test/python/tests/test_console.py
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/python/tests/test_console.py b/gremlin-console/src/test/python/tests/test_console.py
new file mode 100644
index 0000000..c2719bd
--- /dev/null
+++ b/gremlin-console/src/test/python/tests/test_console.py
@@ -0,0 +1,95 @@
+'''
+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 unittest
+from unittest import TestCase
+import pexpect
+
+class TestConsole(TestCase):
+
+ # the base command must pass -C because if colors are enabled pexpect gets garbled input and tests won't pass
+ gremlinsh = "bash gremlin-console/bin/gremlin.sh -C "
+
+ def test_basic_console_operations(self):
+ child = pexpect.spawn(TestConsole.gremlinsh)
+ TestConsole._expect_gremlin_header(child)
+ TestConsole._send(child, "1-1")
+ child.expect("==>0\r\n")
+ TestConsole._expect_prompt(child)
+ TestConsole._close(child)
+
+ def test_just_dash_i(self):
+ child = pexpect.spawn(TestConsole.gremlinsh + "-i x.groovy")
+ TestConsole._expect_gremlin_header(child)
+ TestConsole._send(child, "x")
+ child.expect("==>2\r\n")
+ TestConsole._expect_prompt(child)
+ TestConsole._close(child)
+
+ def test_dash_i_with_args(self):
+ child = pexpect.spawn(TestConsole.gremlinsh + "-i y.groovy 1 2 3")
+ TestConsole._expect_gremlin_header(child)
+ TestConsole._send(child, "y")
+ child.expect("==>6\r\n")
+ TestConsole._expect_prompt(child)
+ TestConsole._close(child)
+
+ def test_dash_i_multiple_scripts(self):
+ child = pexpect.spawn(TestConsole.gremlinsh + "-i y.groovy 1 2 3 -i x.groovy -i \"z.groovy x -i --color -D\"")
+ TestConsole._expect_gremlin_header(child)
+ TestConsole._send(child, "y")
+ child.expect("==>6\r\n")
+ TestConsole._expect_prompt(child)
+ TestConsole._send(child, "x")
+ child.expect("==>2\r\n")
+ TestConsole._expect_prompt(child)
+ TestConsole._send(child, "z")
+ child.expect("==>argument=\[x, -i, --color, -D\]\r\n")
+ TestConsole._expect_prompt(child)
+ TestConsole._close(child)
+
+ def test_no_mix_dash_i_and_dash_e(self):
+ child = pexpect.spawn(TestConsole.gremlinsh + "-i y.groovy 1 2 3 -i x.groovy -e \"z.groovy x -i --color -D\"")
+ child.expect("-i and -e options are mutually exclusive - provide one or the other")
+ child.expect(pexpect.EOF)
+
+ @staticmethod
+ def _expect_gremlin_header(child):
+ # skip/read the Gremlin graphics
+ child.expect("\r\n")
+ child.expect(["plugin activated: tinkerpop.server", "plugin activated: tinkerpop.utilities", "plugin activated: tinkerpop.tinkergraph"])
+ child.expect(["plugin activated: tinkerpop.server", "plugin activated: tinkerpop.utilities", "plugin activated: tinkerpop.tinkergraph"])
+ child.expect(["plugin activated: tinkerpop.server", "plugin activated: tinkerpop.utilities", "plugin activated: tinkerpop.tinkergraph"])
+ TestConsole._expect_prompt(child)
+
+ @staticmethod
+ def _send(child, line):
+ child.sendline(line)
+ child.expect(line + "\r\n")
+
+ @staticmethod
+ def _expect_prompt(child):
+ child.expect("gremlin> ")
+
+ @staticmethod
+ def _close(child):
+ child.sendline(":x")
+
+
+
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/src/test/python/x.groovy
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/python/x.groovy b/gremlin-console/src/test/python/x.groovy
new file mode 100644
index 0000000..31a9f19
--- /dev/null
+++ b/gremlin-console/src/test/python/x.groovy
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+x = 1 + 1
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/src/test/python/y.groovy
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/python/y.groovy b/gremlin-console/src/test/python/y.groovy
new file mode 100644
index 0000000..8b0adf6
--- /dev/null
+++ b/gremlin-console/src/test/python/y.groovy
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+y = args.collect{Integer.parseInt(it)}.sum()
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c91bb19a/gremlin-console/src/test/python/z.groovy
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/python/z.groovy b/gremlin-console/src/test/python/z.groovy
new file mode 100644
index 0000000..3d7d101
--- /dev/null
+++ b/gremlin-console/src/test/python/z.groovy
@@ -0,0 +1,20 @@
+/*
+ * 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.
+ */
+
+z = "argument=" + args
\ No newline at end of file