blob: 78615dd87c905bdfdffd947800618a274d8e31eb [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2018 SAP SE and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* SAP SE - initial version
*******************************************************************************/
package org.eclipse.urischeme.internal.registration;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.hamcrest.Matcher;
import org.hamcrest.core.AnyOf;
import org.hamcrest.core.IsEqual;
import org.hamcrest.core.IsNot;
import org.hamcrest.core.StringContains;
import org.hamcrest.core.StringEndsWith;
import org.junit.Test;
public class TestUnitDesktopFileWriter {
private static final String LINE_SEPARATOR = System.lineSeparator();
private static final String NO_MIME = "";
@Test
public void addsOneScheme() {
DesktopFileWriter writer = getWriterFor(fileContentWith("Exec=/usr/bin/eclipse %u", NO_MIME));
writer.addScheme("adt");
assertThat(new String(writer.getResult()), containsLine("MimeType=x-scheme-handler/adt;"));
}
@Test
public void addTwoSchemes() {
DesktopFileWriter writer = getWriterFor(fileContentWith("Exec=/usr/bin/eclipse %u", NO_MIME));
writer.addScheme("adt");
writer.addScheme("other");
assertThat(new String(writer.getResult()),
containsLine("MimeType=x-scheme-handler/adt;x-scheme-handler/other;"));
}
@Test
public void addsSecondToExistingScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.addScheme("other");
assertThat(new String(writer.getResult()),
containsLine("MimeType=x-scheme-handler/adt;x-scheme-handler/other;"));
}
@Test
public void doesntAddSchemeIfExisting() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.addScheme("adt");
assertThat(new String(writer.getResult()), containsLine("MimeType=x-scheme-handler/adt;"));
}
@Test(expected = IllegalArgumentException.class)
public void addFailsOnIllegalScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.addScheme("&/%");
}
@Test
public void removesScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.removeScheme("adt");
assertThat(new String(writer.getResult()), not(contains("MimeType")));
}
@Test
public void removesFirstOfTwoSchemes() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;x-scheme-handler/other;"));
writer.removeScheme("adt");
assertThat(new String(writer.getResult()), containsLine("MimeType=x-scheme-handler/other;"));
}
@Test
public void removesLastOfTwoSchemes() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;x-scheme-handler/other;"));
writer.removeScheme("other");
assertThat(new String(writer.getResult()), containsLine("MimeType=x-scheme-handler/adt;"));
}
@Test
public void removesSecondOfThreeSchemes() {
DesktopFileWriter writer = getWriterFor(fileContentWith("Exec=/usr/bin/eclipse %u",
"MimeType=x-scheme-handler/adt;x-scheme-handler/other;x-scheme-handler/yetAnother;"));
writer.removeScheme("other");
assertThat(new String(writer.getResult()),
containsLine("MimeType=x-scheme-handler/adt;x-scheme-handler/yetAnother;"));
}
@Test
public void removesNonExistingScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.removeScheme("other");
assertThat(new String(writer.getResult()), containsLine("MimeType=x-scheme-handler/adt;"));
}
@Test(expected = IllegalArgumentException.class)
public void removeFailsOnIllegalScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.removeScheme("&/%");
}
@Test
public void doesNothing() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
assertThat(new String(writer.getResult()), containsLine("MimeType=x-scheme-handler/adt;"));
}
@Test
public void removesEmptyMimeType() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.removeScheme("adt");
assertThat(new String(writer.getResult()), not(contains("MimeType")));
}
@Test(expected = IllegalStateException.class)
public void throwsExceptionOnEmptyDocument() {
getWriterFor(Collections.emptyList());
}
@Test
public void keepsComments() {
String comment = "# comment=test";
ArrayList<String> fileContent = new ArrayList<>(fileContentWith("Exec=/usr/bin/eclipse %u", NO_MIME));
fileContent.add(comment);
DesktopFileWriter writer = getWriterFor(fileContent);
assertThat(new String(writer.getResult()), new StringEndsWith(comment));
}
@Test(expected = IllegalStateException.class)
public void throwsExceptionOnNonPropertiesFile() {
getWriterFor(Arrays.asList("foo=bar"));
}
@Test
public void addsUriPlaceholderToExecLineWhenAddingScheme() {
DesktopFileWriter writer = getWriterFor(fileContentWith("Exec=/usr/bin/eclipse", NO_MIME));
writer.addScheme("adt");
assertThat(new String(writer.getResult()), containsLine("Exec=/usr/bin/eclipse %u"));
}
@Test
public void addsAddUriPlaceholderToExecLineWhenJustGettingResult() {
DesktopFileWriter writer = getWriterFor(fileContentWith("Exec=/usr/bin/eclipse", NO_MIME));
assertThat(new String(writer.getResult()), containsLine("Exec=/usr/bin/eclipse %u"));
}
@Test
public void addsAddUriPlaceholderToExecLineWhenRemovingScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse", "MimeType=x-scheme-handler/adt;"));
writer.removeScheme("adt");
assertThat(new String(writer.getResult()), containsLine("Exec=/usr/bin/eclipse %u"));
}
@Test
public void returnsTrueForRegisteredScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
assertTrue(writer.isRegistered("adt"));
assertFalse(writer.isRegistered("other"));
}
@Test
public void returnsFalseWhenNoSchemeIsRegistered() {
DesktopFileWriter writer = getWriterFor(fileContentWith("Exec=/usr/bin/eclipse %u", ""));
assertFalse(writer.isRegistered("adt"));
assertFalse(writer.isRegistered("other"));
}
@Test(expected = IllegalArgumentException.class)
public void isRegisteredFailsOnIllegalScheme() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
writer.isRegistered("&/%");
}
@Test
public void keepsPropertiesOrder() {
// in the other we just check that lines are contained, not the order
List<String> fileContent = fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;");
DesktopFileWriter writer = getWriterFor(fileContent);
String expected = String.join(LINE_SEPARATOR, fileContent);
assertThat(new String(writer.getResult()), new IsEqual<>(expected));
}
@Test
public void returnsMinimalDesktopFile() {
List<String> actual = DesktopFileWriter.getMinimalDesktopFileContent("/home/myuser/Eclipse/eclipse/eclipse",
"MyProduct");
List<String> expected = Arrays.asList(//
"[Desktop Entry]", //
"Name=MyProduct", //
"Exec=/home/myuser/Eclipse/eclipse/eclipse", //
"NoDisplay=true", //
"Type=Application");
assertEquals(expected, actual);
}
@Test
public void returnsMinimalDesktopFileWithSpaceEscapedInLocation() {
List<String> actual = DesktopFileWriter
.getMinimalDesktopFileContent("/home/myuser/Eclipse/eclipse (copy)/eclipse", "MyProduct");
List<String> expected = Arrays.asList(//
"[Desktop Entry]", //
"Name=MyProduct", //
"Exec=/home/myuser/Eclipse/eclipse\\ (copy)/eclipse", //
"NoDisplay=true", //
"Type=Application");
assertEquals(expected, actual);
}
@Test
public void returnsMinimalDesktopFileWithMultipleSpacesEscapedInLocation() {
List<String> actual = DesktopFileWriter
.getMinimalDesktopFileContent("/home/myuser/Eclipse/eclipse (copy)/eclipse", "MyProduct");
List<String> expected = Arrays.asList(//
"[Desktop Entry]", //
"Name=MyProduct", //
"Exec=/home/myuser/Eclipse/eclipse\\ \\ \\ (copy)/eclipse", //
"NoDisplay=true", //
"Type=Application");
assertEquals(expected, actual);
}
@Test
public void returnsExecutablePathWithoutParameter() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse %u", "MimeType=x-scheme-handler/adt;"));
assertEquals("/usr/bin/eclipse", writer.getExecutableLocation());
}
@Test
public void returnsUnescapedSpaceExecutablePathWithoutParameter() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse\\ (copy) %u", "MimeType=x-scheme-handler/adt;"));
assertEquals("/usr/bin/eclipse (copy)", writer.getExecutableLocation());
}
@Test
public void returnsUnescapedMultipleSpacesExecutablePathWithoutParameter() {
DesktopFileWriter writer = getWriterFor(
fileContentWith("Exec=/usr/bin/eclipse\\ \\ (copy) %u", "MimeType=x-scheme-handler/adt;"));
assertEquals("/usr/bin/eclipse (copy)", writer.getExecutableLocation());
}
private Matcher<String> containsLine(String line) {
return AnyOf.anyOf( //
new StringContains(LINE_SEPARATOR + line + LINE_SEPARATOR), //
new StringContains(LINE_SEPARATOR + line) //
);
}
private Matcher<String> contains(String line) {
return new StringContains(line);
}
private Matcher<String> not(Matcher<String> not) {
return new IsNot<>(not);
}
private DesktopFileWriter getWriterFor(List<String> fileContent) {
return new DesktopFileWriter(fileContent);
}
private List<String> fileContentWith(String execLine, String mimeTypeLine) {
return Arrays.asList("[Desktop Entry]", //
"Encoding=UTF-8", //
"Name=Eclipse 4.4.1", //
"Comment=Eclipse Luna", //
execLine + "", //
"Icon=/opt/eclipse/icon.xpm", //
"Categories=Application;Development;Java;IDE", //
"Version=1.0", //
"Type=Application", //
"Terminal=0", //
mimeTypeLine);
}
}