use of org.syncany.operations.daemon.messages.AlreadySyncingResponse in project syncany by syncany.
the class WatchRunner method onRequestReceived.
@Subscribe
public void onRequestReceived(FolderRequest folderRequest) {
File requestRootFolder = new File(folderRequest.getRoot());
boolean localDirMatches = requestRootFolder.equals(config.getLocalDir());
if (localDirMatches) {
logger.log(Level.INFO, "Received " + folderRequest);
try {
if (!watchOperation.isSyncRunning() && !watchOperation.isSyncRequested()) {
watchOperation.pause();
FolderRequestHandler handler = FolderRequestHandler.createFolderRequestHandler(folderRequest, config);
Response response = handler.handleRequest(folderRequest);
if (response != null) {
eventBus.post(response);
}
watchOperation.resume();
} else {
logger.log(Level.WARNING, "FolderRequest discarded : ", folderRequest);
eventBus.post(new AlreadySyncingResponse(folderRequest.getId(), "FolderRequest discarded."));
}
} catch (Exception e) {
logger.log(Level.FINE, "Failed to process request", e);
eventBus.post(new BadRequestResponse(folderRequest.getId(), "Invalid request."));
}
}
}
use of org.syncany.operations.daemon.messages.AlreadySyncingResponse in project syncany by syncany.
the class NoCliRequestsWhileSyncingTest method testNoCliRequestWhileSyncing.
@Test
public void testNoCliRequestWhileSyncing() throws Exception {
final TransferSettings testConnection = TestConfigUtil.createTestLocalConnection();
final TestClient clientA = new TestClient("ClientA", testConnection);
int port = 58444;
// Load config template
DaemonConfigTO daemonConfig = TestDaemonUtil.loadDaemonConfig("daemonOneFolderNoWebServer.xml");
// Set port to prevent conflicts with default daemons
daemonConfig.getWebServer().setBindPort(port);
// Dynamically insert paths
daemonConfig.getFolders().get(0).setPath(clientA.getConfig().getLocalDir().getAbsolutePath());
// Create access token (not needed in this test, but prevents errors in daemon)
daemonConfig.setPortTO(TestDaemonUtil.createPortTO(port));
// Register to event bus
LocalEventBus localEventBus = LocalEventBus.getInstance();
localEventBus.register(this);
// Prepare CLI request
StatusFolderRequest cliStatusRequest = new StatusFolderRequest();
cliStatusRequest.setId(2586);
cliStatusRequest.setRoot(clientA.getConfig().getLocalDir().getAbsolutePath());
// Create watchServer
WatchServer watchServer = new WatchServer();
watchServer.start(daemonConfig);
// Settlement for watch server
Thread.sleep(1000);
// Create large file, then wait 3sec for the settlement timer and
// send the CLI request at the same time
clientA.createNewFile("largefile", 10 * 1024 * 1024);
Response response = null;
for (int i = 1; i < 100; i++) {
cliStatusRequest.setId(i);
localEventBus.post(cliStatusRequest);
// Then, let's hope the response is "no, no, no!"
response = waitForResponse(i);
if (response instanceof AlreadySyncingResponse) {
break;
}
Thread.sleep(40);
}
assertTrue(response instanceof AlreadySyncingResponse);
watchServer.stop();
clientA.deleteTestData();
}
use of org.syncany.operations.daemon.messages.AlreadySyncingResponse in project syncany by syncany.
the class CommandLineClient method handleRestResponse.
private int handleRestResponse(Command command, HttpResponse httpResponse) throws Exception {
logger.log(Level.FINE, "Received HttpResponse: " + httpResponse);
String responseStr = IOUtils.toString(httpResponse.getEntity().getContent());
logger.log(Level.FINE, "Responding to message with responseString: " + responseStr);
Response response = XmlMessageFactory.toResponse(responseStr);
if (response instanceof FolderResponse) {
FolderResponse folderResponse = (FolderResponse) response;
command.printResults(folderResponse.getResult());
return 0;
} else if (response instanceof AlreadySyncingResponse) {
out.println("Daemon is already syncing, please retry later.");
return 1;
} else if (response instanceof BadRequestResponse) {
out.println(response.getMessage());
return 1;
}
return 1;
}
use of org.syncany.operations.daemon.messages.AlreadySyncingResponse in project syncany by syncany.
the class BasicWatchServerTest method testWatchServer.
/**
* The WatchServerTest tests all things WatchServer.
* This is one single test to prevent issues with parallelism. (Occupied ports, EventBus mixups etc.)
*/
@Test
public void testWatchServer() throws Exception {
final TransferSettings testConnection = TestConfigUtil.createTestLocalConnection();
final TestClient clientA = new TestClient("ClientA", testConnection);
final TestClient clientB = new TestClient("ClientB", testConnection);
int port = 58443;
// Load config template
DaemonConfigTO daemonConfig = TestDaemonUtil.loadDaemonConfig("daemonTwoFoldersNoWebServer.xml");
// Set port to prevent conflicts with default daemons
daemonConfig.getWebServer().setBindPort(port);
// Dynamically insert paths
daemonConfig.getFolders().get(0).setPath(clientA.getConfig().getLocalDir().getAbsolutePath());
daemonConfig.getFolders().get(1).setPath(clientB.getConfig().getLocalDir().getAbsolutePath());
// Create access token (not needed in this test, but prevents errors in daemon)
daemonConfig.setPortTO(TestDaemonUtil.createPortTO(port));
// Create watchServer
WatchServer watchServer = new WatchServer();
clientA.createNewFile("file-1");
watchServer.start(daemonConfig);
for (int i = 0; i < 20; i++) {
if (clientB.getLocalFile("file-1").exists()) {
break;
}
Thread.sleep(1000);
}
assertTrue("File has not synced to clientB", clientB.getLocalFile("file-1").exists());
assertEquals(clientA.getLocalFile("file-1").length(), clientB.getLocalFile("file-1").length());
registerWithBus();
// Create watchServer
clientA.createNewFolder("folder");
clientA.createNewFile("folder/file-2");
// Allow server to settle
Thread.sleep(100);
// Repeat request until 3 files are found.
FileVersion[] files = null;
for (int i = 0; i < 20; i++) {
LsFolderRequest request = new LsFolderRequest();
LsOperationOptions lsOperationOption = new LsOperationOptions();
request.setId(i);
request.setRoot(clientA.getConfig().getLocalDir().getAbsolutePath());
request.setOptions(lsOperationOption);
eventBus.post(request);
Response response = waitForResponse(i);
if (response instanceof AlreadySyncingResponse) {
Thread.sleep(1000);
continue;
}
assertTrue(response instanceof LsFolderResponse);
LsFolderResponse treeResponse = (LsFolderResponse) response;
files = treeResponse.getResult().getFileList().toArray(new FileVersion[] {});
if (files.length == 2) {
break;
}
if (i == 19) {
assertEquals(2, files.length);
} else {
Thread.sleep(1000);
}
}
if (files[0].getName().equals("folder")) {
files = new FileVersion[] { files[1], files[0] };
}
assertEquals(clientA.getLocalFile("file-1").getName(), files[0].getName());
assertEquals(clientA.getLocalFile("file-1").length(), (long) files[0].getSize());
assertEquals(clientA.getLocalFile("folder").getName(), files[1].getName());
assertTrue(clientA.getLocalFile("folder").isDirectory());
assertEquals(files[1].getType(), FileVersion.FileType.FOLDER);
// Create GetFileHistoryRequest for the first returned file
GetFileHistoryFolderRequest request = new GetFileHistoryFolderRequest();
request.setId(21);
request.setRoot(clientA.getConfig().getLocalDir().getAbsolutePath());
request.setFileHistoryId(files[0].getFileHistoryId().toString());
eventBus.post(request);
Response response = waitForResponse(21);
assertTrue(response instanceof GetFileHistoryFolderResponse);
GetFileHistoryFolderResponse fileHistoryResponse = (GetFileHistoryFolderResponse) response;
assertEquals(1, fileHistoryResponse.getFiles().size());
assertEquals(files[0], fileHistoryResponse.getFiles().get(0));
// Create GetFileRequest for the first returned file
GetFileFolderRequest getFileRequest = new GetFileFolderRequest();
getFileRequest.setId(22);
getFileRequest.setRoot(clientA.getConfig().getLocalDir().getAbsolutePath());
getFileRequest.setFileHistoryId(files[0].getFileHistoryId().toString());
getFileRequest.setVersion(1);
eventBus.post(getFileRequest);
int i = 0;
while (internalResponse == null && i < 40) {
Thread.sleep(100);
i++;
}
assertEquals((long) files[0].getSize(), internalResponse.getTempFile().length());
// Cli Requests
clientA.copyFile("file-1", "file-1.bak");
// CLI request while running.
StatusFolderRequest statusRequest = new StatusFolderRequest();
StatusOperationOptions statusOperationOption = new StatusOperationOptions();
statusOperationOption.setForceChecksum(true);
statusRequest.setId(30);
statusRequest.setRoot(clientA.getConfig().getLocalDir().getAbsolutePath());
statusRequest.setOptions(statusOperationOption);
// Create big file to trigger sync
clientA.createNewFile("bigfileforlongsync", 10 * 1024 * 1024);
// ^^ Now sync should start and we send 'status' requests
boolean syncRunningMessageReceived = false;
for (i = 30; i < 59; i++) {
statusRequest.setId(i);
eventBus.post(statusRequest);
response = waitForResponse(i);
if (response instanceof AlreadySyncingResponse) {
syncRunningMessageReceived = true;
break;
}
Thread.sleep(200);
}
assertTrue(syncRunningMessageReceived);
// Allow daemon to sync
Thread.sleep(10000);
for (i = 59; i < 69; i++) {
statusRequest.setId(i);
eventBus.post(statusRequest);
response = waitForResponse(i);
if (response instanceof StatusFolderResponse) {
break;
}
Thread.sleep(1000);
}
assertNotNull(response);
//assertEquals("No local changes.\n", cliResponse.getOutput());
// Restore file test
RestoreFolderRequest restoreRequest = new RestoreFolderRequest();
RestoreOperationOptions restoreOperationOption = new RestoreOperationOptions();
restoreOperationOption.setFileHistoryId(files[0].getFileHistoryId());
restoreOperationOption.setFileVersion(1);
restoreRequest.setId(70);
restoreRequest.setRoot(clientA.getConfig().getLocalDir().getAbsolutePath());
restoreRequest.setOptions(restoreOperationOption);
eventBus.post(restoreRequest);
response = waitForResponse(70);
assertTrue(response instanceof RestoreFolderResponse);
RestoreFolderResponse restoreResponse = (RestoreFolderResponse) response;
byte[] copyChecksum = FileUtil.createChecksum(clientA.getLocalFile("file-1.bak"), "SHA1");
byte[] restoreChecksum = FileUtil.createChecksum(restoreResponse.getResult().getTargetFile(), "SHA1");
assertArrayEquals(copyChecksum, restoreChecksum);
watchServer.stop();
clientA.deleteTestData();
clientB.deleteTestData();
}
Aggregations