Revision 1f30c5ea5fe1a75b8613726331a2b3c9ade10c2c authored by James Graham on 28 March 2014, 17:50:42 UTC, committed by James Graham on 28 March 2014, 17:50:42 UTC
1 parent 8df2888
Raw File
test_user_timing_mark.html
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8" />
        <title>window.performance User Timing mark() method is working properly</title>
        <link rel="author" title="Microsoft" href="http://www.microsoft.com/" />
        <link rel="help" href="http://www.w3.org/TR/user-timing/#dom-performance-mark"/>
        <script src="/resources/testharness.js"></script>
        <script src="/resources/testharnessreport.js"></script>
        <script src="resources/webperftestharness.js"></script>

    <script type="text/javascript">
        // test data
        var markTestDelay = 200;
        var testThreshold = 20;
        var marks;
        
        var TEST_MARKS =
        [
            {
                name:                   "mark1",
                expectedStartTime:      undefined,
                entryMatch:             undefined
            },
            {
                name:                   "mark1",
                expectedStartTime:      undefined,
                entryMatch:             undefined
            }
        ];
        
        setup({explicit_done: true});
        
        test_namespace();
    
        function onload_test()
        {
            // test for existance of User Timing and Performance Timeline interface
            if (window.performance.mark == undefined ||
                window.performance.clearMarks == undefined ||
                window.performance.measure == undefined ||
                window.performance.clearMeasures == undefined ||
                window.performance.getEntriesByName == undefined ||
                window.performance.getEntriesByType == undefined ||
                window.performance.getEntries == undefined)
            {
                test_true(false, 
                          "The User Timing and Performance Timeline interfaces, which are required for this test, " + 
                          "are defined.");
                          
                done();
            }
            else
            {
                // create first mark
                window.performance.mark(TEST_MARKS[0].name);
                
                // record the time that this mark is created; this should correspond to the mark's startTime
                TEST_MARKS[0].expectedStartTime = (new Date()) - window.performance.timing.navigationStart;
            
                // create the duplicate mark using the test delay; the duplicate mark's value should be equivalent to 
                // the loadEventStart navigation timing attribute plus the test delay
                setTimeout(mark_test_cb, markTestDelay);
            }
        }
        
        function mark_test_cb()
        {
            var getByNameScenarios = new Array();
            
            // create second, duplicate mark
            window.performance.mark(TEST_MARKS[1].name);
            
            // record the time that this mark is created; this should correspond to the mark's startTime
            TEST_MARKS[1].expectedStartTime = (new Date()) - window.performance.timing.navigationStart;
        
            // test the test marks are returned by getEntriesByName
            entries = window.performance.getEntriesByName(TEST_MARKS[0].name);
            test_mark(entries[0], 
                      "window.performance.getEntriesByName(\"" + TEST_MARKS[0].name + "\")[0]",
                      TEST_MARKS[0].name,
                      TEST_MARKS[0].expectedStartTime);
            TEST_MARKS[0].entryMatch = entries[0];
            
            test_mark(entries[1], 
                      "window.performance.getEntriesByName(\"" + TEST_MARKS[1].name + "\")[1]",
                      TEST_MARKS[1].name,
                      TEST_MARKS[1].expectedStartTime);
            TEST_MARKS[1].entryMatch = entries[1];
                      
            // test the test marks are returned by getEntriesByName with the entryType parameter provided
            entries = window.performance.getEntriesByName(TEST_MARKS[0].name, "mark");
            test_equals(entries[0].name, TEST_MARKS[0].name, 
                        "window.performance.getEntriesByName(\"" + TEST_MARKS[0].name + "\", \"mark\") returns an " + 
                        "object containing the \"" + TEST_MARKS[0].name + "\" mark in the correct order");
                        
            test_equals(entries[1].name, TEST_MARKS[1].name, 
                        "window.performance.getEntriesByName(\"" + TEST_MARKS[1].name + "\", \"mark\") returns an " + 
                        "object containing the duplicate \"" + TEST_MARKS[1].name + "\" mark in the correct order");
                        
            test_true(match_entries(entries[0], TEST_MARKS[0].entryMatch), 
                      "The \"" + TEST_MARKS[0].name + "\" mark returned by " + 
                      "window.performance.getEntriesByName(\"" + TEST_MARKS[0].name + "\", \"mark\") matches the " + 
                      "the \"" + TEST_MARKS[0].name + "\" mark returned by " + 
                      "window.performance.getEntriesByName(\"" + TEST_MARKS[0].name + "\")");
                        
            test_true(match_entries(entries[1], TEST_MARKS[1].entryMatch), 
                      "The duplicate \"" + TEST_MARKS[1].name + "\" mark returned by " + 
                      "window.performance.getEntriesByName(\"" + TEST_MARKS[1].name + "\", \"mark\") matches the " + 
                      "the duplicate \"" + TEST_MARKS[1].name + "\" mark returned by " + 
                      "window.performance.getEntriesByName(\"" + TEST_MARKS[1].name + "\")");
            
            // test the test marks are returned by getEntries
            entries = get_test_entries(window.performance.getEntries(), "mark");
            
            test_equals(entries[0].name, TEST_MARKS[0].name, 
                        "window.performance.getEntries() returns an object containing the original \"" + 
                        TEST_MARKS[0].name + "\" mark in the correct order");
                        
            test_equals(entries[1].name, TEST_MARKS[1].name, 
                        "window.performance.getEntries() returns an object containing the duplicate \"" + 
                        TEST_MARKS[1].name + "\" mark in the correct order");
                        
            test_true(match_entries(entries[0], TEST_MARKS[0].entryMatch), 
                      "The \"" + TEST_MARKS[0].name + "\" mark returned by " + 
                      "window.performance.getEntries() matches the the \"" + TEST_MARKS[0].name + "\" mark returned " + 
                      "by window.performance.getEntriesByName(\"" + TEST_MARKS[0].name + "\")");
                      
            test_true(match_entries(entries[1], TEST_MARKS[1].entryMatch), 
                      "The \"" + TEST_MARKS[1].name + "\" mark returned by " + 
                      "window.performance.getEntries() matches the the duplicate \"" + TEST_MARKS[1].name + "\" mark " +
                      "returned by window.performance.getEntriesByName(\"" + TEST_MARKS[1].name + "\")");
                      
            // test the test marks are returned by getEntriesByType
            entries = window.performance.getEntriesByType("mark");
            
            test_equals(entries[0].name, TEST_MARKS[0].name, 
                        "window.performance.getEntriesByType(\"mark\") returns an object containing the original \"" + 
                        TEST_MARKS[0].name + "\" mark in the correct order");
                        
            test_equals(entries[1].name, TEST_MARKS[1].name, 
                        "window.performance.getEntriesByType(\"mark\") returns an object containing the duplicate \"" + 
                        TEST_MARKS[1].name + "\" mark in the correct order");
                        
            test_true(match_entries(entries[0], TEST_MARKS[0].entryMatch), 
                      "The \"" + TEST_MARKS[0].name + "\" mark returned by " + 
                      "window.performance.getEntriesByType(\"mark\") matches the the \"" + TEST_MARKS[0].name + 
                      "\" mark returned by window.performance.getEntriesByName(\"" + TEST_MARKS[0].name + "\")");
                      
            test_true(match_entries(entries[1], TEST_MARKS[1].entryMatch), 
                      "The \"" + TEST_MARKS[1].name + "\" mark returned by " + 
                      "window.performance.getEntriesByType(\"mark\") matches the the duplicate \"" + 
                      TEST_MARKS[1].name + "\" mark returned by window.performance.getEntriesByName(\"" + 
                      TEST_MARKS[1].name + "\")");
            
            done();
        }
        
        function match_entries(entry1, entry2)
        {
            var pass = true;
            
            // match name
            pass = pass && (entry1.name == entry2.name);
            
            // match startTime
            pass = pass && (entry1.startTime == entry2.startTime);
            
            // match entryType
            pass = pass && (entry1.entryType == entry2.entryType);
            
            // match duration
            pass = pass && (entry1.duration == entry2.duration);
            
            return pass;
        }
        
        function test_mark(markEntry, markEntryCommand, expectedName, expectedStartTime)
        {
            // test name
            test_equals(markEntry.name, expectedName, markEntryCommand + ".name == \"" + expectedName + "\"");
            
            // test startTime, allow for an acceptable threshold in the difference between the startTime and the 
            // expected value for the startTime (loadEventStart + markTestDelay)
            test_true(Math.abs(markEntry.startTime - expectedStartTime) <= testThreshold, 
                      markEntryCommand + ".startTime ~== " + expectedStartTime + " (up to " + testThreshold + 
                      "ms difference allowed)");
            
            // verify entryType
            test_equals(markEntry.entryType, "mark", markEntryCommand + ".entryType == \"mark\"");
            
            // verify duration
            test_equals(markEntry.duration, 0, markEntryCommand + ".duration == 0");
        }
        
        function get_test_entries(entryList, entryType)
        {
            var testEntries = new Array();
        
            // filter entryList
            for (var i in entryList)
            {
                if (entryList[i].entryType == entryType)
                {
                    testEntries.push(entryList[i]);
                }
            }
            
            return testEntries;
        }
    </script>
    </head>
    <body onload="onload_test();">
        <h1>Description</h1>
        <p>This test validates that the performance.mark() method is working properly. This test creates the 
           following marks to test this method:
            <ul>
                <li>"mark1": created using a normal mark() call</li>
                <li>"mark1": duplicate of the first mark, used to confirm names can be re-used</li>
            </ul>
           After creating each mark, the existence of these marks is validated by calling 
           performance.getEntriesByName() (both with and without the entryType parameter provided), 
           performance.getEntriesByType(), and performance.getEntries()
        </p>

        <div id="log"></div>
    </body>
</html>
back to top