// PUBLIC DOMAIN - NO LICENSE, NO WARRANTY // Unit and Functional Tests for Unsandbox C# SDK (Mono) using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Security.Cryptography; using System.Text; /// /// Unit tests for the Unsandbox SDK library functions. /// These tests verify that exported library functions work correctly. /// public class UnitTests { public static void Run() { Console.WriteLine("=== Unsandbox C# SDK Unit Tests ===\n"); TestDetectLanguage(); TestHmacSign(); TestExtensionMap(); TestBuildEnvContent(); Console.WriteLine("\n=== Unit Tests Complete ==="); } static void TestDetectLanguage() { Console.Write("DetectLanguage: "); var tests = new Dictionary { { "test.py", "python" }, { "script.js", "javascript" }, { "main.go", "go" }, { "app.rs", "rust" }, { "Program.cs", "csharp" }, { "Module.fs", "fsharp" }, { "script.ps1", "powershell" } }; int passed = 0; foreach (var test in tests) { var result = Unsandbox.DetectLanguage(test.Key); if (result == test.Value) passed++; else Console.Write($"[FAIL: {test.Key} -> {result}, expected {test.Value}] "); } if (passed == tests.Count) Console.WriteLine($"PASS ({passed}/{tests.Count})"); else Console.WriteLine($"FAIL ({passed}/{tests.Count})"); } static void TestHmacSign() { Console.Write("HmacSign: "); // Test vector: HMAC-SHA256("key", "message") var result = Unsandbox.HmacSign("key", "message"); // Expected: 6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a var expected = "6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a"; if (result == expected) Console.WriteLine("PASS"); else Console.WriteLine($"FAIL (got {result}, expected {expected})"); } static void TestExtensionMap() { Console.Write("ExtensionMap: "); // Test that the extension map contains expected entries var tests = new Dictionary { { ".py", "python" }, { ".js", "javascript" }, { ".go", "go" }, { ".rs", "rust" }, { ".cs", "csharp" } }; int passed = 0; foreach (var test in tests) { if (Unsandbox.ExtMap.TryGetValue(test.Key, out var lang) && lang == test.Value) passed++; } if (passed == tests.Count) Console.WriteLine($"PASS ({passed}/{tests.Count})"); else Console.WriteLine($"FAIL ({passed}/{tests.Count})"); } static void TestBuildEnvContent() { Console.Write("BuildEnvContent: "); var envs = new List { "KEY1=value1", "KEY2=value2" }; var result = Unsandbox.BuildEnvContent(envs, null); var hasKey1 = result.Contains("KEY1=value1"); var hasKey2 = result.Contains("KEY2=value2"); if (hasKey1 && hasKey2) Console.WriteLine("PASS"); else Console.WriteLine($"FAIL (got: {result})"); } } /// /// Functional tests that require API credentials. /// Set UNSANDBOX_PUBLIC_KEY and UNSANDBOX_SECRET_KEY environment variables. /// public class FunctionalTests { public static void Run() { var publicKey = Environment.GetEnvironmentVariable("UNSANDBOX_PUBLIC_KEY"); var secretKey = Environment.GetEnvironmentVariable("UNSANDBOX_SECRET_KEY"); if (string.IsNullOrEmpty(publicKey) || string.IsNullOrEmpty(secretKey)) { Console.WriteLine("=== Functional Tests Skipped (no API credentials) ==="); return; } Console.WriteLine("=== Unsandbox C# SDK Functional Tests ===\n"); TestHealthCheck(); TestValidateKeys(); TestGetLanguages(); TestExecute(); TestSessionList(); TestServiceList(); TestSnapshotList(); TestImageList(); Console.WriteLine("\n=== Functional Tests Complete ==="); } static void TestHealthCheck() { Console.Write("HealthCheck: "); var result = Unsandbox.HealthCheck(); Console.WriteLine(result ? "PASS" : "FAIL"); } static void TestValidateKeys() { Console.Write("ValidateKeys: "); var result = Unsandbox.ValidateKeys(); if (result != null && result.Valid) Console.WriteLine($"PASS (tier: {result.Tier})"); else Console.WriteLine($"FAIL ({Unsandbox.LastError()})"); } static void TestGetLanguages() { Console.Write("GetLanguages: "); var result = Unsandbox.GetLanguages(); if (result.Count > 0) Console.WriteLine($"PASS ({result.Count} languages)"); else Console.WriteLine($"FAIL ({Unsandbox.LastError()})"); } static void TestExecute() { Console.Write("Execute: "); var result = Unsandbox.Execute("python", "print('hello from C# SDK')"); if (result.Success && result.Stdout != null && result.Stdout.Contains("hello")) Console.WriteLine("PASS"); else Console.WriteLine($"FAIL ({result.ErrorMessage ?? Unsandbox.LastError()})"); } static void TestSessionList() { Console.Write("SessionList: "); var result = Unsandbox.SessionList(); // Empty list is valid - just checking API call works Console.WriteLine($"PASS ({result.Count} sessions)"); } static void TestServiceList() { Console.Write("ServiceList: "); var result = Unsandbox.ServiceList(); Console.WriteLine($"PASS ({result.Count} services)"); } static void TestSnapshotList() { Console.Write("SnapshotList: "); var result = Unsandbox.SnapshotList(); Console.WriteLine($"PASS ({result.Count} snapshots)"); } static void TestImageList() { Console.Write("ImageList: "); var result = Unsandbox.ImageList(); Console.WriteLine($"PASS ({result.Count} images)"); } } public class Program { public static int Main(string[] args) { try { Console.WriteLine("Unsandbox C# SDK Tests (Mono)"); Console.WriteLine("=============================\n"); UnitTests.Run(); Console.WriteLine(); FunctionalTests.Run(); return 0; } catch (Exception ex) { Console.Error.WriteLine($"Test error: {ex.Message}"); return 1; } } }