diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/.gitignore b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/.gitignore new file mode 100644 index 0000000000..afce51184c --- /dev/null +++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/.gitignore @@ -0,0 +1,2 @@ +/.aadlbin-gen/ +/instances/ diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/.project b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/.project new file mode 100644 index 0000000000..b716eb1b8d --- /dev/null +++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/.project @@ -0,0 +1,18 @@ + + + issue2807 + + + + + + org.eclipse.xtext.ui.shared.xtextBuilder + + + + + + org.osate.core.aadlnature + org.eclipse.xtext.ui.shared.xtextNature + + diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/InvalidRecover.aadl b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/InvalidRecover.aadl new file mode 100644 index 0000000000..dd942b831c --- /dev/null +++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/InvalidRecover.aadl @@ -0,0 +1,47 @@ +-- +-- Copyright (c) 2004-2026 Carnegie Mellon University and others. (see Contributors file). +-- All Rights Reserved. +-- +-- NO WARRANTY. ALL MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY +-- KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE +-- OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT +-- MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +-- +-- This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 +-- which is available at https://www.eclipse.org/legal/epl-2.0/ +-- SPDX-License-Identifier: EPL-2.0 +-- +-- Created, in part, with funding and support from the United States Government. (see Acknowledgments file). +-- +-- This program includes and/or can make use of certain third party source code, object code, documentation and other +-- files ("Third Party Software"). The Third Party Software that is used by this program is dependent upon your system +-- configuration. By using this program, You agree to comply with any and all relevant Third Party Software terms and +-- conditions contained in any such Third Party Software or separate license file distributed with such Third Party +-- Software. The parties who own the Third Party Software ("Third Party Licensors") are intended third party benefici- +-- aries to this license with respect to the terms applicable to their Third Party Software. Third Party Software li- +-- censes only apply to the Third Party Software and not any other portion of this program or this program as a whole. +-- +package InvalidRecover +public + system s + features + ep1: in out event port; + modes + m1: initial mode; + m2: mode; + mt1: m1 -[ep1]-> m2; + end s; + + system implementation s.i + subcomponents + child: system; + internal features + es1: event; + annex EMV2 {** + component error behavior + events + invalid_event: recover event when ep1, m1, child; + end component; + **}; + end s.i; +end InvalidRecover; diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/Issue2807.aadl b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/Issue2807.aadl new file mode 100644 index 0000000000..9bb3c5efcf --- /dev/null +++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/Issue2807.aadl @@ -0,0 +1,47 @@ +-- +-- Copyright (c) 2004-2026 Carnegie Mellon University and others. (see Contributors file). +-- All Rights Reserved. +-- +-- NO WARRANTY. ALL MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY +-- KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE +-- OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT +-- MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +-- +-- This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 +-- which is available at https://www.eclipse.org/legal/epl-2.0/ +-- SPDX-License-Identifier: EPL-2.0 +-- +-- Created, in part, with funding and support from the United States Government. (see Acknowledgments file). +-- +-- This program includes and/or can make use of certain third party source code, object code, documentation and other +-- files ("Third Party Software"). The Third Party Software that is used by this program is dependent upon your system +-- configuration. By using this program, You agree to comply with any and all relevant Third Party Software terms and +-- conditions contained in any such Third Party Software or separate license file distributed with such Third Party +-- Software. The parties who own the Third Party Software ("Third Party Licensors") are intended third party benefici- +-- aries to this license with respect to the terms applicable to their Third Party Software. Third Party Software li- +-- censes only apply to the Third Party Software and not any other portion of this program or this program as a whole. +-- +package Issue2807 +public + system s + features + ep1: in out event port; + modes + m1: initial mode; + m2: mode; + mt1: m1 -[ep1]-> m2; + end s; + + system implementation s.i + subcomponents + child: system; + internal features + es1: event; + annex EMV2 {** + component error behavior + events + invalid_event: repair event when ep1, m1, child; + end component; + **}; + end s.i; +end Issue2807; diff --git a/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/ValidInitiators.aadl b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/ValidInitiators.aadl new file mode 100644 index 0000000000..bb2a28b841 --- /dev/null +++ b/emv2/org.osate.aadl2.errormodel.tests/models/issue2807/ValidInitiators.aadl @@ -0,0 +1,56 @@ +-- +-- Copyright (c) 2004-2026 Carnegie Mellon University and others. (see Contributors file). +-- All Rights Reserved. +-- +-- NO WARRANTY. ALL MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY +-- KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE +-- OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT +-- MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. +-- +-- This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 +-- which is available at https://www.eclipse.org/legal/epl-2.0/ +-- SPDX-License-Identifier: EPL-2.0 +-- +-- Created, in part, with funding and support from the United States Government. (see Acknowledgments file). +-- +-- This program includes and/or can make use of certain third party source code, object code, documentation and other +-- files ("Third Party Software"). The Third Party Software that is used by this program is dependent upon your system +-- configuration. By using this program, You agree to comply with any and all relevant Third Party Software terms and +-- conditions contained in any such Third Party Software or separate license file distributed with such Third Party +-- Software. The parties who own the Third Party Software ("Third Party Licensors") are intended third party benefici- +-- aries to this license with respect to the terms applicable to their Third Party Software. Third Party Software li- +-- censes only apply to the Third Party Software and not any other portion of this program or this program as a whole. +-- +package ValidInitiators +public + system s + features + ep1: in out event port; + modes + m1: initial mode; + m2: mode; + mt1: m1 -[ep1]-> m2; + end s; + + system implementation s.i + subcomponents + child: system; + internal features + es1: event; + annex EMV2 {** + component error behavior + events + repair1: repair event; + repair2: repair event when ep1; + repair3: repair event when mt1; + repair4: repair event when es1; + repair5: repair event when ep1, mt1, es1; + recover1: recover event; + recover2: recover event when ep1; + recover3: recover event when mt1; + recover4: recover event when es1; + recover5: recover event when ep1, mt1, es1; + end component; + **}; + end s.i; +end ValidInitiators; diff --git a/emv2/org.osate.aadl2.errormodel.tests/src/org/osate/aadl2/errormodel/tests/issues/Issue2807Test.java b/emv2/org.osate.aadl2.errormodel.tests/src/org/osate/aadl2/errormodel/tests/issues/Issue2807Test.java new file mode 100644 index 0000000000..f41d1c0ded --- /dev/null +++ b/emv2/org.osate.aadl2.errormodel.tests/src/org/osate/aadl2/errormodel/tests/issues/Issue2807Test.java @@ -0,0 +1,87 @@ +/** + * Copyright (c) 2004-2026 Carnegie Mellon University and others. (see Contributors file). + * All Rights Reserved. + * + * NO WARRANTY. ALL MATERIAL IS FURNISHED ON AN "AS-IS" BASIS. CARNEGIE MELLON UNIVERSITY MAKES NO WARRANTIES OF ANY + * KIND, EITHER EXPRESSED OR IMPLIED, AS TO ANY MATTER INCLUDING, BUT NOT LIMITED TO, WARRANTY OF FITNESS FOR PURPOSE + * OR MERCHANTABILITY, EXCLUSIVITY, OR RESULTS OBTAINED FROM USE OF THE MATERIAL. CARNEGIE MELLON UNIVERSITY DOES NOT + * MAKE ANY WARRANTY OF ANY KIND WITH RESPECT TO FREEDOM FROM PATENT, TRADEMARK, OR COPYRIGHT INFRINGEMENT. + * + * This program and the accompanying materials are made available under the terms of the Eclipse Public License 2.0 + * which is available at https://www.eclipse.org/legal/epl-2.0/ + * SPDX-License-Identifier: EPL-2.0 + * + * Created, in part, with funding and support from the United States Government. (see Acknowledgments file). + * + * This program includes and/or can make use of certain third party source code, object code, documentation and other + * files ("Third Party Software"). The Third Party Software that is used by this program is dependent upon your system + * configuration. By using this program, You agree to comply with any and all relevant Third Party Software terms and + * conditions contained in any such Third Party Software or separate license file distributed with such Third Party + * Software. The parties who own the Third Party Software ("Third Party Licensors") are intended third party benefici- + * aries to this license with respect to the terms applicable to their Third Party Software. Third Party Software li- + * censes only apply to the Third Party Software and not any other portion of this program or this program as a whole. + */ +package org.osate.aadl2.errormodel.tests.issues; + +import static org.junit.Assert.assertEquals; + +import java.util.ArrayList; + +import org.eclipse.xtext.testing.InjectWith; +import org.eclipse.xtext.testing.XtextRunner; +import org.eclipse.xtext.testing.validation.ValidationTestHelper; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.osate.aadl2.AadlPackage; +import org.osate.aadl2.DefaultAnnexSubclause; +import org.osate.aadl2.errormodel.tests.ErrorModelInjectorProvider; +import org.osate.testsupport.AssertHelper; +import org.osate.testsupport.TestHelper; +import org.osate.xtext.aadl2.errormodel.errorModel.ErrorModelSubclause; + +import com.google.inject.Inject; +import com.itemis.xtext.testing.FluentIssueCollection; +import com.itemis.xtext.testing.XtextTest; + +@RunWith(XtextRunner.class) +@InjectWith(ErrorModelInjectorProvider.class) +public class Issue2807Test extends XtextTest { + private static final String PATH = "org.osate.aadl2.errormodel.tests/models/issue2807/"; + + @Inject + private TestHelper testHelper; + + @Inject + private ValidationTestHelper validationHelper; + + @Test + public void repairEventRejectsInvalidInitiators() throws Exception { + assertInvalidInitiators("Issue2807.aadl", "Repair"); + } + + @Test + public void recoverEventReportsEachInvalidInitiatorOnce() throws Exception { + assertInvalidInitiators("InvalidRecover.aadl", "Recover"); + } + + @Test + public void validInitiatorsAndAbsentWhenClausesAreAccepted() { + var pkg = testHelper.parseFile(PATH + "ValidInitiators.aadl"); + validationHelper.assertNoIssues(pkg); + } + + private void assertInvalidInitiators(String fileName, String eventKind) throws Exception { + var result = issues = testHelper.testFile(PATH + fileName); + var expected = new FluentIssueCollection(result.getResource(), new ArrayList<>(), new ArrayList<>()); + var pkg = (AadlPackage) result.getResource().getContents().getFirst(); + var implementation = pkg.getPublicSection().getOwnedClassifiers().get(1); + var annex = (ErrorModelSubclause) ((DefaultAnnexSubclause) implementation.getOwnedAnnexSubclauses() + .getFirst()).getParsedAnnexSubclause(); + AssertHelper.assertError(annex.getEvents().getFirst(), result.getIssues(), expected, + eventKind + " event trigger reference 'm1' is not a port, component internal self event, or mode transition.", + eventKind + " event trigger reference 'child' is not a port, component internal self event, or mode transition."); + assertEquals("Each invalid initiator must produce exactly one diagnostic", 2, result.getIssues().size()); + expected.sizeIs(result.getIssues().size()); + assertConstraints(expected); + } +} diff --git a/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java b/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java index 821454b3d5..880e4965b0 100644 --- a/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java +++ b/emv2/org.osate.xtext.aadl2.errormodel/src/org/osate/xtext/aadl2/errormodel/validation/ErrorModelValidator.java @@ -89,6 +89,7 @@ import org.osate.xtext.aadl2.errormodel.errorModel.PropagationPath; import org.osate.xtext.aadl2.errormodel.errorModel.PropagationPoint; import org.osate.xtext.aadl2.errormodel.errorModel.RecoverEvent; +import org.osate.xtext.aadl2.errormodel.errorModel.RepairEvent; import org.osate.xtext.aadl2.errormodel.errorModel.ReportingPortReference; import org.osate.xtext.aadl2.errormodel.errorModel.SConditionElement; import org.osate.xtext.aadl2.errormodel.errorModel.TransitionBranch; @@ -284,12 +285,12 @@ public void caseTypeToken(TypeToken tt) { @Check(CheckType.FAST) public void caseRecoverEvent(RecoverEvent recoverEvent) { - checkRecoverEventTriggerType(recoverEvent); + checkEventTriggerType(recoverEvent, recoverEvent.getEventInitiator(), "Recover"); } @Check(CheckType.FAST) - public void caseRepairEvent(RecoverEvent recoverEvent) { - checkRecoverEventTriggerType(recoverEvent); + public void caseRepairEvent(RepairEvent repairEvent) { + checkEventTriggerType(repairEvent, repairEvent.getEventInitiator(), "Repair"); } @Check(CheckType.FAST) @@ -422,12 +423,11 @@ public void caseConnection(Connection conn) { checkConnectionErrorTypes(conn); } - private void checkRecoverEventTriggerType(RecoverEvent recoverEvent) { - EList cl = recoverEvent.getEventInitiator(); - for (NamedElement namedElement : cl) { + private void checkEventTriggerType(ErrorBehaviorEvent event, List eventInitiators, String eventKind) { + for (NamedElement namedElement : eventInitiators) { if (!(namedElement instanceof ModeTransition || namedElement instanceof Port || namedElement instanceof InternalFeature)) { - error(recoverEvent, "Recover event trigger reference '" + namedElement.getName() + error(event, eventKind + " event trigger reference '" + namedElement.getName() + "' is not a port, component internal self event, or mode transition."); } }