@@ -176,3 +176,161 @@ impl IBFabricManager for IBFabricManagerImpl {
176176 }
177177 }
178178}
179+
180+ #[ cfg( test) ]
181+ mod tests {
182+ use async_trait:: async_trait;
183+ use carbide_secrets:: SecretsError ;
184+ use carbide_test_support:: Outcome :: * ;
185+ use carbide_test_support:: scenarios;
186+
187+ use super :: * ;
188+
189+ struct NoopCredentialReader ;
190+
191+ #[ async_trait]
192+ impl CredentialReader for NoopCredentialReader {
193+ async fn get_credentials (
194+ & self ,
195+ _key : & CredentialKey ,
196+ ) -> Result < Option < Credentials > , SecretsError > {
197+ Ok ( None )
198+ }
199+ }
200+
201+ #[ derive( Clone , Copy , Debug ) ]
202+ enum ManagerCase {
203+ ValidDisabled ,
204+ EmptyEndpointList ,
205+ MultipleEndpoints ,
206+ InvalidEndpoint ,
207+ }
208+
209+ #[ derive( Debug , PartialEq ) ]
210+ struct ManagerConfigSummary {
211+ endpoint_count : usize ,
212+ manager_type : & ' static str ,
213+ max_partition_per_tenant : i32 ,
214+ allow_insecure_fabric_configuration : bool ,
215+ fabric_manager_run_interval_secs : u64 ,
216+ }
217+
218+ fn credential_reader ( ) -> Arc < dyn CredentialReader > {
219+ Arc :: new ( NoopCredentialReader )
220+ }
221+
222+ fn manager_type_name ( manager_type : IBFabricManagerType ) -> & ' static str {
223+ match manager_type {
224+ IBFabricManagerType :: Disable => "disable" ,
225+ #[ cfg( feature = "test-support" ) ]
226+ IBFabricManagerType :: Mock => "mock" ,
227+ IBFabricManagerType :: Rest => "rest" ,
228+ }
229+ }
230+
231+ fn summarize_manager_config ( config : IBFabricManagerConfig ) -> ManagerConfigSummary {
232+ ManagerConfigSummary {
233+ endpoint_count : config. endpoints . len ( ) ,
234+ manager_type : manager_type_name ( config. manager_type ) ,
235+ max_partition_per_tenant : config. max_partition_per_tenant ,
236+ allow_insecure_fabric_configuration : config. allow_insecure_fabric_configuration ,
237+ fabric_manager_run_interval_secs : config. fabric_manager_run_interval . as_secs ( ) ,
238+ }
239+ }
240+
241+ fn config_for_case ( case : ManagerCase ) -> IBFabricManagerConfig {
242+ let mut config = IBFabricManagerConfig :: default ( ) ;
243+ match case {
244+ ManagerCase :: ValidDisabled => {
245+ config. endpoints . insert (
246+ "fabric-a" . to_string ( ) ,
247+ vec ! [ "https://127.0.0.1:443" . to_string( ) ] ,
248+ ) ;
249+ }
250+ ManagerCase :: EmptyEndpointList => {
251+ config. endpoints . insert ( "fabric-a" . to_string ( ) , vec ! [ ] ) ;
252+ }
253+ ManagerCase :: MultipleEndpoints => {
254+ config. endpoints . insert (
255+ "fabric-a" . to_string ( ) ,
256+ vec ! [
257+ "https://127.0.0.1:443" . to_string( ) ,
258+ "https://127.0.0.2:443" . to_string( ) ,
259+ ] ,
260+ ) ;
261+ }
262+ ManagerCase :: InvalidEndpoint => {
263+ config
264+ . endpoints
265+ . insert ( "fabric-a" . to_string ( ) , vec ! [ "not a uri" . to_string( ) ] ) ;
266+ }
267+ }
268+ config
269+ }
270+
271+ fn create_manager ( case : ManagerCase ) -> Result < ManagerConfigSummary , & ' static str > {
272+ create_ib_fabric_manager ( credential_reader ( ) , config_for_case ( case) )
273+ . map ( |manager| summarize_manager_config ( manager. get_config ( ) ) )
274+ . map_err ( manager_error_kind)
275+ }
276+
277+ fn manager_error_kind ( error : eyre:: Report ) -> & ' static str {
278+ let error = error. to_string ( ) ;
279+ if error. contains ( "Exactly 1 endpoint" ) {
280+ "endpoint-count"
281+ } else if error. contains ( "not a valid HTTP(S) URI" ) {
282+ "invalid-uri"
283+ } else {
284+ "unknown"
285+ }
286+ }
287+
288+ #[ test]
289+ fn default_manager_config_uses_disabled_defaults ( ) {
290+ assert_eq ! (
291+ summarize_manager_config( IBFabricManagerConfig :: default ( ) ) ,
292+ ManagerConfigSummary {
293+ endpoint_count: 0 ,
294+ manager_type: "disable" ,
295+ max_partition_per_tenant: config:: IBFabricConfig :: default_max_partition_per_tenant(
296+ ) ,
297+ allow_insecure_fabric_configuration: false ,
298+ fabric_manager_run_interval_secs: 60 ,
299+ }
300+ ) ;
301+ }
302+
303+ #[ test]
304+ fn validates_manager_endpoints ( ) {
305+ scenarios ! ( create_manager:
306+ "valid config" {
307+ ManagerCase :: ValidDisabled => Yields ( ManagerConfigSummary {
308+ endpoint_count: 1 ,
309+ manager_type: "disable" ,
310+ max_partition_per_tenant: config:: IBFabricConfig :: default_max_partition_per_tenant( ) ,
311+ allow_insecure_fabric_configuration: false ,
312+ fabric_manager_run_interval_secs: 60 ,
313+ } ) ,
314+ }
315+
316+ "invalid endpoints" {
317+ ManagerCase :: EmptyEndpointList => FailsWith ( "endpoint-count" ) ,
318+ ManagerCase :: MultipleEndpoints => FailsWith ( "endpoint-count" ) ,
319+ ManagerCase :: InvalidEndpoint => FailsWith ( "invalid-uri" ) ,
320+ }
321+ ) ;
322+ }
323+
324+ #[ tokio:: test]
325+ async fn disabled_manager_returns_disabled_client ( ) {
326+ let manager =
327+ create_ib_fabric_manager ( credential_reader ( ) , IBFabricManagerConfig :: default ( ) )
328+ . unwrap ( ) ;
329+ let client = manager. new_client ( "fabric-a" ) . await . unwrap ( ) ;
330+
331+ assert_eq ! (
332+ client. get_fabric_config( ) . await . unwrap_err( ) . to_string( ) ,
333+ "Failed to call IBFabricManager: ib fabric is disabled"
334+ ) ;
335+ }
336+ }
0 commit comments