/*
* Syncany, www.syncany.org
* Copyright (C) 2011-2016 Philipp C. Heckel <philipp.heckel@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.syncany.tests.integration.scenarios;
import java.util.Queue;
import java.util.Random;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.apache.commons.io.FileUtils;
import org.junit.Ignore;
import org.syncany.operations.cleanup.CleanupOperationOptions;
import org.syncany.plugins.local.LocalTransferSettings;
import org.syncany.tests.util.TestClient;
import org.syncany.tests.util.TestConfigUtil;
public class Issue429ScenarioTest {
private static final Logger logger = Logger.getLogger(Issue429ScenarioTest.class.getSimpleName());
@Ignore
public void testIssue492UploadDuplicateFile() throws Exception {
// Setup
LocalTransferSettings testConnection = (LocalTransferSettings) TestConfigUtil.createTestLocalConnection();
TestClient clientA = new TestClient("A", testConnection);
TestClient clientB = new TestClient("B", testConnection);
TestClient clientC = new TestClient("C", testConnection);
clientA.createNewFile("file1.txt", 1024);
clientA.upWithForceChecksum();
FileUtils.copyFile(clientA.getLocalFile("file1.txt"), clientB.getLocalFile("file2.txt"));
clientB.down();
clientB.up();
clientA.deleteFile("file1.txt");
clientA.deleteFile("file2.txt");
clientA.upWithForceChecksum();
clientB.cleanup();
clientC.down();
// Tear down
//clientB.deleteTestData();
//clientA.deleteTestData();
}
@Ignore
public void testSpecificQueue() throws Exception {
String[] commands = new String[] { "A5", "B5", "B0", "B0", "A7", "A3", "B6", "B1", "A7", "A6", "A7", "B5", "A1", "A0", "B6", "A5", "B0",
"B6", "A7", "A0", "B7", "A5", "B1", "B7", "A6", "B7", "A0", "A3", "B4", "B7", "A2", "A7", "A4", "B1", "B4", "A3", "B0", "A0", "A4",
"A6", "B3", "B3", "B2", "A1", "B1", "B3", "A1", "A7", "B7", "B7", "A1", "B4", "A4", "A4", "A1", "B4", "A6", "B2", "B5", "B7", "A5",
"B2", "B2", "B3", "B1", "B5", "B3", "B1", "B3", "B2", "B4" };
LocalTransferSettings testConnection = (LocalTransferSettings) TestConfigUtil.createTestLocalConnection();
TestClient clientA = new TestClient("A", testConnection);
TestClient clientB = new TestClient("B", testConnection);
for (String command : commands) {
int choice = Integer.parseInt(command.substring(1));
if (command.contains("A")) {
performAction(clientA, choice);
}
else {
performAction(clientB, choice);
}
}
clientA.deleteTestData();
clientB.deleteTestData();
}
@Ignore
public void testSameFileDifferentNameFuzzy() throws Exception {
for (int seed = 0; seed < 1000; seed++) {
LocalTransferSettings testConnection = (LocalTransferSettings) TestConfigUtil.createTestLocalConnection();
TestClient clientA = new TestClient("A", testConnection);
TestClient clientB = new TestClient("B", testConnection);
Random randomA = new Random(2 * seed);
Random randomB = new Random(2 * seed + 1);
Queue<String> queue = new ConcurrentLinkedQueue<>();
activeThread A = new activeThread(randomA, clientA, queue);
activeThread B = new activeThread(randomB, clientB, queue);
Thread AThread = new Thread(A, "A");
Thread BThread = new Thread(B, "B");
try {
AThread.start();
BThread.start();
// int actionsA = -1;
// int actionsB = -1;
for (int i = 0; i < 50; i++) {
TestClient clientC = new TestClient("C", testConnection);
clientC.down();
if (!AThread.isAlive() || !BThread.isAlive()) {
throw new RuntimeException("One of the threads died");
}
FileUtils.deleteDirectory(clientC.getLocalFile(""));
Thread.sleep(2000);
}
AThread.interrupt();
BThread.interrupt();
}
catch (Exception e) {
logger.log(Level.INFO, "Queue:" + queue.toString());
logger.log(Level.INFO, "Something went wrong at seed: " + seed);
throw e;
}
clientA.deleteTestData();
clientB.deleteTestData();
}
}
public static class activeThread implements Runnable {
private static final Logger logger = Logger.getLogger(activeThread.class.getSimpleName());
Random random;
TestClient client;
Queue<String> queue;
public activeThread(Random random, TestClient client, Queue<String> queue) {
this.random = random;
this.client = client;
this.queue = queue;
}
@Override
public void run() {
try {
while (true) {
int choice = random.nextInt(8);
queue.add(client.getConfig().getDisplayName() + choice);
performAction(client, choice);
int sleepTime = random.nextInt(500);
logger.log(Level.INFO, "Now sleeping for " + sleepTime + " ms.");
Thread.sleep(sleepTime);
}
}
catch (Exception e) {
logger.log(Level.INFO, "Error in thread", e.getMessage());
throw new RuntimeException("Something went wrong.", e);
}
}
}
public static void performAction(TestClient client, int choice) throws Exception {
switch (choice) {
case 0:
logger.log(Level.INFO, "0. Creating file with content");
if (!client.getLocalFile(client.getConfig().getDisplayName()).exists()) {
client.createFileWithContent(client.getConfig().getDisplayName(), "content");
}
break;
case 1:
logger.log(Level.INFO, "1. Deleting my file.");
client.deleteFile(client.getConfig().getDisplayName());
break;
case 2:
logger.log(Level.INFO, "2. Deleting all files");
for (String file : client.getLocalFiles().keySet()) {
client.deleteFile(file);
}
break;
case 3:
logger.log(Level.INFO, "3. Performing Up");
client.upWithForceChecksum();
break;
case 4:
logger.log(Level.INFO, "4. Performing Down");
client.down();
break;
case 5:
logger.log(Level.INFO, "5. Performing Cleanup");
CleanupOperationOptions options = new CleanupOperationOptions();
options.setForce(true);
client.cleanup(options);
break;
case 6:
logger.log(Level.INFO, "6. Syncing.");
client.sync();
break;
case 7:
logger.log(Level.INFO, "7. Creating file with content (2)");
if (!client.getLocalFile(client.getConfig().getDisplayName() + "2").exists()) {
client.createFileWithContent(client.getConfig().getDisplayName() + "2", "content");
}
break;
default:
break;
}
}
}