<html>
<head>
<script src="inspector-test.js"></script>
<script src="console-test.js"></script>
<script>
var testFunctions = [testDNSLookup, testSSLCertificate];
var nextTestIndex = 0;

function onload()
{
    if (window.testRunner)
        testRunner.waitUntilDone();
    if (!window.WebSocket) {
        console.log("WebSocket is not supported."); return;
    }
    doNextTest();
}

function doNextTest()
{
    if (nextTestIndex == testFunctions.length) {
        runTest();
        return;
    }
    var testFunction = testFunctions[nextTestIndex];
    nextTestIndex++;
    testFunction();
}

function testDNSLookup()
{
    console.log("testDNSLookup: Test started.");
    var ws = new WebSocket("ws://nonexistent.domain.invalid/"); // Network error should be logged to console.
    ws.onopen = function() {
        console.log("testDNSLookup: onopen is called.");
        ws.close();
    };
    ws.onerror = function() {
        console.log("testDNSLookup: onerror is called.");
        ws.close();
    };
    ws.onclose = function() {
        console.log("testDNSLookup: onclose is called.");
        doNextTest();
    };
}

function testSSLCertificate()
{
    console.log("testSSLCertificate: Test started.");
    // The following statement should cause "Untrusted root certificate" error.
    // Note that port 8443 serves HTTPS content rather than secure WebSocket,
    // but it does not matter because the test does not send or receive any payload.
    var ws = new WebSocket("wss://127.0.0.1:8443/");
    ws.onopen = function() {
        console.log("testSSLCertificate: onopen is called.");
        ws.close();
    };
    ws.onerror = function() {
        console.log("testSSLCertificate: onerror is called.");
        ws.close();
    };
    ws.onclose = function() {
        console.log("testSSLCertificate: onclose is called.");
        doNextTest();
    };
}

function test()
{
    InspectorTest.dumpConsoleMessages();
    InspectorTest.completeTest();
}

</script>
</head>

<body onload="onload()">
<p>
WebSocket's network errors should be logged to console.
</p>

</body>
</html>
