From d868eff3e1d63a7d46f5866d676570cc2f2be84a Mon Sep 17 00:00:00 2001 From: Anuraag Agrawal Date: Thu, 24 Feb 2022 09:08:05 +0900 Subject: [PATCH] Move view builders to top level (#4202) --- .../sdk/viewconfig/ViewConfig.java | 6 +- .../sdk/metrics/view/InstrumentSelector.java | 80 ++--------- .../view/InstrumentSelectorBuilder.java | 93 +++++++++++++ .../sdk/metrics/view/MeterSelector.java | 125 +++-------------- .../metrics/view/MeterSelectorBuilder.java | 127 ++++++++++++++++++ .../metrics/view/InstrumentSelectorTest.java | 35 +++++ .../sdk/metrics/view/MeterSelectorTest.java | 32 +++++ 7 files changed, 317 insertions(+), 181 deletions(-) create mode 100644 sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorBuilder.java create mode 100644 sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelectorBuilder.java create mode 100644 sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorTest.java diff --git a/sdk-extensions/metric-incubator/src/main/java/io/opentelemetry/sdk/viewconfig/ViewConfig.java b/sdk-extensions/metric-incubator/src/main/java/io/opentelemetry/sdk/viewconfig/ViewConfig.java index d5af5b317c..2a4e62389d 100644 --- a/sdk-extensions/metric-incubator/src/main/java/io/opentelemetry/sdk/viewconfig/ViewConfig.java +++ b/sdk-extensions/metric-incubator/src/main/java/io/opentelemetry/sdk/viewconfig/ViewConfig.java @@ -13,7 +13,9 @@ import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder; import io.opentelemetry.sdk.metrics.common.InstrumentType; import io.opentelemetry.sdk.metrics.view.Aggregation; import io.opentelemetry.sdk.metrics.view.InstrumentSelector; +import io.opentelemetry.sdk.metrics.view.InstrumentSelectorBuilder; import io.opentelemetry.sdk.metrics.view.MeterSelector; +import io.opentelemetry.sdk.metrics.view.MeterSelectorBuilder; import io.opentelemetry.sdk.metrics.view.View; import io.opentelemetry.sdk.metrics.view.ViewBuilder; import java.io.InputStream; @@ -198,7 +200,7 @@ public final class ViewConfig { // Visible for testing static InstrumentSelector toInstrumentSelector(SelectorSpecification selectorSpec) { - InstrumentSelector.Builder builder = InstrumentSelector.builder(); + InstrumentSelectorBuilder builder = InstrumentSelector.builder(); String instrumentName = selectorSpec.getInstrumentName(); if (instrumentName != null) { builder.setInstrumentName(instrumentName); @@ -208,7 +210,7 @@ public final class ViewConfig { builder.setInstrumentType(instrumentType); } - MeterSelector.Builder meterBuilder = MeterSelector.builder(); + MeterSelectorBuilder meterBuilder = MeterSelector.builder(); String meterName = selectorSpec.getMeterName(); if (meterName != null) { meterBuilder.setName(meterName); diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelector.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelector.java index cbe7d47d82..b28b89a52f 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelector.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelector.java @@ -7,10 +7,7 @@ package io.opentelemetry.sdk.metrics.view; import com.google.auto.value.AutoValue; import io.opentelemetry.sdk.metrics.common.InstrumentType; -import io.opentelemetry.sdk.metrics.internal.view.StringPredicates; -import java.util.Objects; import java.util.function.Predicate; -import java.util.regex.Pattern; import javax.annotation.Nullable; import javax.annotation.concurrent.Immutable; @@ -22,15 +19,16 @@ import javax.annotation.concurrent.Immutable; @Immutable public abstract class InstrumentSelector { - /** - * Returns a new {@link Builder} for {@link InstrumentSelector}. - * - * @return a new {@link Builder} for {@link InstrumentSelector}. - */ - public static Builder builder() { - return new AutoValue_InstrumentSelector.Builder() - .setInstrumentNameFilter(StringPredicates.ALL) - .setMeterSelector(MeterSelector.builder().build()); + /** Returns a new {@link InstrumentSelectorBuilder} for {@link InstrumentSelector}. */ + public static InstrumentSelectorBuilder builder() { + return new InstrumentSelectorBuilder(); + } + + static InstrumentSelector create( + @Nullable InstrumentType instrumentType, + Predicate instrumentNameFilter, + MeterSelector meterSelector) { + return new AutoValue_InstrumentSelector(instrumentType, instrumentNameFilter, meterSelector); } /** @@ -47,62 +45,4 @@ public abstract class InstrumentSelector { /** Returns the selections criteria for {@link io.opentelemetry.api.metrics.Meter}s. */ public abstract MeterSelector getMeterSelector(); - - /** Builder for {@link InstrumentSelector} instances. */ - @AutoValue.Builder - public abstract static class Builder { - /** Sets a specifier for {@link InstrumentType}. */ - public abstract Builder setInstrumentType(InstrumentType instrumentType); - - /** - * Sets the {@link Pattern} for instrument names that will be selected. - * - *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link - * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is - * used. - */ - public abstract Builder setInstrumentNameFilter(Predicate instrumentNameFilter); - - /** - * Sets the {@link Pattern} for instrument names that will be selected. - * - *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link - * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is - * used. - */ - public final Builder setInstrumentNamePattern(Pattern instrumentNamePattern) { - return setInstrumentNameFilter(StringPredicates.regex(instrumentNamePattern)); - } - - /** - * Sets the exact instrument name that will be selected. - * - *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link - * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is - * used. - */ - public final Builder setInstrumentName(String instrumentName) { - return setInstrumentNameFilter(StringPredicates.exact(instrumentName)); - } - - /** - * Sets a specifier for selecting Instruments by name. - * - *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link - * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is - * used. - */ - public final Builder setInstrumentNameRegex(String regex) { - return setInstrumentNamePattern(Pattern.compile(Objects.requireNonNull(regex, "regex"))); - } - - /** - * Sets the {@link MeterSelector} for which {@link io.opentelemetry.api.metrics.Meter}s will be - * included. - */ - public abstract Builder setMeterSelector(MeterSelector meterSelector); - - /** Returns an InstrumentSelector instance with the content of this builder. */ - public abstract InstrumentSelector build(); - } } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorBuilder.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorBuilder.java new file mode 100644 index 0000000000..c79c4bed6b --- /dev/null +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorBuilder.java @@ -0,0 +1,93 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.metrics.view; + +import static java.util.Objects.requireNonNull; + +import io.opentelemetry.sdk.metrics.common.InstrumentType; +import io.opentelemetry.sdk.metrics.internal.view.StringPredicates; +import java.util.function.Predicate; +import java.util.regex.Pattern; +import javax.annotation.Nullable; + +/** Builder for {@link InstrumentSelector}. */ +public final class InstrumentSelectorBuilder { + + @Nullable private InstrumentType instrumentType; + private Predicate instrumentNameFilter = StringPredicates.ALL; + private MeterSelector meterSelector = MeterSelector.builder().build(); + + /** Sets a specifier for {@link InstrumentType}. */ + public InstrumentSelectorBuilder setInstrumentType(InstrumentType instrumentType) { + requireNonNull(instrumentType, "instrumentType"); + this.instrumentType = instrumentType; + return this; + } + + /** + * Sets the {@link Pattern} for instrument names that will be selected. + * + *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link + * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is + * used. + */ + public InstrumentSelectorBuilder setInstrumentNameFilter(Predicate instrumentNameFilter) { + requireNonNull(instrumentNameFilter, "instrumentNameFilter"); + this.instrumentNameFilter = instrumentNameFilter; + return this; + } + + /** + * Sets the {@link Pattern} for instrument names that will be selected. + * + *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link + * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is + * used. + */ + public InstrumentSelectorBuilder setInstrumentNamePattern(Pattern instrumentNamePattern) { + requireNonNull(instrumentNamePattern, "instrumentNamePattern"); + return setInstrumentNameFilter(StringPredicates.regex(instrumentNamePattern)); + } + + /** + * Sets the exact instrument name that will be selected. + * + *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link + * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is + * used. + */ + public InstrumentSelectorBuilder setInstrumentName(String instrumentName) { + requireNonNull(instrumentName, "instrumentName"); + return setInstrumentNameFilter(StringPredicates.exact(instrumentName)); + } + + /** + * Sets a specifier for selecting Instruments by name. + * + *

Note: The last provided of {@link #setInstrumentNameFilter}, {@link + * #setInstrumentNamePattern} {@link #setInstrumentNameRegex} and {@link #setInstrumentName} is + * used. + */ + public InstrumentSelectorBuilder setInstrumentNameRegex(String instrumentNameRegex) { + requireNonNull(instrumentNameRegex, "instrumentNameRegex"); + return setInstrumentNamePattern(Pattern.compile(instrumentNameRegex)); + } + + /** + * Sets the {@link MeterSelector} for which {@link io.opentelemetry.api.metrics.Meter}s will be + * included. + */ + public InstrumentSelectorBuilder setMeterSelector(MeterSelector meterSelector) { + requireNonNull(meterSelector, "meterSelector"); + this.meterSelector = meterSelector; + return this; + } + + /** Returns an InstrumentSelector instance with the content of this builder. */ + public InstrumentSelector build() { + return InstrumentSelector.create(instrumentType, instrumentNameFilter, meterSelector); + } +} diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelector.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelector.java index af55ebb246..25fed09c75 100644 --- a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelector.java +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelector.java @@ -6,7 +6,6 @@ package io.opentelemetry.sdk.metrics.view; import com.google.auto.value.AutoValue; -import io.opentelemetry.sdk.metrics.internal.view.StringPredicates; import java.util.function.Predicate; import java.util.regex.Pattern; import javax.annotation.concurrent.Immutable; @@ -19,125 +18,33 @@ import javax.annotation.concurrent.Immutable; @Immutable public abstract class MeterSelector { - /** - * Returns a new {@link Builder} for {@link InstrumentSelector}. - * - * @return a new {@link Builder} for {@link InstrumentSelector}. - */ - public static Builder builder() { - return new AutoValue_MeterSelector.Builder() - .setNameFilter(StringPredicates.ALL) - .setVersionFilter(StringPredicates.ALL) - .setSchemaUrlFilter(StringPredicates.ALL); + /** Returns a new {@link MeterSelectorBuilder} for {@link InstrumentSelector}. */ + public static MeterSelectorBuilder builder() { + return new MeterSelectorBuilder(); + } + + static MeterSelector create( + Predicate nameFilter, + Predicate versionFilter, + Predicate schemaUrlFilter) { + return new AutoValue_MeterSelector(nameFilter, versionFilter, schemaUrlFilter); } /** - * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link Builder}, or - * {@code Pattern.compile(".*")} if none was specified. + * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link + * MeterSelectorBuilder}, or {@code Pattern.compile(".*")} if none was specified. */ public abstract Predicate getNameFilter(); /** - * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link Builder}, or - * {@code Pattern.compile(".*")} if none was specified. + * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link + * MeterSelectorBuilder}, or {@code Pattern.compile(".*")} if none was specified. */ public abstract Predicate getVersionFilter(); /** - * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link Builder}, or - * {@code Pattern.compile(".*")} if none was specified. + * Returns the {@link Pattern} generated by the provided {@code regex} in the {@link + * MeterSelectorBuilder}, or {@code Pattern.compile(".*")} if none was specified. */ public abstract Predicate getSchemaUrlFilter(); - - /** Builder for {@link InstrumentSelector} instances. */ - @AutoValue.Builder - public abstract static class Builder { - - /** - * Sets the {@link Predicate} for matching name. - * - *

Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link - * #setName} is used. - */ - public abstract Builder setNameFilter(Predicate filter); - - /** - * Sets the {@link Pattern} for matching name. - * - *

Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link - * #setName} is used. - */ - public final Builder setNamePattern(Pattern pattern) { - return setNameFilter(StringPredicates.regex(pattern)); - } - - /** - * Sets a specifier for selecting Instruments by name. - * - *

Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link - * #setName} is used. - */ - public final Builder setName(String name) { - return setNameFilter(StringPredicates.exact(name)); - } - - /** - * Sets the {@link Predicate} for matching versions. - * - *

Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and - * {@link #setVersion} is used. - */ - public abstract Builder setVersionFilter(Predicate filter); - - /** - * Sets the {@link Pattern} for matching versions. - * - *

Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and - * {@link #setVersion} is used. - */ - public final Builder setVersionPattern(Pattern pattern) { - return setVersionFilter(StringPredicates.regex(pattern)); - } - - /** - * Sets a specifier for selecting Meters by version. - * - *

Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and - * {@link #setVersion} is used. - */ - public final Builder setVersion(String version) { - return setVersionFilter(StringPredicates.exact(version)); - } - - /** - * Sets the {@link Predicate} for matching schema urls. - * - *

Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and - * {@link #setSchemaUrl} is used. - */ - abstract Builder setSchemaUrlFilter(Predicate filter); - - /** - * Sets the {@link Pattern} for matching schema urls. - * - *

Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and - * {@link #setSchemaUrl} is used. - */ - public final Builder setSchemaUrlPattern(Pattern pattern) { - return setSchemaUrlFilter(StringPredicates.regex(pattern)); - } - - /** - * Sets the schema url to match. - * - *

Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and - * {@link #setSchemaUrl} is used. - */ - public final Builder setSchemaUrl(String url) { - return setSchemaUrlFilter(StringPredicates.exact(url)); - } - - /** Returns an InstrumentSelector instance with the content of this builder. */ - public abstract MeterSelector build(); - } } diff --git a/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelectorBuilder.java b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelectorBuilder.java new file mode 100644 index 0000000000..6dcd4b382e --- /dev/null +++ b/sdk/metrics/src/main/java/io/opentelemetry/sdk/metrics/view/MeterSelectorBuilder.java @@ -0,0 +1,127 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.metrics.view; + +import static java.util.Objects.requireNonNull; + +import io.opentelemetry.sdk.metrics.internal.view.StringPredicates; +import java.util.function.Predicate; +import java.util.regex.Pattern; + +/** Builder for {@link MeterSelector}. */ +public final class MeterSelectorBuilder { + + private Predicate nameFilter = StringPredicates.ALL; + private Predicate versionFilter = StringPredicates.ALL; + private Predicate schemaUrlFilter = StringPredicates.ALL; + + /** + * Sets the {@link Predicate} for matching name. + * + *

Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link + * #setName} is used. + */ + public MeterSelectorBuilder setNameFilter(Predicate nameFilter) { + requireNonNull(nameFilter, "nameFilter"); + this.nameFilter = nameFilter; + return this; + } + + /** + * Sets the {@link Pattern} for matching name. + * + *

Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link + * #setName} is used. + */ + public MeterSelectorBuilder setNamePattern(Pattern pattern) { + requireNonNull(pattern, "pattern"); + return setNameFilter(StringPredicates.regex(pattern)); + } + + /** + * Sets a specifier for selecting Instruments by name. + * + *

Note: The last provided of {@link #setNameFilter}, {@link #setNamePattern} and {@link + * #setName} is used. + */ + public MeterSelectorBuilder setName(String name) { + requireNonNull(name, "name"); + return setNameFilter(StringPredicates.exact(name)); + } + + /** + * Sets the {@link Predicate} for matching versions. + * + *

Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and {@link + * #setVersion} is used. + */ + public MeterSelectorBuilder setVersionFilter(Predicate versionFilter) { + requireNonNull(versionFilter, "versionFilter"); + this.versionFilter = versionFilter; + return this; + } + + /** + * Sets the {@link Pattern} for matching versions. + * + *

Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and {@link + * #setVersion} is used. + */ + public MeterSelectorBuilder setVersionPattern(Pattern pattern) { + requireNonNull(pattern, "pattern"); + return setVersionFilter(StringPredicates.regex(pattern)); + } + + /** + * Sets a specifier for selecting Meters by version. + * + *

Note: The last provided of {@link #setVersionFilter}, {@link #setVersionPattern} and {@link + * #setVersion} is used. + */ + public MeterSelectorBuilder setVersion(String version) { + requireNonNull(version, "version"); + return setVersionFilter(StringPredicates.exact(version)); + } + + /** + * Sets the {@link Predicate} for matching schema urls. + * + *

Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and + * {@link #setSchemaUrl} is used. + */ + public MeterSelectorBuilder setSchemaUrlFilter(Predicate schemaUrlFilter) { + requireNonNull(schemaUrlFilter, "schemaUrlFilter"); + this.schemaUrlFilter = schemaUrlFilter; + return this; + } + + /** + * Sets the {@link Pattern} for matching schema urls. + * + *

Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and + * {@link #setSchemaUrl} is used. + */ + public MeterSelectorBuilder setSchemaUrlPattern(Pattern pattern) { + requireNonNull(pattern, "pattern"); + return setSchemaUrlFilter(StringPredicates.regex(pattern)); + } + + /** + * Sets the schema url to match. + * + *

Note: The last provided of {@link #setSchemaUrlFilter}, {@link #setSchemaUrlPattern} and + * {@link #setSchemaUrl} is used. + */ + public MeterSelectorBuilder setSchemaUrl(String schemaUrl) { + requireNonNull(schemaUrl, "schemaUrl"); + return setSchemaUrlFilter(StringPredicates.exact(schemaUrl)); + } + + /** Returns an InstrumentSelector instance with the content of this builder. */ + public MeterSelector build() { + return MeterSelector.create(nameFilter, versionFilter, schemaUrlFilter); + } +} diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorTest.java new file mode 100644 index 0000000000..fb86f554d1 --- /dev/null +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/InstrumentSelectorTest.java @@ -0,0 +1,35 @@ +/* + * Copyright The OpenTelemetry Authors + * SPDX-License-Identifier: Apache-2.0 + */ + +package io.opentelemetry.sdk.metrics.view; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import org.junit.jupiter.api.Test; + +class InstrumentSelectorTest { + + @Test + void invalidArgs() { + assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentType(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("instrumentType"); + assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentNameFilter(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("instrumentNameFilter"); + assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentNamePattern(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("instrumentNamePattern"); + assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentName(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("instrumentName"); + assertThatThrownBy(() -> InstrumentSelector.builder().setInstrumentNameRegex(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("instrumentNameRegex"); + assertThatThrownBy(() -> InstrumentSelector.builder().setMeterSelector(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("meterSelector"); + } +} diff --git a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/MeterSelectorTest.java b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/MeterSelectorTest.java index 14c8059de3..0fb8bbb93b 100644 --- a/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/MeterSelectorTest.java +++ b/sdk/metrics/src/test/java/io/opentelemetry/sdk/metrics/view/MeterSelectorTest.java @@ -6,6 +6,7 @@ package io.opentelemetry.sdk.metrics.view; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; import java.util.regex.Pattern; import org.junit.jupiter.api.Test; @@ -106,4 +107,35 @@ public class MeterSelectorTest { assertThat(schemaUrl.getSchemaUrlFilter().test("1.0")).isFalse(); assertThat(schemaUrl.getSchemaUrlFilter().test("1.2")).isFalse(); } + + @Test + void invalidArgs() { + assertThatThrownBy(() -> MeterSelector.builder().setNameFilter(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("nameFilter"); + assertThatThrownBy(() -> MeterSelector.builder().setNamePattern(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("pattern"); + assertThatThrownBy(() -> MeterSelector.builder().setName(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("name"); + assertThatThrownBy(() -> MeterSelector.builder().setVersionFilter(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("versionFilter"); + assertThatThrownBy(() -> MeterSelector.builder().setVersionPattern(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("pattern"); + assertThatThrownBy(() -> MeterSelector.builder().setVersion(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("version"); + assertThatThrownBy(() -> MeterSelector.builder().setSchemaUrlFilter(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("schemaUrlFilter"); + assertThatThrownBy(() -> MeterSelector.builder().setSchemaUrlPattern(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("pattern"); + assertThatThrownBy(() -> MeterSelector.builder().setSchemaUrl(null)) + .isInstanceOf(NullPointerException.class) + .hasMessage("schemaUrl"); + } }