diff --git a/README.adoc b/README.adoc
index 29ec174a..996e6e39 100644
--- a/README.adoc
+++ b/README.adoc
@@ -1,7 +1,7 @@
= sshj - SSHv2 library for Java
Jeroen van Erp
:sshj_groupid: com.hierynomus
-:sshj_version: 0.32.0
+:sshj_version: 0.36.0
:source-highlighter: pygments
image:https://github.com/hierynomus/sshj/actions/workflows/gradle.yml/badge.svg[link="https://github.com/hierynomus/sshj/actions/workflows/gradle.yml"]
@@ -108,6 +108,12 @@ Issue tracker: https://github.com/hierynomus/sshj/issues
Fork away!
== Release history
+SSHJ 0.36.0 (2023-07-14)::
+* Merged https://github.com/hierynomus/sshj/pull/874[#874]: Java 8 minimum version + dependency upgrades
+* Merged https://github.com/hierynomus/sshj/pull/876[#876]: Change `newStatefulSFTPClient` to return `StatefulSFTPClient`
+* Merged https://github.com/hierynomus/sshj/pull/860[#860]: Upgrade to Gradle 7.6.1
+* Merged https://github.com/hierynomus/sshj/pull/838[#838]: Replaced Curve25519 class with X25519 Key agreement
+* Merged https://github.com/hierynomus/sshj/pull/772[#772]: Remove dependency on jzlib
SSHJ 0.35.0 (2023-01-30)::
* Merged https://github.com/hierynomus/sshj/pull/835[#835]: TimeoutException message improved
* Merged https://github.com/hierynomus/sshj/pull/815[#815]: Support authPassword on FreeBSD
diff --git a/build.gradle b/build.gradle
index 4560fd25..88e05eb4 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,25 +1,27 @@
plugins {
id "java"
+ id "jvm-test-suite"
id "groovy"
id "jacoco"
id "com.github.blindpirate.osgi" version '0.0.6'
id "maven-publish"
id "signing"
- id 'pl.allegro.tech.build.axion-release' version '1.13.3'
- id "com.bmuschko.docker-remote-api" version "7.1.0"
+ id 'pl.allegro.tech.build.axion-release' version '1.15.3'
id "com.github.hierynomus.license" version "0.16.1"
- id 'ru.vyarus.github-info' version '1.2.0'
- id "io.github.gradle-nexus.publish-plugin" version "1.0.0"
+ id "com.bmuschko.docker-remote-api" version "9.2.1"
+ id 'ru.vyarus.github-info' version '1.5.0'
+ id "io.github.gradle-nexus.publish-plugin" version "1.3.0"
}
+group = "com.hierynomus"
+ext.moduleName = "${project.group}.${project.name}"
+
+defaultTasks "build"
+
repositories {
mavenCentral()
}
-group = "com.hierynomus"
-defaultTasks ["build"]
-ext.moduleName = "${project.group}.${project.name}"
-
scmVersion {
tag {
prefix = 'v'
@@ -33,6 +35,10 @@ scmVersion {
project.version = scmVersion.version
+compileJava {
+ options.release = 8
+}
+
configurations.implementation.transitive = false
def bouncycastleVersion = "1.75"
@@ -44,20 +50,6 @@ dependencies {
implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion"
implementation "com.hierynomus:asn-one:0.6.0"
implementation "net.i2p.crypto:eddsa:0.3.0"
-
- testImplementation(platform("org.junit:junit-bom:5.9.3"))
- testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine'
- testRuntimeOnly 'org.junit.vintage:junit-vintage-engine'
- testImplementation 'junit:junit:4.13.2'
- testImplementation 'org.spockframework:spock-core:2.3-groovy-3.0'
- testImplementation 'org.spockframework:spock-junit4:2.3-groovy-3.0'
- testImplementation "org.mockito:mockito-core:4.11.0"
- testImplementation "org.apache.sshd:sshd-core:$sshdVersion"
- testImplementation "org.apache.sshd:sshd-sftp:$sshdVersion"
- testImplementation "org.apache.sshd:sshd-scp:$sshdVersion"
- testImplementation "ch.qos.logback:logback-classic:1.3.8"
- testImplementation 'org.glassfish.grizzly:grizzly-http-server:3.0.1'
- testImplementation 'org.testcontainers:testcontainers:1.18.3'
}
license {
@@ -73,6 +65,11 @@ license {
])
}
+java {
+ withJavadocJar()
+ withSourcesJar()
+}
+
if (!JavaVersion.current().isJava9Compatible()) {
throw new GradleScriptException("Minimum compilation version is Java 9")
}
@@ -84,10 +81,80 @@ if (JavaVersion.current().isJava8Compatible()) {
}
}
-compileJava {
- options.compilerArgs.addAll(['--release', '8'])
+testing {
+ suites {
+ configureEach {
+ useJUnitJupiter()
+ dependencies {
+ implementation "org.slf4j:slf4j-api:2.0.7"
+ implementation 'org.spockframework:spock-core:2.3-groovy-3.0'
+ implementation "org.mockito:mockito-core:4.11.0"
+ implementation "ru.vyarus:spock-junit5:1.2.0"
+ implementation "org.apache.sshd:sshd-core:$sshdVersion"
+ implementation "org.apache.sshd:sshd-sftp:$sshdVersion"
+ implementation "org.apache.sshd:sshd-scp:$sshdVersion"
+ implementation "ch.qos.logback:logback-classic:1.3.8"
+ implementation 'org.glassfish.grizzly:grizzly-http-server:3.0.1'
+ }
+
+ targets {
+ all {
+ testTask.configure {
+ testLogging {
+ exceptionFormat = 'full'
+ }
+ include "**/*Test.*"
+ include "**/*Spec.*"
+ afterSuite { descriptor, result ->
+ def indicator = "\u001B[32m✓\u001b[0m"
+ if (result.failedTestCount > 0) {
+ indicator = "\u001B[31m✘\u001b[0m"
+ }
+ logger.lifecycle("$indicator Test ${descriptor.name}; Executed: ${result.testCount}/\u001B[32m${result.successfulTestCount}\u001B[0m/\u001B[31m${result.failedTestCount}\u001B[0m")
+ }
+ }
+ }
+ }
+ }
+
+ test {
+ sources {
+ groovy {
+ srcDirs = ['src/test/groovy']
+ }
+ }
+ }
+
+ integrationTest(JvmTestSuite) {
+ dependencies {
+ implementation project()
+ implementation 'org.testcontainers:testcontainers:1.18.3'
+ implementation 'org.testcontainers:junit-jupiter:1.18.3'
+ }
+
+ sources {
+ groovy {
+ srcDirs = ['src/itest/groovy']
+ }
+
+ resources {
+ srcDirs = ['src/itest/resources']
+ }
+ }
+
+ targets {
+ all {
+ testTask.configure {
+ shouldRunAfter(test)
+ }
+ }
+ }
+ }
+ }
}
+project.tasks.compileGroovy.onlyIf { false }
+
task writeSshjVersionProperties {
doLast {
project.file("${project.buildDir}/resources/main").mkdirs()
@@ -121,11 +188,6 @@ jar {
}
}
-java {
- withJavadocJar()
- withSourcesJar()
-}
-
sourcesJar {
manifest {
attributes(
@@ -139,46 +201,6 @@ sourcesJar {
}
}
-configurations {
- integrationTestImplementation.extendsFrom testImplementation
- integrationTestRuntimeOnly.extendsFrom testRuntimeOnly
-}
-
-sourceSets {
- integrationTest {
- groovy {
- compileClasspath += sourceSets.main.output + sourceSets.test.output
- runtimeClasspath += sourceSets.main.output + sourceSets.test.output
- srcDir file('src/itest/groovy')
- }
- resources.srcDir file('src/itest/resources')
- }
-}
-
-task integrationTest(type: Test) {
- testClassesDirs = sourceSets.integrationTest.output.classesDirs
- classpath = sourceSets.integrationTest.runtimeClasspath
-}
-
-tasks.withType(Test) {
- testLogging {
- exceptionFormat = 'full'
- }
- useJUnitPlatform()
-
- afterSuite { descriptor, result ->
- if (descriptor.className != null) {
- def indicator = "\u001B[32m✓\u001b[0m"
- if (result.failedTestCount > 0) {
- indicator = "\u001B[31m✘\u001b[0m"
- }
- logger.lifecycle("$indicator Test ${descriptor.name}; Executed: ${result.testCount}/\u001B[32m${result.successfulTestCount}\u001B[0m/\u001B[31m${result.failedTestCount}\u001B[0m")
- }
- }
-}
-
-project.tasks.compileGroovy.onlyIf { false }
-
github {
user 'hierynomus'
license 'Apache'
@@ -264,17 +286,11 @@ nexusPublishing {
jacocoTestReport {
reports {
- xml.enabled true
- html.enabled true
+ xml.required = true
+ html.required = true
}
}
-task forkedUploadRelease(type: GradleBuild) {
- buildFile = project.buildFile
- tasks = ["clean", "publishToSonatype", "closeAndReleaseSonatypeStagingRepository"]
-}
-
project.tasks.release.dependsOn([project.tasks.integrationTest, project.tasks.build])
-project.tasks.release.finalizedBy(project.tasks.forkedUploadRelease)
project.tasks.jacocoTestReport.dependsOn(project.tasks.test)
project.tasks.check.dependsOn(project.tasks.jacocoTestReport)
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 774fae87..15de9024 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.2-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
diff --git a/src/itest/groovy/com/hierynomus/sshj/IntegrationSpec.groovy b/src/itest/groovy/com/hierynomus/sshj/IntegrationSpec.groovy
index d0843709..708c2151 100644
--- a/src/itest/groovy/com/hierynomus/sshj/IntegrationSpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/IntegrationSpec.groovy
@@ -20,15 +20,17 @@ import net.schmizz.sshj.DefaultConfig
import net.schmizz.sshj.SSHClient
import net.schmizz.sshj.transport.TransportException
import net.schmizz.sshj.userauth.UserAuthException
-import org.junit.ClassRule
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll
+@Testcontainers
class IntegrationSpec extends Specification {
@Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
@Unroll
def "should accept correct key for #signatureName"() {
diff --git a/src/itest/groovy/com/hierynomus/sshj/sftp/FileWriteSpec.groovy b/src/itest/groovy/com/hierynomus/sshj/sftp/FileWriteSpec.groovy
index 95179a38..2646aa0f 100644
--- a/src/itest/groovy/com/hierynomus/sshj/sftp/FileWriteSpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/sftp/FileWriteSpec.groovy
@@ -15,13 +15,15 @@
*/
package com.hierynomus.sshj.sftp
-import com.hierynomus.sshj.IntegrationTestUtil
+
import com.hierynomus.sshj.SshdContainer
import net.schmizz.sshj.SSHClient
import net.schmizz.sshj.sftp.OpenMode
import net.schmizz.sshj.sftp.RemoteFile
import net.schmizz.sshj.sftp.SFTPClient
import org.junit.ClassRule
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Shared
import spock.lang.Specification
@@ -29,10 +31,11 @@ import java.nio.charset.StandardCharsets
import static org.codehaus.groovy.runtime.IOGroovyMethods.withCloseable
+@Testcontainers
class FileWriteSpec extends Specification {
@Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
def "should append to file (GH issue #390)"() {
given:
diff --git a/src/itest/groovy/com/hierynomus/sshj/signature/PublicKeyAuthWithCertificateSpec.groovy b/src/itest/groovy/com/hierynomus/sshj/signature/PublicKeyAuthWithCertificateSpec.groovy
index 58df0190..2854ffd5 100644
--- a/src/itest/groovy/com/hierynomus/sshj/signature/PublicKeyAuthWithCertificateSpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/signature/PublicKeyAuthWithCertificateSpec.groovy
@@ -19,7 +19,8 @@ import com.hierynomus.sshj.SshdContainer
import net.schmizz.sshj.DefaultConfig
import net.schmizz.sshj.SSHClient
import net.schmizz.sshj.transport.verification.PromiscuousVerifier
-import org.junit.ClassRule
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll
@@ -29,10 +30,11 @@ import spock.lang.Unroll
*
* Also, take a look at the unit test {@link net.schmizz.sshj.transport.verification.KeyWithCertificateUnitSpec}.
*/
+@Testcontainers
class PublicKeyAuthWithCertificateSpec extends Specification {
@Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
@Unroll
def "authorising with a signed public key #keyName"() {
diff --git a/src/itest/groovy/com/hierynomus/sshj/signature/RsaSignatureClientKeySpec.groovy b/src/itest/groovy/com/hierynomus/sshj/signature/RsaSignatureClientKeySpec.groovy
index df048763..cebbd416 100644
--- a/src/itest/groovy/com/hierynomus/sshj/signature/RsaSignatureClientKeySpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/signature/RsaSignatureClientKeySpec.groovy
@@ -17,15 +17,17 @@ package com.hierynomus.sshj.signature
import com.hierynomus.sshj.IntegrationTestUtil
import com.hierynomus.sshj.SshdContainer
-import org.junit.ClassRule
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll
+@Testcontainers
class RsaSignatureClientKeySpec extends Specification {
@Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
@Unroll
def "should correctly connect using publickey auth with RSA key with signature"() {
diff --git a/src/itest/groovy/com/hierynomus/sshj/signature/SignatureSpec.groovy b/src/itest/groovy/com/hierynomus/sshj/signature/SignatureSpec.groovy
index d431738a..c8946b4e 100644
--- a/src/itest/groovy/com/hierynomus/sshj/signature/SignatureSpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/signature/SignatureSpec.groovy
@@ -19,15 +19,17 @@ import com.hierynomus.sshj.IntegrationTestUtil
import com.hierynomus.sshj.SshdContainer
import com.hierynomus.sshj.key.KeyAlgorithms
import net.schmizz.sshj.DefaultConfig
-import org.junit.ClassRule
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll
+@Testcontainers
class SignatureSpec extends Specification {
@Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
@Unroll
def "should correctly connect with #sig Signature"() {
diff --git a/src/itest/groovy/com/hierynomus/sshj/transport/cipher/CipherSpec.groovy b/src/itest/groovy/com/hierynomus/sshj/transport/cipher/CipherSpec.groovy
index bc6687d8..643e5df6 100644
--- a/src/itest/groovy/com/hierynomus/sshj/transport/cipher/CipherSpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/transport/cipher/CipherSpec.groovy
@@ -18,15 +18,17 @@ package com.hierynomus.sshj.transport.cipher
import com.hierynomus.sshj.IntegrationTestUtil
import com.hierynomus.sshj.SshdContainer
import net.schmizz.sshj.DefaultConfig
-import org.junit.ClassRule
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll
+@Testcontainers
class CipherSpec extends Specification {
@Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
@Unroll
def "should correctly connect with #cipher Cipher"() {
diff --git a/src/itest/groovy/com/hierynomus/sshj/transport/kex/KexSpec.groovy b/src/itest/groovy/com/hierynomus/sshj/transport/kex/KexSpec.groovy
index 944be9f3..69f8abf6 100644
--- a/src/itest/groovy/com/hierynomus/sshj/transport/kex/KexSpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/transport/kex/KexSpec.groovy
@@ -22,15 +22,15 @@ import net.schmizz.sshj.transport.kex.Curve25519SHA256
import net.schmizz.sshj.transport.kex.DHGexSHA1
import net.schmizz.sshj.transport.kex.DHGexSHA256
import net.schmizz.sshj.transport.kex.ECDHNistP
-import org.junit.ClassRule
-import spock.lang.Shared
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Specification
import spock.lang.Unroll
+@Testcontainers
class KexSpec extends Specification {
- @Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
@Unroll
def "should correctly connect with #kex Key Exchange"() {
diff --git a/src/itest/groovy/com/hierynomus/sshj/transport/mac/MacSpec.groovy b/src/itest/groovy/com/hierynomus/sshj/transport/mac/MacSpec.groovy
index fe616cdd..0db84d90 100644
--- a/src/itest/groovy/com/hierynomus/sshj/transport/mac/MacSpec.groovy
+++ b/src/itest/groovy/com/hierynomus/sshj/transport/mac/MacSpec.groovy
@@ -18,15 +18,17 @@ package com.hierynomus.sshj.transport.mac
import com.hierynomus.sshj.IntegrationTestUtil
import com.hierynomus.sshj.SshdContainer
import net.schmizz.sshj.DefaultConfig
-import org.junit.ClassRule
+import org.testcontainers.junit.jupiter.Container
+import org.testcontainers.junit.jupiter.Testcontainers
import spock.lang.Shared
import spock.lang.Specification
import spock.lang.Unroll
+@Testcontainers
class MacSpec extends Specification {
@Shared
- @ClassRule
- SshdContainer sshd
+ @Container
+ static SshdContainer sshd = new SshdContainer()
@Unroll
def "should correctly connect with #mac MAC"() {
diff --git a/src/test/groovy/com/hierynomus/sshj/connection/channel/direct/LocalPortForwarderSpec.groovy b/src/test/groovy/com/hierynomus/sshj/connection/channel/direct/LocalPortForwarderSpec.groovy
index 0a3b64a9..baaa89f4 100644
--- a/src/test/groovy/com/hierynomus/sshj/connection/channel/direct/LocalPortForwarderSpec.groovy
+++ b/src/test/groovy/com/hierynomus/sshj/connection/channel/direct/LocalPortForwarderSpec.groovy
@@ -15,18 +15,18 @@
*/
package com.hierynomus.sshj.connection.channel.direct
-import com.hierynomus.sshj.test.SshFixture
+import com.hierynomus.sshj.test.SshServerExtension
import net.schmizz.sshj.connection.channel.direct.Parameters
-import org.junit.Rule
+import org.junit.jupiter.api.extension.RegisterExtension
import spock.lang.Specification
import spock.util.concurrent.PollingConditions
class LocalPortForwarderSpec extends Specification {
- @Rule
- SshFixture tunnelFixture = new SshFixture()
+ @RegisterExtension
+ SshServerExtension tunnelFixture = new SshServerExtension()
- @Rule
- SshFixture realServer = new SshFixture()
+ @RegisterExtension
+ SshServerExtension realServer = new SshServerExtension()
def "should not hang when disconnect tunnel"() {
given:
diff --git a/src/test/groovy/com/hierynomus/sshj/sftp/SFTPClientSpec.groovy b/src/test/groovy/com/hierynomus/sshj/sftp/SFTPClientSpec.groovy
index 1fd48615..b3f6774c 100644
--- a/src/test/groovy/com/hierynomus/sshj/sftp/SFTPClientSpec.groovy
+++ b/src/test/groovy/com/hierynomus/sshj/sftp/SFTPClientSpec.groovy
@@ -15,25 +15,29 @@
*/
package com.hierynomus.sshj.sftp
-import com.hierynomus.sshj.test.SshFixture
+import com.hierynomus.sshj.test.SshServerExtension
import com.hierynomus.sshj.test.util.FileUtil
import net.schmizz.sshj.SSHClient
import net.schmizz.sshj.sftp.FileMode
import net.schmizz.sshj.sftp.SFTPClient
-import org.junit.Rule
-import org.junit.rules.TemporaryFolder
+import org.junit.jupiter.api.extension.RegisterExtension
import spock.lang.Specification
+import spock.lang.TempDir
import spock.lang.Unroll
+import java.nio.file.Files
+import java.nio.file.Path
+
import static org.codehaus.groovy.runtime.IOGroovyMethods.withCloseable
class SFTPClientSpec extends Specification {
- @Rule
- public SshFixture fixture = new SshFixture()
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension()
- @Rule
- public TemporaryFolder temp = new TemporaryFolder()
+
+ @TempDir
+ public Path temp
@Unroll
def "should copy #sourceType->#targetType if #targetExists with #named name"() {
@@ -79,11 +83,11 @@ class SFTPClientSpec extends Specification {
def "should not throw exception on close before disconnect"() {
given:
- File file = temp.newFile("source.txt")
+ File file = Files.createFile(temp.resolve("source.txt")).toFile()
FileUtil.writeToFile(file, "This is the source")
when:
- doUpload(file, temp.newFile("dest.txt"))
+ doUpload(file, temp.resolve("dest.txt").toFile())
then:
noExceptionThrown()
@@ -147,10 +151,10 @@ class SFTPClientSpec extends Specification {
def "should not merge same name subdirs (GH #252)"() {
given:
- File toto = temp.newFolder("toto")
+ File toto = Files.createDirectory(temp.resolve("toto")).toFile()
File tutu = mkdir(toto, "tutu")
File toto2 = mkdir(toto, "toto")
- File dest = temp.newFolder("dest")
+ File dest = Files.createDirectory(temp.resolve("dest")).toFile()
FileUtil.writeToFile(new File(toto, "toto.txt"), "Toto file")
FileUtil.writeToFile(new File(tutu, "tototutu.txt"), "Toto/Tutu file")
FileUtil.writeToFile(new File(toto2, "totototo.txt"), "Toto/Toto file")
diff --git a/src/test/groovy/com/hierynomus/sshj/transport/verification/OpenSSHKnownHostsSpec.groovy b/src/test/groovy/com/hierynomus/sshj/transport/verification/OpenSSHKnownHostsSpec.groovy
index 2fc05e68..091ae10c 100644
--- a/src/test/groovy/com/hierynomus/sshj/transport/verification/OpenSSHKnownHostsSpec.groovy
+++ b/src/test/groovy/com/hierynomus/sshj/transport/verification/OpenSSHKnownHostsSpec.groovy
@@ -18,17 +18,16 @@ package com.hierynomus.sshj.transport.verification
import net.schmizz.sshj.common.Buffer
import net.schmizz.sshj.transport.verification.OpenSSHKnownHosts
import net.schmizz.sshj.util.KeyUtil
-import org.junit.Rule
-import org.junit.rules.TemporaryFolder
import spock.lang.Specification
+import spock.lang.TempDir
import spock.lang.Unroll
+import java.nio.file.Files
import java.security.PublicKey
class OpenSSHKnownHostsSpec extends Specification {
- @Rule
- public TemporaryFolder temp = new TemporaryFolder();
+ @TempDir def temp
def "should parse and verify hashed host entry"() {
given:
@@ -215,7 +214,7 @@ host1 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBL
}
def knownHosts(String s) {
- def f = temp.newFile("known_hosts")
+ def f = Files.createFile(temp.resolve("known_hosts")).toFile()
f.write(s)
return f
}
diff --git a/src/test/groovy/com/hierynomus/sshj/userauth/keyprovider/FileKeyProviderSpec.groovy b/src/test/groovy/com/hierynomus/sshj/userauth/keyprovider/FileKeyProviderSpec.groovy
index 7c85faa4..9b34eae8 100644
--- a/src/test/groovy/com/hierynomus/sshj/userauth/keyprovider/FileKeyProviderSpec.groovy
+++ b/src/test/groovy/com/hierynomus/sshj/userauth/keyprovider/FileKeyProviderSpec.groovy
@@ -15,18 +15,18 @@
*/
package com.hierynomus.sshj.userauth.keyprovider
-import com.hierynomus.sshj.test.SshFixture
+import com.hierynomus.sshj.test.SshServerExtension
import net.schmizz.sshj.DefaultConfig
import net.schmizz.sshj.SSHClient
import net.schmizz.sshj.userauth.keyprovider.KeyFormat
import org.apache.sshd.server.auth.pubkey.AcceptAllPublickeyAuthenticator
-import org.junit.Rule
+import org.junit.jupiter.api.extension.RegisterExtension
import spock.lang.Specification
import spock.lang.Unroll
class FileKeyProviderSpec extends Specification {
- @Rule
- SshFixture fixture = new SshFixture(false)
+ @RegisterExtension
+ SshServerExtension fixture = new SshServerExtension(false)
def setup() {
fixture.getServer().setPublickeyAuthenticator(AcceptAllPublickeyAuthenticator.INSTANCE)
diff --git a/src/test/groovy/net/schmizz/sshj/signature/SignatureDSASpec.groovy b/src/test/groovy/net/schmizz/sshj/signature/SignatureDSASpec.groovy
index 3032b2a7..e62eaedd 100644
--- a/src/test/groovy/net/schmizz/sshj/signature/SignatureDSASpec.groovy
+++ b/src/test/groovy/net/schmizz/sshj/signature/SignatureDSASpec.groovy
@@ -31,20 +31,12 @@
package net.schmizz.sshj.signature
import com.hierynomus.sshj.common.KeyAlgorithm
-import spock.lang.Unroll;
-
-import java.math.BigInteger;
-import java.security.KeyFactory;
-import java.security.NoSuchAlgorithmException;
-import java.security.PublicKey;
-import java.security.spec.DSAPublicKeySpec;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
import spock.lang.Specification
+import spock.lang.Unroll
+
+import java.security.KeyFactory
+import java.security.PublicKey
+import java.security.spec.DSAPublicKeySpec
class SignatureDSASpec extends Specification {
diff --git a/src/test/java/com/hierynomus/sshj/connection/channel/ChannelCloseEofTest.java b/src/test/java/com/hierynomus/sshj/connection/channel/ChannelCloseEofTest.java
index 917e60c1..31b27861 100644
--- a/src/test/java/com/hierynomus/sshj/connection/channel/ChannelCloseEofTest.java
+++ b/src/test/java/com/hierynomus/sshj/connection/channel/ChannelCloseEofTest.java
@@ -15,10 +15,10 @@
*/
package com.hierynomus.sshj.connection.channel;
-import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.SshServerExtension;
import net.schmizz.sshj.connection.channel.direct.Session;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
import java.io.IOException;
@@ -26,8 +26,8 @@ import static org.hamcrest.MatcherAssert.assertThat;
public class ChannelCloseEofTest {
- @Rule
- public SshFixture fixture = new SshFixture();
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension();
@Test
public void shouldCorrectlyHandleSessionChannelEof() throws IOException, InterruptedException {
diff --git a/src/test/java/com/hierynomus/sshj/connection/channel/direct/CommandTest.java b/src/test/java/com/hierynomus/sshj/connection/channel/direct/CommandTest.java
index 3c62c9a1..813e606b 100644
--- a/src/test/java/com/hierynomus/sshj/connection/channel/direct/CommandTest.java
+++ b/src/test/java/com/hierynomus/sshj/connection/channel/direct/CommandTest.java
@@ -15,13 +15,13 @@
*/
package com.hierynomus.sshj.connection.channel.direct;
-import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.SshServerExtension;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.sftp.SFTPClient;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.junit.jupiter.api.io.TempDir;
import java.io.File;
import java.io.IOException;
@@ -30,17 +30,17 @@ import static org.hamcrest.MatcherAssert.assertThat;
public class CommandTest {
- @Rule
- public SshFixture fixture = new SshFixture();
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension();
- @Rule
- public TemporaryFolder temp = new TemporaryFolder();
+ @TempDir
+ public File temp;
@Test
public void shouldExecuteBackgroundCommand() throws IOException {
SSHClient sshClient = fixture.setupConnectedDefaultClient();
sshClient.authPassword("jeroen", "jeroen");
- File file = new File(temp.getRoot(), "testdir");
+ File file = new File(temp, "testdir");
assertThat("File should not exist", !file.exists());
// TODO figure out why this does not really execute in the background.
Session.Command exec = sshClient.startSession().exec("mkdir " + file.getPath() + " &");
diff --git a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java
index e923708f..b001a98c 100644
--- a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java
+++ b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/LocalPortForwarderTest.java
@@ -16,44 +16,36 @@
package com.hierynomus.sshj.connection.channel.forwarded;
import com.hierynomus.sshj.test.HttpServer;
-import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.SshServerExtension;
import com.hierynomus.sshj.test.util.FileUtil;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.connection.channel.direct.LocalPortForwarder;
import net.schmizz.sshj.connection.channel.direct.Parameters;
import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
+import org.junit.jupiter.api.extension.RegisterExtension;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.PrintWriter;
-import java.net.HttpURLConnection;
-import java.net.InetSocketAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.net.URL;
+import java.io.*;
+import java.net.*;
+import java.nio.file.Files;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
public class LocalPortForwarderTest {
private static final String LOCALHOST_URL = "http://127.0.0.1:8080";
- @Rule
- public SshFixture fixture = new SshFixture();
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension();
- @Rule
+ @RegisterExtension
public HttpServer httpServer = new HttpServer();
- @Before
+ @BeforeEach
public void setUp() throws IOException {
fixture.getServer().setForwardingFilter(new AcceptAllForwardingFilter());
- File file = httpServer.getDocRoot().newFile("index.html");
+ File file = Files.createFile(httpServer.getDocRoot().toPath().resolve("index.html")).toFile();
FileUtil.writeToFile(file, "
Hi!
");
}
@@ -68,7 +60,8 @@ public class LocalPortForwarderTest {
httpGetAndAssertConnectionClosedByServer(8080);
}
- @Test(timeout = 10_000)
+ @Test
+ @Timeout(10_000)
public void shouldCloseConnectionWhenRemoteServerClosesConnection() throws IOException {
SSHClient sshClient = getFixtureClient();
@@ -113,7 +106,7 @@ public class LocalPortForwarderTest {
int read = inputStream.read();
// Assert input stream was closed by server.
- Assert.assertEquals(-1, read);
+ assertEquals(-1, read);
}
}
diff --git a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java
index 9dda9e47..b07f2d2c 100644
--- a/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java
+++ b/src/test/java/com/hierynomus/sshj/connection/channel/forwarded/RemotePortForwarderTest.java
@@ -16,24 +16,25 @@
package com.hierynomus.sshj.connection.channel.forwarded;
import com.hierynomus.sshj.test.HttpServer;
-import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.SshServerExtension;
import com.hierynomus.sshj.test.util.FileUtil;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.connection.ConnectionException;
import net.schmizz.sshj.connection.channel.forwarded.RemotePortForwarder;
import net.schmizz.sshj.connection.channel.forwarded.SocketForwardingConnectListener;
import org.apache.sshd.server.forward.AcceptAllForwardingFilter;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
import java.io.File;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.URL;
+import java.nio.file.Files;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
public class RemotePortForwarderTest {
private static final PortRange RANGE = new PortRange(9000, 9999);
@@ -41,16 +42,16 @@ public class RemotePortForwarderTest {
private static final String LOCALHOST_URL_FORMAT = "http://127.0.0.1:%d";
private static final InetSocketAddress HTTP_SERVER_SOCKET_ADDR = new InetSocketAddress(LOCALHOST, 8080);
- @Rule
- public SshFixture fixture = new SshFixture();
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension();
- @Rule
+ @RegisterExtension
public HttpServer httpServer = new HttpServer();
- @Before
+ @BeforeEach
public void setUp() throws IOException {
fixture.getServer().setForwardingFilter(new AcceptAllForwardingFilter());
- File file = httpServer.getDocRoot().newFile("index.html");
+ File file = Files.createFile(httpServer.getDocRoot().toPath().resolve("index.html")).toFile();
FileUtil.writeToFile(file, "Hi!
");
}
diff --git a/src/test/java/com/hierynomus/sshj/keepalive/KeepAliveThreadTerminationTest.java b/src/test/java/com/hierynomus/sshj/keepalive/KeepAliveThreadTerminationTest.java
index 9e743f6b..153b6dec 100644
--- a/src/test/java/com/hierynomus/sshj/keepalive/KeepAliveThreadTerminationTest.java
+++ b/src/test/java/com/hierynomus/sshj/keepalive/KeepAliveThreadTerminationTest.java
@@ -15,21 +15,18 @@
*/
package com.hierynomus.sshj.keepalive;
-import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.SshServerExtension;
import net.schmizz.keepalive.KeepAlive;
import net.schmizz.keepalive.KeepAliveProvider;
import net.schmizz.sshj.DefaultConfig;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.userauth.UserAuthException;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
import java.io.IOException;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThrows;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.*;
public class KeepAliveThreadTerminationTest {
@@ -37,8 +34,8 @@ public class KeepAliveThreadTerminationTest {
private static final long STOP_SLEEP = 1500;
- @Rule
- public SshFixture fixture = new SshFixture();
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension();
@Test
public void shouldNotStartThreadOnSetKeepAliveInterval() {
diff --git a/src/test/java/com/hierynomus/sshj/sftp/RemoteFileTest.java b/src/test/java/com/hierynomus/sshj/sftp/RemoteFileTest.java
index c69d1240..b105962b 100644
--- a/src/test/java/com/hierynomus/sshj/sftp/RemoteFileTest.java
+++ b/src/test/java/com/hierynomus/sshj/sftp/RemoteFileTest.java
@@ -15,7 +15,7 @@
*/
package com.hierynomus.sshj.sftp;
-import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.SshServerExtension;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.ByteArrayUtils;
import net.schmizz.sshj.sftp.OpenMode;
@@ -23,9 +23,9 @@ import net.schmizz.sshj.sftp.RemoteFile;
import net.schmizz.sshj.sftp.SFTPEngine;
import net.schmizz.sshj.sftp.SFTPException;
import org.apache.sshd.common.util.io.IoUtils;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
+import org.junit.jupiter.api.io.TempDir;
import java.io.*;
import java.security.SecureRandom;
@@ -34,15 +34,15 @@ import java.util.Random;
import static org.hamcrest.CoreMatchers.equalTo;
import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.fail;
public class RemoteFileTest {
- @Rule
- public SshFixture fixture = new SshFixture();
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension();
- @Rule
- public TemporaryFolder temp = new TemporaryFolder();
+ @TempDir
+ public File temp;
@Test
public void shouldNotGoOutOfBoundsInReadAheadInputStream() throws IOException {
@@ -51,7 +51,7 @@ public class RemoteFileTest {
SFTPEngine sftp = new SFTPEngine(ssh).init();
RemoteFile rf;
- File file = temp.newFile("SftpReadAheadTest.bin");
+ File file = new File(temp, "SftpReadAheadTest.bin");
rf = sftp.open(file.getPath(), EnumSet.of(OpenMode.WRITE, OpenMode.CREAT));
byte[] data = new byte[8192];
new Random(53).nextBytes(data);
@@ -96,7 +96,7 @@ public class RemoteFileTest {
SFTPEngine sftp = new SFTPEngine(ssh).init();
RemoteFile rf;
- File file = temp.newFile("SftpReadAheadLimitTest.bin");
+ File file = new File(temp, "SftpReadAheadLimitTest.bin");
rf = sftp.open(file.getPath(), EnumSet.of(OpenMode.WRITE, OpenMode.CREAT));
byte[] data = new byte[8192];
new Random(53).nextBytes(data);
@@ -139,7 +139,7 @@ public class RemoteFileTest {
SFTPEngine sftp = new SFTPEngine(ssh).init();
RemoteFile rf;
- File file = temp.newFile("SftpReadAheadLimitedTest.bin");
+ File file = new File(temp, "SftpReadAheadLimitedTest.bin");
rf = sftp.open(file.getPath(), EnumSet.of(OpenMode.WRITE, OpenMode.CREAT));
byte[] data = new byte[8192];
new Random(53).nextBytes(data);
@@ -205,7 +205,7 @@ public class RemoteFileTest {
final byte[] expected = new byte[fileSize];
new SecureRandom(new byte[] { 31 }).nextBytes(expected);
- File file = temp.newFile("shouldReadCorrectlyWhenWrappedInBufferedStream.bin");
+ File file = new File(temp, "shouldReadCorrectlyWhenWrappedInBufferedStream.bin");
try (OutputStream fStream = new FileOutputStream(file)) {
IoUtils.copy(new ByteArrayInputStream(expected), fStream);
}
@@ -221,7 +221,7 @@ public class RemoteFileTest {
actual = baos.toByteArray();
}
- assertEquals("The file should be fully read", expected.length, actual.length);
+ assertEquals(expected.length, actual.length, "The file should be fully read");
assertThat("The file should be read correctly",
ByteArrayUtils.equals(expected, 0, actual, 0, expected.length));
}
diff --git a/src/test/java/com/hierynomus/sshj/test/BaseAlgorithmTest.java b/src/test/java/com/hierynomus/sshj/test/BaseAlgorithmTest.java
index 975f7d9e..127ac443 100644
--- a/src/test/java/com/hierynomus/sshj/test/BaseAlgorithmTest.java
+++ b/src/test/java/com/hierynomus/sshj/test/BaseAlgorithmTest.java
@@ -21,9 +21,8 @@ import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.transport.random.JCERandom;
import net.schmizz.sshj.transport.random.SingletonRandomFactory;
import org.apache.sshd.server.SshServer;
-import org.junit.After;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -36,13 +35,8 @@ public abstract class BaseAlgorithmTest {
private SingletonRandomFactory randomFactory = new SingletonRandomFactory(new JCERandom.Factory());
private DefaultConfig config = new DefaultConfig();
- @Rule
- public SshFixture fixture = new SshFixture(false);
-
- @After
- public void stopServer() {
- fixture.stopServer();
- }
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension(false);
@Test
public void shouldVerifyAlgorithm() throws IOException {
diff --git a/src/test/java/com/hierynomus/sshj/test/HttpServer.java b/src/test/java/com/hierynomus/sshj/test/HttpServer.java
index 76ec2333..259235b7 100644
--- a/src/test/java/com/hierynomus/sshj/test/HttpServer.java
+++ b/src/test/java/com/hierynomus/sshj/test/HttpServer.java
@@ -15,27 +15,25 @@
*/
package com.hierynomus.sshj.test;
-import org.junit.rules.ExternalResource;
-import org.junit.rules.TemporaryFolder;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+
+import java.io.File;
+import java.nio.file.Files;
/**
* Can be used to setup a test HTTP server
*/
-public class HttpServer extends ExternalResource {
+public class HttpServer implements BeforeEachCallback, AfterEachCallback {
private org.glassfish.grizzly.http.server.HttpServer httpServer;
- private TemporaryFolder docRoot = new TemporaryFolder();
+
+ private File docRoot ;
@Override
- protected void before() throws Throwable {
- docRoot.create();
- httpServer = org.glassfish.grizzly.http.server.HttpServer.createSimpleServer(docRoot.getRoot().getAbsolutePath());
- httpServer.start();
- }
-
- @Override
- protected void after() {
+ public void afterEach(ExtensionContext context) throws Exception {
try {
httpServer.shutdownNow();
} catch (Exception e) {}
@@ -45,11 +43,18 @@ public class HttpServer extends ExternalResource {
}
+ @Override
+ public void beforeEach(ExtensionContext context) throws Exception {
+ docRoot = Files.createTempDirectory("sshj").toFile();
+ httpServer = org.glassfish.grizzly.http.server.HttpServer.createSimpleServer(docRoot.getAbsolutePath());
+ httpServer.start();
+ }
+
public org.glassfish.grizzly.http.server.HttpServer getHttpServer() {
return httpServer;
}
- public TemporaryFolder getDocRoot() {
+ public File getDocRoot() {
return docRoot;
}
}
diff --git a/src/test/java/com/hierynomus/sshj/test/SshFixture.java b/src/test/java/com/hierynomus/sshj/test/SshServerExtension.java
similarity index 88%
rename from src/test/java/com/hierynomus/sshj/test/SshFixture.java
rename to src/test/java/com/hierynomus/sshj/test/SshServerExtension.java
index 508fa290..1d07bbe3 100644
--- a/src/test/java/com/hierynomus/sshj/test/SshFixture.java
+++ b/src/test/java/com/hierynomus/sshj/test/SshServerExtension.java
@@ -25,8 +25,11 @@ import org.apache.sshd.scp.server.ScpCommandFactory;
import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.shell.ProcessShellFactory;
import org.apache.sshd.sftp.server.SftpSubsystemFactory;
-import org.junit.rules.ExternalResource;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import java.io.Closeable;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.net.ServerSocket;
@@ -36,7 +39,7 @@ import java.util.concurrent.atomic.AtomicBoolean;
/**
* Can be used as a rule to ensure the server is teared down after each test.
*/
-public class SshFixture extends ExternalResource {
+public class SshServerExtension implements BeforeEachCallback, AfterEachCallback, Closeable {
public static final String hostkey = "hostkey.pem";
public static final String fingerprint = "ce:a7:c1:cf:17:3f:96:49:6a:53:1a:05:0b:ba:90:db";
public static final String listCommand = OsUtils.isWin32() ? "cmd.exe /C dir" : "ls";
@@ -46,22 +49,28 @@ public class SshFixture extends ExternalResource {
private final AtomicBoolean started = new AtomicBoolean(false);
private boolean autoStart = true;
- public SshFixture(boolean autoStart) {
+ public SshServerExtension(boolean autoStart) {
this.autoStart = autoStart;
}
- public SshFixture() {
+ public SshServerExtension() {
}
@Override
- protected void before() throws Throwable {
+ public void afterEach(ExtensionContext context) throws Exception {
+ close();
+ }
+
+ @Override
+ public void beforeEach(ExtensionContext context) throws Exception {
if (autoStart) {
start();
}
}
+
@Override
- protected void after() {
+ public void close() throws IOException {
stopClient();
stopServer();
}
diff --git a/src/test/java/com/hierynomus/sshj/transport/ChachaPolyCipherTest.java b/src/test/java/com/hierynomus/sshj/transport/ChachaPolyCipherTest.java
index 6a281176..df9e8d18 100644
--- a/src/test/java/com/hierynomus/sshj/transport/ChachaPolyCipherTest.java
+++ b/src/test/java/com/hierynomus/sshj/transport/ChachaPolyCipherTest.java
@@ -15,17 +15,15 @@
*/
package com.hierynomus.sshj.transport;
-import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
-
import com.hierynomus.sshj.transport.cipher.ChachaPolyCiphers;
import net.schmizz.sshj.common.SSHRuntimeException;
import net.schmizz.sshj.transport.cipher.Cipher;
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
+import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
+
+import static org.junit.jupiter.api.Assertions.*;
public class ChachaPolyCipherTest {
diff --git a/src/test/java/com/hierynomus/sshj/transport/DisconnectionTest.java b/src/test/java/com/hierynomus/sshj/transport/DisconnectionTest.java
index b4522e04..d40cd497 100644
--- a/src/test/java/com/hierynomus/sshj/transport/DisconnectionTest.java
+++ b/src/test/java/com/hierynomus/sshj/transport/DisconnectionTest.java
@@ -15,30 +15,30 @@
*/
package com.hierynomus.sshj.transport;
-import com.hierynomus.sshj.test.SshFixture;
+import com.hierynomus.sshj.test.SshServerExtension;
import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.DisconnectReason;
import net.schmizz.sshj.connection.channel.direct.Session;
import net.schmizz.sshj.transport.DisconnectListener;
import net.schmizz.sshj.transport.TransportException;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
import java.io.IOException;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
public class DisconnectionTest {
private AtomicBoolean disconnected = null;
- @Rule
- public SshFixture fixture = new SshFixture();
+ @RegisterExtension
+ public SshServerExtension fixture = new SshServerExtension();
- @Before
+ @BeforeEach
public void setupFlag() throws IOException {
disconnected = new AtomicBoolean(false);
// Initialize the client
diff --git a/src/test/java/com/hierynomus/sshj/transport/GcmCipherDecryptSshPacketTest.java b/src/test/java/com/hierynomus/sshj/transport/GcmCipherDecryptSshPacketTest.java
index b0ed52c5..60995cb4 100644
--- a/src/test/java/com/hierynomus/sshj/transport/GcmCipherDecryptSshPacketTest.java
+++ b/src/test/java/com/hierynomus/sshj/transport/GcmCipherDecryptSshPacketTest.java
@@ -20,48 +20,58 @@ import net.schmizz.sshj.common.IOUtils;
import net.schmizz.sshj.common.SSHPacket;
import net.schmizz.sshj.transport.cipher.Cipher;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
-import org.junit.BeforeClass;
-import org.junit.experimental.theories.DataPoints;
-import org.junit.experimental.theories.Theories;
-import org.junit.experimental.theories.Theory;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
import java.security.Security;
import java.util.Arrays;
+import java.util.stream.Stream;
-import static org.junit.Assert.assertArrayEquals;
+import static org.junit.jupiter.api.Assertions.assertArrayEquals;
/**
* Unit test to decrypt SSH traffic with OpenSSH and Apache Mina SSHD (master) using AES-GCM ciphers, for verifying
* cipher behaviour.
*/
-@RunWith(Theories.class)
+
public class GcmCipherDecryptSshPacketTest {
- @DataPoints
- public static final String sets[][] = new String[][]{{"mina-sshd", "3"}, {"openssh", "4"}};
+ public static Stream sets() {
+ return Stream.of(Arguments.of("mina-sshd", 3), Arguments.of("openssh", 4));
+ }
- @BeforeClass
+ @BeforeAll
public static void setupBeforeClass() {
Security.addProvider(new BouncyCastleProvider());
}
- @Theory
- public void testDecryptPacket(String[] args) throws Exception {
+ @ParameterizedTest
+ @MethodSource("sets")
+ public void testDecryptPacket(String ssh, int nr) throws Exception {
ClassLoader classLoader = getClass().getClassLoader();
- byte[] iv = IOUtils.readFully(classLoader.getResourceAsStream("ssh-packets/gcm/"+args[0]+"/s2c.iv.bin")).toByteArray();
- byte[] key = IOUtils.readFully(classLoader.getResourceAsStream("ssh-packets/gcm/"+args[0]+"/s2c.key.bin")).toByteArray();
+ byte[] iv = IOUtils.readFully(classLoader.getResourceAsStream("ssh-packets/gcm/" + ssh + "/s2c.iv.bin"))
+ .toByteArray();
+ byte[] key = IOUtils.readFully(classLoader.getResourceAsStream("ssh-packets/gcm/" + ssh + "/s2c.key.bin"))
+ .toByteArray();
Cipher cipher = GcmCiphers.AES128GCM().create();
cipher.init(Cipher.Mode.Decrypt, key, iv);
- for(int i=1; i<=Integer.parseInt(args[1]); i++) {
- byte[] data = IOUtils.readFully(classLoader.getResourceAsStream("ssh-packets/gcm/"+args[0]+"/client.receive."+i+".bin")).toByteArray();
+ for (int i = 1; i <= nr; i++) {
+ byte[] data = IOUtils
+ .readFully(classLoader
+ .getResourceAsStream("ssh-packets/gcm/" + ssh + "/client.receive." + i + ".bin"))
+ .toByteArray();
SSHPacket inputBuffer = new SSHPacket(data);
cipher.updateAAD(inputBuffer.array(), 0, 4);
int size = inputBuffer.readUInt32AsInt();
cipher.update(inputBuffer.array(), 4, size);
- byte[] expected = IOUtils.readFully(classLoader.getResourceAsStream("ssh-packets/gcm/"+args[0]+"/client.decrypted."+i+".bin")).toByteArray();
- assertArrayEquals(Arrays.copyOfRange(expected, 0, size+4),
- Arrays.copyOfRange(inputBuffer.array(), 0, size+4));
+ byte[] expected = IOUtils
+ .readFully(classLoader
+ .getResourceAsStream("ssh-packets/gcm/" + ssh + "/client.decrypted." + i + ".bin"))
+ .toByteArray();
+ assertArrayEquals(Arrays.copyOfRange(expected, 0, size + 4),
+ Arrays.copyOfRange(inputBuffer.array(), 0, size + 4));
}
}
}
diff --git a/src/test/java/com/hierynomus/sshj/transport/GcmCipherTest.java b/src/test/java/com/hierynomus/sshj/transport/GcmCipherTest.java
index b9784d0b..e09ec6aa 100644
--- a/src/test/java/com/hierynomus/sshj/transport/GcmCipherTest.java
+++ b/src/test/java/com/hierynomus/sshj/transport/GcmCipherTest.java
@@ -18,23 +18,21 @@ package com.hierynomus.sshj.transport;
import com.hierynomus.sshj.transport.cipher.GcmCiphers;
import net.schmizz.sshj.common.SSHRuntimeException;
import net.schmizz.sshj.transport.cipher.Cipher;
-import org.junit.experimental.theories.DataPoints;
-import org.junit.experimental.theories.Theories;
-import org.junit.experimental.theories.Theory;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
import javax.crypto.AEADBadTagException;
import java.nio.charset.StandardCharsets;
-import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.*;
-@RunWith(Theories.class)
public class GcmCipherTest {
- public static final @DataPoints
- GcmCiphers.Factory[] cipherFactories = { GcmCiphers.AES128GCM(), GcmCiphers.AES256GCM() };
+ public static GcmCiphers.Factory[] cipherFactories() {
+ return new GcmCiphers.Factory[] { GcmCiphers.AES128GCM(), GcmCiphers.AES256GCM() }; };
- @Theory
+ @ParameterizedTest
+ @MethodSource("cipherFactories")
public void testEncryptDecrypt(GcmCiphers.Factory factory) throws Exception {
Cipher enc = factory.create();
byte[] key = new byte[enc.getBlockSize()];
diff --git a/src/test/java/com/hierynomus/sshj/transport/kex/KeyExchangeTest.java b/src/test/java/com/hierynomus/sshj/transport/kex/KeyExchangeTest.java
index e82ec077..d0b61011 100644
--- a/src/test/java/com/hierynomus/sshj/transport/kex/KeyExchangeTest.java
+++ b/src/test/java/com/hierynomus/sshj/transport/kex/KeyExchangeTest.java
@@ -15,63 +15,76 @@
*/
package com.hierynomus.sshj.transport.kex;
-import com.hierynomus.sshj.test.BaseAlgorithmTest;
+import com.hierynomus.sshj.test.SshServerExtension;
import net.schmizz.sshj.Config;
import net.schmizz.sshj.DefaultConfig;
+import net.schmizz.sshj.SSHClient;
import net.schmizz.sshj.common.Factory;
import net.schmizz.sshj.transport.kex.DHGexSHA1;
import net.schmizz.sshj.transport.kex.DHGexSHA256;
import net.schmizz.sshj.transport.kex.ECDHNistP;
+import net.schmizz.sshj.transport.random.JCERandom;
+import net.schmizz.sshj.transport.random.SingletonRandomFactory;
import org.apache.sshd.common.kex.BuiltinDHFactories;
import org.apache.sshd.common.kex.KeyExchangeFactory;
-import org.apache.sshd.server.SshServer;
import org.apache.sshd.server.kex.DHGEXServer;
import org.apache.sshd.server.kex.DHGServer;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
+import org.junit.jupiter.api.DynamicTest;
+import org.junit.jupiter.api.TestFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
+import java.util.stream.Stream;
-@RunWith(Parameterized.class)
-public class KeyExchangeTest extends BaseAlgorithmTest {
+import static org.hamcrest.MatcherAssert.assertThat;
+
+public class KeyExchangeTest {
+ private final Logger logger = LoggerFactory.getLogger(this.getClass());
- @SuppressWarnings("deprecation")
- @Parameterized.Parameters(name = "algorithm={0}")
public static Collection