blob: 752575a6463cfc47203b1fc138a6ca64cd718123 [file] [log] [blame]
/*
* Copyright 2016-present Open Networking Laboratory
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.onlab.util;
import java.util.concurrent.Callable;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.onlab.util.PredictableExecutor.PickyRunnable;
import com.google.common.testing.EqualsTester;
public class PredictableExecutorTest {
private PredictableExecutor pexecutor;
private ExecutorService executor;
@Before
public void setUp() {
pexecutor = new PredictableExecutor(3, Tools.namedThreads("Thread-%d"));
executor = pexecutor;
}
@After
public void tearDown() {
pexecutor.shutdownNow();
}
@Test
public void test() throws InterruptedException {
CountDownLatch latch = new CountDownLatch(7);
AtomicReference<String> hintValue0 = new AtomicReference<>("");
AtomicReference<String> hintValue1 = new AtomicReference<>("");
AtomicReference<String> hintFunction0 = new AtomicReference<>("");
AtomicReference<String> pickyRunnable0 = new AtomicReference<>("");
AtomicReference<String> pickyRunnable1 = new AtomicReference<>("");
AtomicReference<String> pickyCallable0 = new AtomicReference<>("");
AtomicReference<String> hashCode0 = new AtomicReference<>("");
pexecutor.execute(() -> {
hintValue0.set(Thread.currentThread().getName());
latch.countDown();
}, 0);
pexecutor.execute(() -> {
hintValue1.set(Thread.currentThread().getName());
latch.countDown();
}, 1);
pexecutor.execute(() -> {
hintFunction0.set(Thread.currentThread().getName());
latch.countDown();
}, (runnable) -> 0);
pexecutor.execute(new PickyRunnable() {
@Override
public void run() {
pickyRunnable0.set(Thread.currentThread().getName());
latch.countDown();
}
@Override
public int hint() {
return 0;
}
});
executor.execute(new PickyRunnable() {
@Override
public void run() {
pickyRunnable1.set(Thread.currentThread().getName());
latch.countDown();
}
@Override
public int hint() {
return 1;
}
});
Callable<Void> callable = new Callable<Void>() {
@Override
public Void call() {
pickyCallable0.set(Thread.currentThread().getName());
latch.countDown();
return null;
}
};
executor.submit(PredictableExecutor.picky(callable, 0));
executor.execute(new Runnable() {
@Override
public void run() {
hashCode0.set(Thread.currentThread().getName());
latch.countDown();
}
@Override
public int hashCode() {
return 0;
}
});
latch.await(1, TimeUnit.SECONDS);
new EqualsTester()
.addEqualityGroup(hintValue0.get(),
hintFunction0.get(),
pickyRunnable0.get(),
pickyCallable0.get(),
hashCode0.get())
.addEqualityGroup(hintValue1.get(),
pickyRunnable1.get())
.testEquals();
}
}