All SDKs now implement 58+ functions matching C reference (un.h): - Execution (8): execute, execute_async, wait_job, get_job, cancel_job, list_jobs, get_languages, detect_language - Sessions (9): list, get, create, destroy, freeze, unfreeze, boost, unboost, execute - Services (17): list, get, create, destroy, freeze, unfreeze, lock, unlock, set_unfreeze_on_demand, redeploy, logs, execute, env_get/set/delete/export, resize - Snapshots (9): list, get, session, service, restore, delete, lock, unlock, clone - Images (13): list, get, publish, delete, lock, unlock, set_visibility, grant/revoke_access, list_trusted, transfer, spawn, clone - PaaS Logs (2): fetch, stream - Utilities (5): validate_keys, hmac_sign, health_check, version, last_error Test suites created for all SDKs with unit, integration, and functional tests. Languages: AWK, Bash, C++, C#, Clojure, COBOL, Crystal, D, Dart, .NET, Elixir, Erlang, F#, Forth, Fortran, Go, Groovy, Haskell, Java, JavaScript, Julia, Kotlin, Lisp, Lua, Nim, Objective-C, OCaml, Perl, PHP, PowerShell, Prolog, Python, R, Raku, Ruby, Rust, Scheme, Swift, Tcl, TypeScript, V, Zig
211 lines
6.5 KiB
Kotlin
211 lines
6.5 KiB
Kotlin
// PUBLIC DOMAIN - NO LICENSE, NO WARRANTY
|
|
// Unit tests for Un SDK - Kotlin Synchronous client
|
|
|
|
import org.junit.jupiter.api.Test
|
|
import org.junit.jupiter.api.BeforeEach
|
|
import org.junit.jupiter.api.DisplayName
|
|
import org.junit.jupiter.api.Nested
|
|
import org.junit.jupiter.api.condition.EnabledIfEnvironmentVariable
|
|
import org.junit.jupiter.api.Assertions.*
|
|
|
|
class UnTest {
|
|
|
|
@Nested
|
|
@DisplayName("Language Detection Tests")
|
|
inner class LanguageDetectionTests {
|
|
|
|
@Test
|
|
@DisplayName("Should detect Python from .py extension")
|
|
fun detectPython() {
|
|
assertEquals("python", detectLanguage("script.py"))
|
|
assertEquals("python", detectLanguage("path/to/script.py"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should detect JavaScript from .js extension")
|
|
fun detectJavaScript() {
|
|
assertEquals("javascript", detectLanguage("app.js"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should detect TypeScript from .ts extension")
|
|
fun detectTypeScript() {
|
|
assertEquals("typescript", detectLanguage("app.ts"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should detect Go from .go extension")
|
|
fun detectGo() {
|
|
assertEquals("go", detectLanguage("main.go"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should detect Rust from .rs extension")
|
|
fun detectRust() {
|
|
assertEquals("rust", detectLanguage("lib.rs"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should detect Java from .java extension")
|
|
fun detectJava() {
|
|
assertEquals("java", detectLanguage("Main.java"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should detect Kotlin from .kt extension")
|
|
fun detectKotlin() {
|
|
assertEquals("kotlin", detectLanguage("Main.kt"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should detect Groovy from .groovy extension")
|
|
fun detectGroovy() {
|
|
assertEquals("groovy", detectLanguage("script.groovy"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should throw for unknown extension")
|
|
fun detectUnknown() {
|
|
assertThrows(RuntimeException::class.java) {
|
|
detectLanguage("file.unknown")
|
|
}
|
|
}
|
|
}
|
|
|
|
@Nested
|
|
@DisplayName("Utility Function Tests")
|
|
inner class UtilityTests {
|
|
|
|
@Test
|
|
@DisplayName("Version should return a valid version string")
|
|
fun versionString() {
|
|
val ver = version()
|
|
assertNotNull(ver)
|
|
assertTrue(ver.matches(Regex("\\d+\\.\\d+\\.\\d+")), "Version should be in X.Y.Z format")
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("HMAC sign should produce valid hex signature")
|
|
fun hmacSignature() {
|
|
val signature = hmacSign("secret", "message")
|
|
assertNotNull(signature)
|
|
assertEquals(64, signature.length, "HMAC-SHA256 should produce 64 hex chars")
|
|
assertTrue(signature.matches(Regex("[0-9a-f]+")), "Signature should be lowercase hex")
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("HMAC sign should be consistent")
|
|
fun hmacConsistent() {
|
|
val sig1 = hmacSign("key", "data")
|
|
val sig2 = hmacSign("key", "data")
|
|
assertEquals(sig1, sig2, "Same inputs should produce same signature")
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("HMAC sign should differ with different inputs")
|
|
fun hmacDifferent() {
|
|
val sig1 = hmacSign("key1", "data")
|
|
val sig2 = hmacSign("key2", "data")
|
|
assertNotEquals(sig1, sig2, "Different keys should produce different signatures")
|
|
}
|
|
}
|
|
|
|
@Nested
|
|
@DisplayName("Health Check Tests")
|
|
inner class HealthCheckTests {
|
|
|
|
@Test
|
|
@DisplayName("Health check should return boolean")
|
|
fun healthCheckReturnsBoolean() {
|
|
val healthy = healthCheck()
|
|
// We just verify it returns without throwing
|
|
assertTrue(healthy || !healthy)
|
|
}
|
|
}
|
|
|
|
@Nested
|
|
@DisplayName("Integration Tests (requires credentials)")
|
|
@EnabledIfEnvironmentVariable(named = "UNSANDBOX_PUBLIC_KEY", matches = ".+")
|
|
inner class IntegrationTests {
|
|
|
|
private lateinit var publicKey: String
|
|
private lateinit var secretKey: String
|
|
|
|
@BeforeEach
|
|
fun setUp() {
|
|
publicKey = System.getenv("UNSANDBOX_PUBLIC_KEY") ?: ""
|
|
secretKey = System.getenv("UNSANDBOX_SECRET_KEY") ?: ""
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should execute Python code successfully")
|
|
fun executePythonCode() {
|
|
val result = execute("python", "print('Hello, World!')", publicKey, secretKey)
|
|
|
|
assertNotNull(result)
|
|
assertTrue(result["stdout"].toString().contains("Hello, World!"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should execute JavaScript code successfully")
|
|
fun executeJavaScriptCode() {
|
|
val result = execute("javascript", "console.log('Hello from JS')", publicKey, secretKey)
|
|
|
|
assertNotNull(result)
|
|
assertTrue(result["stdout"].toString().contains("Hello from JS"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should get supported languages")
|
|
fun getLanguagesTest() {
|
|
val languages = getLanguages(publicKey, secretKey)
|
|
|
|
assertNotNull(languages)
|
|
assertTrue(languages.isNotEmpty())
|
|
assertTrue(languages.contains("python"))
|
|
assertTrue(languages.contains("javascript"))
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should list jobs")
|
|
fun listJobsTest() {
|
|
val jobs = listJobs(publicKey, secretKey)
|
|
assertNotNull(jobs)
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should validate keys successfully")
|
|
fun validateKeysTest() {
|
|
val result = validateKeys(publicKey, secretKey)
|
|
assertNotNull(result)
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should list sessions")
|
|
fun listSessionsTest() {
|
|
val sessions = sessionList(publicKey, secretKey)
|
|
assertNotNull(sessions)
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should list services")
|
|
fun listServicesTest() {
|
|
val services = serviceList(publicKey, secretKey)
|
|
assertNotNull(services)
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should list snapshots")
|
|
fun listSnapshotsTest() {
|
|
val snapshots = snapshotList(publicKey, secretKey)
|
|
assertNotNull(snapshots)
|
|
}
|
|
|
|
@Test
|
|
@DisplayName("Should list images")
|
|
fun listImagesTest() {
|
|
val images = imageList(null, publicKey, secretKey)
|
|
assertNotNull(images)
|
|
}
|
|
}
|
|
}
|