@@ -2,6 +2,7 @@ package io.sentry.sqlite
22
33import io.sentry.IScopes
44import io.sentry.SentryDateProvider
5+ import io.sentry.SentryLongDate
56import io.sentry.SentryNanotimeDate
67import io.sentry.SentryOptions
78import io.sentry.SentryTracer
@@ -13,6 +14,7 @@ import java.util.Date
1314import kotlin.test.Test
1415import kotlin.test.assertEquals
1516import kotlin.test.assertFalse
17+ import kotlin.test.assertIs
1618import kotlin.test.assertNotNull
1719import kotlin.test.assertNull
1820import kotlin.test.assertTrue
@@ -149,7 +151,7 @@ class SQLiteSpanInstrumentationTest {
149151 }
150152
151153 @Test
152- fun `recordSpan repairs start precision when parent uses SentryNanotimeDate ` () {
154+ fun `recordSpan repairs start precision` () {
153155 val sameMillis = Date (1_000_000L )
154156 val parentNanos = 100_000_000L
155157 val childNanos = 100_500_000L
@@ -168,75 +170,14 @@ class SQLiteSpanInstrumentationTest {
168170
169171 val parentStart = fixture.sentryTracer.startDate
170172 val expectedStart = parentStart.laterDateNanosTimestampByDiff(start)
173+ // Child and parent share the same ms-quantized baseline; repair adds nanosecond offset.
174+ assertEquals(parentStart.nanoTimestamp(), start.nanoTimestamp())
175+ assertTrue(start.nanoTimestamp() != expectedStart)
176+ assertIs<SentryLongDate >(span.startDate)
171177 assertEquals(expectedStart, span.startDate.nanoTimestamp())
172178 assertEquals(expectedStart + durationNanos, span.finishDate!! .nanoTimestamp())
173179 }
174180
175- @Test
176- fun `recordSpan gives distinct ordered starts within the same millisecond` () {
177- val sameMillis = Date (1_000_000L )
178- val parentNanos = 100_000_000L
179- val child1Nanos = 100_200_000L
180- val child2Nanos = 100_800_000L
181-
182- val sut =
183- setUpWithNanotimeDates(
184- SentryNanotimeDate (sameMillis, parentNanos),
185- SentryNanotimeDate (sameMillis, child1Nanos),
186- SentryNanotimeDate (sameMillis, child2Nanos),
187- )
188- val start1 = sut.startTimestamp()
189- val start2 = sut.startTimestamp()
190-
191- assertEquals(
192- start1.nanoTimestamp(),
193- start2.nanoTimestamp(),
194- " Raw starts share the same ms-quantized timestamp" ,
195- )
196-
197- sut.recordSpan(" SELECT 1" , start1, 1_000_000 , SpanStatus .OK )
198- sut.recordSpan(" SELECT 2" , start2, 1_000_000 , SpanStatus .OK )
199-
200- val span1 = fixture.sentryTracer.children[0 ]
201- val span2 = fixture.sentryTracer.children[1 ]
202-
203- assertTrue(
204- span1.startDate.nanoTimestamp() < span2.startDate.nanoTimestamp(),
205- " Repaired starts should be distinct and ordered" ,
206- )
207- }
208-
209- @Test
210- fun `recordSpan preserves exact duration after precision repair` () {
211- val sameMillis = Date (1_000_000L )
212- val sut =
213- setUpWithNanotimeDates(
214- SentryNanotimeDate (sameMillis, 100_000_000L ),
215- SentryNanotimeDate (sameMillis, 100_750_000L ),
216- )
217- val start = sut.startTimestamp()
218- val durationNanos = 123_456L
219-
220- sut.recordSpan(" SELECT 1" , start, durationNanos, SpanStatus .OK )
221-
222- val span = fixture.sentryTracer.children.first()
223- val actualDuration = span.finishDate!! .nanoTimestamp() - span.startDate.nanoTimestamp()
224- assertEquals(durationNanos, actualDuration)
225- }
226-
227- @Test
228- fun `recordSpan does not repair start when parent is not SentryNanotimeDate` () {
229- val sut = fixture.getSut(isTransactionActive = true )
230- val start = sut.startTimestamp()
231- val durationNanos = 1_000_000L
232-
233- sut.recordSpan(" SELECT 1" , start, durationNanos, SpanStatus .OK )
234-
235- val span = fixture.sentryTracer.children.first()
236- assertEquals(start.nanoTimestamp(), span.startDate.nanoTimestamp())
237- assertEquals(start.nanoTimestamp() + durationNanos, span.finishDate!! .nanoTimestamp())
238- }
239-
240181 @Test
241182 fun `recordCoarseSpan records a span if a transaction is active` () {
242183 val sut = fixture.getSut(isTransactionActive = true )
@@ -346,7 +287,7 @@ class SQLiteSpanInstrumentationTest {
346287 }
347288
348289 @Test
349- fun `recordCoarseSpan does not repair start precision when parent uses SentryNanotimeDate ` () {
290+ fun `recordCoarseSpan does not repair start precision` () {
350291 val sameMillis = Date (1_000_000L )
351292 val parentNanos = 100_000_000L
352293 val childNanos = 100_500_000L
@@ -367,18 +308,6 @@ class SQLiteSpanInstrumentationTest {
367308 assertTrue(span.finishDate!! .nanoTimestamp() >= span.startDate.nanoTimestamp())
368309 }
369310
370- @Test
371- fun `recordCoarseSpan does not repair start when parent is not SentryNanotimeDate` () {
372- val sut = fixture.getSut(isTransactionActive = true )
373- val start = sut.startTimestamp()
374-
375- sut.recordCoarseSpan(" SELECT 1" , start, SpanStatus .OK )
376-
377- val span = fixture.sentryTracer.children.first()
378- assertEquals(start.nanoTimestamp(), span.startDate.nanoTimestamp())
379- assertTrue(span.finishDate!! .nanoTimestamp() >= start.nanoTimestamp())
380- }
381-
382311 @Test
383312 fun `fromFileName sets db name from fileName when using recordSpan` () {
384313 val options = SentryOptions ().apply { dsn = " https://key@sentry.io/proj" }
0 commit comments