diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 6b8a85edf8fa1019076d32099b55888cac46bd0d..5ea9bcbc44dc39d9d257f6fae7122d36fa36c29c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -84,6 +84,20 @@ client_build:
- minarca-client/minarca-installation-package/target/*.exe
- minarca-client/minarca-installation-package-deb/target/*.deb
+client_windows:
+ stage: build
+ image: ikus060/docker-wine-maven:3-jdk-8
+ script:
+ - cd minarca-client
+ - export REVISION="$(curl http://git.patrikdufresne.com/pdsl/maven-scm-version/raw/master/version.sh | bash -)"
+ - echo "REVISION=$REVISION"
+ # Start a virtual frame buffer
+ - (Xvfb :99 &)
+ - export DISPLAY=:99
+ # Run unit test only, since the build is not working on windows
+ - mvn -B -Drevision=${REVISION} clean verify
+
+
server_package_deb:
stage: build
script:
diff --git a/minarca-client/minarca-core/pom.xml b/minarca-client/minarca-core/pom.xml
index 14e24c244c6304e10445200d6c6684e6dc8064b9..62f1c7126d4ef33a8ae7a0c1f77a8a10c9a32133 100644
--- a/minarca-client/minarca-core/pom.xml
+++ b/minarca-client/minarca-core/pom.xml
@@ -1,5 +1,4 @@
-
4.0.0
@@ -61,72 +60,83 @@
gettext-commons
0.9.8
-
- org.mockito
- mockito-all
- 1.9.5
- test
-
-
- commons-configuration
- commons-configuration
- 1.10
-
-
- com.google.code.gson
- gson
- 2.8.5
-
-
- net.jadler
- jadler-all
- 1.3.0
- test
-
-
- javax.xml.bind
- jaxb-api
- 2.3.0
-
-
-
-
-
-
- org.apache.maven.plugins
- maven-jar-plugin
- 2.5
-
-
-
- true
-
-
-
-
-
-
-
-
- com.googlecode.gettext-commons
- gettext-maven-plugin
- 1.2.4
-
-
-
- dist
-
-
-
-
- ${basedir}/src/main/po
-
- -k_
-
- com.patrikdufresne.minarca.core.messages
- properties
-
-
-
-
+
+ org.mockito
+ mockito-all
+ 1.9.5
+ test
+
+
+ commons-configuration
+ commons-configuration
+ 1.10
+
+
+ com.google.code.gson
+ gson
+ 2.8.5
+
+
+ net.jadler
+ jadler-all
+ 1.3.0
+ test
+
+
+ javax.xml.bind
+ jaxb-api
+ 2.3.0
+
+
+ net.java.dev.jna
+ jna-platform
+ 5.5.0
+
+
+
+ com.github.hypfvieh
+ dbus-java
+ 3.2.0
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-jar-plugin
+ 2.5
+
+
+
+ true
+
+
+
+
+
+
+
+
+ com.googlecode.gettext-commons
+ gettext-maven-plugin
+ 1.2.4
+
+
+
+ dist
+
+
+
+
+ ${basedir}/src/main/po
+
+ -k_
+
+ com.patrikdufresne.minarca.core.messages
+ properties
+
+
+
+
diff --git a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/API.java b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/API.java
index 1c7286152942d681b3c6f1caec85b9f2aaf69b72..f14b51128d1e5e5de3d8e9cdbafa2a29e13b5a12 100644
--- a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/API.java
+++ b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/API.java
@@ -47,6 +47,7 @@ import com.patrikdufresne.minarca.core.APIException.UnsupportedOS;
import com.patrikdufresne.minarca.core.internal.Compat;
import com.patrikdufresne.minarca.core.internal.Keygen;
import com.patrikdufresne.minarca.core.internal.MinarcaExecutable;
+import com.patrikdufresne.minarca.core.internal.PowerManagement;
import com.patrikdufresne.minarca.core.internal.RdiffBackup;
import com.patrikdufresne.minarca.core.internal.Scheduler;
import com.patrikdufresne.minarca.core.internal.SchedulerLinux;
@@ -195,6 +196,8 @@ public class API {
} catch (InterruptedException e) {
// Nothing to do.
}
+ // Restore sleep mode.
+ PowerManagement.uninhibit();
}
};
t.setDaemon(true);
@@ -222,6 +225,13 @@ public class API {
// Add sets of patterns
patterns.addAll(GlobPattern.ADVANCE_AFTER);
+ // Prevent Computer from sleeping. during backup.
+ try {
+ PowerManagement.inhibit();
+ } catch (Exception e) {
+ LOGGER.warn("error to inhibit computer");
+ }
+
// Create a new instance of rdiff backup to test and run the backup.
RdiffBackup rdiffbackup = new RdiffBackup(remotehost, knownHosts, identityFile);
// Check the remote server.
@@ -240,7 +250,14 @@ public class API {
t.interrupt();
Status.setLastStatus(LastResult.FAILURE);
LOGGER.info("backup FAILED", e);
- throw new APIException(_("Backup failed"), e);
+ throw (e instanceof APIException ? (APIException) e : new APIException(e));
+ } finally {
+ // Prevent Computer from sleeping.
+ try {
+ PowerManagement.uninhibit();
+ } catch (Exception e) {
+ LOGGER.warn("error to uninhibit computer");
+ }
}
}
@@ -310,9 +327,9 @@ public class API {
case 302:
// Try to provide usefule guidance for http vs https URL
if (e.getMessage().contains("Location: https://") && baseurl.startsWith("http://")) {
- throw new APIException(
- _("{0} is redirected to another location. Double check if the URL should start with https:// instead of http://", baseurl),
- e);
+ throw new APIException(_(
+ "{0} is redirected to another location. Double check if the URL should start with https:// instead of http://",
+ baseurl), e);
}
throw new APIException(_("{0} is redirected to another location. Please provide the canonical URL.", baseurl), e);
case 401:
diff --git a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/Main.java b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/Main.java
index 451c0b336d02218bf3038612eaba5faa61fef667..39cb7007c6439b86da42bb4bddaa0c65b6efac52 100644
--- a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/Main.java
+++ b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/Main.java
@@ -66,20 +66,13 @@ public class Main {
try {
API.instance().backup(false, force);
} catch (Exception e) {
+ System.err.println("error during backup: " + e.getMessage());
System.exit(2);
+ return;
}
}
- /**
- * Include a new patterns
- *
- * @param string
- */
- private static void include(String string) {
-
- }
-
/**
* Called for action "link".
*
@@ -113,9 +106,7 @@ public class Main {
return;
} catch (Exception e) {
System.err
- .println(
- _(
- "Unexpected error happened during the linking process with the server. Verify connectivity with the server and try again later."));
+ .println(_("Unexpected error happened during the linking process with the server. Verify connectivity with the server and try again later."));
System.exit(1);
return;
}
diff --git a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/Compat.java b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/Compat.java
index fb6d59a1a4478585dd5e075c8bd5342b0f59c830..133142ee406a949e07d307b87e6bf41428adec24 100644
--- a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/Compat.java
+++ b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/Compat.java
@@ -119,6 +119,11 @@ public class Compat {
*/
public static final File PID_FILE_GUI;
+ /**
+ * Either \n or \r\n
+ */
+ public static final String LINEENDING;
+
/**
* Location of the status.properties file.
*/
@@ -147,9 +152,11 @@ public class Compat {
MINARCA_EXE = "minarca.exe";
MINARCAUI_EXE = "minarcaui.exe";
}
+ LINEENDING = "\r\n";
} else {
MINARCA_EXE = "minarca";
MINARCAUI_EXE = "minarcaui";
+ LINEENDING = "\n";
}
}
diff --git a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/PowerManagement.java b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/PowerManagement.java
new file mode 100644
index 0000000000000000000000000000000000000000..412e51d9b6e98750187e265e45dfb14e0bce6400
--- /dev/null
+++ b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/PowerManagement.java
@@ -0,0 +1,170 @@
+package com.patrikdufresne.minarca.core.internal;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.freedesktop.dbus.DBusAsyncReply;
+import org.freedesktop.dbus.annotations.DBusInterfaceName;
+import org.freedesktop.dbus.connections.impl.DBusConnection;
+import org.freedesktop.dbus.connections.impl.DBusConnection.DBusBusType;
+import org.freedesktop.dbus.exceptions.DBusException;
+import org.freedesktop.dbus.interfaces.DBusInterface;
+import org.freedesktop.dbus.types.UInt32;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.sun.jna.platform.win32.Kernel32;
+import com.sun.jna.platform.win32.WinBase;
+
+/**
+ * Power management class to abstract the OS details.
+ *
+ * For Windows we are using SetThreadExecutionState native API.
+ *
+ * For Linux we are using dbus gnome session API.
+ *
+ * @see http://www.lucidelectricdreams.com/2011/06/disabling-screensaverlock-screen-on.html
+ * @see https://people.gnome.org/~mccann/gnome-session/docs/gnome-session.html#org.gnome.SessionManager.Uninhibit
+ * @see https://www.freedesktop.org/wiki/Software/systemd/inhibit/
+ *
+ * @author Patrik Dufresne
+ *
+ */
+public class PowerManagement {
+
+ @DBusInterfaceName("org.gnome.SessionManager")
+ private interface SessionManager extends DBusInterface {
+
+ UInt32 Inhibit(String app_id, UInt32 toplevel_xid, String reason, UInt32 flags);
+
+ UInt32 Uninhibit(UInt32 inhibit_cookie);
+
+ boolean IsInhibited(UInt32 flags);
+
+ }
+
+ private static final transient Logger LOGGER = LoggerFactory.getLogger(PowerManagement.class);
+
+ /**
+ * Cookie return by Linux Gnome session inhibit.
+ */
+ private static UInt32 inhibitCookie;
+
+ /**
+ * Used to inhibit the the computer from sleeping
+ */
+ public static void inhibit() {
+ if (SystemUtils.IS_OS_WINDOWS) {
+ inhibitWin32();
+ } else {
+ inhibitLinux();
+ }
+ }
+
+ private static void inhibitLinux() {
+ try {
+ DBusConnection session = DBusConnection.getConnection(DBusBusType.SESSION);
+ DBusInterface proxy = session.getRemoteObject("org.gnome.SessionManager", "/org/gnome/SessionManager", SessionManager.class);
+ DBusAsyncReply> reply = session.callMethodAsync(proxy, "Inhibit", "minarca", new UInt32(0), "Inhibiting", INHIBIT_FLAG_4);
+ int timeout = 1000;
+ while (!reply.hasReply() && timeout > 0) {
+ try {
+ Thread.sleep(10);
+ timeout -= 10;
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ inhibitCookie = (UInt32) reply.getReply();
+ } catch (DBusException e) {
+ LOGGER.warn("inhibit gnome session manager failed", e);
+ }
+ }
+
+ private static void inhibitWin32() {
+ // Prevent Windows from going to sleep.
+ int r = Kernel32.INSTANCE.SetThreadExecutionState(WinBase.ES_CONTINUOUS | WinBase.ES_SYSTEM_REQUIRED | WinBase.ES_AWAYMODE_REQUIRED);
+ if (r == 0) {
+ LOGGER.warn("call to SetThreadExecutionState(ES_CONTINUOUS|ES_SYSTEM_REQUIRED|ES_AWAYMODE_REQUIRED) return 0");
+ }
+ }
+
+ public static boolean isInhibited() {
+ if (SystemUtils.IS_OS_WINDOWS) {
+ return isInhibitedWin32();
+ }
+ return isInhibitedLinux();
+
+ }
+
+ /**
+ * 4: Inhibit suspending the session or computer
+ */
+ private static final UInt32 INHIBIT_FLAG_4 = new UInt32(4);
+
+ private static boolean isInhibitedLinux() {
+ try {
+ DBusConnection session = DBusConnection.getConnection(DBusBusType.SESSION);
+ DBusInterface proxy = session.getRemoteObject("org.gnome.SessionManager", "/org/gnome/SessionManager", SessionManager.class);
+ DBusAsyncReply> isInhibited = session.callMethodAsync(proxy, "IsInhibited", INHIBIT_FLAG_4);
+ int timeout = 1000;
+ while (!isInhibited.hasReply() && timeout > 0) {
+ try {
+ Thread.sleep(10);
+ timeout -= 10;
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ return (Boolean) isInhibited.getReply();
+ } catch (DBusException e) {
+ LOGGER.warn("inhibit gnome session manager failed", e);
+ }
+ return false;
+ }
+
+ private static boolean isInhibitedWin32() {
+ int r = Kernel32.INSTANCE.SetThreadExecutionState(WinBase.ES_CONTINUOUS);
+ if (r != 0) {
+ Kernel32.INSTANCE.SetThreadExecutionState(r);
+ }
+ return r == (WinBase.ES_CONTINUOUS | WinBase.ES_SYSTEM_REQUIRED | WinBase.ES_AWAYMODE_REQUIRED);
+ }
+
+ /**
+ * Revert back the sleep mode.
+ */
+ public static void uninhibit() {
+ if (SystemUtils.IS_OS_WINDOWS) {
+ uninhibitWin32();
+ } else {
+ uninhibitLinux();
+ }
+ }
+
+ private static void uninhibitLinux() {
+ try {
+ DBusConnection session = DBusConnection.getConnection(DBusBusType.SESSION);
+ DBusInterface proxy = session.getRemoteObject("org.gnome.SessionManager", "/org/gnome/SessionManager", SessionManager.class);
+ DBusAsyncReply> reply = session.callMethodAsync(proxy, "Uninhibit", inhibitCookie);
+ int timeout = 1000;
+ while (!reply.getCall().hasReply() && timeout > 0) {
+ try {
+ Thread.sleep(10);
+ timeout -= 10;
+ } catch (InterruptedException e) {
+ Thread.currentThread().interrupt();
+ }
+ }
+ } catch (DBusException e) {
+ LOGGER.warn("inhibit gnome session return an error", e);
+ }
+ }
+
+ private static void uninhibitWin32() {
+ // Allow Windows to go to sleep.
+ int r = Kernel32.INSTANCE.SetThreadExecutionState(WinBase.ES_CONTINUOUS);
+ if (r == 0) {
+ LOGGER.warn("call to SetThreadExecutionState(ES_CONTINUOUS) return 0");
+ }
+ }
+
+}
diff --git a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/ProcessUtils.java b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/ProcessUtils.java
index 6cc47d2defaa222585a46bc1cf4cbbbfcd07c5c3..ca3fbd82533ab4d98cabcd971a78c6408a317895 100644
--- a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/ProcessUtils.java
+++ b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/ProcessUtils.java
@@ -12,6 +12,13 @@ import java.lang.management.ManagementFactory;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.SystemUtils;
+import com.sun.jna.platform.win32.Kernel32;
+import com.sun.jna.platform.win32.Kernel32Util;
+import com.sun.jna.platform.win32.Psapi;
+import com.sun.jna.platform.win32.Win32Exception;
+import com.sun.jna.platform.win32.WinNT;
+import com.sun.jna.platform.win32.WinNT.HANDLE;
+
/**
* Utility class to manage processes.
*
@@ -27,7 +34,13 @@ public class ProcessUtils {
*
*/
public static class ProcessInfo {
+ /**
+ * The pid.
+ */
public int pid;
+ /**
+ * The file name. e.g.: minarca.exe
+ */
public String name;
}
@@ -42,11 +55,12 @@ public class ProcessUtils {
}
}
- /**
- * TODO Let implementat a fast process open.
- */
- public void popen() {
+ public static class CalledProcessError extends Exception {
+ int exitCode;
+ public CalledProcessError(int exitCode) {
+ this.exitCode = exitCode;
+ }
}
/**
@@ -89,26 +103,28 @@ public class ProcessUtils {
*/
public static ProcessInfo getPid(int pid) throws NoSuchProcess {
if (SystemUtils.IS_OS_WINDOWS) {
- String output;
- try {
- // tasklist.exe /FI "PID eq 1500" /FO CSV /NH
- // "dwm.exe","1500","RDP-Tcp#0","2","2Â 748 Ko"
- java.lang.Process p = new ProcessBuilder("tasklist.exe", "/FO", "CSV", "/NH", "/FI", "PID eq " + pid).redirectErrorStream(true).start();
- StreamHandler sh = new StreamHandler(p);
- int returnCode = p.waitFor();
- output = sh.getOutput();
- } catch (IOException | InterruptedException e) {
- throw new IllegalStateException(e);
- }
- String[] fields = output.replaceFirst("^\"", "").replaceFirst("\"$", "").split("\",\"");
- if (fields.length >= 5) {
- ProcessInfo data = new ProcessInfo();
- data.pid = pid;
- data.name = fields[0];
- return data;
+
+ HANDLE p = Kernel32.INSTANCE.OpenProcess(WinNT.PROCESS_ALL_ACCESS, false, pid);
+ if (p != null) {
+ try {
+
+ final char[] filePathUnicode = new char[1025];
+ int length = Psapi.INSTANCE.GetModuleFileNameExW(p, null, filePathUnicode, filePathUnicode.length - 1);
+ if (length == 0) {
+ throw new Win32Exception(Kernel32.INSTANCE.GetLastError());
+ }
+
+ ProcessInfo data = new ProcessInfo();
+ data.pid = pid;
+ data.name = new File(new String(filePathUnicode)).getName();
+ return data;
+
+ } finally {
+ Kernel32Util.closeHandle(p);
+ }
}
- throw new NoSuchProcess();
}
+
/* Linux */
File cmdline = new File("/proc/" + pid + "/exe");
if (cmdline.exists()) {
diff --git a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/RdiffBackup.java b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/RdiffBackup.java
index 9ed4f038aa20c87fd7ec037acb49b2c88f8ff350..0b1119b9607d47caa00d0b5193035772ddaaf06c 100644
--- a/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/RdiffBackup.java
+++ b/minarca-client/minarca-core/src/main/java/com/patrikdufresne/minarca/core/internal/RdiffBackup.java
@@ -309,16 +309,13 @@ public class RdiffBackup {
// Otherwise if way use keychain or keberos authentication and prompt user for password.
// Last argument is the command line to be executed. This should be the repository name.
// minarca-shell will make use if it.
- args
- .add(
- String
- .format(
- "%s %s-oBatchMode=yes -oUserKnownHostsFile='%s' -oIdentitiesOnly=yes -i '%s' %%s %s",
- ssh,
- extraOptions,
- knownHostsFile,
- identityFile,
- path));
+ args.add(String.format(
+ "%s %s-oBatchMode=yes -oUserKnownHostsFile='%s' -oIdentitiesOnly=yes -i '%s' %%s %s",
+ ssh,
+ extraOptions,
+ knownHostsFile,
+ identityFile,
+ path));
// Add extra args.
args.addAll(extraArgs);
// Add remote host.
diff --git a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/MainTest.java b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/MainTest.java
index eef68da0fb4123a888ca53c70722553f69bbcb83..e90e76e1ce912cb0e62eef260a0c3a168353a143 100644
--- a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/MainTest.java
+++ b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/MainTest.java
@@ -8,10 +8,12 @@ package com.patrikdufresne.minarca.core;
import static org.junit.Assert.*;
import java.io.ByteArrayOutputStream;
+import java.io.File;
import java.io.PrintStream;
import java.security.Permission;
import java.util.Locale;
+import org.apache.commons.lang3.SystemUtils;
import org.junit.After;
import org.junit.Before;
import org.junit.Ignore;
@@ -121,10 +123,18 @@ public class MainTest {
Main.main(new String[] { "exclude", "**/toberemove" });
Main.main(new String[] { "patterns" });
- assertTrue(outContent.toString().contains("include **/test"));
- assertTrue(outContent.toString().contains("exclude **/me"));
- assertTrue(!outContent.toString().contains("include **/toberemove"));
- assertTrue(outContent.toString().contains("exclude **/toberemove"));
+ if (SystemUtils.IS_OS_WINDOWS) {
+ assertTrue(outContent.toString().contains("include **\\test"));
+ assertTrue(outContent.toString().contains("exclude **\\me"));
+ assertTrue(!outContent.toString().contains("include **\\toberemove"));
+ assertTrue(outContent.toString().contains("exclude **\\toberemove"));
+ } else {
+ assertTrue(outContent.toString().contains("include **/test"));
+ assertTrue(outContent.toString().contains("exclude **/me"));
+ assertTrue(!outContent.toString().contains("include **/toberemove"));
+ assertTrue(outContent.toString().contains("exclude **/toberemove"));
+ }
+
}
}
diff --git a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/PowerManagementTest.java b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/PowerManagementTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9f4d39bbd8f2268ff9d928f4483d3f705df2f13
--- /dev/null
+++ b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/PowerManagementTest.java
@@ -0,0 +1,38 @@
+/**
+ * Copyright(C) 2013 Patrik Dufresne Service Logiciel
+ *
+ * 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 com.patrikdufresne.minarca.core.internal;
+
+import static org.junit.Assert.*;
+
+import org.apache.commons.lang3.SystemUtils;
+import org.junit.Test;
+
+public class PowerManagementTest {
+
+ @Test
+ public void testInhibit() {
+ if (SystemUtils.IS_OS_LINUX && !"gnome-xorg".equals(System.getenv("DESKTOP_SESSION"))) {
+ // Skip the test. Nothing to inhibit if gnome session is not used.
+ return;
+ }
+ assertFalse("Should not be inhibited when starting test", PowerManagement.isInhibited());
+ PowerManagement.inhibit();
+ assertTrue("expect system to be inhibit", PowerManagement.isInhibited());
+ PowerManagement.uninhibit();
+ assertFalse("expect system to be uninhibit", PowerManagement.isInhibited());
+ }
+
+}
diff --git a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/ProcessUtilsTest.java b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/ProcessUtilsTest.java
index 5f67bfb5e48b87d16027d68b97144621fa36729e..033ff64c47fce0707bc574379b93a9d588ffe033 100644
--- a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/ProcessUtilsTest.java
+++ b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/ProcessUtilsTest.java
@@ -5,7 +5,9 @@
*/
package com.patrikdufresne.minarca.core.internal;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.File;
@@ -29,14 +31,19 @@ public class ProcessUtilsTest {
int pid = ProcessUtils.pid();
ProcessInfo p = ProcessUtils.getPid(pid);
assertNotNull(p);
+ assertTrue("process name should be java:" + p.name, p.name.startsWith("java"));
}
@Test
public void testGetPidWithFile() throws IOException, NoSuchProcess {
+ // Get current pid
+ ProcessInfo p = ProcessUtils.getPid(ProcessUtils.pid());
+
File f = File.createTempFile("minarca-process-utils", ".pid");
ProcessUtils.writePidFile(f);
- ProcessInfo p = ProcessUtils.getPid(f, "java");
- assertNotNull(p);
+ ProcessInfo p2 = ProcessUtils.getPid(f, p.name);
+ assertNotNull(p2);
+ assertEquals(p.name, p2.name);
}
@Test
diff --git a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/RdiffBackupTest.java b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/RdiffBackupTest.java
index d64d819202dc47135edb55a486ae0da2e2148370..8b645a828f4c13a3e29694e7550cf700ee488d87 100644
--- a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/RdiffBackupTest.java
+++ b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/RdiffBackupTest.java
@@ -21,6 +21,7 @@ import java.util.Arrays;
import java.util.List;
import org.apache.commons.io.FileUtils;
+import org.apache.commons.lang3.SystemUtils;
import org.junit.Test;
import org.mockito.Mockito;
@@ -39,26 +40,41 @@ public class RdiffBackupTest {
// Mock some part of rdiff backup
RdiffBackup rdiffbackup = Mockito.spy(new RdiffBackup("example.com:2222", hostFile, identity));
Mockito.doNothing().when(rdiffbackup).execute(Mockito.anyList(), Mockito.any(File.class));
- Mockito.doReturn(new File("/usr/bin/rdiff-backup")).when(rdiffbackup).getRdiffbackupLocation();
- Mockito.doReturn(new File("/usr/bin/ssh")).when(rdiffbackup).getSshLocation();
+ Mockito.doReturn(new File("./rdiff-backup")).when(rdiffbackup).getRdiffbackupLocation();
+ Mockito.doReturn(new File("./ssh")).when(rdiffbackup).getSshLocation();
// Make a call
rdiffbackup.testServer("reponame");
// Check results
- List expectedArgs = Arrays
- .asList(
- "/usr/bin/rdiff-backup",
- "-v",
- "5",
- "--remote-schema",
- "/usr/bin/ssh -p 2222 -oBatchMode=yes -oUserKnownHostsFile='"
- + hostFile.toString()
- + "' -oIdentitiesOnly=yes -i '"
- + identity.toString()
- + "' %s reponame",
- "--test-server",
- "minarca@example.com::reponame");
+ List expectedArgs;
+ if (SystemUtils.IS_OS_WINDOWS) {
+ expectedArgs = Arrays.asList(
+ ".\\rdiff-backup",
+ "-v",
+ "5",
+ "--remote-schema",
+ ".\\ssh -p 2222 -oBatchMode=yes -oUserKnownHostsFile='"
+ + hostFile.toString()
+ + "' -oIdentitiesOnly=yes -i '"
+ + identity.toString()
+ + "' %s reponame",
+ "--test-server",
+ "minarca@example.com::reponame");
+ } else {
+ expectedArgs = Arrays.asList(
+ "./rdiff-backup",
+ "-v",
+ "5",
+ "--remote-schema",
+ "./ssh -p 2222 -oBatchMode=yes -oUserKnownHostsFile='"
+ + hostFile.toString()
+ + "' -oIdentitiesOnly=yes -i '"
+ + identity.toString()
+ + "' %s reponame",
+ "--test-server",
+ "minarca@example.com::reponame");
+ }
Mockito.verify(rdiffbackup).execute(Mockito.eq(expectedArgs), Mockito.any(File.class));
}
diff --git a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/SchedulerLinuxTest.java b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/SchedulerLinuxTest.java
index 6edf92adfa19904528ed49f7d517651035cadd4c..c3b1cbf8ff3377cf68a2f7ff35bb8d7cc52ece76 100644
--- a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/SchedulerLinuxTest.java
+++ b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/SchedulerLinuxTest.java
@@ -11,6 +11,7 @@ import java.io.File;
import java.io.IOException;
import java.util.Arrays;
+import org.apache.commons.lang3.SystemUtils;
import org.junit.Test;
import org.mockito.Mockito;
@@ -23,21 +24,25 @@ public class SchedulerLinuxTest {
@Test
public void testExists() throws ScheduleNotFoundException, APIException, IOException {
// Mock crontab
- SchedulerLinux sh = Mockito.spy(new SchedulerLinux());
- Mockito.doReturn(new CrontabEntry("@daily minarca --backup")).when(sh).find();
- // Get value
- assertTrue(sh.exists());
+ if (SystemUtils.IS_OS_LINUX) {
+ SchedulerLinux sh = Mockito.spy(new SchedulerLinux());
+ Mockito.doReturn(new CrontabEntry("@daily minarca --backup")).when(sh).find();
+ // Get value
+ assertTrue(sh.exists());
+ }
}
@Test
public void testFind() throws ScheduleNotFoundException, APIException, IOException {
- SchedulerLinux sh = Mockito.spy(new SchedulerLinux());
- Mockito.when(sh.getExeLocation()).thenReturn(new File("minarca"));
- Crontab crontab = new Crontab(Arrays.asList(new CrontabEntry("@daily minarca --backup")));
- Mockito.when(sh.getCrontab()).thenReturn(crontab);
-
- // Get value
- assertTrue(sh.exists());
+ if (SystemUtils.IS_OS_LINUX) {
+ SchedulerLinux sh = Mockito.spy(new SchedulerLinux());
+ Mockito.when(sh.getExeLocation()).thenReturn(new File("minarca"));
+ Crontab crontab = new Crontab(Arrays.asList(new CrontabEntry("@daily minarca --backup")));
+ Mockito.when(sh.getCrontab()).thenReturn(crontab);
+
+ // Get value
+ assertTrue(sh.exists());
+ }
}
}
diff --git a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/StreamHandlerTest.java b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/StreamHandlerTest.java
index e227c86e55c30a015ac37f702c1e0134933fe0a7..23f4725144f8c3a72522330b2fc38a863959ca0f 100644
--- a/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/StreamHandlerTest.java
+++ b/minarca-client/minarca-core/src/test/java/com/patrikdufresne/minarca/core/internal/StreamHandlerTest.java
@@ -9,15 +9,21 @@ import static org.junit.Assert.assertEquals;
import java.io.IOException;
+import org.apache.commons.lang3.SystemUtils;
import org.junit.Test;
public class StreamHandlerTest {
@Test
public void test() throws IOException {
- Process p = new ProcessBuilder().command("echo", "coucou").redirectErrorStream(true).start();
+ Process p;
+ if (SystemUtils.IS_OS_LINUX) {
+ p = new ProcessBuilder().command("echo", "coucou").redirectErrorStream(true).start();
+ } else {
+ p = new ProcessBuilder().command("cmd", "/c", "echo", "coucou").redirectErrorStream(true).start();
+ }
StreamHandler sh = new StreamHandler(p);
- assertEquals("coucou\n", sh.getOutput());
+ assertEquals("coucou" + Compat.LINEENDING, sh.getOutput());
}
}
diff --git a/minarca-client/minarca-icons/pom.xml b/minarca-client/minarca-icons/pom.xml
index 7cac567b6ddc5ef1dcfd470abbed510c37b5c079..7fee391c9f71faeadec1ef7431f5409fba6fbce9 100644
--- a/minarca-client/minarca-icons/pom.xml
+++ b/minarca-client/minarca-icons/pom.xml
@@ -51,7 +51,7 @@
-
+
diff --git a/minarca-client/minarca-installation-package/pom.xml b/minarca-client/minarca-installation-package/pom.xml
index 401bd88291e4736053189669bb5ce928ec4e2c64..c1cc51e597b6bde4ae5b37ada5cd33bc521f8491 100644
--- a/minarca-client/minarca-installation-package/pom.xml
+++ b/minarca-client/minarca-installation-package/pom.xml
@@ -217,9 +217,9 @@
+
-
diff --git a/minarca-client/minarca-installation-package/src/main/nsis/setup.nsi b/minarca-client/minarca-installation-package/src/main/nsis/setup.nsi
index 313de10706e3a98e3a82651b6993c379e27c143e..044f8cca48e7177162e4898950761837bd78f48e 100644
--- a/minarca-client/minarca-installation-package/src/main/nsis/setup.nsi
+++ b/minarca-client/minarca-installation-package/src/main/nsis/setup.nsi
@@ -32,10 +32,10 @@ SetCompressor bzip2
VIAddVersionKey "ProductName" "${AppName}"
VIAddVersionKey "Comments" "Automatically saves your data online for easy access at any time while travelling or in case of equipment loss or breakage."
VIAddVersionKey "CompanyName" "${Vendor}"
- VIAddVersionKey "LegalCopyright" "© ${Vendor}"
+ VIAddVersionKey "LegalCopyright" "� ${Vendor}"
VIAddVersionKey "FileDescription" "${AppName} ${AppVersion} Installer"
VIAddVersionKey "FileVersion" "${AppVersion}"
- OutFile "setup.exe"
+ OutFile "${OutFile}"
; Define icon
!define MUI_ICON "minarca.ico"
@@ -108,7 +108,7 @@ SetCompressor bzip2
;Language Strings
LangString APP_IS_RUNNING ${LANG_ENGLISH} "The installation process detected ${AppName} is running. Please close it and try again."
-LangString APP_IS_RUNNING ${LANG_FRENCH} "Le processus d'installation a détecté que ${AppName} est en cours d'exécution. S'il vous plaît, fermez l'application et essayez à nouveau."
+LangString APP_IS_RUNNING ${LANG_FRENCH} "Le processus d'installation a d�tect� que ${AppName} est en cours d'ex�cution. S'il vous pla�t, fermez l'application et essayez � nouveau."
;--------------------------------
;Reserve Files
@@ -127,7 +127,7 @@ LangString APP_IS_RUNNING ${LANG_FRENCH} "Le processus d'installation a d
LangString DESC_SecAppFiles ${LANG_FRENCH} "Copie des fichiers"
LangString RunMinarca ${LANG_ENGLISH} "Start ${AppName}"
- LangString RunMinarca ${LANG_FRENCH} "Démarrer ${AppName}"
+ LangString RunMinarca ${LANG_FRENCH} "D�marrer ${AppName}"
;--------------------------------
;Installer Sections