// 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);
assertTrue(response instanceof LsFolderResponse);
LsFolderResponse treeResponse = (LsFolderResponse) response;
files = treeResponse.getResult().getFileTree().values().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", 5000);
// ^^ Now sync should start and we send 'status' requests
boolean syncRunningMessageReceived = false;
for (i = 30; i < 50; 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 = 50; i < 60; 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();
}