Skip to content

Commit 5c37d1d

Browse files
authored
refactor(logging): cleanup #5937
- deduplicate tests - define `setTopic` on `BaseLogger`, not `ToolkitLogger` - it's not specific to ToolkitLogger, so it should live in the base interface. - define `LogTopic` in `logger.ts`, not `ToolkitLogger` - it's not specific to ToolkitLogger, so it should live in the base interface.
1 parent 6989ed6 commit 5c37d1d

File tree

4 files changed

+41
-55
lines changed

4 files changed

+41
-55
lines changed

CONTRIBUTING.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,16 @@ To run tests against a specific folder in VSCode, do any one of:
216216
$Env:TEST_DIR = "../core/src/test/foo"; npm run test
217217
```
218218
219+
#### Run jscpd ("Copy-Paste Detection")
220+
221+
If the "Copy-Paste Detection" CI job fails, you will find it useful to check things locally. To
222+
check a specific file:
223+
224+
npx jscpd --config .github/workflows/jscpd.json --pattern packages/…/src/foo.ts
225+
226+
See the [jscpd cli documentation](https://github.com/kucherenko/jscpd/tree/master/apps/jscpd) for
227+
more options.
228+
219229
### Coverage report
220230
221231
You can find the coverage report at `./coverage/amazonq/lcov-report/index.html` and `./coverage/toolkit/lcov-report/index.html` after running the tests. Tests ran from the workspace launch config won't generate a coverage report automatically because it can break file watching.

packages/core/src/shared/logger/logger.ts

Lines changed: 16 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,8 @@
44
*/
55

66
import * as vscode from 'vscode'
7-
import { LogTopic, type ToolkitLogger } from './toolkitLogger'
7+
8+
export type LogTopic = 'crashReport' | 'notifications' | 'test' | 'unknown'
89

910
const toolkitLoggers: {
1011
main: Logger | undefined
@@ -33,6 +34,11 @@ export interface Logger {
3334

3435
export abstract class BaseLogger implements Logger {
3536
logFile?: vscode.Uri
37+
topic: LogTopic = 'unknown'
38+
39+
setTopic(topic: LogTopic = 'unknown') {
40+
this.topic = topic
41+
}
3642

3743
debug(message: string | Error, ...meta: any[]): number {
3844
return this.sendToLog('debug', message, ...meta)
@@ -125,36 +131,20 @@ export function getLogger(topic?: LogTopic): Logger {
125131
if (!logger) {
126132
return new ConsoleLogger()
127133
}
128-
/**
129-
* need this check so that setTopic can be recognized
130-
* using instanceof would lead to dependency loop error
131-
*/
132-
if (isToolkitLogger(logger)) {
133-
logger.setTopic(topic)
134-
}
134+
;(logger as BaseLogger).setTopic?.(topic)
135135
return logger
136136
}
137137

138-
/**
139-
* check if the logger is of type `ToolkitLogger`. This avoids Circular Dependencies, but `instanceof ToolkitLogger` is preferred.
140-
* @param logger
141-
* @returns bool, true if is `ToolkitLogger`
142-
*/
143-
function isToolkitLogger(logger: Logger): logger is ToolkitLogger {
144-
return 'setTopic' in logger && typeof logger.setTopic === 'function'
145-
}
146-
147138
export function getDebugConsoleLogger(topic?: LogTopic): Logger {
148139
const logger = toolkitLoggers['debugConsole']
149140
if (!logger) {
150141
return new ConsoleLogger()
151142
}
152-
if (isToolkitLogger(logger)) {
153-
logger.setTopic(topic)
154-
}
143+
;(logger as BaseLogger).setTopic?.(topic)
155144
return logger
156145
}
157146

147+
// jscpd:ignore-start
158148
export class NullLogger extends BaseLogger {
159149
public setLogLevel(logLevel: LogLevel) {}
160150
public logLevelEnabled(logLevel: LogLevel): boolean {
@@ -169,6 +159,9 @@ export class NullLogger extends BaseLogger {
169159
message: string | Error,
170160
...meta: any[]
171161
): number {
162+
void logLevel
163+
void message
164+
void meta
172165
return 0
173166
}
174167
}
@@ -190,10 +183,7 @@ export class ConsoleLogger extends BaseLogger {
190183
message: string | Error,
191184
...meta: any[]
192185
): number {
193-
/**
194-
* This is here because we pipe verbose to debug currentlly
195-
* TODO: remove in the next stage
196-
*/
186+
// TODO: we alias "verbose" to "debug" currently. Will be revisited: IDE-14839
197187
if (logLevel === 'verbose') {
198188
// eslint-disable-next-line aws-toolkits/no-console-log
199189
console.debug(message, ...meta)
@@ -204,10 +194,12 @@ export class ConsoleLogger extends BaseLogger {
204194
return 0
205195
}
206196
}
197+
// jscpd:ignore-end
207198

208199
export function getNullLogger(type?: 'debugConsole' | 'main'): Logger {
209200
return new NullLogger()
210201
}
202+
211203
/**
212204
* Sets (or clears) the logger that is accessible to code.
213205
* The Extension is expected to call this only once per log type.

packages/core/src/shared/logger/toolkitLogger.ts

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,6 @@ import { SharedFileTransport } from './sharedFileTransport'
1414
import { ConsoleLogTransport } from './consoleLogTransport'
1515
import { isWeb } from '../extensionGlobals'
1616

17-
/* define log topics */
18-
export type LogTopic = 'unknown' | 'test' | 'crashReport' | 'notifications'
19-
2017
class ErrorLog {
2118
constructor(
2219
public topic: string,
@@ -30,7 +27,6 @@ const logmapSize: number = 1000
3027
export class ToolkitLogger extends BaseLogger implements vscode.Disposable {
3128
private readonly logger: winston.Logger
3229
/* topic is used for header in log messages, default is 'Unknown' */
33-
private topic: LogTopic = 'unknown'
3430
private disposed: boolean = false
3531
private idCounter: number = 0
3632
private logMap: { [logID: number]: { [filePath: string]: string } } = {}
@@ -115,16 +111,10 @@ export class ToolkitLogger extends BaseLogger implements vscode.Disposable {
115111
})
116112
}
117113

118-
public setTopic(topic: LogTopic = 'unknown') {
119-
this.topic = topic
120-
}
121-
122114
/* Format the message with topic header */
123115
private addTopicToMessage(message: string | Error): string | ErrorLog {
124116
if (typeof message === 'string') {
125-
/*We shouldn't print unknow before current logging calls are migrated
126-
* TODO: remove this once migration of current calls is completed
127-
*/
117+
// TODO: remove this after all calls are migrated and topic is a required param.
128118
if (this.topic === 'unknown') {
129119
return message
130120
}

packages/core/src/test/shared/logger/toolkitLogger.test.ts

Lines changed: 14 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -239,32 +239,26 @@ describe('ToolkitLogger', function () {
239239
assert.ok(!(await waitForMessage).includes(nonLoggedVerboseEntry), 'unexpected message in log')
240240
})
241241

242-
it('logs append topic header in message', async function () {
243-
const testMessage = 'This is a test message'
244-
const testMessageWithHeader = 'test: This is a test message'
245-
242+
it('prepends topic to message', async function () {
246243
testLogger = new ToolkitLogger('info')
247244
testLogger.logToOutputChannel(outputChannel, false)
248245
testLogger.setTopic('test')
249246
testLogger.setLogLevel('verbose')
250-
testLogger.verbose(testMessage)
251-
252-
const waitForMessage = waitForLoggedTextByContents(testMessageWithHeader)
253-
assert.ok((await waitForMessage).includes(testMessageWithHeader), 'Expected header added')
254-
})
255247

256-
it('logs append topic header in errors', async function () {
257-
const testError = new ToolkitError('root error', { code: 'something went wrong' })
258-
const testErrorWithHeader = "topic: 'test'"
248+
const testMessageWithHeader = 'test: This is a test message'
249+
testLogger.verbose('This is a test message')
250+
assert.ok(
251+
(await waitForLoggedTextByContents(testMessageWithHeader)).includes(testMessageWithHeader),
252+
'Expected header added'
253+
)
259254

260-
testLogger = new ToolkitLogger('info')
261-
testLogger.logToOutputChannel(outputChannel, false)
262-
testLogger.setTopic('test')
263-
testLogger.setLogLevel('verbose')
264-
testLogger.verbose(testError)
255+
const msg = "topic: 'test'"
256+
testLogger.verbose(new ToolkitError('root error', { code: 'something went wrong' }))
257+
assert.ok((await waitForLoggedTextByContents(msg)).includes(msg), 'Expected header added')
265258

266-
const waitForMessage = waitForLoggedTextByContents(testErrorWithHeader)
267-
assert.ok((await waitForMessage).includes(testErrorWithHeader), 'Expected header added')
259+
const msg2 = "topic: 'test'"
260+
testLogger.verbose(new ToolkitError('root error', { code: 'something went wrong' }))
261+
assert.ok((await waitForLoggedTextByContents(msg2)).includes(msg2), 'Expected header added')
268262
})
269263

270264
it('unknown topic header ignored in message', async function () {
@@ -282,7 +276,7 @@ describe('ToolkitLogger', function () {
282276
assert.ok(!(await waitForMessage).includes(unknowntestMessage), 'unexpected header in log')
283277
})
284278

285-
it('switch topic within same logger', async function () {
279+
it('switch topic on same logger', async function () {
286280
const testMessage = 'This is a test message'
287281
const testMessageWithHeader = 'test: This is a test message'
288282

0 commit comments

Comments
 (0)