11package io.sentry
22
33import io.sentry.test.getProperty
4- import java.util.concurrent.BlockingQueue
5- import java.util.concurrent.Callable
6- import java.util.concurrent.CancellationException
74import java.util.concurrent.LinkedBlockingQueue
85import java.util.concurrent.ScheduledThreadPoolExecutor
6+ import java.util.concurrent.TimeUnit
97import java.util.concurrent.atomic.AtomicBoolean
108import kotlin.test.Test
119import kotlin.test.assertEquals
12- import kotlin.test.assertFailsWith
1310import kotlin.test.assertFalse
1411import kotlin.test.assertTrue
1512import org.awaitility.kotlin.await
@@ -109,108 +106,6 @@ class SentryExecutorServiceTest {
109106 assertFalse(sentryExecutor.isClosed)
110107 }
111108
112- @Test
113- fun `SentryExecutorService submit runnable returns cancelled future when queue size exceeds limit` () {
114- val queue = mock<BlockingQueue <Runnable >>()
115- whenever(queue.size).thenReturn(272 ) // Above MAX_QUEUE_SIZE (271)
116-
117- val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
118-
119- val options = mock<SentryOptions >()
120- val logger = mock<ILogger >()
121- whenever(options.logger).thenReturn(logger)
122-
123- val sentryExecutor = SentryExecutorService (executor, options)
124- val future = sentryExecutor.submit {}
125-
126- assertTrue(future.isCancelled)
127- assertTrue(future.isDone)
128- assertFailsWith<CancellationException > { future.get() }
129- verify(executor, never()).submit(any<Runnable >())
130- verify(logger).log(any<SentryLevel >(), any<String >())
131- }
132-
133- @Test
134- fun `SentryExecutorService submit runnable accepts when queue size is within limit` () {
135- val queue = mock<BlockingQueue <Runnable >>()
136- whenever(queue.size).thenReturn(270 ) // Below MAX_QUEUE_SIZE (271)
137-
138- val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
139-
140- val sentryExecutor = SentryExecutorService (executor, null )
141- sentryExecutor.submit {}
142-
143- verify(executor).submit(any<Runnable >())
144- }
145-
146- @Test
147- fun `SentryExecutorService submit callable returns cancelled future when queue size exceeds limit` () {
148- val queue = mock<BlockingQueue <Runnable >>()
149- whenever(queue.size).thenReturn(272 ) // Above MAX_QUEUE_SIZE (271)
150-
151- val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
152-
153- val options = mock<SentryOptions >()
154- val logger = mock<ILogger >()
155- whenever(options.logger).thenReturn(logger)
156-
157- val sentryExecutor = SentryExecutorService (executor, options)
158- val future = sentryExecutor.submit(Callable { " result" })
159-
160- assertTrue(future.isCancelled)
161- assertTrue(future.isDone)
162- assertFailsWith<CancellationException > { future.get() }
163- verify(executor, never()).submit(any<Callable <String >>())
164- verify(logger).log(any<SentryLevel >(), any<String >())
165- }
166-
167- @Test
168- fun `SentryExecutorService submit callable accepts when queue size is within limit` () {
169- val queue = mock<BlockingQueue <Runnable >>()
170- whenever(queue.size).thenReturn(270 ) // Below MAX_QUEUE_SIZE (271)
171-
172- val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
173-
174- val sentryExecutor = SentryExecutorService (executor, null )
175- sentryExecutor.submit(Callable { " result" })
176-
177- verify(executor).submit(any<Callable <String >>())
178- }
179-
180- @Test
181- fun `SentryExecutorService schedule returns cancelled future when queue size exceeds limit` () {
182- val queue = mock<BlockingQueue <Runnable >>()
183- whenever(queue.size).thenReturn(272 ) // Above MAX_QUEUE_SIZE (271)
184-
185- val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
186-
187- val options = mock<SentryOptions >()
188- val logger = mock<ILogger >()
189- whenever(options.logger).thenReturn(logger)
190-
191- val sentryExecutor = SentryExecutorService (executor, options)
192- val future = sentryExecutor.schedule({}, 1000L )
193-
194- assertTrue(future.isCancelled)
195- assertTrue(future.isDone)
196- assertFailsWith<CancellationException > { future.get() }
197- verify(executor, never()).schedule(any<Runnable >(), any(), any())
198- verify(logger).log(any<SentryLevel >(), any<String >())
199- }
200-
201- @Test
202- fun `SentryExecutorService schedule accepts when queue size is within limit` () {
203- val queue = mock<BlockingQueue <Runnable >>()
204- whenever(queue.size).thenReturn(270 ) // Below MAX_QUEUE_SIZE (271)
205-
206- val executor = mock<ScheduledThreadPoolExecutor > { on { getQueue() } doReturn queue }
207-
208- val sentryExecutor = SentryExecutorService (executor, null )
209- sentryExecutor.schedule({}, 1000L )
210-
211- verify(executor).schedule(any<Runnable >(), any(), any())
212- }
213-
214109 @Test
215110 fun `SentryExecutorService prewarm schedules dummy tasks and clears queue` () {
216111 val executor = ScheduledThreadPoolExecutor (1 )
@@ -225,4 +120,15 @@ class SentryExecutorServiceTest {
225120 // the queue should be empty
226121 assertEquals(0 , executor.queue.size)
227122 }
123+
124+ @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
129+ repeat(1000 ) { sentryExecutor.schedule({}, TimeUnit .DAYS .toMillis(1 )) }
130+ sentryExecutor.submit { called = true }
131+ await.until { called }
132+ assertTrue(called)
133+ }
228134}
0 commit comments