|
19 | 19 |
|
20 | 20 | import org.apache.doris.analysis.UserIdentity; |
21 | 21 | import org.apache.doris.common.AnalysisException; |
| 22 | +import org.apache.doris.common.jmockit.Deencapsulation; |
| 23 | +import org.apache.doris.job.base.AbstractJob; |
| 24 | +import org.apache.doris.job.base.JobExecuteType; |
| 25 | +import org.apache.doris.job.base.JobExecutionConfiguration; |
| 26 | +import org.apache.doris.job.exception.JobException; |
22 | 27 | import org.apache.doris.qe.ConnectContext; |
23 | 28 | import org.apache.doris.utframe.TestWithFeService; |
24 | 29 |
|
25 | 30 | import com.google.common.collect.Sets; |
26 | 31 | import mockit.Expectations; |
27 | 32 | import org.junit.Assert; |
28 | 33 | import org.junit.Test; |
| 34 | +import org.mockito.Mockito; |
29 | 35 |
|
30 | 36 | import java.io.IOException; |
31 | 37 | import java.util.HashSet; |
| 38 | +import java.util.Map; |
32 | 39 |
|
33 | 40 | public class JobManagerTest { |
34 | 41 | @Test |
@@ -62,4 +69,37 @@ public void testJobAuth() throws IOException, AnalysisException { |
62 | 69 | Assert.assertTrue(e.getMessage().contains("table1")); |
63 | 70 | } |
64 | 71 | } |
| 72 | + |
| 73 | + private static AbstractJob mockJob(long id, String name, JobExecuteType type) { |
| 74 | + AbstractJob job = Mockito.mock(AbstractJob.class); |
| 75 | + Mockito.when(job.getJobId()).thenReturn(id); |
| 76 | + Mockito.when(job.getJobName()).thenReturn(name); |
| 77 | + JobExecutionConfiguration cfg = new JobExecutionConfiguration(); |
| 78 | + cfg.setExecuteType(type); |
| 79 | + Mockito.when(job.getJobConfig()).thenReturn(cfg); |
| 80 | + return job; |
| 81 | + } |
| 82 | + |
| 83 | + @Test |
| 84 | + @SuppressWarnings({"unchecked", "rawtypes"}) |
| 85 | + public void testCancelTaskByIdNotBlockedByOtherStreamingJob() throws JobException { |
| 86 | + JobManager manager = new JobManager(); |
| 87 | + AbstractJob streamingJob = mockJob(1L, "streaming_job", JobExecuteType.STREAMING); |
| 88 | + AbstractJob batchJob = mockJob(2L, "batch_job", JobExecuteType.RECURRING); |
| 89 | + Map<Long, AbstractJob> jobMap = (Map<Long, AbstractJob>) Deencapsulation.getField(manager, "jobMap"); |
| 90 | + jobMap.put(1L, streamingJob); |
| 91 | + jobMap.put(2L, batchJob); |
| 92 | + |
| 93 | + // Cancelling the batch job must not be blocked by the unrelated streaming job in jobMap. |
| 94 | + manager.cancelTaskById("batch_job", 100L); |
| 95 | + Mockito.verify(batchJob).cancelTaskById(100L); |
| 96 | + |
| 97 | + // Cancelling the streaming job itself still rejected. |
| 98 | + try { |
| 99 | + manager.cancelTaskById("streaming_job", 100L); |
| 100 | + Assert.fail("expected JobException for streaming job"); |
| 101 | + } catch (JobException e) { |
| 102 | + Assert.assertTrue(e.getMessage().contains("streaming job not support")); |
| 103 | + } |
| 104 | + } |
65 | 105 | } |
0 commit comments