From ec8a35024de02cf6c47269e14a762a2fe7cc659e Mon Sep 17 00:00:00 2001 From: sarps Date: Tue, 15 Oct 2024 22:31:04 +0200 Subject: [PATCH] Added test to check whether the translation keys are complete --- .../api/aop/java/JavaSecurityTestCase.java | 90 ++++--------------- .../JavaInstrumentationAdviceToolbox.java | 4 +- .../ares/api/localization/messages.properties | 9 ++ .../api/localization/messages_de.properties | 41 +++++++++ .../integration/FileSystemAccessTest.java | 16 +--- .../cit/ase/ares/integration/LocaleTest.java | 27 ++++++ .../testuser/FileSystemAccessUser.java | 1 - 7 files changed, 101 insertions(+), 87 deletions(-) diff --git a/src/main/java/de/tum/cit/ase/ares/api/aop/java/JavaSecurityTestCase.java b/src/main/java/de/tum/cit/ase/ares/api/aop/java/JavaSecurityTestCase.java index e731dad8..044c874e 100644 --- a/src/main/java/de/tum/cit/ase/ares/api/aop/java/JavaSecurityTestCase.java +++ b/src/main/java/de/tum/cit/ase/ares/api/aop/java/JavaSecurityTestCase.java @@ -18,6 +18,8 @@ import java.util.Map; import java.util.function.Predicate; import java.util.stream.Collectors; + +import static de.tum.cit.ase.ares.api.aop.java.instrumentation.advice.JavaInstrumentationAdviceToolbox.localize; // /** @@ -79,23 +81,14 @@ private static String generateAdviceSettingValue(@Nonnull String dataType, @Nonn return switch (dataType) { case "String" -> { - // TODO: Refactor the error messages here if (!(value instanceof String)) { - throw new SecurityException(String.format( - "Ares Security Error (Reason: Ares-Code; Stage: Creation): " - + "Invalid value type for String advice setting: " - + "%s but should be String.", - value.getClass())); + throw new SecurityException(localize("security.advice.settings.data.type.mismatch.string", value.getClass())); } yield String.format("private static String %s = \"%s\";%n", adviceSetting, value); } case "String[]" -> { if (!(value instanceof List)) { - throw new SecurityException(String.format( - "Ares Security Error (Reason: Ares-Code; Stage: Creation): " - + "Invalid value type for String[] advice setting: " - + "%s but should be List.", - value.getClass())); + throw new SecurityException(localize("security.advice.settings.data.type.mismatch.string[]", value.getClass())); } String stringArrayValue = ((List) value).stream() .map(Object::toString) @@ -105,11 +98,7 @@ private static String generateAdviceSettingValue(@Nonnull String dataType, @Nonn } case "String[][]" -> { if (!(value instanceof List)) { - throw new SecurityException(String.format( - "Ares Security Error (Reason: Ares-Code; Stage: Creation): " - + "Invalid value type for String[][] advice setting: " - + "%s but should be List>.", - value.getClass())); + throw new SecurityException(localize("security.advice.settings.data.type.mismatch.string[][]", value.getClass())); } String stringArrayArrayValue = ((List) value).stream() .filter(e -> e instanceof List) @@ -124,38 +113,17 @@ private static String generateAdviceSettingValue(@Nonnull String dataType, @Nonn } case "int[]" -> { if (!(value instanceof List)) { - throw new SecurityException(String.format( - "Ares Security Error (Reason: Ares-Code; Stage: Creation): " - + "Invalid value type for int[] advice setting: " - + "%s but should be List.", - value.getClass())); + throw new SecurityException(localize("security.advice.settings.data.type.mismatch.int[]", value.getClass())); } String intArrayValue = ((List) value).stream() .map(Object::toString) .collect(Collectors.joining(", ")); yield String.format("private static int[] %s = new int[] {%s};%n", adviceSetting, intArrayValue); } - default -> throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation): " - + "Unknown data type while creating the value " - + value - + " for the advice settings " - + dataType - + " " - + adviceSetting - ); + default -> throw new SecurityException(localize("security.advice.settings.data.type.unknown", value, dataType, adviceSetting)); }; } catch (IllegalFormatException e) { - throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation): " - + "Format error while creating the value " - + value - + " for the advice settings " - + dataType - + " " - + adviceSetting, - e - ); + throw new SecurityException(localize("security.advice.invalid.format", value, dataType, adviceSetting)); } } @@ -180,53 +148,31 @@ public static void setJavaAdviceSettingValue(@Nonnull String adviceSetting, @Nul field.setAccessible(false); } catch (LinkageError e) { throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation):" - + "Linkage error while accessing field '" - + adviceSetting - + "' in AdviceSettings", + localize("security.advice.linkage.exception", adviceSetting), e); } catch (ClassNotFoundException e) { throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation):" - + "Could not find 'JavaSecurityTestCaseSettings' class to access field '" - + adviceSetting - + "'", + localize("security.advice.class.not.found.exception", adviceSetting), e); } catch (NoSuchFieldException e) { throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation):" - + "Field '" - + adviceSetting - + "' not found in AdviceSettings", + localize("security.advice.no.such.field.exception", adviceSetting), e); } catch (NullPointerException e) { throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation):" - + "Null pointer exception while accessing field '" - + adviceSetting - + "' in AdviceSettings", + localize("security.advice.null.pointer.exception", adviceSetting), e); } catch (IllegalAccessException e) { throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation):" - + "Field '" - + adviceSetting - + "' is not accessible in AdviceSettings", + localize("security.advice.illegal.access.exception", adviceSetting), e); } catch (IllegalArgumentException e) { throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation):" - + "Illegal argument while setting field '" - + adviceSetting - + "' in AdviceSettings with value " - + value, + localize("security.advice.illegal.argument.exception", adviceSetting, value), e); } catch (InaccessibleObjectException e) { throw new SecurityException( - "Ares Security Error (Reason: Ares-Code; Stage: Creation):" - + "Field '" - + adviceSetting - + "' is inaccessible in AdviceSettings", + localize("security.advice.inaccessible.object.exception", adviceSetting), e); } } @@ -266,7 +212,7 @@ private List getPermittedFilePaths(@Nonnull String filePermission) { case "execute" -> FilePermission::executeAllFiles; case "delete" -> FilePermission::deleteAllFiles; default -> - throw new IllegalArgumentException("Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid file permission: " + filePermission); + throw new IllegalArgumentException(localize("security.advice.settings.invalid.file.permission", filePermission)); }; return resourceAccesses.regardingFileSystemInteractions() .stream() @@ -329,7 +275,7 @@ private List getPermittedNetworkHosts(@Nonnull String networkPermission) case "send" -> NetworkPermission::sendData; case "receive" -> NetworkPermission::receiveData; default -> - throw new IllegalArgumentException("Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid network permission: " + networkPermission); + throw new IllegalArgumentException(localize("security.advice.settings.invalid.network.permission", networkPermission)); }; return resourceAccesses.regardingNetworkConnections() .stream() @@ -351,7 +297,7 @@ private List getPermittedNetworkPorts(@Nonnull String networkPermission case "send" -> NetworkPermission::sendData; case "receive" -> NetworkPermission::receiveData; default -> - throw new IllegalArgumentException("Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid network permission: " + networkPermission); + throw new IllegalArgumentException(localize("security.advice.settings.invalid.network.permission", networkPermission)); }; return resourceAccesses.regardingNetworkConnections() .stream() diff --git a/src/main/java/de/tum/cit/ase/ares/api/aop/java/instrumentation/advice/JavaInstrumentationAdviceToolbox.java b/src/main/java/de/tum/cit/ase/ares/api/aop/java/instrumentation/advice/JavaInstrumentationAdviceToolbox.java index 2cfd784f..92b1c695 100644 --- a/src/main/java/de/tum/cit/ase/ares/api/aop/java/instrumentation/advice/JavaInstrumentationAdviceToolbox.java +++ b/src/main/java/de/tum/cit/ase/ares/api/aop/java/instrumentation/advice/JavaInstrumentationAdviceToolbox.java @@ -265,8 +265,8 @@ public static String localize(String key, Object... args) { throw new IllegalStateException("Method does not return a String"); } } catch (ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - // TODO: Add a correct implementation of the localization - throw new RuntimeException(e.getMessage()); + // Fallback: Return the key if localization fails + return key; } } } \ No newline at end of file diff --git a/src/main/resources/de/tum/cit/ase/ares/api/localization/messages.properties b/src/main/resources/de/tum/cit/ase/ares/api/localization/messages.properties index 01abe729..b0168fb5 100644 --- a/src/main/resources/de/tum/cit/ase/ares/api/localization/messages.properties +++ b/src/main/resources/de/tum/cit/ase/ares/api/localization/messages.properties @@ -49,6 +49,7 @@ security.advice.class.not.found.exception=Ares Security Error (Reason: Ares-Code security.advice.no.such.field.exception=Ares Security Error (Reason: Ares-Code; Stage: Execution): Field '%s' not found in AdviceSettings security.advice.null.pointer.exception=Ares Security Error (Reason: Ares-Code; Stage: Execution): Null pointer exception while accessing field '%s' in AdviceSettings security.advice.illegal.access.exception=Ares Security Error (Reason: Ares-Code; Stage: Execution): Field '%s' is not accessible in AdviceSettings +security.advice.illegal.argument.exception=Ares Security Error (Reason: Ares-Code; Stage: Execution): Illegal argument while setting field '%s' in AdviceSettings with value %s security.advice.inaccessible.object.exception=Ares Security Error (Reason: Ares-Code; Stage: Execution): Field '%s' is inaccessible in AdviceSettings security.advice.transform.path.exception=Cannot transform to path security.instrumentation.inaccessible.object.exception=Ares Security Error (Reason: Ares-Code; Stage: Execution): Unable to make field '%s' in class '%s' accessible due to JVM security restrictions. @@ -92,6 +93,14 @@ security.policy.java.architecture.mode.null=Ares Security Error (Reason: Ares-Co security.policy.java.aop.mode.null=Ares Security Error (Reason: Ares-Code; Stage: Creation): The AOP mode cannot be null. security.policy.java.not.correct.set=Ares Security Error (Reason: Ares-Code; Stage: Creation): The x cannot be null. security.file-tools.read.content.failure=Ares Security Error (Stage: Creation): Failed to read content from source file. +security.advice.settings.data.type.mismatch.string=Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid value type for String advice setting: %s but should be String. +security.advice.settings.data.type.mismatch.string[]=Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid value type for String[] advice setting: %s but should be List. +security.advice.settings.data.type.mismatch.string[][]=Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid value type for String[][] advice setting: %s but should be List>. +security.advice.settings.data.type.mismatch.int[]=Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid value type for int[] advice setting: %s but should be List. +security.advice.settings.data.type.unknown=Ares Security Error (Reason: Ares-Code; Stage: Creation): Unknown data type while creating the value %s for the advice settings %s %s +security.advice.invalid.format=Ares Security Error (Reason: Ares-Code; Stage: Creation): Format error while creating the value %s for the advice settings %s %s +security.advice.settings.invalid.file.permission=Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid file permission: %s +security.advice.settings.invalid.network.permission=Ares Security Error (Reason: Ares-Code; Stage: Creation): Invalid network permission: %s # Policy reader and configurer security.policy.reader.path.blank=The policy file path is not specified. diff --git a/src/main/resources/de/tum/cit/ase/ares/api/localization/messages_de.properties b/src/main/resources/de/tum/cit/ase/ares/api/localization/messages_de.properties index 3c8f9bab..54642f5f 100644 --- a/src/main/resources/de/tum/cit/ase/ares/api/localization/messages_de.properties +++ b/src/main/resources/de/tum/cit/ase/ares/api/localization/messages_de.properties @@ -49,6 +49,7 @@ security.advice.class.not.found.exception=Ares Sicherheitsfehler (Grund: Ares-Co security.advice.no.such.field.exception=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Ausführung): Das Feld '%s' wurde in AdviceSettings nicht gefunden security.advice.null.pointer.exception=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Ausführung): NullPointerException beim Zugriff auf das Feld '%s' in AdviceSettings security.advice.illegal.access.exception=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Ausführung): Das Feld '%s' ist in AdviceSettings nicht zugänglich +security.advice.illegal.argument.exception=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Ausführung): Ungültiges Argument beim Setzen des Feldes '%s' in AdviceSettings mit dem Wert %s security.advice.inaccessible.object.exception=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Ausführung): Das Feld '%s' ist in AdviceSettings unzugänglich security.advice.transform.path.exception=Kann nicht in Pfad umgewandelt werden security.instrumentation.inaccessible.object.exception=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Ausführung): Das Feld '%s' in der Klasse '%s' kann aufgrund von JVM-Sicherheitsbeschränkungen nicht zugänglich gemacht werden. @@ -92,6 +93,14 @@ security.policy.java.architecture.mode.null=Ares Sicherheitsfehler (Grund: Ares- security.policy.java.aop.mode.null=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Der AOP-Modus darf nicht null sein. security.policy.java.not.correct.set=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Die x darf nicht null sein. security.file-tools.read.content.failure=Ares Sicherheitsfehler (Phase: Erstellung): Konnte den Inhalt der Quelldatei nicht lesen. +security.advice.settings.data.type.mismatch.string=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Ungültiger Datentyp für String-Rateneinstellung: %s, erwartet wurde String. +security.advice.settings.data.type.mismatch.string[]=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Ungültiger Datentyp für String[]-Rateneinstellung: %s, erwartet wurde Liste. +security.advice.settings.data.type.mismatch.string[][]=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Ungültiger Datentyp für String[][]-Rateneinstellung: %s, erwartet wurde Liste>. +security.advice.settings.data.type.mismatch.int[]=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Ungültiger Datentyp für int[]-Rateneinstellung: %s, erwartet wurde Liste. +security.advice.settings.data.type.unknown=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Unbekannter Datentyp beim Erstellen des Wertes %s für die Rateneinstellungen %s %s +security.advice.invalid.format=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Formatfehler beim Erstellen des Wertes %s für die Rateneinstellungen %s %s +security.advice.settings.invalid.file.permission=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Ungültige Dateiberechtigung: %s +security.advice.settings.invalid.network.permission=Ares Sicherheitsfehler (Grund: Ares-Code; Phase: Erstellung): Ungültige Netzwerkberechtigung: %s # Policy reader and configurer security.policy.reader.path.blank=Der Pfad zur Richtliniendatei ist nicht angegeben. @@ -168,6 +177,38 @@ structural.scan.wrongCaseCorrectPlace=Die Aufgabe erwartet eine Klasse mit dem N structural.scan.wrongCaseMisplaced=Die Aufgabe erwartet eine Klasse mit dem Namen %s im Paket %s. Wir haben festgestellt, dass du eine Klasse %s im Paket %s implementiert hast, die von der Erwartung abweicht. Ãœberprüfe auf falsche Groß-/Kleinschreibung und stelle sicher, dass du sie in das richtige Paket einordnest. structural.scan.wrongCaseMultiple=Die Aufgabe erwartet eine Klasse mit dem Namen %s im Paket %s. Wir haben festgestellt, dass du eine Klasse %s im Paket %s implementiert hast, die von der Erwartung abweicht. Prüfe auf falsche Groß-/Kleinschreibung und stelle sicher, dass du eine Klasse dem richtigen Paket zuordnest und alle überflüssigen Klassen entfernst. structural.scan.defaultPackage= (d.h. kein Paket) + +# reflection test utils +reflection_test_utils.attribute_access=Das Attribut '%s' konnte aus der Klasse %s nicht abgerufen werden, da der Zugriff auf das Attribut verweigert wurde. Stellen Sie sicher, dass Sie die Modifizierer des %s überprüfen. +reflection_test_utils.attribute_not_found=Das Attribut '%s' konnte aus der Klasse %s nicht abgerufen werden, da das Attribut nicht existiert. Stellen Sie sicher, dass das Attribut korrekt implementiert ist. +reflection_test_utils.attribute_null=Der Wert des Attributs '%s' konnte nicht abgerufen werden, da das Objekt null war. +reflection_test_utils.attribute_set_final=Der Wert des Attributs '%s' aus der Klasse %s konnte nicht gesetzt werden, da es final ist. Stellen Sie sicher, dass Sie die Modifizierer des Attributs überprüfen. +reflection_test_utils.class_initialization=Die Klasse '%s' konnte nicht initialisiert werden, da eine Ausnahme in einem statischen Initialisierungsblock ausgelöst wurde. Stellen Sie sicher, dass die statische Initialisierung fehlerfrei implementiert ist. +reflection_test_utils.class_not_found=Die Klasse '%s' wurde innerhalb der Übermittlung nicht gefunden. Stellen Sie sicher, dass sie korrekt implementiert ist. +reflection_test_utils.constructor_abstract_class=Die Klasse %s konnte nicht instanziiert werden, da die Klasse abstrakt ist und keinen Konstruktor haben sollte. Stellen Sie sicher, dass der Konstruktor der Klasse entfernt wird. +reflection_test_utils.constructor_access=Die Klasse %s konnte nicht instanziiert werden, da der Zugriff auf ihren Konstruktor mit den Parametern: %s verweigert wurde. Stellen Sie sicher, dass Sie die Modifizierer des %s überprüfen. +reflection_test_utils.constructor_arguments=Die Klasse %s konnte nicht instanziiert werden, da der tatsächliche Konstruktor oder keiner der tatsächlichen Konstruktoren dieser Klasse mit dem erwarteten übereinstimmt. Wir erwarten unter anderem einen mit %s Parametern, der nicht existiert. Stellen Sie sicher, dass Sie diesen Konstruktor korrekt implementieren. +reflection_test_utils.constructor_class_init=Die Klasse %s konnte nicht instanziiert werden, da der Konstruktor mit %d Parametern nicht initialisiert werden konnte. +reflection_test_utils.constructor_internal_exception=Die Klasse %s konnte nicht instanziiert werden, da der Konstruktor mit %d Parametern eine Ausnahme ausgelöst hat und nicht initialisiert werden konnte. Stellen Sie sicher, dass Sie die Implementierung des Konstruktors überprüfen. +reflection_test_utils.constructor_not_found_args=Die Klasse %s konnte nicht instanziiert werden, da die Klasse keinen Konstruktor mit den Argumenten: %s hat. Stellen Sie sicher, dass Sie diesen Konstruktor korrekt implementieren. +reflection_test_utils.constructor_not_found_params=Der Konstruktor %s in der Klasse %s konnte nicht gefunden werden, da der Konstruktor nicht existiert. Stellen Sie sicher, dass Sie diesen Konstruktor korrekt implementieren. +reflection_test_utils.constructor_null_args=Die Klasse %s konnte nicht instanziiert werden, da kein passender Konstruktor gefunden werden konnte, weil eines der übergebenen Argumente null war. +reflection_test_utils.method_access=Die Methode '%s' in der Klasse %s konnte nicht aufgerufen werden, da der Zugriff auf die Methode verweigert wurde. Stellen Sie sicher, dass Sie die Modifizierer des %s überprüfen. +reflection_test_utils.method_class_init=Die Methode '%s' in der Klasse %s konnte nicht aufgerufen werden, da die durch diese Methode ausgelöste statische Initialisierung fehlgeschlagen ist. Stellen Sie sicher, dass Sie die durch diese Methode ausgelöste Initialisierung überprüfen. +reflection_test_utils.method_internal_exception=Die Methode '%s' in der Klasse %s konnte nicht aufgerufen werden, aufgrund einer Ausnahme innerhalb der Methode: %s +reflection_test_utils.method_name_null=Die Methode '%s' in der Klasse %s konnte nicht gefunden werden, da der Name der Methode null ist. Stellen Sie sicher, dass Sie den Namen der Methode überprüfen. +reflection_test_utils.method_not_found=Die Methode '%s' in der Klasse %s konnte nicht gefunden werden, da die Methode nicht existiert. Stellen Sie sicher, dass Sie diese Methode korrekt implementieren. +reflection_test_utils.method_null_args=Die Methode '%s' konnte nicht gefunden werden, da eines der übergebenen Argumente null war. +reflection_test_utils.method_null_target=Die Methode '%s' konnte nicht gefunden werden, da das Objekt null war. +reflection_test_utils.method_null_target_instance=Die Methode '%s' in der Klasse %s konnte nicht aufgerufen werden, da das Objekt null war und die Methode eine Instanzmethode ist. Stellen Sie sicher, dass Sie den statischen Modifikator der Methode überprüfen. +reflection_test_utils.method_parameters=Die Methode '%s' in der Klasse %s konnte nicht aufgerufen werden, da die Parameter nicht korrekt implementiert sind. Stellen Sie sicher, dass Sie die Parameter der Methode überprüfen. +reflection_test_utils.no_parameters= +reflection_test_utils.with_parameters=mit den Parametern: %s\u0020 +reflection_test_utils.construct.class=Klasse +reflection_test_utils.construct.constructor=Konstruktor +reflection_test_utils.construct.field=Attribut +reflection_test_utils.construct.method=Methode + # dynamics dynamics.check.final=%s ist final. dynamics.check.not_final=%s ist nicht final. diff --git a/src/test/java/de/tum/cit/ase/ares/integration/FileSystemAccessTest.java b/src/test/java/de/tum/cit/ase/ares/integration/FileSystemAccessTest.java index 5c2750eb..c6b84a1d 100644 --- a/src/test/java/de/tum/cit/ase/ares/integration/FileSystemAccessTest.java +++ b/src/test/java/de/tum/cit/ase/ares/integration/FileSystemAccessTest.java @@ -6,6 +6,7 @@ import de.tum.cit.ase.ares.api.Policy; import de.tum.cit.ase.ares.api.jupiter.PublicTest; import de.tum.cit.ase.ares.integration.testuser.subject.fileSystem.FileSystemAccessPenguin; +import org.junit.jupiter.api.Assumptions; import org.junit.jupiter.api.Nested; import org.junit.platform.testkit.engine.Events; @@ -802,10 +803,7 @@ void test_accessFileSystemViaFileExecuteInstrumentation() { @Policy(value = "src/test/resources/de/tum/cit/ase/ares/integration/testuser/securitypolicies/OnePathAllowedAspectJExecute.yaml", withinPath = "test-classes/de/tum/cit/ase/ares/integration/testuser/subject/student") void test_accessFileSystemViaDesktopAspectJ() throws IOException { try { - if (GraphicsEnvironment.isHeadless()) { - // Skip or mark the test as ignored - return; - } + Assumptions.assumeFalse(GraphicsEnvironment.isHeadless(), "Skipping test in headless environment"); FileSystemAccessPenguin.accessFileSystemViaDesktop(); fail(errorMessage); } catch (SecurityException e) { @@ -818,10 +816,7 @@ void test_accessFileSystemViaDesktopAspectJ() throws IOException { @Policy(value = "src/test/resources/de/tum/cit/ase/ares/integration/testuser/securitypolicies/OnePathAllowedInstrumentationExecute.yaml", withinPath = "test-classes/de/tum/cit/ase/ares/integration/testuser/subject/student") void test_accessFileSystemViaDesktopInstrumentation() throws IOException { try { - if (GraphicsEnvironment.isHeadless()) { - // Skip or mark the test as ignored - return; - } + Assumptions.assumeFalse(GraphicsEnvironment.isHeadless(), "Skipping test in headless environment"); FileSystemAccessPenguin.accessFileSystemViaDesktop(); fail(errorMessage); } catch (SecurityException e) { @@ -907,10 +902,7 @@ void test_accessFileSystemViaJFileChooserAspectJ() throws IOException { @Policy(value = "src/test/resources/de/tum/cit/ase/ares/integration/testuser/securitypolicies/OnePathAllowedInstrumentationDelete.yaml", withinPath = "test-classes/de/tum/cit/ase/ares/integration/testuser/subject/student") void test_accessFileSystemViaJFileChooserInstrumentation() { try { - if (GraphicsEnvironment.isHeadless()) { - // Skip or mark the test as ignored - return; - } + Assumptions.assumeFalse(GraphicsEnvironment.isHeadless(), "Skipping test in headless environment"); FileSystemAccessPenguin.accessFileSystemViaJFileChooser(); fail(errorMessage); } catch (SecurityException e) { diff --git a/src/test/java/de/tum/cit/ase/ares/integration/LocaleTest.java b/src/test/java/de/tum/cit/ase/ares/integration/LocaleTest.java index ce757b78..95e7bf04 100644 --- a/src/test/java/de/tum/cit/ase/ares/integration/LocaleTest.java +++ b/src/test/java/de/tum/cit/ase/ares/integration/LocaleTest.java @@ -1,6 +1,7 @@ package de.tum.cit.ase.ares.integration; import static de.tum.cit.ase.ares.testutilities.CustomConditions.finishedSuccessfully; +import static org.assertj.core.api.Assertions.assertThat; import org.junit.platform.testkit.engine.Events; @@ -8,6 +9,12 @@ import de.tum.cit.ase.ares.integration.testuser.LocaleUser.*; import de.tum.cit.ase.ares.testutilities.*; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; +import java.util.Set; + @UserBased({ LocaleUser.class, LocaleEn.class, LocaleUnsupported.class }) class LocaleTest { @@ -20,6 +27,9 @@ class LocaleTest { private final String testUnknownFormatted = "testUnknownFormatted"; private final String testUnknownNormal = "testUnknownNormal"; + private static final String ENGLISH_FILE_PATH = "src/main/resources/de/tum/cit/ase/ares/api/localization/messages.properties"; // Replace with actual path + private static final String GERMAN_FILE_PATH = "src/main/resources/de/tum/cit/ase/ares/api/localization/messages_de.properties"; // Replace with actual path + @TestTest void test_testLocaleEn() { tests.assertThatEvents().haveExactly(1, finishedSuccessfully(testLocaleEn)); @@ -44,4 +54,21 @@ void test_testUnknownFormatted() { void test_testUnknownNormal() { tests.assertThatEvents().haveExactly(1, finishedSuccessfully(testUnknownNormal)); } + + @TestTest + public void testTranslationsCompleteness() throws IOException { + Set englishKeys = loadPropertiesKeys(ENGLISH_FILE_PATH); + Set germanKeys = loadPropertiesKeys(GERMAN_FILE_PATH); + + assertThat(germanKeys).containsAll(englishKeys); + } + + private Set loadPropertiesKeys(String filePath) throws IOException { + Properties properties = new Properties(); + try (InputStream input = new FileInputStream(filePath)) { + properties.load(input); + } + return properties.stringPropertyNames(); + } + } diff --git a/src/test/java/de/tum/cit/ase/ares/integration/testuser/FileSystemAccessUser.java b/src/test/java/de/tum/cit/ase/ares/integration/testuser/FileSystemAccessUser.java index b3898721..8d8709c7 100644 --- a/src/test/java/de/tum/cit/ase/ares/integration/testuser/FileSystemAccessUser.java +++ b/src/test/java/de/tum/cit/ase/ares/integration/testuser/FileSystemAccessUser.java @@ -36,7 +36,6 @@ void accessPathAllowed() throws IOException { PathAccessPenguin.accessPath(Path.of("pom.xml")); }*/ - // TODO this test should fail with the given agent SecurityException currently not working @PublicTest @Policy(value = "src/test/resources/de/tum/cit/ase/ares/integration/testuser/securitypolicies/OnePathAllowedInstrumentation.yaml", withinPath = "test-classes/de/tum/cit/ase/ares/integration/testuser/subject/pathaccess") public void accessPathNormalInstrumentation() throws IOException {