1// Flags: --expose-internals --no-warnings
2'use strict';
3
4const common = require('../common');
5const assert = require('assert');
6const { internalBinding } = require('internal/test/binding');
7const {
8  observerCounts: counts
9} = internalBinding('performance');
10const {
11  performance,
12  PerformanceObserver,
13  constants
14} = require('perf_hooks');
15
16const {
17  NODE_PERFORMANCE_ENTRY_TYPE_GC,
18  NODE_PERFORMANCE_ENTRY_TYPE_HTTP2,
19} = constants;
20
21assert.strictEqual(counts[NODE_PERFORMANCE_ENTRY_TYPE_GC], 0);
22assert.strictEqual(counts[NODE_PERFORMANCE_ENTRY_TYPE_HTTP2], 0);
23
24{
25  [1, null, undefined, {}, [], Infinity].forEach((i) => {
26    assert.throws(
27      () => new PerformanceObserver(i),
28      {
29        code: 'ERR_INVALID_ARG_TYPE',
30        name: 'TypeError',
31      }
32    );
33  });
34  const observer = new PerformanceObserver(common.mustNotCall());
35
36  [1, 'test'].forEach((input) => {
37    assert.throws(
38      () => observer.observe(input),
39      {
40        code: 'ERR_INVALID_ARG_TYPE',
41        name: 'TypeError',
42        message: 'The "options" argument must be of type object.' +
43                 common.invalidArgTypeHelper(input)
44      });
45  });
46
47  [1, null, {}, Infinity].forEach((i) => {
48    assert.throws(() => observer.observe({ entryTypes: i }),
49                  {
50                    code: 'ERR_INVALID_ARG_TYPE',
51                    name: 'TypeError'
52                  });
53  });
54
55  const obs = new PerformanceObserver(common.mustNotCall());
56  obs.observe({ entryTypes: ['mark', 'mark'] });
57  obs.disconnect();
58  performance.mark('42');
59}
60
61// Test Non-Buffered
62{
63  const observer =
64    new PerformanceObserver(common.mustCall(callback));
65
66  function callback(list, obs) {
67    assert.strictEqual(obs, observer);
68    const entries = list.getEntries();
69    assert.strictEqual(entries.length, 3);
70    observer.disconnect();
71  }
72  observer.observe({ entryTypes: ['mark', 'node'] });
73  performance.mark('test1');
74  performance.mark('test2');
75  performance.mark('test3');
76}
77