View Javadoc
1   /*
2    * Copyright (c) 2012-2024, jcabi.com
3    * All rights reserved.
4    *
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions
7    * are met: 1) Redistributions of source code must retain the above
8    * copyright notice, this list of conditions and the following
9    * disclaimer. 2) Redistributions in binary form must reproduce the above
10   * copyright notice, this list of conditions and the following
11   * disclaimer in the documentation and/or other materials provided
12   * with the distribution. 3) Neither the name of the jcabi.com nor
13   * the names of its contributors may be used to endorse or promote
14   * products derived from this software without specific prior written
15   * permission.
16   *
17   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18   * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT
19   * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
20   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
21   * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
22   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
24   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
25   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
26   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
27   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
28   * OF THE POSSIBILITY OF SUCH DAMAGE.
29   */
30  package com.jcabi.aspects.aj;
31  
32  import com.jcabi.aspects.ScheduleWithFixedDelay;
33  import java.io.Closeable;
34  import java.util.concurrent.TimeUnit;
35  import org.hamcrest.MatcherAssert;
36  import org.hamcrest.Matchers;
37  import org.junit.jupiter.api.Test;
38  
39  /**
40   * Tests for {@link MethodScheduler}.
41   *
42   * @since 0.7.22
43   */
44  @SuppressWarnings("PMD.DoNotUseThreads")
45  final class MethodSchedulerTest {
46  
47      @Test
48      void shortRunningTaskShouldBeAllowedToFinish() throws Exception {
49          final MethodSchedulerTest.ShortRun target = new MethodSchedulerTest.ShortRun();
50          TimeUnit.SECONDS.sleep(5);
51          target.close();
52          MatcherAssert.assertThat(target.finished, Matchers.equalTo(true));
53      }
54  
55      @Test
56      void interruptLongRunningTask() throws Exception {
57          final MethodSchedulerTest.LongRun target = new MethodSchedulerTest.LongRun();
58          target.close();
59          MatcherAssert.assertThat(target.finished, Matchers.equalTo(false));
60      }
61  
62      /**
63       * Short running task.
64       * @since 0.7.22
65       */
66      @ScheduleWithFixedDelay(unit = TimeUnit.NANOSECONDS)
67      private static class ShortRun implements Runnable, Closeable {
68  
69          /**
70           * Have we finished?
71           */
72          private transient boolean finished;
73  
74          @Override
75          public void run() {
76              try {
77                  TimeUnit.SECONDS.sleep(1L);
78                  this.finished = true;
79              } catch (final InterruptedException ex) {
80                  Thread.currentThread().interrupt();
81              }
82          }
83  
84          @Override
85          public void close() {
86              // do nothing
87          }
88      }
89  
90      /**
91       * Long running task.
92       * @since 0.7.22
93       */
94      @ScheduleWithFixedDelay(unit = TimeUnit.NANOSECONDS,
95          await = 10, awaitUnit = TimeUnit.SECONDS)
96      private static class LongRun implements Runnable, Closeable {
97          /**
98           * Have we finished?
99           */
100         private transient boolean finished;
101 
102         @Override
103         public void run() {
104             try {
105                 TimeUnit.SECONDS.sleep(30L);
106                 this.finished = true;
107             } catch (final InterruptedException ex) {
108                 Thread.currentThread().interrupt();
109             }
110         }
111 
112         @Override
113         public void close() {
114             // do nothing
115         }
116     }
117 }