66package io .opentelemetry .contrib .dynamic .policy .registry ;
77
88import static org .assertj .core .api .Assertions .assertThat ;
9+ import static org .assertj .core .api .Assertions .assertThatThrownBy ;
910import static org .mockito .Mockito .mock ;
1011import static org .mockito .Mockito .verify ;
1112import static org .mockito .Mockito .when ;
1213
14+ import io .opentelemetry .api .incubator .config .DeclarativeConfigProperties ;
1315import io .opentelemetry .contrib .dynamic .policy .tracesampling .TraceSamplingRatePolicy ;
1416import io .opentelemetry .sdk .autoconfigure .spi .AutoConfigurationCustomizer ;
1517import io .opentelemetry .sdk .autoconfigure .spi .ConfigProperties ;
1618import java .lang .reflect .Method ;
19+ import java .nio .charset .StandardCharsets ;
20+ import java .nio .file .Files ;
21+ import java .nio .file .Path ;
22+ import java .util .Collections ;
1723import java .util .Map ;
1824import java .util .function .Function ;
1925import org .junit .jupiter .api .AfterEach ;
2026import org .junit .jupiter .api .Test ;
27+ import org .junit .jupiter .api .io .TempDir ;
2128import org .mockito .ArgumentCaptor ;
2229
2330class PolicyInitTest {
31+ @ TempDir Path tempDir ;
2432
2533 @ AfterEach
2634 void tearDown () throws Exception {
@@ -60,6 +68,49 @@ void doesNotInitializePolicyWhenTopLevelTelemetryPolicyDeclarativeConfigMissing(
6068 assertThat (ignored ).isNotNull ();
6169 }
6270
71+ @ Test
72+ void initializesPolicyFromInitConfigInAutoConfigurationMode () throws Exception {
73+ AutoConfigurationCustomizer customizer = mock (AutoConfigurationCustomizer .class );
74+ PolicyInit .init (customizer );
75+ Function <ConfigProperties , Map <String , String >> propertiesCustomizer =
76+ capturePropertiesCustomizer (customizer );
77+
78+ Path configPath = tempDir .resolve ("policy-init.json" );
79+ Files .write (configPath , minimalJsonInitConfig ().getBytes (StandardCharsets .UTF_8 ));
80+
81+ ConfigProperties config = mock (ConfigProperties .class );
82+ when (config .getString (PolicyInitConfig .POLICY_INIT_CONFIG_PROPERTY_YAML )).thenReturn (null );
83+ when (config .getString (PolicyInitConfig .POLICY_INIT_CONFIG_PROPERTY_JSON ))
84+ .thenReturn (configPath .toString ());
85+
86+ Map <String , String > ignored = propertiesCustomizer .apply (config );
87+
88+ assertThat (ignored ).isNotNull ();
89+ assertThat (TraceSamplingRatePolicy .getInitializedSampler ()).isNotNull ();
90+ }
91+
92+ @ Test
93+ void initializesRegisteredPolicyTypeFromDeclarativeConfig () {
94+ ConfigProperties config = mock (ConfigProperties .class );
95+
96+ PolicyInit .initFromDeclarativeConfig (
97+ telemetryPolicyNodeConfig (TraceSamplingRatePolicy .POLICY_TYPE ), config );
98+
99+ assertThat (TraceSamplingRatePolicy .getInitializedSampler ()).isNotNull ();
100+ }
101+
102+ @ Test
103+ void throwsWhenDeclarativeConfigUsesUnknownPolicyType () {
104+ ConfigProperties config = mock (ConfigProperties .class );
105+
106+ assertThatThrownBy (
107+ () ->
108+ PolicyInit .initFromDeclarativeConfig (
109+ telemetryPolicyNodeConfig ("trace_sampling_rate_policy" ), config ))
110+ .isInstanceOf (IllegalArgumentException .class )
111+ .hasMessageContaining ("Unknown policyType" );
112+ }
113+
63114 private static Function <ConfigProperties , Map <String , String >> capturePropertiesCustomizer (
64115 AutoConfigurationCustomizer customizer ) {
65116 @ SuppressWarnings ("unchecked" )
@@ -74,4 +125,29 @@ private static void invokeStaticNoArg(Class<?> targetClass, String methodName) t
74125 method .setAccessible (true );
75126 method .invoke (null );
76127 }
128+
129+ private static DeclarativeConfigProperties telemetryPolicyNodeConfig (String policyType ) {
130+ DeclarativeConfigProperties telemetryPolicy = mock (DeclarativeConfigProperties .class );
131+ DeclarativeConfigProperties source = mock (DeclarativeConfigProperties .class );
132+ DeclarativeConfigProperties mapping = mock (DeclarativeConfigProperties .class );
133+
134+ when (telemetryPolicy .getStructuredList (PolicyInitConfig .SOURCES_DECLARATIVE_KEY ))
135+ .thenReturn (Collections .singletonList (source ));
136+ when (source .getString (PolicyInitConfig .KIND_DECLARATIVE_KEY )).thenReturn ("opamp" );
137+ when (source .getString (PolicyInitConfig .FORMAT_DECLARATIVE_KEY )).thenReturn ("jsonkeyvalue" );
138+ when (source .getString (PolicyInitConfig .LOCATION_DECLARATIVE_KEY )).thenReturn ("vendor" );
139+ when (source .getStructuredList (PolicyInitConfig .MAPPINGS_DECLARATIVE_KEY ))
140+ .thenReturn (Collections .singletonList (mapping ));
141+ when (mapping .getString (PolicyInitConfig .SOURCE_KEY_DECLARATIVE_KEY ))
142+ .thenReturn ("sampling_rate" );
143+ when (mapping .getString (PolicyInitConfig .POLICY_TYPE_DECLARATIVE_KEY )).thenReturn (policyType );
144+ return telemetryPolicy ;
145+ }
146+
147+ private static String minimalJsonInitConfig () {
148+ return "{\" sources\" :[{\" kind\" :\" opamp\" ,\" format\" :\" jsonkeyvalue\" ,\" location\" :\" vendor\" ,"
149+ + "\" mappings\" :[{\" sourceKey\" :\" sampling_rate\" ,\" policyType\" :\" "
150+ + TraceSamplingRatePolicy .POLICY_TYPE
151+ + "\" }]}]}" ;
152+ }
77153}
0 commit comments