<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>This test validates that PerformanceResourceTiming's toJSON method
       contains all of the entry's attributes.</title>
<link rel="author" title="Google" href="http://www.google.com/" />
<link rel="help"
      href="https://www.w3.org/TR/resource-timing-2/#dom-performanceresourcetiming-tojson">
<script src="/resources/testharness.js"></script>
<script src="/resources/testharnessreport.js"></script>
</head>
<body>
<script>
promise_test(() => {
  return new Promise((resolve, reject) => {
    const po = new PerformanceObserver(list => {
      const entries = list.getEntries();
      if (entries.length < 1) {
        throw new Error(`No entries to run the test with.`);
      }
      assert_greater_than_equal(entries.length, 1);
      const entry = entries[0];
      assert_equals(typeof(entry.toJSON), 'function');
      const json = entry.toJSON();
      assert_equals(typeof(json), 'object');

      const performanceResourceTimingKeys = [
        'name',
        'entryType',
        'startTime',
        'duration',
        'initiatorType',
        'nextHopProtocol',
        'workerStart',
        'redirectStart',
        'redirectEnd',
        'fetchStart',
        'domainLookupStart',
        'domainLookupEnd',
        'connectStart',
        'connectEnd',
        'secureConnectionStart',
        'requestStart',
        'responseStart',
        'responseEnd',
        'transferSize',
        'encodedBodySize',
        'decodedBodySize'
      ];
      for (const key of performanceResourceTimingKeys) {
        try {
          assert_false(json[key] === undefined,
            `entry.toJSON().${key} is undefined`);
          assert_equals(json[key], entry[key],
            `entry.toJSON().${key} should match entry.${key}`);
        } catch(e) {
          reject(e);
        }
      }
      resolve();
    });
    po.observe({type: "resource", buffered: true});
  });
}, 'Test toJSON() in PerformanceResourceTiming');
</script>
</body>
</html>
