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: Removed repetitive cache busting #2160

Merged
merged 2 commits into from
Apr 24, 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
7 changes: 2 additions & 5 deletions test/lib/agent_helper.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ const { EventEmitter } = require('events')
const Transaction = require('../../lib/transaction')
const symbols = require('../../lib/symbols')
const InstrumentationTracker = require('../../lib/instrumentation-tracker')
const { removeModules } = require('./cache-buster')
const http = require('http')
const https = require('https')
const semver = require('semver')
Expand Down Expand Up @@ -220,11 +221,7 @@ helper.maybeLoadSecurityAgent = function maybeLoadSecurityAgent(agent) {
*/
helper.maybeUnloadSecurityAgent = function maybeUnloadSecurityAgent(agent) {
if (helper.isSecurityAgentEnabled(agent)) {
Object.keys(require.cache).forEach((key) => {
if (key.includes('@newrelic/security-agent')) {
delete require.cache[key]
}
})
removeModules(['@newrelic/security-agent'])
}
}

Expand Down
55 changes: 55 additions & 0 deletions test/lib/cache-buster.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/*
* Copyright 2024 New Relic Corporation. All rights reserved.
* SPDX-License-Identifier: Apache-2.0
*/

'use strict'

/**
* Utility method to remove a set of modules from the require cache.
*
* @param {string[]} modules The set of module names to remove from the cache.
*/
module.exports = {
/**
* Removes explicitly named modules from the require cache.
*
* @param {string[]} modules
*
* @returns {number} The number of cache entries removed.
*/
removeModules(modules = []) {
let removed = 0
const keys = Object.keys(require.cache)
for (const mod of modules) {
for (const key of keys) {
if (key.includes(mod) === false) {
continue
}
delete require.cache[key]
removed += 1
}
}
return removed
},

/**
* Removes modules from the require cache that are identified by a matcher.
*
* @param {RegExp} matcher
*
* @returns {number} The number of cache entries removed.
*/
removeMatchedModules(matcher) {
let removed = 0
const keys = Object.keys(require.cache)
for (const key of keys) {
if (matcher.test(key) === false) {
continue
}
delete require.cache[key]
removed += 1
}
return removed
}
}
7 changes: 2 additions & 5 deletions test/unit/config/config-location.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ const fs = require('fs')
const fsPromises = require('fs/promises')
const sinon = require('sinon')

const { removeMatchedModules } = require('../../lib/cache-buster')
const Config = require('../../../lib/config')

tap.test('when overriding the config file location via NEW_RELIC_HOME', (t) => {
Expand Down Expand Up @@ -153,11 +154,7 @@ tap.test('Selecting config file path', (t) => {
process.chdir(originalWorkingDirectory)

const mainModuleRegex = new RegExp(MAIN_MODULE_DIR)
Object.keys(require.cache).forEach((key) => {
if (mainModuleRegex.test(key)) {
delete require.cache[key]
}
})
removeMatchedModules(mainModuleRegex)
})

t.test('should load the default newrelic.js config file', (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/unit/instrumentation/koa/koa.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../../lib/agent_helper')
const { removeModules } = require('../../../lib/cache-buster')
const InstrumentationDescriptor = require('../../../../lib/instrumentation-descriptor')

tap.beforeEach((t) => {
Expand All @@ -23,11 +24,7 @@ tap.beforeEach((t) => {

tap.afterEach((t) => {
helper.unloadAgent(t.context.agent)
Object.keys(require.cache).forEach((key) => {
if (key.includes('koa')) {
delete require.cache[key]
}
})
removeModules(['koa'])
})

tap.test('Koa instrumentation', async (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/unit/instrumentation/koa/route.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
const tap = require('tap')
const { METHODS } = require('../../../../lib/instrumentation/http-methods')
const helper = require('../../../lib/agent_helper')
const { removeModules } = require('../../../lib/cache-buster')
const InstrumentationDescriptor = require('../../../../lib/instrumentation-descriptor')

tap.beforeEach((t) => {
Expand All @@ -24,11 +25,7 @@ tap.beforeEach((t) => {

tap.afterEach((t) => {
helper.unloadAgent(t.context.agent)
Object.keys(require.cache).forEach((key) => {
if (key.includes('koa-route')) {
delete require.cache[key]
}
})
removeModules(['koa-route'])
})

tap.test('methods', function (t) {
Expand Down
13 changes: 3 additions & 10 deletions test/unit/instrumentation/koa/router.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ const tap = require('tap')
const instrumentation = require('../../../../lib/instrumentation/koa/router-instrumentation')
const { METHODS } = require('../../../../lib/instrumentation/http-methods')
const helper = require('../../../lib/agent_helper')
const { removeModules } = require('../../../lib/cache-buster')
const InstrumentationDescriptor = require('../../../../lib/instrumentation-descriptor')
const WRAPPED_METHODS = ['param', 'register', 'routes', 'middleware', 'allowedMethods']
const UNWRAPPED_METHODS = METHODS.concat([
Expand Down Expand Up @@ -45,11 +46,7 @@ tap.test('koa-router', (t) => {

t.afterEach((t) => {
helper.unloadAgent(t.context.agent)
Object.keys(require.cache).forEach((key) => {
if (key.includes(koaRouterMod)) {
delete require.cache[key]
}
})
removeModules([koaRouterMod])
})

t.test('mounting paramware', async (t) => {
Expand Down Expand Up @@ -99,11 +96,7 @@ tap.test('koa-router', (t) => {

t.afterEach((t) => {
helper.unloadAgent(t.context.agent)
Object.keys(require.cache).forEach((key) => {
if (key.includes(koaRouterMod)) {
delete require.cache[key]
}
})
removeModules([koaRouterMod])
})

t.test('mounting paramware', async (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/amqplib/callback.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
const amqpUtils = require('./amqp-utils')
const API = require('../../../api')
const helper = require('../../lib/agent_helper')
const { removeMatchedModules } = require('../../lib/cache-buster')
const tap = require('tap')

/*
Expand Down Expand Up @@ -64,11 +65,7 @@ tap.test('amqplib callback instrumentation', function (t) {

t.afterEach(function () {
helper.unloadAgent(agent)
Object.keys(require.cache).forEach(function (key) {
if (/amqplib/.test(key)) {
delete require.cache[key]
}
})
removeMatchedModules(/amqplib/)

if (!conn) {
return
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/amqplib/promises.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
const amqpUtils = require('./amqp-utils')
const API = require('../../../api')
const helper = require('../../lib/agent_helper')
const { removeMatchedModules } = require('../../lib/cache-buster')
const tap = require('tap')

/*
Expand Down Expand Up @@ -37,11 +38,7 @@ tap.test('amqplib promise instrumentation', function (t) {
// which the test itself re-requires, but second-order modules (deps of
// instrumented methods) are not reloaded and thus not re-instrumented. To
// resolve this we just delete everything. Kill it all.
Object.keys(require.cache).forEach(function (key) {
if (/amqplib|bluebird/.test(key)) {
delete require.cache[key]
}
})
removeMatchedModules(/amqplib|bluebird/)

agent = helper.instrumentMockedAgent({
attributes: {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/bunyan/bunyan.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeMatchedModules } = require('../../lib/cache-buster')
require('../../lib/logging-helper')
const { LOGGING } = require('../../../lib/metrics/names')
const { makeSink, logStuff, originalMsgAssertion, logForwardingMsgAssertion } = require('./helpers')
Expand All @@ -28,11 +29,7 @@ tap.test('bunyan instrumentation', (t) => {
bunyan = null
// must purge require cache of bunyan related instrumentation
// to ensure it re-registers on subsequent test runs
Object.keys(require.cache).forEach((key) => {
if (/bunyan/.test(key)) {
delete require.cache[key]
}
})
removeMatchedModules(/bunyan/)
})

t.test('logging disabled', (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/grpc/client-bidi-streaming.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeModules } = require('../../lib/cache-buster')
const { ERR_CODE, ERR_MSG } = require('./constants.cjs')

const {
Expand Down Expand Up @@ -41,11 +42,7 @@ tap.test('gRPC Client: Bidi Streaming', (t) => {
client.close()
grpc = null
proto = null
Object.keys(require.cache).forEach((key) => {
if (key.includes('@grpc/grpc-js')) {
delete require.cache[key]
}
})
removeModules(['@grpc/grpc-js'])
})

t.test(
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/grpc/client-server-streaming.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeModules } = require('../../lib/cache-buster')
const { ERR_CODE, ERR_MSG } = require('./constants.cjs')

const {
Expand Down Expand Up @@ -41,11 +42,7 @@ tap.test('gRPC Client: Server Streaming', (t) => {
client.close()
grpc = null
proto = null
Object.keys(require.cache).forEach((key) => {
if (key.includes('@grpc/grpc-js')) {
delete require.cache[key]
}
})
removeModules(['@grpc/grpc-js'])
})

t.test('should track server streaming requests as an external when in a transaction', (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/grpc/client-streaming.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeModules } = require('../../lib/cache-buster')
const { ERR_CODE, ERR_MSG, HALT_CODE, HALT_SERVER_ERR_MSG } = require('./constants.cjs')

const {
Expand Down Expand Up @@ -41,11 +42,7 @@ tap.test('gRPC Client: Client Streaming', (t) => {
client.close()
grpc = null
proto = null
Object.keys(require.cache).forEach((key) => {
if (key.includes('@grpc/grpc-js')) {
delete require.cache[key]
}
})
removeModules(['@grpc/grpc-js'])
})

t.test('should track client streaming requests as an external when in a transaction', (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/grpc/client-unary.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeModules } = require('../../lib/cache-buster')
const { ERR_CODE, ERR_MSG } = require('./constants.cjs')

const {
Expand Down Expand Up @@ -41,11 +42,7 @@ tap.test('gRPC Client: Unary Requests', (t) => {
client.close()
grpc = null
proto = null
Object.keys(require.cache).forEach((key) => {
if (key.includes('@grpc/grpc-js')) {
delete require.cache[key]
}
})
removeModules(['@grpc/grpc-js'])
})

t.test('should track unary client requests as an external when in a transaction', (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/grpc/server-bidi-streaming.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeModules } = require('../../lib/cache-buster')
const DESTINATIONS = require('../../../lib/config/attribute-filter').DESTINATIONS
const DESTINATION = DESTINATIONS.TRANS_EVENT | DESTINATIONS.ERROR_EVENT
const { ERR_CODE, ERR_SERVER_MSG } = require('./constants.cjs')
Expand Down Expand Up @@ -45,11 +46,7 @@ tap.test('gRPC Server: Bidi Streaming', (t) => {
client.close()
grpc = null
proto = null
Object.keys(require.cache).forEach((key) => {
if (key.includes('@grpc/grpc-js')) {
delete require.cache[key]
}
})
removeModules(['@grpc/grpc-js'])
})

t.test('should track bidirectional requests', async (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/grpc/server-client-streaming.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeModules } = require('../../lib/cache-buster')
const DESTINATIONS = require('../../../lib/config/attribute-filter').DESTINATIONS
const DESTINATION = DESTINATIONS.TRANS_EVENT | DESTINATIONS.ERROR_EVENT
const { ERR_CODE, ERR_SERVER_MSG, HALT_CODE, HALT_GRPC_SERVER_MSG } = require('./constants.cjs')
Expand Down Expand Up @@ -45,11 +46,7 @@ tap.test('gRPC Server: Client Streaming', (t) => {
client.close()
grpc = null
proto = null
Object.keys(require.cache).forEach((key) => {
if (key.includes('@grpc/grpc-js')) {
delete require.cache[key]
}
})
removeModules(['@grpc/grpc-js'])
})

t.test('should track client streaming requests', async (t) => {
Expand Down
7 changes: 2 additions & 5 deletions test/versioned/grpc/server-streaming.tap.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

const tap = require('tap')
const helper = require('../../lib/agent_helper')
const { removeModules } = require('../../lib/cache-buster')
const DESTINATIONS = require('../../../lib/config/attribute-filter').DESTINATIONS
const DESTINATION = DESTINATIONS.TRANS_EVENT | DESTINATIONS.ERROR_EVENT
const { ERR_CODE, ERR_SERVER_MSG } = require('./constants.cjs')
Expand Down Expand Up @@ -45,11 +46,7 @@ tap.test('gRPC Server: Server Streaming', (t) => {
client.close()
grpc = null
proto = null
Object.keys(require.cache).forEach((key) => {
if (key.includes('@grpc/grpc-js')) {
delete require.cache[key]
}
})
removeModules(['@grpc/grpc-js'])
})

t.test('should track server-streaming requests', async (t) => {
Expand Down
Loading
Loading