Add unit test for asynchronous browse

This commit is contained in:
Rene Pfeuffer
2019-12-11 13:32:05 +01:00
parent 7c0eb9251a
commit 093c0abb02
2 changed files with 96 additions and 0 deletions

View File

@@ -35,6 +35,7 @@ import org.junit.Test;
import sonia.scm.repository.BrowserResult; import sonia.scm.repository.BrowserResult;
import sonia.scm.repository.FileObject; import sonia.scm.repository.FileObject;
import sonia.scm.repository.GitRepositoryConfig; import sonia.scm.repository.GitRepositoryConfig;
import sonia.scm.repository.spi.SyncAsyncExecutors.AsyncExecutorStepper;
import java.io.IOException; import java.io.IOException;
import java.util.Collection; import java.util.Collection;
@@ -43,7 +44,9 @@ import static org.assertj.core.api.Assertions.assertThat;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static sonia.scm.repository.spi.SyncAsyncExecutors.stepperAsynchronousExecutor;
import static sonia.scm.repository.spi.SyncAsyncExecutors.synchronousExecutor; import static sonia.scm.repository.spi.SyncAsyncExecutors.synchronousExecutor;
/** /**
@@ -112,6 +115,28 @@ public class GitBrowseCommandTest extends AbstractGitCommandTestBase {
assertEquals("c", c.getPath()); assertEquals("c", c.getPath());
} }
@Test
public void testAsynchronousBrowse() throws IOException {
try (AsyncExecutorStepper executor = stepperAsynchronousExecutor()) {
GitBrowseCommand command = new GitBrowseCommand(createContext(), repository, null, executor);
FileObject root = command.getBrowserResult(new BrowseCommandRequest()).getFile();
assertNotNull(root);
Collection<FileObject> foList = root.getChildren();
FileObject a = findFile(foList, "a.txt");
assertFalse(a.isDirectory());
assertNull("expected empty name before commit could have been read", a.getDescription());
assertNull("expected empty date before commit could have been read", a.getLastModified());
executor.next();
assertNotNull("expected correct name after commit could have been read", a.getDescription());
assertNotNull("expected correct date after commit could have been read", a.getLastModified());
}
}
@Test @Test
public void testBrowseSubDirectory() throws IOException { public void testBrowseSubDirectory() throws IOException {
BrowseCommandRequest request = new BrowseCommandRequest(); BrowseCommandRequest request = new BrowseCommandRequest();

View File

@@ -1,7 +1,12 @@
package sonia.scm.repository.spi; package sonia.scm.repository.spi;
import java.io.Closeable;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;
import java.util.function.Consumer; import java.util.function.Consumer;
import static sonia.scm.repository.spi.SyncAsyncExecutor.ExecutionType.ASYNCHRONOUS;
import static sonia.scm.repository.spi.SyncAsyncExecutor.ExecutionType.SYNCHRONOUS; import static sonia.scm.repository.spi.SyncAsyncExecutor.ExecutionType.SYNCHRONOUS;
public final class SyncAsyncExecutors { public final class SyncAsyncExecutors {
@@ -20,4 +25,70 @@ public final class SyncAsyncExecutors {
} }
}; };
} }
public static SyncAsyncExecutor asynchronousExecutor() {
Executor executor = Executors.newSingleThreadExecutor();
return new SyncAsyncExecutor() {
@Override
public ExecutionType execute(Consumer<ExecutionType> runnable) {
executor.execute(() -> runnable.accept(ASYNCHRONOUS));
return ASYNCHRONOUS;
}
@Override
public boolean hasExecutedAllSynchronously() {
return true;
}
};
}
public static AsyncExecutorStepper stepperAsynchronousExecutor() {
Executor executor = Executors.newSingleThreadExecutor();
Semaphore enterSemaphore = new Semaphore(0);
Semaphore exitSemaphore = new Semaphore(0);
return new AsyncExecutorStepper() {
@Override
public void close() {
enterSemaphore.release(Integer.MAX_VALUE);
exitSemaphore.release(Integer.MAX_VALUE);
}
@Override
public ExecutionType execute(Consumer<ExecutionType> runnable) {
executor.execute(() -> {
try {
enterSemaphore.acquire();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
runnable.accept(ASYNCHRONOUS);
exitSemaphore.release();
});
return ASYNCHRONOUS;
}
@Override
public void next() {
enterSemaphore.release();
try {
exitSemaphore.acquire();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
}
@Override
public boolean hasExecutedAllSynchronously() {
return true;
}
};
}
public interface AsyncExecutorStepper extends SyncAsyncExecutor, Closeable {
void next();
}
} }