Skip to content

Commit

Permalink
✅ add logs scenario
Browse files Browse the repository at this point in the history
  • Loading branch information
thomas-lebeau committed Dec 23, 2024
1 parent 076a91e commit 8dfc67f
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 62 deletions.
2 changes: 1 addition & 1 deletion playwright.config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { defineConfig, devices } from '@playwright/test'
*/
export default defineConfig({
testDir: './test/e2e/scenario',
testMatch: '**/init.scenario.ts',
testMatch: ['**/init.scenario.ts', '**/logs.scenario.ts'],
/* Run tests in files in parallel */
fullyParallel: true,
/* Fail the build on CI if you accidentally left test.only in the source code. */
Expand Down
124 changes: 63 additions & 61 deletions test/e2e/scenario/logs.scenario.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { DEFAULT_REQUEST_ERROR_RESPONSE_LENGTH_LIMIT } from '@datadog/browser-logs/cjs/domain/configuration'
import { createTest, flushEvents } from '../lib/framework'
import { test, expect } from '@playwright/test'
import { createTest } from '../lib/framework'
import { APPLICATION_ID } from '../lib/helpers/configuration'
import { flushBrowserLogs, withBrowserLogs } from '../lib/helpers/browser'

const UNREACHABLE_URL = 'http://localhost:9999/unreachable'

describe('logs', () => {
test.describe('logs', () => {
createTest('send logs')
.withLogs()
.run(async ({ intakeRegistry }) => {
await browser.execute(() => {
.run(async ({ intakeRegistry, flushEvents, page }) => {
await page.evaluate(() => {
window.DD_LOGS!.logger.log('hello')
})
await flushEvents()
Expand All @@ -19,52 +19,56 @@ describe('logs', () => {

createTest('display logs in the console')
.withLogs()
.run(async ({ intakeRegistry }) => {
await browser.execute(() => {
.run(async ({ intakeRegistry, flushEvents, page, withBrowserLogs }) => {
await page.evaluate(() => {
window.DD_LOGS!.logger.setHandler('console')
window.DD_LOGS!.logger.warn('hello')
})
await flushEvents()
expect(intakeRegistry.logsEvents.length).toBe(0)

await withBrowserLogs((logs) => {
withBrowserLogs((logs) => {
expect(logs.length).toBe(1)
expect(logs[0].level).toBe('WARNING')
expect(logs[0].message).not.toEqual(jasmine.stringContaining('Datadog Browser SDK'))
expect(logs[0].message).toEqual(jasmine.stringContaining('hello'))
expect(logs[0].level).toBe('warning')
expect(logs[0].message).not.toEqual(expect.stringContaining('Datadog Browser SDK'))
expect(logs[0].message).toEqual(expect.stringContaining('hello'))
})
})

createTest('send console errors')
.withLogs({ forwardErrorsToLogs: true })
.run(async ({ intakeRegistry }) => {
await browser.execute(() => {
.run(async ({ intakeRegistry, flushEvents, page, withBrowserLogs }) => {
await page.evaluate(() => {
console.error('oh snap')
})
await flushEvents()
expect(intakeRegistry.logsEvents.length).toBe(1)
expect(intakeRegistry.logsEvents[0].message).toBe('oh snap')
await withBrowserLogs((browserLogs) => {
withBrowserLogs((browserLogs) => {
expect(browserLogs.length).toEqual(1)
})
})

createTest('send XHR network errors')
.withLogs({ forwardErrorsToLogs: true })
.run(async ({ intakeRegistry }) => {
await browser.executeAsync((unreachableUrl, done) => {
const xhr = new XMLHttpRequest()
xhr.addEventListener('error', () => done(undefined))
xhr.open('GET', unreachableUrl)
xhr.send()
}, UNREACHABLE_URL)
.run(async ({ intakeRegistry, flushEvents, withBrowserLogs, page }) => {
await page.evaluate(
(unreachableUrl) =>
new Promise<void>((resolve) => {
const xhr = new XMLHttpRequest()
xhr.addEventListener('error', () => resolve())
xhr.open('GET', unreachableUrl)
xhr.send()
}),
UNREACHABLE_URL
)

await flushEvents()
expect(intakeRegistry.logsEvents.length).toBe(1)
expect(intakeRegistry.logsEvents[0].message).toBe(`XHR error GET ${UNREACHABLE_URL}`)
expect(intakeRegistry.logsEvents[0].origin).toBe('network')

await withBrowserLogs((browserLogs) => {
withBrowserLogs((browserLogs) => {
// Some browser report two errors:
// * failed to load resource
// * blocked by CORS policy
Expand All @@ -74,19 +78,15 @@ describe('logs', () => {

createTest('send fetch network errors')
.withLogs({ forwardErrorsToLogs: true })
.run(async ({ intakeRegistry }) => {
await browser.executeAsync((unreachableUrl, done) => {
fetch(unreachableUrl).catch(() => {
done(undefined)
})
}, UNREACHABLE_URL)
.run(async ({ intakeRegistry, flushEvents, page, withBrowserLogs }) => {
await page.evaluate((unreachableUrl) => fetch(unreachableUrl).catch(() => {}), UNREACHABLE_URL)

await flushEvents()
expect(intakeRegistry.logsEvents.length).toBe(1)
expect(intakeRegistry.logsEvents[0].message).toBe(`Fetch error GET ${UNREACHABLE_URL}`)
expect(intakeRegistry.logsEvents[0].origin).toBe('network')

await withBrowserLogs((browserLogs) => {
withBrowserLogs((browserLogs) => {
// Some browser report two errors:
// * failed to load resource
// * blocked by CORS policy
Expand All @@ -96,10 +96,8 @@ describe('logs', () => {

createTest('keep only the first bytes of the response')
.withLogs({ forwardErrorsToLogs: true })
.run(async ({ intakeRegistry, baseUrl, servers }) => {
await browser.executeAsync((done) => {
fetch('/throw-large-response').then(() => done(undefined), console.log)
})
.run(async ({ intakeRegistry, baseUrl, servers, flushEvents, page, withBrowserLogs }) => {
await page.evaluate(() => fetch('/throw-large-response').then(() => {}, console.log))

await flushEvents()
expect(intakeRegistry.logsEvents.length).toBe(1)
Expand All @@ -115,7 +113,7 @@ describe('logs', () => {
DEFAULT_REQUEST_ERROR_RESPONSE_LENGTH_LIMIT
)

await withBrowserLogs((browserLogs) => {
withBrowserLogs((browserLogs) => {
// Some browser report two errors:
// * the server responded with a status of 500
// * canceling the body stream is reported as a network error (net::ERR_FAILED)
Expand All @@ -125,29 +123,33 @@ describe('logs', () => {

createTest('track fetch error')
.withLogs({ forwardErrorsToLogs: true })
.run(async ({ intakeRegistry, baseUrl }) => {
await browser.executeAsync((unreachableUrl, done) => {
let count = 0
fetch('/throw')
.then(() => (count += 1))
.catch((err) => console.error(err))
fetch('/unknown')
.then(() => (count += 1))
.catch((err) => console.error(err))
fetch(unreachableUrl).catch(() => (count += 1))
fetch('/ok')
.then(() => (count += 1))
.catch((err) => console.error(err))

const interval = setInterval(() => {
if (count === 4) {
clearInterval(interval)
done(undefined)
}
}, 500)
}, UNREACHABLE_URL)

await flushBrowserLogs()
.run(async ({ intakeRegistry, baseUrl, flushEvents, flushBrowserLogs, page }) => {
await page.evaluate(
(unreachableUrl) =>
new Promise<void>((resolve) => {
let count = 0
fetch('/throw')
.then(() => (count += 1))
.catch((err) => console.error(err))
fetch('/unknown')
.then(() => (count += 1))
.catch((err) => console.error(err))
fetch(unreachableUrl).catch(() => (count += 1))
fetch('/ok')
.then(() => (count += 1))
.catch((err) => console.error(err))

const interval = setInterval(() => {
if (count === 4) {
clearInterval(interval)
resolve()
}
}, 500)
}),
UNREACHABLE_URL
)

flushBrowserLogs()
await flushEvents()

expect(intakeRegistry.logsEvents.length).toEqual(2)
Expand All @@ -167,8 +169,8 @@ describe('logs', () => {
createTest('add RUM internal context to logs')
.withRum()
.withLogs()
.run(async ({ intakeRegistry }) => {
await browser.execute(() => {
.run(async ({ intakeRegistry, flushEvents, page }) => {
await page.evaluate(() => {
window.DD_LOGS!.logger.log('hello')
})
await flushEvents()
Expand All @@ -184,8 +186,8 @@ describe('logs', () => {
return true
},
})
.run(async ({ intakeRegistry }) => {
await browser.execute(() => {
.run(async ({ intakeRegistry, flushEvents, page }) => {
await page.evaluate(() => {
window.DD_LOGS!.logger.log('hello', {})
})
await flushEvents()
Expand Down

0 comments on commit 8dfc67f

Please sign in to comment.