@@ -14,8 +14,13 @@ import org.mockito.kotlin.any
1414import org.mockito.kotlin.doReturn
1515import org.mockito.kotlin.mock
1616import org.mockito.kotlin.never
17+ import org.mockito.kotlin.spy
1718import org.mockito.kotlin.verify
1819import org.mockito.kotlin.whenever
20+ import java.util.concurrent.BlockingQueue
21+ import java.util.concurrent.Callable
22+ import java.util.concurrent.CancellationException
23+ import kotlin.test.assertFailsWith
1924
2025class SentryExecutorServiceTest {
2126 @Test
@@ -105,6 +110,86 @@ class SentryExecutorServiceTest {
105110 whenever(executor.isShutdown).thenReturn(false )
106111 assertFalse(sentryExecutor.isClosed)
107112 }
113+ @Test
114+ fun `SentryExecutorService submit runnable returns cancelled future when queue size exceeds limit` () {
115+ val queue = mock<BlockingQueue <Runnable >>()
116+ whenever(queue.size).thenReturn(272 ) // Above MAX_QUEUE_SIZE (271)
117+
118+ val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
119+
120+ val options = mock<SentryOptions >()
121+ val logger = mock<ILogger >()
122+ whenever(options.logger).thenReturn(logger)
123+
124+ val sentryExecutor = SentryExecutorService (executor, options)
125+ val future = sentryExecutor.submit {}
126+
127+ assertTrue(future.isCancelled)
128+ assertTrue(future.isDone)
129+ assertFailsWith<CancellationException > { future.get() }
130+ verify(executor, never()).submit(any<Runnable >())
131+ verify(logger).log(any<SentryLevel >(), any<String >())
132+ }
133+
134+ @Test
135+ fun `SentryExecutorService submit runnable accepts when queue size is within limit` () {
136+ val queue = mock<BlockingQueue <Runnable >>()
137+ whenever(queue.size).thenReturn(270 ) // Below MAX_QUEUE_SIZE (271)
138+
139+ val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
140+
141+ val sentryExecutor = SentryExecutorService (executor, null )
142+ sentryExecutor.submit {}
143+
144+ verify(executor).submit(any<Runnable >())
145+ }
146+
147+ @Test
148+ fun `SentryExecutorService submit callable returns cancelled future when queue size exceeds limit` () {
149+ val queue = mock<BlockingQueue <Runnable >>()
150+ whenever(queue.size).thenReturn(272 ) // Above MAX_QUEUE_SIZE (271)
151+
152+ val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
153+
154+ val options = mock<SentryOptions >()
155+ val logger = mock<ILogger >()
156+ whenever(options.logger).thenReturn(logger)
157+
158+ val sentryExecutor = SentryExecutorService (executor, options)
159+ val future = sentryExecutor.submit(Callable { " result" })
160+
161+ assertTrue(future.isCancelled)
162+ assertTrue(future.isDone)
163+ assertFailsWith<CancellationException > { future.get() }
164+ verify(executor, never()).submit(any<Callable <String >>())
165+ verify(logger).log(any<SentryLevel >(), any<String >())
166+ }
167+
168+ @Test
169+ fun `SentryExecutorService submit callable accepts when queue size is within limit` () {
170+ val queue = mock<BlockingQueue <Runnable >>()
171+ whenever(queue.size).thenReturn(270 ) // Below MAX_QUEUE_SIZE (271)
172+
173+ val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
174+
175+ val sentryExecutor = SentryExecutorService (executor, null )
176+ sentryExecutor.submit(Callable { " result" })
177+
178+ verify(executor).submit(any<Callable <String >>())
179+ }
180+
181+ @Test
182+ fun `SentryExecutorService schedule accepts when queue size is within limit` () {
183+ val queue = mock<BlockingQueue <Runnable >>()
184+ whenever(queue.size).thenReturn(270 ) // Below MAX_QUEUE_SIZE (271)
185+
186+ val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
187+
188+ val sentryExecutor = SentryExecutorService (executor, null )
189+ sentryExecutor.schedule({}, 1000L )
190+
191+ verify(executor).schedule(any<Runnable >(), any(), any())
192+ }
108193
109194 @Test
110195 fun `SentryExecutorService prewarm schedules dummy tasks and clears queue` () {
@@ -122,13 +207,11 @@ class SentryExecutorServiceTest {
122207 }
123208
124209 @Test
125- fun `SentryExecutorService runs any number of job` () {
126- val sentryExecutor = SentryExecutorService ( )
127- var called = false
128- // Post 1k jobs after 1 day, to test new jobs are accepted
210+ fun `SentryExecutorService schedules any number of job` () {
211+ val executor = ScheduledThreadPoolExecutor ( 1 )
212+ val sentryExecutor = SentryExecutorService (executor, null )
213+ // Post 1k jobs after 1 day, to test they are all accepted
129214 repeat(1000 ) { sentryExecutor.schedule({}, TimeUnit .DAYS .toMillis(1 )) }
130- sentryExecutor.submit { called = true }
131- await.until { called }
132- assertTrue(called)
215+ assertEquals(1000 , executor.queue.size)
133216 }
134217}
0 commit comments