Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

chore: Updated shimmer, uninstrumented, environment, flatten, and logger integration tests to node:test #2802

Merged
merged 2 commits into from
Nov 26, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,26 @@

'use strict'

const tap = require('tap')
const test = tap.test
const test = require('node:test')
const assert = require('node:assert')

const configurator = require('../../lib/config')
const Agent = require('../../lib/agent')

test("Using should shouldn't cause the agent to explode on startup.", function (t) {
t.plan(2)

t.doesNotThrow(function () {
test("Using should shouldn't cause the agent to explode on startup.", (_, end) => {
assert.doesNotThrow(function () {
require('should')
const agent = new Agent(configurator.initialize())
t.ok(agent.should)
assert.ok(agent.should)
end()
}, "shouldn't throw when should is included.")
})

test("Environment scraper shouldn't die if HOME isn't set.", function (t) {
t.plan(2)

test("Environment scraper shouldn't die if HOME isn't set.", () => {
delete process.env.HOME

t.notOk(process.env.HOME, 'HOME has been nuked.')
t.doesNotThrow(function () {
assert.equal(process.env.HOME, undefined, 'HOME has been nuked.')
assert.doesNotThrow(function () {
return new Agent(configurator.initialize())
}, "shouldn't throw just because HOME isn't set")
})
24 changes: 11 additions & 13 deletions test/integration/logger.tap.js → test/integration/logger.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,15 +5,15 @@

'use strict'

const path = require('path')
const fs = require('fs')
const tap = require('tap')
const test = require('node:test')
const assert = require('node:assert')
const path = require('node:path')
const fs = require('node:fs')

const rimraf = require('rimraf')
const DIRNAME = 'XXXNOCONFTEST'

tap.test('logger', function (t) {
t.autoend()

test('logger', async (t) => {
t.afterEach(async () => {
if (path.basename(process.cwd()) === DIRNAME) {
process.chdir('..')
Expand All @@ -31,21 +31,19 @@ tap.test('logger', function (t) {
delete process.env.NEW_RELIC_LOG
})

t.test('configuration from environment', function (t) {
await t.test('configuration from environment', (t, end) => {
fs.mkdir(DIRNAME, function (error) {
if (!t.error(error, 'should not fail to make directory')) {
return t.end()
}
assert.ifError(error, 'should not fail to make directory')

process.chdir(DIRNAME)

process.env.NEW_RELIC_LOG = 'stdout'

t.doesNotThrow(function () {
t.ok(require('../../lib/logger'), 'requiring logger returned a logging object')
assert.doesNotThrow(function () {
assert.ok(require('../../lib/logger'), 'requiring logger returned a logging object')
})

t.end()
end()
})
})
})
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,24 @@

'use strict'

const tap = require('tap')
const test = require('node:test')
const tspl = require('@matteo.collina/tspl')

const helper = require('../../lib/agent_helper')

tap.beforeEach((t) => {
t.context.agent = helper.instrumentMockedAgent({})
test.beforeEach((ctx) => {
ctx.nr = {}
ctx.nr.agent = helper.instrumentMockedAgent({})
})

tap.afterEach((t) => {
helper.unloadAgent(t.context.agent)
test.afterEach((ctx) => {
helper.unloadAgent(ctx.nr.agent)
})

tap.test('can instrument the same module from multiple installs', (t) => {
t.plan(3)
test('can instrument the same module from multiple installs', async (t) => {
const plan = tspl(t, { plan: 3 })

const { agent } = t.context
const { agent } = t.nr
agent.start(() => {
const api = helper.getAgentApi()

Expand All @@ -44,13 +47,13 @@ tap.test('can instrument the same module from multiple installs', (t) => {
}
})
const person = new Person(dest)
t.equal(person.isHuman, true)
t.same(lines, ['human constructed\n', 'person constructed\n'])
plan.equal(person.isHuman, true)
plan.deepStrictEqual(lines, ['human constructed\n', 'person constructed\n'])

// We loaded the same module from two different installed paths.
// Thus, we should have two instrumentations.
t.equal(instrumentedCount, 2)

t.end()
plan.equal(instrumentedCount, 2)
})

await plan.completed
})
Original file line number Diff line number Diff line change
Expand Up @@ -5,28 +5,31 @@

'use strict'

const test = require('node:test')
const assert = require('node:assert')

/* eslint-disable node/no-unpublished-require */
const Metrics = require('../../../lib/metrics')
const MetricNormalizer = require('../../../lib/metrics/normalizer')
const MetricMapper = require('../../../lib/metrics/mapper')
// eslint-disable-next-line node/no-extraneous-require
const tap = require('tap')

const uninstrumented = require('../../../lib/uninstrumented')
const helper = require('../../lib/agent_helper')
const shimmer = require('../../../lib/shimmer')
/* eslint-enable node/no-unpublished-require */

tap.test('does not mark files with known module names as uninstrumented', function (t) {
test('does not mark files with known module names as uninstrumented', (t) => {
const loaded = []

require('./mock-config/redis')
loaded.push('redis')

t.ok(loaded.length > 0, 'should have loaded at least one module')
assert.ok(loaded.length > 0, 'should have loaded at least one module')

const agent = helper.instrumentMockedAgent()

t.teardown(() => {
t.after(() => {
helper.unloadAgent(agent)
})

Expand All @@ -40,14 +43,12 @@ tap.test('does not mark files with known module names as uninstrumented', functi
const flagMetrics = metrics.toJSON().filter(function (metric) {
return metric[0].name === 'Supportability/Uninstrumented/redis'
})
t.equal(flagMetrics.length, 0, 'No uninstrumented flag metric present')

t.end()
assert.equal(flagMetrics.length, 0, 'No uninstrumented flag metric present')
})

// This doesn't test the core http and https modules because we can't detect if
// core modules have already been loaded.
tap.test('all instrumented modules should be detected when uninstrumented', function (t) {
test('all instrumented modules should be detected when uninstrumented', (t, end) => {
const loaded = []

const instrumentations = Object.keys(shimmer.registeredInstrumentations)
Expand All @@ -62,16 +63,16 @@ tap.test('all instrumented modules should be detected when uninstrumented', func
require(module)
loaded.push(module)
} catch (err) {
t.comment('failed to load ' + module)
t.diagnostic('failed to load ' + module)
}
}
})

t.ok(loaded.length > 0, 'should have loaded at least one module')
assert.ok(loaded.length > 0, 'should have loaded at least one module')

const agent = helper.instrumentMockedAgent()

t.teardown(() => {
t.after(() => {
helper.unloadAgent(agent)
})

Expand All @@ -87,13 +88,13 @@ tap.test('all instrumented modules should be detected when uninstrumented', func
const flagMetrics = metricsJSON.filter(function (metric) {
return metric[0].name === 'Supportability/Uninstrumented'
})
t.equal(flagMetrics.length, 1, 'Uninstrumented flag metric present')
assert.equal(flagMetrics.length, 1, 'Uninstrumented flag metric present')

if (flagMetrics.length !== 1) {
return t.end()
return end()
}

t.ok(
assert.ok(
flagMetrics[0][1].callCount > 0,
'Callcount for uninstrumented flag metric > 0 (' + flagMetrics[0][1].callCount + ')'
)
Expand All @@ -103,15 +104,15 @@ tap.test('all instrumented modules should be detected when uninstrumented', func

metricsJSON.forEach(function (metric) {
if (metric[0].name === 'Supportability/Uninstrumented/' + module) {
t.ok(metric[1].callCount > 0, 'should have uninstrumented metric for ' + module)
assert.ok(metric[1].callCount > 0, 'should have uninstrumented metric for ' + module)
found = true
}
})

if (!found) {
t.fail('No uninstrumented module metric found for ' + module)
assert.fail('No uninstrumented module metric found for ' + module)
}
})

t.end()
end()
})
47 changes: 21 additions & 26 deletions test/integration/flatten.tap.js → test/unit/util/flatten.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,58 +5,53 @@

'use strict'

const tap = require('tap')
const flatten = require('../../lib/util/flatten')
const test = require('node:test')
const assert = require('node:assert')

tap.test('util.flatten', function (t) {
t.autoend()
const flatten = require('../../../lib/util/flatten')

t.test('flattens things', function (t) {
t.same(flatten({}, '', { a: 5, b: true }), { a: 5, b: true }, '1 level')
t.same(
test('util.flatten', async (t) => {
await t.test('flattens things', () => {
assert.deepStrictEqual(flatten({}, '', { a: 5, b: true }), { a: 5, b: true }, '1 level')
assert.deepStrictEqual(
flatten({}, '', { a: 5, b: { c: true, d: 7 } }),
{ 'a': 5, 'b.c': true, 'b.d': 7 },
'2 levels'
)
t.same(
assert.deepStrictEqual(
flatten({}, '', { a: 5, b: { c: true, d: 7, e: { foo: 'efoo', bar: 'ebar' } } }),
{ 'a': 5, 'b.c': true, 'b.d': 7, 'b.e.foo': 'efoo', 'b.e.bar': 'ebar' },
'3 levels'
)

t.end()
})

t.test('flattens recursive objects', function (t) {
await t.test('flattens recursive objects', () => {
// eslint-disable-next-line sonarjs/prefer-object-literal -- Disabled so we can create cyclical objects
const obj = {}
obj.x = obj
t.same(flatten({}, '', obj), {})

t.end()
assert.deepStrictEqual(flatten({}, '', obj), {})
})
})

tap.test('util.flatten.keys', function (t) {
t.autoend()

t.test('gets flattened keys', function (t) {
t.same(flatten.keys({ a: 5, b: true }), ['a', 'b'], '1 level')
t.same(flatten.keys({ a: 5, b: { c: true, d: 7 } }), ['a', 'b.c', 'b.d'], '2 levels')
t.same(
test('util.flatten.keys', async (t) => {
await t.test('gets flattened keys', () => {
assert.deepStrictEqual(flatten.keys({ a: 5, b: true }), ['a', 'b'], '1 level')
assert.deepStrictEqual(
flatten.keys({ a: 5, b: { c: true, d: 7 } }),
['a', 'b.c', 'b.d'],
'2 levels'
)
assert.deepStrictEqual(
flatten.keys({ a: 5, b: { c: true, d: 7, e: { foo: 'efoo', bar: 'ebar' } } }),
['a', 'b.c', 'b.d', 'b.e.foo', 'b.e.bar'],
'3 levels'
)

t.end()
})

t.test('flattens recursive objects', function (t) {
await t.test('flattens recursive objects', () => {
// eslint-disable-next-line sonarjs/prefer-object-literal -- Disabled so we can create cyclical objects
const obj = {}
obj.x = obj
t.same(flatten.keys(obj), [])
t.end()
assert.deepStrictEqual(flatten.keys(obj), [])
})
})
Loading