From 8e4b1e40c296df311869c2f8db422166748fb7c0 Mon Sep 17 00:00:00 2001 From: Sebastian Sdorra Date: Wed, 4 Nov 2020 08:20:29 +0100 Subject: [PATCH] Remove setter of SpanContext, because it should be immutable --- .../java/sonia/scm/trace/SpanContext.java | 33 ++++++----- .../java/sonia/scm/trace/SpanContextTest.java | 57 +++++++++++++++++++ 2 files changed, 75 insertions(+), 15 deletions(-) create mode 100644 scm-core/src/test/java/sonia/scm/trace/SpanContextTest.java diff --git a/scm-core/src/main/java/sonia/scm/trace/SpanContext.java b/scm-core/src/main/java/sonia/scm/trace/SpanContext.java index 8c9dba2bcd..d158933d7a 100644 --- a/scm-core/src/main/java/sonia/scm/trace/SpanContext.java +++ b/scm-core/src/main/java/sonia/scm/trace/SpanContext.java @@ -26,9 +26,9 @@ package sonia.scm.trace; import lombok.AccessLevel; import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.NoArgsConstructor; -import lombok.Setter; import sonia.scm.xml.XmlInstantAdapter; import javax.xml.bind.annotation.XmlAccessType; @@ -44,21 +44,30 @@ import java.util.Map; * * @since 2.9.0 */ +@Getter @XmlRootElement +@EqualsAndHashCode +@AllArgsConstructor @XmlAccessorType(XmlAccessType.FIELD) @NoArgsConstructor(access = AccessLevel.PACKAGE) -@AllArgsConstructor(access = AccessLevel.PACKAGE) -@Getter -@Setter public class SpanContext { - String kind; - Map labels; + private String kind; + private Map labels; @XmlJavaTypeAdapter(XmlInstantAdapter.class) - Instant opened; + private Instant opened; @XmlJavaTypeAdapter(XmlInstantAdapter.class) - Instant closed; - boolean failed; + private Instant closed; + private boolean failed; + + /** + * Returns the label with the given key or {@code null}. + * @param key key of label + * @return label or {@code null} + */ + public String label(String key) { + return labels.get(key); + } /** * Calculates the duration of the span. @@ -68,10 +77,4 @@ public class SpanContext { public Duration duration() { return Duration.between(opened, closed); } - - // For testing - public static SpanContext create(String kind, Map labels, Instant opened, Instant closed, boolean failed) { - return new SpanContext(kind, labels, opened, closed, failed); - } - } diff --git a/scm-core/src/test/java/sonia/scm/trace/SpanContextTest.java b/scm-core/src/test/java/sonia/scm/trace/SpanContextTest.java new file mode 100644 index 0000000000..87bba53753 --- /dev/null +++ b/scm-core/src/test/java/sonia/scm/trace/SpanContextTest.java @@ -0,0 +1,57 @@ +/* + * MIT License + * + * Copyright (c) 2020-present Cloudogu GmbH and Contributors + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +package sonia.scm.trace; + +import com.google.common.collect.ImmutableMap; +import org.junit.jupiter.api.Test; + +import javax.xml.bind.JAXB; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.time.Instant; + +import static org.assertj.core.api.Assertions.assertThat; + +class SpanContextTest { + + @Test + void shouldMarshalAndUnmarshal() { + Instant now = Instant.now(); + SpanContext span = new SpanContext( + "jenkins", ImmutableMap.of("one", "1"), now, now, true + ); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + JAXB.marshal(span, baos); + span = JAXB.unmarshal(new ByteArrayInputStream(baos.toByteArray()), SpanContext.class); + + assertThat(span.getKind()).isEqualTo("jenkins"); + assertThat(span.label("one")).isEqualTo("1"); + assertThat(span.getOpened()).isEqualTo(now); + assertThat(span.getClosed()).isEqualTo(now); + assertThat(span.isFailed()).isTrue(); + } + +}