This commit is contained in:
Kevin Risden 2017-02-07 23:25:21 -05:00
Родитель c3cfc98e57
Коммит c52c4385b1
4 изменённых файлов: 563 добавлений и 12 удалений

Просмотреть файл

@ -29,7 +29,143 @@ LICENSE file.
<properties> <properties>
<!-- Skip tests by default. will be activated by jdk8 profile --> <!-- Skip tests by default. will be activated by jdk8 profile -->
<skipTests>true</skipTests> <skipTests>true</skipTests>
<elasticsearch.groupid>org.elasticsearch.distribution.zip</elasticsearch.groupid>
<!-- For integration tests using ANT -->
<integ.http.port>9400</integ.http.port>
<integ.transport.port>9500</integ.transport.port>
</properties> </properties>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>2.10</version>
<executions>
<execution>
<id>integ-setup-dependencies</id>
<phase>pre-integration-test</phase>
<goals>
<goal>copy</goal>
</goals>
<configuration>
<skip>${skipTests}</skip>
<artifactItems>
<artifactItem>
<groupId>${elasticsearch.groupid}</groupId>
<artifactId>elasticsearch</artifactId>
<version>${elasticsearch5-version}</version>
<type>zip</type>
</artifactItem>
</artifactItems>
<useBaseVersion>true</useBaseVersion>
<outputDirectory>${project.build.directory}/integration-tests/binaries</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.8</version>
<executions>
<!-- start up external cluster -->
<execution>
<id>integ-setup</id>
<phase>pre-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<skip>${skipTests}</skip>
<target>
<ant antfile="src/test/ant/integration-tests.xml" target="start-external-cluster"/>
</target>
</configuration>
</execution>
<!-- shut down external cluster -->
<execution>
<id>integ-teardown</id>
<phase>post-integration-test</phase>
<goals>
<goal>run</goal>
</goals>
<configuration>
<skip>${skipTests}</skip>
<target>
<ant antfile="src/test/ant/integration-tests.xml" target="stop-external-cluster"/>
</target>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.19</version>
<executions>
<execution>
<id>default-test</id>
<phase>none</phase>
</execution>
</executions>
</plugin>
<plugin>
<groupId>com.carrotsearch.randomizedtesting</groupId>
<artifactId>junit4-maven-plugin</artifactId>
<version>2.3.3</version>
<configuration>
<assertions enableSystemAssertions="false">
<enable/>
</assertions>
<listeners>
<report-text />
</listeners>
</configuration>
<executions>
<execution>
<id>unit-tests</id>
<phase>test</phase>
<goals>
<goal>junit4</goal>
</goals>
<inherited>true</inherited>
<configuration>
<skipTests>${skipTests}</skipTests>
<includes>
<include>**/*Test.class</include>
</includes>
<excludes>
<exclude>**/*$*</exclude>
</excludes>
</configuration>
</execution>
<execution>
<id>integration-tests</id>
<phase>integration-test</phase>
<goals>
<goal>junit4</goal>
</goals>
<inherited>true</inherited>
<configuration>
<skipTests>${skipTests}</skipTests>
<includes>
<include>**/*IT.class</include>
</includes>
<excludes>
<exclude>**/*$*</exclude>
</excludes>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
<artifactId>elasticsearch5-binding</artifactId> <artifactId>elasticsearch5-binding</artifactId>
<name>Elasticsearch 5.x Binding</name> <name>Elasticsearch 5.x Binding</name>
@ -75,4 +211,19 @@ LICENSE file.
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
</dependencies> </dependencies>
<profiles>
<!-- Requires JDK8 to run, so none of our tests
will work unless we're using jdk8.
-->
<profile>
<id>jdk8-tests</id>
<activation>
<jdk>1.8</jdk>
</activation>
<properties>
<skipTests>false</skipTests>
</properties>
</profile>
</profiles>
</project> </project>

Просмотреть файл

@ -120,13 +120,11 @@ public class ElasticsearchRestClient extends DB {
Collections.<String, String>emptyMap(), Collections.<String, String>emptyMap(),
new NStringEntity(new ObjectMapper().writeValueAsString(data), ContentType.APPLICATION_JSON)); new NStringEntity(new ObjectMapper().writeValueAsString(data), ContentType.APPLICATION_JSON));
if(response.getStatusLine().getStatusCode() == 200) { return Status.OK;
return Status.OK;
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Status.ERROR;
} }
return Status.ERROR;
} }
@Override @Override
@ -136,13 +134,11 @@ public class ElasticsearchRestClient extends DB {
HttpDelete.METHOD_NAME, HttpDelete.METHOD_NAME,
"/" + indexKey + "/" + table + "/" + key); "/" + indexKey + "/" + table + "/" + key);
if(response.getStatusLine().getStatusCode() == 200) { return Status.OK;
return Status.OK;
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Status.ERROR;
} }
return Status.ERROR;
} }
@Override @Override
@ -150,13 +146,11 @@ public class ElasticsearchRestClient extends DB {
try { try {
Response response = restClient.performRequest(HttpGet.METHOD_NAME, "/"); Response response = restClient.performRequest(HttpGet.METHOD_NAME, "/");
if(response.getStatusLine().getStatusCode() == 200) { return Status.OK;
return Status.OK;
}
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
return Status.ERROR;
} }
return Status.ERROR;
// try { // try {
// final GetResponse response = client.prepareGet(indexKey, table, key).execute().actionGet(); // final GetResponse response = client.prepareGet(indexKey, table, key).execute().actionGet();

Просмотреть файл

@ -0,0 +1,282 @@
<?xml version="1.0"?>
<project name="integration-tests" xmlns:if="ant:if" xmlns:unless="ant:unless">
<!-- our pid file for easy cleanup -->
<property name="integ.pidfile" location="${project.build.directory}/integration-tests/run/es.pid"/>
<!-- if this exists, ES is running (maybe) -->
<available property="integ.pidfile.exists" file="${integ.pidfile}"/>
<!-- name of our cluster, maybe needs changing -->
<property name="integ.cluster.name" value="elasticsearch_integration"/>
<!-- runs an OS script -->
<macrodef name="run-script">
<attribute name="script"/>
<attribute name="spawn" default="false"/>
<element name="nested" optional="true"/>
<sequential>
<local name="failonerror"/>
<condition property="failonerror">
<isfalse value="@{spawn}"/>
</condition>
<!-- create a temp CWD, to enforce that commands don't rely on CWD -->
<local name="temp.cwd"/>
<tempfile property="temp.cwd" destDir="${project.build.directory}/integration-tests/run/tmp" deleteonexit="true"/>
<mkdir dir="${temp.cwd}"/>
<!-- print commands we run -->
<local name="script.base"/>
<basename file="@{script}" property="script.base"/>
<!-- crappy way to output, but we need it. make it nice later -->
<echoxml><exec script="${script.base}"><nested/></exec></echoxml>
<exec executable="cmd" osfamily="winnt" dir="${temp.cwd}" failonerror="${failonerror}" spawn="@{spawn}" taskname="${script.base}">
<arg value="/c"/>
<arg value="&quot;"/>
<arg value="@{script}.bat"/>
<nested/>
<arg value="&quot;"/>
</exec>
<exec executable="bash" osfamily="unix" dir="${temp.cwd}" failonerror="${failonerror}" spawn="@{spawn}" taskname="${script.base}">
<arg value="@{script}"/>
<nested/>
</exec>
</sequential>
</macrodef>
<!-- extracts PID from file -->
<macrodef name="extract-pid">
<attribute name="file"/>
<attribute name="property"/>
<sequential>
<loadfile srcFile="@{file}" property="@{property}">
<filterchain>
<striplinebreaks/>
</filterchain>
</loadfile>
</sequential>
</macrodef>
<!-- applies transformations to src and stores in dst -->
<macrodef name="filter-property">
<attribute name="src"/>
<attribute name="dest"/>
<element name="chain"/>
<sequential>
<loadresource property="@{dest}">
<propertyresource name="@{src}"/>
<filterchain>
<tokenfilter>
<chain/>
</tokenfilter>
</filterchain>
</loadresource>
</sequential>
</macrodef>
<!-- waits for elasticsearch to start -->
<macrodef name="waitfor-elasticsearch">
<attribute name="port"/>
<attribute name="timeoutproperty"/>
<sequential>
<echo>Waiting for elasticsearch to become available on port @{port}...</echo>
<waitfor maxwait="30" maxwaitunit="second"
checkevery="500" checkeveryunit="millisecond"
timeoutproperty="@{timeoutproperty}">
<http url="http://localhost:@{port}"/>
</waitfor>
</sequential>
</macrodef>
<scriptdef name="isGreater" language="javascript">
<attribute name="v1"/>
<attribute name="v2"/>
<![CDATA[
var i, l, d, s = false;
a = attributes.get("v1").split('.');
b = attributes.get("v2").split('.');
l = Math.min(a.length, b.length);
for (i=0; i<l; i++) {
d = parseInt(a[i], 10) - parseInt(b[i], 10);
if (d !== 0) {
project.setProperty("compare-result", d > 0);
s = true;
break;
}
}
if(!s){
d = a.length - b.length;
project.setProperty("compare-result", d >= 0);
}
]]>
</scriptdef>
<!-- start elasticsearch and wait until its ready -->
<macrodef name="startup-elasticsearch">
<attribute name="home" default="${project.build.directory}/integration-tests/run/elasticsearch-${elasticsearch5-version}"/>
<attribute name="spawn" default="true"/>
<attribute name="es.cluster.name" default="${integ.cluster.name}"/>
<attribute name="es.http.port" default="${integ.http.port}"/>
<attribute name="es.transport.tcp.port" default="${integ.transport.port}"/>
<attribute name="es.pidfile" default="${integ.pidfile}"/>
<element name="additional-args" optional="true"/>
<sequential>
<!-- make sure no elasticsearch instance is currently running and listening on the port we need -->
<fail message="This test expects port @{es.http.port} to be free but an elasticsearch instance is already running and listening on that port.
Maybe the last test run did not manage to shut down the node correctly?
You must kill it before tests can run.">
<condition>
<socket server="localhost" port="@{es.http.port}"></socket>
</condition>
</fail>
<!-- run bin/elasticsearch with args -->
<echo>Starting up external cluster...</echo>
<isGreater v1="${elasticsearch5-version}" v2="5.0.0" />
<echo if:true="${compare-result}">running Elasticsearch 5.0.0 or superior</echo>
<echo unless:true="${compare-result}">running Elasticsearch &lt; 5.0.0</echo>
<run-script script="@{home}/bin/elasticsearch"
spawn="@{spawn}">
<nested>
<arg value="-Des.pidfile=@{es.pidfile}" unless:true="${compare-result}"/>
<arg value="-Des.cluster.name=@{es.cluster.name}" unless:true="${compare-result}"/>
<arg value="-Des.http.port=@{es.http.port}" unless:true="${compare-result}"/>
<arg value="-Des.transport.tcp.port=@{es.transport.tcp.port}" unless:true="${compare-result}"/>
<arg value="-Des.network.host=127.0.0.1" unless:true="${compare-result}"/>
<arg value="-Epidfile=@{es.pidfile}" if:true="${compare-result}"/>
<arg value="-Ecluster.name=@{es.cluster.name}" if:true="${compare-result}"/>
<arg value="-Ehttp.port=@{es.http.port}" if:true="${compare-result}"/>
<arg value="-Etransport.tcp.port=@{es.transport.tcp.port}" if:true="${compare-result}"/>
<arg value="-Enetwork.host=127.0.0.1" if:true="${compare-result}"/>
<additional-args/>
</nested>
</run-script>
<!-- wait for startup -->
<local name="failed.to.start"/>
<waitfor-elasticsearch port="@{es.http.port}"
timeoutproperty="failed.to.start"/>
<!-- best effort, print console log. useful if it fails especially -->
<local name="log.contents"/>
<loadfile srcFile="@{home}/logs/@{es.cluster.name}.log"
property="log.contents"
failonerror="false"/>
<echo message="${log.contents}" taskname="elasticsearch"/>
<fail message="ES instance did not start" if="failed.to.start"/>
<local name="integ.pid"/>
<extract-pid file="@{es.pidfile}" property="integ.pid"/>
<echo>External node started PID ${integ.pid}</echo>
</sequential>
</macrodef>
<macrodef name="stop-node">
<attribute name="es.pidfile" default="${integ.pidfile}"/>
<sequential>
<local name="integ.pid"/>
<extract-pid file="@{es.pidfile}" property="integ.pid"/>
<echo>Shutting down external node PID ${integ.pid}</echo>
<!-- verify with jps that this actually is the correct pid.
See if we can find the line "pid org.elasticsearch.bootstrap.Elasticsearch" in the output of jps -l.-->
<local name="jps.pidline"/>
<local name="jps.executable"/>
<local name="environment"/>
<property environment="environment"/>
<property name="jps.executable" location="${environment.JAVA_HOME}/bin/jps"/>
<exec executable="${jps.executable}" failonerror="true">
<arg value="-l"/>
<redirector outputproperty="jps.pidline">
<outputfilterchain>
<linecontains>
<contains value="${integ.pid} org.elasticsearch.bootstrap.Elasticsearch"/>
</linecontains>
</outputfilterchain>
</redirector>
</exec>
<fail
message="pid file at @{es.pidfile} is ${integ.pid} but jps -l did not report any process with org.elasticsearch.bootstrap.Elasticsearch and this pid.
Did you run mvn clean? Maybe an old pid file is still lying around.">
<condition>
<equals arg1="${jps.pidline}" arg2=""/>
</condition>
</fail>
<exec executable="taskkill" failonerror="true" osfamily="winnt">
<arg value="/F"/>
<arg value="/PID"/>
<arg value="${integ.pid}"/>
</exec>
<exec executable="kill" failonerror="true" osfamily="unix">
<arg value="-9"/>
<arg value="${integ.pid}"/>
</exec>
<delete file="@{es.pidfile}"/>
</sequential>
</macrodef>
<target name="stop-external-cluster" if="integ.pidfile.exists">
<stop-node/>
</target>
<target name="setup-workspace" depends="stop-external-cluster">
<sequential>
<delete dir="${project.build.directory}/integration-tests/run"/>
<unzip src="${project.build.directory}/integration-tests/binaries/elasticsearch-${elasticsearch5-version}.zip"
dest="${project.build.directory}/integration-tests/run"/>
</sequential>
</target>
<target name="start-external-cluster" depends="setup-workspace">
<startup-elasticsearch/>
</target>
<!-- unzip integ test artifact, install plugin, then start ES -->
<target name="start-external-cluster-with-plugin" depends="setup-workspace">
<install-plugin name="${project.artifactId}" file="${project.build.directory}/releases/${project.artifactId}-${project.version}.zip"/>
<startup-elasticsearch/>
</target>
<!-- installs a plugin into elasticsearch -->
<macrodef name="install-plugin">
<attribute name="home" default="${project.build.directory}/integration-tests/run/elasticsearch-${elasticsearch5-version}"/>
<attribute name="name"/>
<attribute name="file"/>
<sequential>
<local name="url"/>
<makeurl property="url" file="@{file}"/>
<isGreater v1="${elasticsearch5-version}" v2="5.0.0" />
<property name="commandline" value="@{home}/bin/plugin" unless:true="${compare-result}"/>
<property name="commandline" value="@{home}/bin/elasticsearch-plugin" if:true="${compare-result}"/>
<!-- install plugin -->
<echo>Installing plugin @{name}...</echo>
<run-script script="${commandline}">
<nested>
<arg value="install"/>
<arg value="${url}"/>
</nested>
</run-script>
<fail message="did not find plugin installed as @{name}">
<condition>
<not>
<resourceexists>
<file file="@{home}/plugins/@{name}"/>
</resourceexists>
</not>
</condition>
</fail>
</sequential>
</macrodef>
</project>

Просмотреть файл

@ -0,0 +1,124 @@
/**
* Copyright (c) 2017 YCSB contributors. All rights reserved.
* <p>
* Licensed 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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. See accompanying
* LICENSE file.
*/
package com.yahoo.ycsb.db.elasticsearch5;
import com.yahoo.ycsb.ByteIterator;
import com.yahoo.ycsb.DBException;
import com.yahoo.ycsb.Status;
import com.yahoo.ycsb.StringByteIterator;
import org.junit.*;
import java.util.HashMap;
import java.util.Properties;
import java.util.Set;
import java.util.Vector;
import static org.junit.Assert.assertEquals;
public class ElasticsearchRestClientTestIT {
private final static String TEST_HOST = "localhost:9400";
private final static ElasticsearchRestClient instance = new ElasticsearchRestClient();
private final static HashMap<String, ByteIterator> MOCK_DATA;
private final static String MOCK_TABLE = "MOCK_TABLE";
private final static String MOCK_KEY0 = "0";
private final static String MOCK_KEY1 = "1";
private final static String MOCK_KEY2 = "2";
static {
MOCK_DATA = new HashMap<>(10);
for (int i = 1; i <= 10; i++) {
MOCK_DATA.put("field" + i, new StringByteIterator("value" + i));
}
}
@BeforeClass
public static void setUpClass() throws DBException {
final Properties props = new Properties();
props.setProperty("es.hosts.list", TEST_HOST);
instance.setProperties(props);
instance.init();
}
@AfterClass
public static void tearDownClass() throws DBException {
instance.cleanup();
}
@Before
public void setUp() {
instance.insert(MOCK_TABLE, MOCK_KEY1, MOCK_DATA);
instance.insert(MOCK_TABLE, MOCK_KEY2, MOCK_DATA);
}
@After
public void tearDown() {
instance.delete(MOCK_TABLE, MOCK_KEY1);
instance.delete(MOCK_TABLE, MOCK_KEY2);
}
@Test
public void testInsert() {
Status result = instance.insert(MOCK_TABLE, MOCK_KEY0, MOCK_DATA);
assertEquals(Status.OK, result);
}
@Test
public void testDelete() {
Status result = instance.delete(MOCK_TABLE, MOCK_KEY1);
assertEquals(Status.OK, result);
}
@Test
public void testRead() {
Set<String> fields = MOCK_DATA.keySet();
HashMap<String, ByteIterator> resultParam = new HashMap<>(10);
Status result = instance.read(MOCK_TABLE, MOCK_KEY1, fields, resultParam);
assertEquals(Status.OK, result);
}
@Test
public void testUpdate() {
int i;
HashMap<String, ByteIterator> newValues = new HashMap<>(10);
for (i = 1; i <= 10; i++) {
newValues.put("field" + i, new StringByteIterator("newvalue" + i));
}
Status result = instance.update(MOCK_TABLE, MOCK_KEY1, newValues);
assertEquals(Status.OK, result);
//validate that the values changed
HashMap<String, ByteIterator> resultParam = new HashMap<>(10);
instance.read(MOCK_TABLE, MOCK_KEY1, MOCK_DATA.keySet(), resultParam);
for (i = 1; i <= 10; i++) {
assertEquals("newvalue" + i, resultParam.get("field" + i).toString());
}
}
@Test
public void testScan() {
int recordcount = 10;
Set<String> fields = MOCK_DATA.keySet();
Vector<HashMap<String, ByteIterator>> resultParam = new Vector<>(10);
Status result = instance.scan(MOCK_TABLE, MOCK_KEY1, recordcount, fields, resultParam);
assertEquals(Status.NOT_IMPLEMENTED, result);
}
}