|
12 | 12 | import static org.junit.jupiter.api.parallel.ExecutionMode.SAME_THREAD; |
13 | 13 |
|
14 | 14 | import edu.wpi.first.networktables.NetworkTable; |
| 15 | +import edu.wpi.first.networktables.NetworkTableEntry; |
| 16 | +import edu.wpi.first.networktables.NetworkTableEvent; |
15 | 17 | import edu.wpi.first.networktables.NetworkTableInstance; |
| 18 | +import edu.wpi.first.networktables.NetworkTableListener; |
16 | 19 | import edu.wpi.first.networktables.Topic; |
17 | 20 | import java.io.IOException; |
18 | 21 | import java.io.InputStream; |
19 | 22 | import java.nio.file.Files; |
20 | 23 | import java.nio.file.Path; |
21 | 24 | import java.util.ArrayList; |
22 | 25 | import java.util.Arrays; |
| 26 | +import java.util.EnumSet; |
23 | 27 | import java.util.List; |
| 28 | +import java.util.concurrent.Semaphore; |
| 29 | +import java.util.concurrent.TimeUnit; |
24 | 30 | import java.util.stream.Stream; |
25 | 31 | import org.junit.jupiter.api.AfterEach; |
26 | 32 | import org.junit.jupiter.api.BeforeEach; |
@@ -69,6 +75,8 @@ void setup(@TempDir Path tempDir) { |
69 | 75 |
|
70 | 76 | @AfterEach |
71 | 77 | void cleanup() { |
| 78 | + Preferences.disableLegacyDashboardSupport(); |
| 79 | + m_inst.waitForListenerQueue(0.1); |
72 | 80 | m_inst.close(); |
73 | 81 | } |
74 | 82 |
|
@@ -121,6 +129,45 @@ void defaultValueTest() { |
121 | 129 | () -> assertFalse(Preferences.getBoolean("checkedValueBoolean", true))); |
122 | 130 | } |
123 | 131 |
|
| 132 | + @Test |
| 133 | + void enableLegacyDashboardSupportTest() throws InterruptedException { |
| 134 | + // Publish a value, wait until we are sure the listener would have fired, and verify that the |
| 135 | + // topic is not marked as persistant. |
| 136 | + Semaphore semaphore = new Semaphore(0); |
| 137 | + NetworkTableEntry entry = m_table.getEntry("legacyDashboardValueLong"); |
| 138 | + try (NetworkTableListener listener = |
| 139 | + NetworkTableListener.createListener( |
| 140 | + entry, |
| 141 | + EnumSet.of(NetworkTableEvent.Kind.kImmediate, NetworkTableEvent.Kind.kValueAll), |
| 142 | + event -> { |
| 143 | + if (event.valueData != null) { |
| 144 | + semaphore.release(); |
| 145 | + } |
| 146 | + })) { |
| 147 | + // Set a value, wait for listeners to fire, and do that again. This ensures any listener for |
| 148 | + // thus entry would have been called at least once. |
| 149 | + for (int value = 1; value < 3; value++) { |
| 150 | + entry.setInteger(value); |
| 151 | + if (!semaphore.tryAcquire(100, TimeUnit.MILLISECONDS)) { |
| 152 | + fail("timed out waiting for event listener"); |
| 153 | + } |
| 154 | + } |
| 155 | + |
| 156 | + assertFalse(entry.isPersistent()); |
| 157 | + |
| 158 | + // When legacy dashboard support is enabled, the topic should be marked as persistant. |
| 159 | + Preferences.enableLegacyDashboardSupport(); |
| 160 | + for (int value = 3; value < 5; value++) { |
| 161 | + entry.setInteger(value); |
| 162 | + if (!semaphore.tryAcquire(100, TimeUnit.MILLISECONDS)) { |
| 163 | + fail("timed out waiting for event listener"); |
| 164 | + } |
| 165 | + } |
| 166 | + |
| 167 | + assertTrue(entry.isPersistent()); |
| 168 | + } |
| 169 | + } |
| 170 | + |
124 | 171 | @Nested |
125 | 172 | class PutGetTests { |
126 | 173 | @Test |
|
0 commit comments