Added Time agnostic Onset and Abated classes 00/100300/4
authorjhh <jorge.hernandez-herrero@att.com>
Wed, 15 Jan 2020 04:48:45 +0000 (22:48 -0600)
committerjhh <jorge.hernandez-herrero@att.com>
Thu, 16 Jan 2020 14:44:53 +0000 (08:44 -0600)
These classes can be used for comparison of alarm skeletons
independently of the time at which they were produced.

Issue-ID: POLICY-2323
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
Change-Id: I85b9d6a429de56f056eb0a6caa9e4f90fbd68918
Signed-off-by: jhh <jorge.hernandez-herrero@att.com>
models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/Abated.java [new file with mode: 0644]
models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/CanonicalAbated.java [new file with mode: 0644]
models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/CanonicalOnset.java [new file with mode: 0644]
models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/ControlLoopEvent.java
models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/Onset.java [new file with mode: 0644]
models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/VirtualControlLoopEvent.java
models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/AbatedTest.java [new file with mode: 0644]
models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/CanonicalAbatedTest.java [new file with mode: 0644]
models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/CanonicalOnsetTest.java [new file with mode: 0644]
models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/OnsetTest.java [new file with mode: 0644]

diff --git a/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/Abated.java b/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/Abated.java
new file mode 100644 (file)
index 0000000..3488e3b
--- /dev/null
@@ -0,0 +1,56 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import lombok.ToString;
+
+/**
+ * An ABATED event.
+ */
+@ToString(callSuper = true)
+public class Abated extends VirtualControlLoopEvent {
+    private static final long serialVersionUID = -90742191326653587L;
+
+    /**
+     * No arguments constructor.
+     */
+    public Abated() {
+        super();
+        setClosedLoopEventStatus(ControlLoopEventStatus.ABATED);
+    }
+
+    /**
+     * Constructor from a VirtualControlLoop event.
+     */
+    public Abated(VirtualControlLoopEvent event) {
+        super(event);
+        setClosedLoopEventStatus(ControlLoopEventStatus.ABATED);
+    }
+
+    @Override
+    public void setClosedLoopEventStatus(ControlLoopEventStatus status) {
+        if (status != ControlLoopEventStatus.ABATED) {
+            throw new IllegalArgumentException("Not an ABATED event status");
+        }
+
+        super.setClosedLoopEventStatus(status);
+    }
+}
diff --git a/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/CanonicalAbated.java b/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/CanonicalAbated.java
new file mode 100644 (file)
index 0000000..f1f2db3
--- /dev/null
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
+/**
+ * An ABATED event that determines equality with other ABATED
+ * with only non-time dependent values.
+ */
+
+@NoArgsConstructor
+@ToString(callSuper = true)
+public class CanonicalAbated extends Abated {
+    private static final long serialVersionUID = 284865663873284818L;
+
+    public CanonicalAbated(VirtualControlLoopEvent event) {
+        super(event);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        // see hashcode method notes
+        return EqualsBuilder.reflectionEquals(
+            this, other, "requestId", "closedLoopAlarmStart", "closedLoopAlarmEnd");
+    }
+
+    @Override
+    public int hashCode() {
+        // The reflection based implementation has been chosen
+        // for maintenance reasons, even though may incur in some
+        // performance overhead.   The other possibility is to use
+        // Objects.hash(..) but will require to spell out all fields
+        // to be considered, which are many more than the exceptions,
+        // in addition this class would need to be updated as new fields
+        // are added.   Other option to consider in the future is to
+        // restructure the class hierarchy.   Note that could not use
+        // lombok annotations to exclude fields from superclasses.
+        return
+            HashCodeBuilder.reflectionHashCode(
+                this, "requestId", "closedLoopAlarmStart", "closedLoopAlarmEnd");
+    }
+
+}
diff --git a/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/CanonicalOnset.java b/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/CanonicalOnset.java
new file mode 100644 (file)
index 0000000..98aa433
--- /dev/null
@@ -0,0 +1,65 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import lombok.NoArgsConstructor;
+import lombok.ToString;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+
+/**
+ * An ONSET event that determines equality with other ONSET events
+ * with only non-time dependent values.
+ */
+
+@NoArgsConstructor
+@ToString(callSuper = true)
+public class CanonicalOnset extends Onset {
+    private static final long serialVersionUID = 284865663873284818L;
+
+    public CanonicalOnset(VirtualControlLoopEvent event) {
+        super(event);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        // see hashcode method notes
+        return EqualsBuilder.reflectionEquals(
+            this, other, "requestId", "closedLoopAlarmStart", "closedLoopAlarmEnd");
+    }
+
+    @Override
+    public int hashCode() {
+        // The reflection based implementation has been chosen
+        // for maintenance reasons, even though may incur in some
+        // performance overhead.   The other possibility is to use
+        // Objects.hash(..) but will require to spell out all fields
+        // to be considered, which are many more than the exceptions,
+        // in addition this class would need to be updated as new fields
+        // are added.   Other option to consider in the future is to
+        // restructure the class hierarchy.   Note that could not use
+        // lombok annotations to exclude fields from superclasses.
+        return
+            HashCodeBuilder.reflectionHashCode(
+                this, "requestId", "closedLoopAlarmStart", "closedLoopAlarmEnd");
+    }
+
+}
index bbe902a..3106e39 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * controlloop
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -35,19 +35,19 @@ public abstract class ControlLoopEvent implements Serializable {
     private static final long serialVersionUID = 2391252138583119195L;
 
     @SerializedName("requestID")
-    private UUID requestId;
+    protected UUID requestId;
     @SerializedName("target_type")
-    private String targetType;
-    private String closedLoopControlName;
-    private String version = "1.0.2";
-    private String closedLoopEventClient;
-    private String target;
-    private String from;
-    private String policyScope;
-    private String policyName;
-    private String policyVersion;
-    private ControlLoopEventStatus closedLoopEventStatus;
-    private Map<String, String> additionalEventParams;
+    protected String targetType;
+    protected String closedLoopControlName;
+    protected String version = "1.0.2";
+    protected String closedLoopEventClient;
+    protected String target;
+    protected String from;
+    protected String policyScope;
+    protected String policyName;
+    protected String policyVersion;
+    protected ControlLoopEventStatus closedLoopEventStatus;
+    protected Map<String, String> additionalEventParams;
 
     /**
      * Construct an instance from an existing instance.
diff --git a/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/Onset.java b/models-interactions/model-impl/events/src/main/java/org/onap/policy/controlloop/Onset.java
new file mode 100644 (file)
index 0000000..41a0eba
--- /dev/null
@@ -0,0 +1,58 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import lombok.NonNull;
+import lombok.ToString;
+
+/**
+ * An ONSET event.
+ */
+
+@ToString(callSuper = true)
+public class Onset extends VirtualControlLoopEvent {
+    private static final long serialVersionUID = -90742191326653587L;
+
+    /**
+     * No arguments constructor.
+     */
+    public Onset() {
+        super();
+        setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
+    }
+
+    /**
+     * Constructor from a VirtualControlLoop event.
+     */
+    public Onset(@NonNull VirtualControlLoopEvent event) {
+        super(event);
+        setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
+    }
+
+    @Override
+    public void setClosedLoopEventStatus(ControlLoopEventStatus status) {
+        if (status != ControlLoopEventStatus.ONSET) {
+            throw new IllegalArgumentException("Not an ONSET event status");
+        }
+
+        super.setClosedLoopEventStatus(status);
+    }
+}
index 24cc81d..3319105 100644 (file)
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * controlloop
  * ================================================================================
- * Copyright (C) 2017-2019 AT&T Intellectual Property. All rights reserved.
+ * Copyright (C) 2017-2020 AT&T Intellectual Property. All rights reserved.
  * Modifications Copyright (C) 2019 Nordix Foundation.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
@@ -29,19 +29,21 @@ import java.util.Map;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
 import lombok.NoArgsConstructor;
+import lombok.ToString;
 
 @Data
 @EqualsAndHashCode(callSuper = true)
 @NoArgsConstructor
+@ToString(callSuper = true)
 public class VirtualControlLoopEvent extends ControlLoopEvent {
 
     private static final long serialVersionUID = -5752405682246066226L;
 
     @SerializedName("AAI")
-    private Map<String, String> aai = new HashMap<>();
-    private String payload;
-    private Instant closedLoopAlarmStart;
-    private Instant closedLoopAlarmEnd;
+    protected Map<String, String> aai = new HashMap<>();
+    protected String payload;
+    protected Instant closedLoopAlarmStart;
+    protected Instant closedLoopAlarmEnd;
 
     /**
      * Construct an instance from an existing instance.
diff --git a/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/AbatedTest.java b/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/AbatedTest.java
new file mode 100644 (file)
index 0000000..e1ef77e
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.time.Instant;
+import org.junit.Test;
+
+public class AbatedTest {
+
+    @Test
+    public void testConstructors() {
+        VirtualControlLoopEvent event = new VirtualControlLoopEvent();
+        event.setClosedLoopEventStatus(ControlLoopEventStatus.ABATED);
+        event.setClosedLoopAlarmStart(Instant.now());
+        event.setClosedLoopAlarmEnd(Instant.now());
+
+        Abated abated = new Abated(event);
+        assertEquals(abated, event);
+        assertEquals(event.getClosedLoopAlarmStart(), abated.getClosedLoopAlarmStart());
+        assertEquals(ControlLoopEventStatus.ABATED, abated.getClosedLoopEventStatus());
+
+        abated.setClosedLoopAlarmEnd(Instant.now());
+        assertNotEquals(abated, event);
+
+        assertEquals(new Abated(abated), abated);
+    }
+
+    @Test
+    public void testSetClosedLoopEventStatus() {
+        assertThatIllegalArgumentException()
+            .isThrownBy(() -> new Abated().setClosedLoopEventStatus(ControlLoopEventStatus.ONSET));
+    }
+}
\ No newline at end of file
diff --git a/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/CanonicalAbatedTest.java b/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/CanonicalAbatedTest.java
new file mode 100644 (file)
index 0000000..d7007bc
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+
+public class CanonicalAbatedTest {
+
+    @Test
+    public void testConstructors() {
+        CanonicalAbated abated1 = new CanonicalAbated(new VirtualControlLoopEvent());
+        abated1.setRequestId(UUID.randomUUID());
+        abated1.setClosedLoopAlarmStart(Instant.now());
+        abated1.setClosedLoopAlarmEnd(Instant.now());
+
+        CanonicalAbated abated2 = new CanonicalAbated(new Abated());
+        abated2.setRequestId(UUID.randomUUID());
+        abated2.setClosedLoopAlarmStart(Instant.now());
+        abated2.setClosedLoopAlarmEnd(Instant.now());
+
+        CanonicalAbated abated3 = new CanonicalAbated(abated2);
+
+        assertEquals(abated1, abated2);
+        assertEquals(abated1, abated3);
+        assertEquals(ControlLoopEventStatus.ABATED, abated1.getClosedLoopEventStatus());
+        assertEquals(ControlLoopEventStatus.ABATED, abated2.getClosedLoopEventStatus());
+        assertEquals(ControlLoopEventStatus.ABATED, abated3.getClosedLoopEventStatus());
+
+        assertNotEquals(abated1.getRequestId(), abated2.getRequestId());
+        assertNotEquals(abated1.getClosedLoopAlarmStart(), abated2.getClosedLoopAlarmStart());
+        assertNotEquals(abated1.getClosedLoopAlarmEnd(), abated2.getClosedLoopAlarmEnd());
+
+        abated2.setFrom("here");
+        assertNotEquals(abated1, abated2);
+    }
+}
\ No newline at end of file
diff --git a/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/CanonicalOnsetTest.java b/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/CanonicalOnsetTest.java
new file mode 100644 (file)
index 0000000..7b0a43f
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.time.Instant;
+import java.util.UUID;
+import org.junit.Test;
+
+public class CanonicalOnsetTest {
+
+    @Test
+    public void testConstructors() {
+        CanonicalOnset onset1 = new CanonicalOnset(new VirtualControlLoopEvent());
+        onset1.setRequestId(UUID.randomUUID());
+        onset1.setClosedLoopAlarmStart(Instant.now());
+        onset1.setClosedLoopAlarmEnd(Instant.now());
+
+        CanonicalOnset onset2 = new CanonicalOnset(new Onset());
+        onset2.setRequestId(UUID.randomUUID());
+        onset2.setClosedLoopAlarmStart(Instant.now());
+        onset2.setClosedLoopAlarmEnd(Instant.now());
+
+        CanonicalOnset onset3 = new CanonicalOnset(onset2);
+
+        assertEquals(onset1, onset2);
+        assertEquals(onset1, onset3);
+        assertEquals(ControlLoopEventStatus.ONSET, onset1.getClosedLoopEventStatus());
+        assertEquals(ControlLoopEventStatus.ONSET, onset2.getClosedLoopEventStatus());
+        assertEquals(ControlLoopEventStatus.ONSET, onset3.getClosedLoopEventStatus());
+
+        assertNotEquals(onset1.getRequestId(), onset2.getRequestId());
+        assertNotEquals(onset1.getClosedLoopAlarmStart(), onset2.getClosedLoopAlarmStart());
+        assertNotEquals(onset1.getClosedLoopAlarmEnd(), onset2.getClosedLoopAlarmEnd());
+
+        onset2.setFrom("here");
+        assertNotEquals(onset1, onset2);
+    }
+}
\ No newline at end of file
diff --git a/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/OnsetTest.java b/models-interactions/model-impl/events/src/test/java/org/onap/policy/controlloop/OnsetTest.java
new file mode 100644 (file)
index 0000000..b229b02
--- /dev/null
@@ -0,0 +1,56 @@
+/*
+ * ============LICENSE_START=======================================================
+ * ONAP
+ * ================================================================================
+ * Copyright (C) 2020 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * 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.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.onap.policy.controlloop;
+
+import static org.assertj.core.api.Assertions.assertThatIllegalArgumentException;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+import java.time.Instant;
+import org.junit.Test;
+
+public class OnsetTest {
+
+    @Test
+    public void testConstructors() {
+        VirtualControlLoopEvent event = new VirtualControlLoopEvent();
+        event.setClosedLoopEventStatus(ControlLoopEventStatus.ONSET);
+        event.setClosedLoopAlarmStart(Instant.now());
+        event.setClosedLoopAlarmEnd(Instant.now());
+
+        Onset onset = new Onset(event);
+        assertEquals(onset, event);
+        assertEquals(event.getClosedLoopAlarmStart(), onset.getClosedLoopAlarmStart());
+        assertEquals(ControlLoopEventStatus.ONSET, onset.getClosedLoopEventStatus());
+        assertEquals(event.getClosedLoopAlarmEnd(), onset.getClosedLoopAlarmEnd());
+
+        onset.setClosedLoopAlarmEnd(Instant.now());
+        assertNotEquals(onset, event);
+
+        assertEquals(new Onset(onset), onset);
+    }
+
+    @Test
+    public void testSetClosedLoopEventStatus() {
+        assertThatIllegalArgumentException()
+            .isThrownBy(() -> new Onset().setClosedLoopEventStatus(ControlLoopEventStatus.ABATED));
+    }
+}
\ No newline at end of file