Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add integration test framework #687

Merged
Merged
Show file tree
Hide file tree
Changes from 39 commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
6a7629a
Add integration test task that uses the OpenSearch gradle plugin
ryanbogan Apr 18, 2023
7c5cf1f
Merge main into add_integ_test_framework
ryanbogan Apr 19, 2023
52dda1c
Added closeTestExtension task to kill testExtension process
ryanbogan Apr 19, 2023
17be5bf
Fix spotless
ryanbogan Apr 19, 2023
a45ac35
Merge branch 'main' into add_integ_test_framework
ryanbogan Apr 21, 2023
53bbf1d
Merge main into add_integ_test_framework
ryanbogan May 1, 2023
3d96e32
Implement resolution strategy to fix dependency conflict
ryanbogan May 8, 2023
afba241
Merge branch 'main' into add_integ_test_framework
ryanbogan May 8, 2023
af6904e
Minor adjustment
ryanbogan May 9, 2023
ea2f1f0
Merge branch 'main' into add_integ_test_framework
ryanbogan May 9, 2023
b0d742a
Merge branch 'main' into add_integ_test_framework
ryanbogan May 10, 2023
d0c9ed8
Change jackson version
ryanbogan May 10, 2023
78a0c3b
Change jackson dataformat version
ryanbogan May 10, 2023
476263e
Revert jackson version change
ryanbogan May 10, 2023
f60262b
Merge branch 'main' into add_integ_test_framework
ryanbogan May 11, 2023
1b602a5
Add resolution strategy to fix jackson dependency conflict
ryanbogan May 12, 2023
e1c389b
Address PR Comments
ryanbogan May 12, 2023
94d2b99
Merge branch 'main' into add_integ_test_framework
ryanbogan May 15, 2023
9f37e54
Add new implementation to fix error from separate merge
ryanbogan May 15, 2023
e2d16e0
Address PR Comments
ryanbogan May 16, 2023
660e29c
Address PR Comments
ryanbogan May 16, 2023
71c92be
Revert minor change
ryanbogan May 16, 2023
e2485fb
Address PR Comments
ryanbogan May 16, 2023
85d48ba
Add reading from yaml for testExtensionCreation
ryanbogan May 16, 2023
383e7a5
Spotless
ryanbogan May 16, 2023
71b43c4
Minor change
ryanbogan May 16, 2023
a921cf1
Debug test commit
ryanbogan May 17, 2023
4f0bc31
Merge branch 'main' into add_integ_test_framework
saratvemulapalli May 22, 2023
9e46836
Merge main into add_integ_test-framework
ryanbogan May 23, 2023
d54c143
Minor changes
ryanbogan May 23, 2023
b2c87bd
Merge branch 'add_integ_test_framework' of github.com:ryanbogan/opens…
ryanbogan May 23, 2023
1aa03ec
Remove extra test class
ryanbogan May 23, 2023
e7e9eea
Merge branch 'main' into add_integ_test_framework
owaiskazi19 May 23, 2023
c49abcf
Merge branch 'main' into add_integ_test_framework
ryanbogan May 24, 2023
3d5f1d0
Add index
ryanbogan May 24, 2023
342caa1
Fix inadvertent change
ryanbogan May 24, 2023
7f0fd39
Minor change
ryanbogan May 24, 2023
80c1fc2
Merge main into add_integ_test_framework
ryanbogan May 25, 2023
e7540d8
Add log4j resolution strategy
ryanbogan May 25, 2023
bdadfa7
Remove testing println
ryanbogan May 25, 2023
2db7e35
Merge branch 'main' into add_integ_test_framework
ryanbogan May 26, 2023
bc8654c
Merge branch 'main' into add_integ_test_framework
ryanbogan May 30, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 11 additions & 0 deletions DEVELOPER_GUIDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
- [Publish OpenSearch SDK for Java to Maven Local](#publish-opensearch-sdk-for-java-to-maven-local)
- [Perform a REST Request on the Extension](#perform-a-rest-request-on-the-extension)
- [Run Tests](#run-tests)
- [Launching and debugging from an IDE](#launching-and-debugging-from-an-ide)
- [Submitting Changes](#submitting-changes)

## Introduction
Expand Down Expand Up @@ -221,6 +222,16 @@ Run tests :
```
./gradlew clean build test
```

Run integration tests :
```
./gradlew clean build integTest
```

## Launching and debugging from an IDE
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved

See [Launching and debugging from an IDE in OpenSearch](https://github.com/opensearch-project/OpenSearch/blob/main/TESTING.md#launching-and-debugging-from-an-ide)

## Generate Artifact

In opensearch-sdk-java navigate to build/distributions. Look for tar ball in the form `opensearch-sdk-java-1.0.0-SNAPSHOT.tar`. If not found follow the below steps to create one:
Expand Down
182 changes: 167 additions & 15 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,26 @@

import java.nio.file.Files
import org.gradle.api.internal.tasks.testing.junitplatform.JUnitPlatformTestFramework
import org.opensearch.gradle.test.RestIntegTestTask
import org.opensearch.gradle.testclusters.ExtensionsProperties

buildscript {
ext {
opensearch_version = System.getProperty("opensearch.version", "3.0.0-SNAPSHOT")
isSnapshot = "true" == System.getProperty("build.snapshot", "true")
buildVersionQualifier = System.getProperty("build.version_qualifier", "")
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved
}

repositories {
mavenLocal()
mavenCentral()
maven { url "https://aws.oss.sonatype.org/content/repositories/snapshots" }
}

dependencies {
classpath "org.opensearch.gradle:build-tools:${opensearch_version}"
}
}

plugins {
id 'java-library'
Expand All @@ -22,21 +42,51 @@ plugins {
}


apply from: 'gradle/formatting.gradle'
apply plugin: 'maven-publish'
apply plugin: 'java'
apply plugin: 'opensearch.opensearchplugin'
apply plugin: 'opensearch.testclusters'

opensearchplugin {
joshpalis marked this conversation as resolved.
Show resolved Hide resolved
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved
name 'opensearch-sdk-java'
description 'OpenSearch Software Development Kit'
classname 'org.opensearch.sdk.sample.helloworld.HelloWorldExtension'
}

ext {
projectSubstitutions = [:]
licenseFile = rootProject.file('LICENSE.txt')
noticeFile = rootProject.file('NOTICE.txt')
}

dependencyLicenses.enabled = false
thirdPartyAudit.enabled = false
loggerUsageCheck.enabled = false
forbiddenApisMain.enabled = false
forbiddenApisTest.enabled = false
filepermissions.enabled = false
forbiddenPatterns.enabled = false
testingConventions.enabled = false
validateNebulaPom.enabled = false
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved

def _numNodes = findProperty('numNodes') as Integer ?: 1
def testPort = 4500

allprojects {
project.ext.licenseName = 'The Apache Software License, Version 2.0'
project.ext.licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
group = 'org.opensearch'
version = opensearch_version.tokenize('-')[0] + '.0'
if (buildVersionQualifier) {
version += "-${buildVersionQualifier}"
}
if (isSnapshot) {
version += "-SNAPSHOT"
}
}

apply plugin: 'application'
apply from: 'gradle/formatting.gradle'
apply plugin: 'maven-publish'

// Temporary to keep "gradle run" working
// TODO: change this to an extension designed for testing instead of duplicating a sample
// https://github.com/opensearch-project/opensearch-sdk-java/issues/175
mainClassName = 'org.opensearch.sdk.sample.helloworld.HelloWorldExtension'


group 'org.opensearch.sdk'
Expand All @@ -49,14 +99,26 @@ java {

publishing {
publications {
group = "${group}"
version = "${version}"
mavenJava(MavenPublication) {
from components.java
}
sourceCompatibility = 11
targetCompatibility = 11
}
// add license information to generated poms
all {
pom {
name = "opensearch-sdk-java"
description = "OpenSearch SDK"
}
pom.withXml { XmlProvider xml ->
Node node = xml.asNode()
node.appendNode('inceptionYear', '2022')

Node license = node.appendNode('licenses').appendNode('license')
license.appendNode('name', project.licenseName)
license.appendNode('url', project.licenseUrl)

Node developer = node.appendNode('developers').appendNode('developer')
developer.appendNode('name', 'opensearch-sdk-java')
developer.appendNode('url', 'https://github.com/opensearch-project/opensearch-sdk-java')
}
}
}

repositories {
maven {
Expand Down Expand Up @@ -89,6 +151,11 @@ dependencies {
def junit5Version = "5.9.3"
def junitPlatform = "1.9.3"
def jaxbVersion = "2.3.1"
def jakartaVersion = "2.1.1"
def jakartaInjectVersion = "2.0.1"
def javaxVersion = "1"
def guavaFailureAccessVersion = "1.0.1"
def aopallianceVersion = "1.0"

api("org.opensearch:opensearch:${opensearchVersion}")
implementation("org.apache.logging.log4j:log4j-api:${log4jVersion}")
Expand All @@ -99,6 +166,7 @@ dependencies {
api("org.opensearch.client:opensearch-java:${opensearchVersion}")
implementation("org.opensearch.plugin:transport-netty4-client:${opensearchVersion}")
implementation("io.netty:netty-all:${nettyVersion}")
implementation("jakarta.inject:jakarta.inject-api:${jakartaInjectVersion}")
testCompileOnly("junit:junit:${junit4Version}") {
exclude module : 'hamcrest'
exclude module : 'hamcrest-core'
Expand All @@ -108,6 +176,13 @@ dependencies {
implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:${jacksonDatabindVersion}")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:${jacksonDatabindVersion}")
implementation("com.fasterxml.jackson.datatype:jackson-datatype-guava:${jacksonDatabindVersion}")
implementation("com.fasterxml.jackson.core:jackson-annotations:${jacksonDatabindVersion}")

implementation("com.google.guava:guava:${guavaVersion}")
implementation("javax.inject:javax.inject:${javaxVersion}")
implementation("com.google.guava:failureaccess:${guavaFailureAccessVersion}")
implementation("aopalliance:aopalliance:${aopallianceVersion}")

constraints {
implementation("com.google.guava:guava:${guavaVersion}") {
because 'versions below 30.0 have active CVE'
Expand All @@ -118,6 +193,15 @@ dependencies {
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:${junit5Version}")
testImplementation("org.opensearch.test:framework:${opensearchVersion}")
testRuntimeOnly("org.junit.platform:junit-platform-launcher:${junitPlatform}")

configurations.all {
resolutionStrategy.force("jakarta.json:jakarta.json-api:${jakartaVersion}")
resolutionStrategy.force("com.fasterxml.jackson.core:jackson-databind:${jacksonDatabindVersion}")
resolutionStrategy.force("com.fasterxml.jackson.core:jackson-core:${jacksonDatabindVersion}")
resolutionStrategy.force("org.apache.logging.log4j:log4j-api:${log4jVersion}")
resolutionStrategy.force("org.apache.logging.log4j:log4j-core:${log4jVersion}")
resolutionStrategy.force("org.apache.logging.log4j:log4j-jul:${log4jVersion}")
}
}

// this task runs the helloworld sample extension
Expand Down Expand Up @@ -182,3 +266,71 @@ diffCoverageReport {
failOnViolation = true
}
}

task integTest(type: RestIntegTestTask) {
description = "Run tests against a cluster"
testClassesDirs = sourceSets.test.output.classesDirs
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved
classpath = sourceSets.test.runtimeClasspath
}
//tasks.named("check").configure { dependsOn(integTest) }

task startTestExtension(type: Exec) {
commandLine 'bash', '-c', "./gradlew helloWorld &"
}

integTest {
dependsOn(startTestExtension)

//TODO: find a way to add permissions for the tests
systemProperty 'tests.security.manager', 'false'
owaiskazi19 marked this conversation as resolved.
Show resolved Hide resolved

systemProperty "https", System.getProperty("https")
systemProperty "user", System.getProperty("user")
systemProperty "password", System.getProperty("password")

// The 'doFirst' delays till execution time.
doFirst {
// Tell the test JVM if the cluster JVM is running under a debugger so that tests can
// use longer timeouts for requests.
def isDebuggingCluster = getDebug() || System.getProperty("test.debug") != null
systemProperty 'cluster.debug', isDebuggingCluster
// Set number of nodes system property to be used in tests
systemProperty 'cluster.number_of_nodes', "1"
// There seems to be an issue when running multi node run or integ tasks with unicast_hosts
// not being written, the waitForAllConditions ensures it's written
getClusters().forEach { cluster ->
cluster.waitForAllConditions()
}
}

// The --debug-jvm command-line option makes the cluster debuggable; this makes the tests debuggable
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved
if (System.getProperty("test.debug") != null) {
jvmArgs '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005'
}
}

def testExtensionYml = new org.yaml.snakeyaml.Yaml().load(new File("src/test/resources/hello-world-extension.yml").newInputStream())

task closeTestExtension (type: Exec) {
commandLine 'bash', '-c', "kill \$(lsof -i:${testExtensionYml.port})"
}

tasks.named("integTest").configure { finalizedBy(closeTestExtension) }

testClusters.integTest {
extension(new ExtensionsProperties("${testExtensionYml.name}", "${testExtensionYml.uniqueId}", "${testExtensionYml.hostAddress}", "${testExtensionYml.port}", "${testExtensionYml.version}", "${testExtensionYml.opensearchVersion}", "${testExtensionYml.minimumCompatibleVersion}"))
testDistribution = "ARCHIVE"
// Cluster shrink exception thrown if we try to set numberOfNodes to 1, so only apply if > 1
if (_numNodes > 1) numberOfNodes = _numNodes
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved
// When running integration tests it doesn't forward the --debug-jvm to the cluster anymore
// i.e. we have to use a custom property to flag when we want to debug elasticsearch JVM
// since we also support multi node integration tests we increase debugPort per node
if (System.getProperty("opensearch.debug") != null) {
def debugPort = 5005
nodes.forEach { node ->
node.jvmArgs("-agentlib:jdwp=transport=dt_socket,server=n,suspend=y,address=*:${debugPort}")
debugPort += 1
}
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ public List<Setting<?>> getSettings() {
*/
public static void main(String[] args) throws IOException {
// Execute this extension by instantiating it and passing to ExtensionsRunner
System.out.println("Hi");
ryanbogan marked this conversation as resolved.
Show resolved Hide resolved
ExtensionsRunner.run(new HelloWorldExtension());
}
}
2 changes: 1 addition & 1 deletion src/main/resources/sample/helloworld-settings.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
extensionName: hello-world
hostAddress: 127.0.0.1
hostPort: 4532
hostPort: 4500
opensearchAddress: 127.0.0.1
opensearchPort: 9200
#ssl.transport.enabled: true
Expand Down
7 changes: 7 additions & 0 deletions src/test/resources/hello-world-extension.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
name: hello-world
uniqueId: opensearch-sdk-java-1
hostAddress: '127.0.0.1'
port: '4500'
version: '1.0'
opensearchVersion: '3.0.0'
minimumCompatibleVersion: '3.0.0'