// http_test.js var http = use('http'); var os = use('os'); var getter = http.fetch('tortoise.png') var file = getter.data() // invokes the data stream to wait for it var got = false var count = 0 http.fetch("https://dictionary.ink/find?word=theological", { on_data: e => { console.log(e.length) count++ }, callback: e => { for (var i in e) console.log(i) console.log(e.data) got = true } }) while (!got) { http.poll() } console.log(`got hit ${count} times`) os.exit() // Deep comparison function (unchanged from previous version) function deepCompare(expected, actual, path = '') { if (expected === actual) return { passed: true, messages: [] }; if (typeof expected === 'string' && typeof actual === 'string') { if (expected === actual) { return { passed: true, messages: [] }; } return { passed: false, messages: [`String mismatch at ${path}: expected "${expected}", got "${actual}"`] }; } if (typeof expected === 'object' && expected !== null && typeof actual === 'object' && actual !== null) { const expKeys = Object.keys(expected).sort(); const actKeys = Object.keys(actual).sort(); if (JSON.stringify(expKeys) !== JSON.stringify(actKeys)) { return { passed: false, messages: [`Object keys mismatch at ${path}: expected ${expKeys}, got ${actKeys}`] }; } let messages = []; for (let key of expKeys) { const result = deepCompare(expected[key], actual[key], `${path}.${key}`); if (!result.passed) messages.push(...result.messages); } return { passed: messages.length === 0, messages }; } return { passed: false, messages: [`Value mismatch at ${path}: expected ${JSON.stringify(expected)}, got ${JSON.stringify(actual)}`] }; } // Test cases (slightly modified to include state tracking) var testCases = [ { name: "Basic GET request", url: "https://api.github.com", expected: { contains: "GitHub" }, validate: function(result) { return result.toLowerCase().includes("github"); }, completed: false, result: null, error: null }, { name: "JSON response", url: "https://api.github.com/users/octocat", expected: { login: "octocat" }, validate: function(result) { let parsed = JSON.parse(result); return deepCompare({ login: "octocat" }, { login: parsed.login }); }, completed: false, result: null, error: null }, { name: "Follow redirect", url: "http://github.com", expected: { contains: "gihtub" }, validate: function(result) { return result.toLowerCase().includes("github"); }, completed: false, result: null, error: null }, { name: "Invalid URL", url: "http://nonexistent.domain.xyz", expectError: true, validate: function(result) { return true; }, completed: false, result: null, error: null }, { name: "Malformed URL", url: "not-a-url", expectError: true, validate: function(result) { return true; }, completed: false, result: null, error: null }, { name: "Large response", url: "https://www.gutenberg.org/files/1342/1342-0.txt", expected: { contains: "Pride and Prejudice" }, validate: function(result) { return result.includes("Pride and Prejudice"); }, completed: false, result: null, error: null } ]; // Test execution state var results = []; var testCount = 0; var activeRequests = 0; var timeout = 5000; // 5 seconds timeout per test // Start tests function startTests() { testCount = testCases.length; activeRequests = testCount; for (let i = 0; i < testCases.length; i++) { let test = testCases[i]; let testName = `Test ${i + 1}: ${test.name}`; http.fetch(test.url, function(result) { test.completed = true; activeRequests--; if (result.error) { test.error = result.error; } else { test.result = result.data; } }); } // Start polling loop pollTests(); } // Poll and check test completion function pollTests() { let startTime = os.now(); while (true) { http.poll(); let allCompleted = activeRequests === 0; let timedOut = (os.now() - startTime) >= timeout; if (allCompleted || timedOut) { processResults(); break; } // Sleep a bit to avoid pegging the CPU (requires a C function or std.sleep) os.sleep(0.01); } } // Process and report results function processResults() { for (let i = 0; i < testCases.length; i++) { let test = testCases[i]; let testName = `Test ${i + 1}: ${test.name}`; let passed = true; let messages = []; if (!test.completed) { passed = false; messages.push("Test timed out"); } else if (test.error) { if (test.expectError) { // Expected error occurred } else { passed = false; messages.push(`Request failed: ${test.error}`); } } else if (test.expectError) { passed = false; messages.push("Expected request to fail but it succeeded"); } else { const validation = test.validate(test.result); if (typeof validation === 'boolean') { if (!validation) { passed = false; messages.push(`Validation failed for ${test.url}`); messages.push(`Expected to contain: ${JSON.stringify(test.expected)}`); messages.push(`Got: ${test.result.substring(0, 100)}...`); } } else if (!validation.passed) { passed = false; messages.push(...validation.messages); } } results.push({ testName, passed, messages }); if (!passed) { console.log(`\nDetailed Failure Report for ${testName}:`); console.log(`URL: ${test.url}`); console.log(messages.join("\n")); console.log(""); } } // Summary console.log("\nTest Summary:"); results.forEach(result => { console.log(`${result.testName} - ${result.passed ? "Passed" : "Failed"}`); if (!result.passed) { console.log(result.messages.join("\n")); } }); let passedCount = results.filter(r => r.passed).length; console.log(`\nResult: ${passedCount}/${testCount} tests passed`); if (passedCount < testCount) { console.log("Overall: FAILED"); os.exit(1); } else { console.log("Overall: PASSED"); os.exit(0); } } // Run the tests startTests();