From 2819dd79de2c4e6b7501c412b8b48bb01fa11609 Mon Sep 17 00:00:00 2001 From: Yousif Ahmed Date: Thu, 2 Jan 2025 13:27:58 +0000 Subject: [PATCH] test(react-native): add rendering metrics e2e test --- .../scenarios/RenderingMetricsScenario.js | 84 +++++++++++++++++++ .../scenario-launcher/scenarios/index.js | 3 +- .../features/rendering-metrics.feature | 15 ++++ 3 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 test/react-native/features/fixtures/scenario-launcher/scenarios/RenderingMetricsScenario.js create mode 100644 test/react-native/features/rendering-metrics.feature diff --git a/test/react-native/features/fixtures/scenario-launcher/scenarios/RenderingMetricsScenario.js b/test/react-native/features/fixtures/scenario-launcher/scenarios/RenderingMetricsScenario.js new file mode 100644 index 000000000..e8329f9a9 --- /dev/null +++ b/test/react-native/features/fixtures/scenario-launcher/scenarios/RenderingMetricsScenario.js @@ -0,0 +1,84 @@ +import React, { useEffect, useRef, useState } from 'react' +import { SafeAreaView, View, Text, StyleSheet, FlatList } from 'react-native' +import { NativeScenarioLauncher } from '../lib/native' +import BugsnagPerformance from '@bugsnag/react-native-performance' + +export const doNotStartBugsnagPerformance = true + +const listData = Array.from({ length: 1000 }, (_, index) => { return { name: `Item ${index + 1}` } }) + +export const initialise = async (config) => { + const nativeConfig = { + apiKey: config.apiKey, + endpoint: config.endpoint + } + + await NativeScenarioLauncher.startNativePerformance(nativeConfig) + + BugsnagPerformance.attach({ maximumBatchSize: 1, autoInstrumentAppStarts: false, autoInstrumentNetworkRequests: false }) +} + +const Item = ({title}) => { + const [shouldRender, setShouldRender] = useState(false) + + useEffect(() => { + setTimeout(() => { + setShouldRender(true) + }, 250) + }, []) + + if (!shouldRender) { + return null + } + + return ( + + {title} + + ) +} + +export const App = () => { + let nativeSpan = BugsnagPerformance.startSpan('RenderingMetricsScenario', { isFirstClass: true }) + + const renderItem = (item, index) => { + if (nativeSpan && index === listData.length - 1) { + nativeSpan.end() + nativeSpan = null + } + + return + } + + return ( + + + Rendering Metrics Scenario + { this.flatListRef = ref }} + onContentSizeChange={()=> this.flatListRef.scrollToEnd()} + data={listData} + renderItem={({ item, index }) => renderItem(item, index)} + /> + + + ) +} + +const styles = StyleSheet.create({ + container: { + flex: 1 + }, + scenario: { + flex: 1 + }, + item: { + backgroundColor: '#f9c2ff', + padding: 20, + marginVertical: 8, + marginHorizontal: 16, + }, + title: { + fontSize: 32 + } +}) diff --git a/test/react-native/features/fixtures/scenario-launcher/scenarios/index.js b/test/react-native/features/fixtures/scenario-launcher/scenarios/index.js index 92a20769d..eb14e84e8 100644 --- a/test/react-native/features/fixtures/scenario-launcher/scenarios/index.js +++ b/test/react-native/features/fixtures/scenario-launcher/scenarios/index.js @@ -20,4 +20,5 @@ export * as ReactNativeNavigationScenario from './ReactNativeNavigationScenario' export * as ReactNavigationScenario from './ReactNavigationScenario' // Native Integration Scenarios -export * as NativeIntegrationScenario from './NativeIntegrationScenario' \ No newline at end of file +export * as NativeIntegrationScenario from './NativeIntegrationScenario' +export * as RenderingMetricsScenario from './RenderingMetricsScenario' \ No newline at end of file diff --git a/test/react-native/features/rendering-metrics.feature b/test/react-native/features/rendering-metrics.feature new file mode 100644 index 000000000..ec81649c6 --- /dev/null +++ b/test/react-native/features/rendering-metrics.feature @@ -0,0 +1,15 @@ +@native_integration +Feature: Rendering Metrics + + Scenario: Rendering metrics are reported + When I run 'RenderingMetricsScenario' + And I wait to receive a sampling request + And I wait to receive 1 traces + + # Native trace + Then the trace payload field "resourceSpans.0.resource" string attribute "service.name" equals "com.bugsnag.fixtures.reactnative.performance" + And the trace payload field "resourceSpans.0.resource" string attribute "telemetry.sdk.name" equals the platform-dependent string: + | ios | bugsnag.performance.cocoa | + | android | bugsnag.performance.android | + + And a span name equals "RenderingMetricsScenario"