@@ -27,6 +27,7 @@ func populateRedisData() error {
2727 "../../fixtures/test/counters_db_data.json" ,
2828 "../../fixtures/test/config_db_data.json" ,
2929 "../../fixtures/test/appl_db_data.json" ,
30+ "../../fixtures/test/asic_db_data.json" ,
3031 "../../fixtures/test/state_db_data.json" ,
3132 }
3233
@@ -79,6 +80,7 @@ func TestMain(m *testing.M) {
7980 os .Setenv ("LLDP_INCLUDE_MGMT" , "true" )
8081 os .Setenv ("VLAN_ENABLED" , "true" )
8182 os .Setenv ("LAG_ENABLED" , "true" )
83+ os .Setenv ("FDB_ENABLED" , "true" )
8284 err = populateRedisData ()
8385 if err != nil {
8486 slog .Error ("failed to populate redis data" , "error" , err )
@@ -93,6 +95,7 @@ func TestMain(m *testing.M) {
9395 os .Unsetenv ("LLDP_INCLUDE_MGMT" )
9496 os .Unsetenv ("VLAN_ENABLED" )
9597 os .Unsetenv ("LAG_ENABLED" )
98+ os .Unsetenv ("FDB_ENABLED" )
9699 os .Exit (exitCode )
97100}
98101
@@ -375,3 +378,97 @@ func TestLagCollector(t *testing.T) {
375378 t .Errorf ("unexpected collecting result:\n %s" , err )
376379 }
377380}
381+
382+ func TestFdbCollector (t * testing.T ) {
383+ promslogConfig := & promslog.Config {}
384+ logger := promslog .New (promslogConfig )
385+
386+ fdbCollector := NewFdbCollector (logger )
387+
388+ problems , err := testutil .CollectAndLint (fdbCollector )
389+ if err != nil {
390+ t .Error ("metric lint completed with errors" )
391+ }
392+
393+ for _ , problem := range problems {
394+ t .Errorf ("metric %v has a problem: %v" , problem .Metric , problem .Text )
395+ }
396+
397+ metadata := `
398+ # HELP sonic_fdb_collector_success Whether FDB collector succeeded
399+ # TYPE sonic_fdb_collector_success gauge
400+ # HELP sonic_fdb_entries Number of FDB entries
401+ # TYPE sonic_fdb_entries gauge
402+ # HELP sonic_fdb_entries_unknown_vlan Number of FDB entries with unknown VLAN mapping
403+ # TYPE sonic_fdb_entries_unknown_vlan gauge
404+ `
405+
406+ expected := `
407+ sonic_fdb_collector_success 1
408+ sonic_fdb_entries 4
409+ sonic_fdb_entries_unknown_vlan 1
410+ `
411+
412+ if err := testutil .CollectAndCompare (fdbCollector , strings .NewReader (metadata + expected ), "sonic_fdb_collector_success" , "sonic_fdb_entries" , "sonic_fdb_entries_unknown_vlan" ); err != nil {
413+ t .Errorf ("unexpected collecting result:\n %s" , err )
414+ }
415+
416+ portMetadata := `
417+ # HELP sonic_fdb_entries_by_port Number of FDB entries by port
418+ # TYPE sonic_fdb_entries_by_port gauge
419+ `
420+
421+ portExpected := `
422+ sonic_fdb_entries_by_port{port="Ethernet0"} 2
423+ sonic_fdb_entries_by_port{port="Ethernet39"} 2
424+ `
425+
426+ if err := testutil .CollectAndCompare (fdbCollector , strings .NewReader (portMetadata + portExpected ), "sonic_fdb_entries_by_port" ); err != nil {
427+ t .Errorf ("unexpected collecting result:\n %s" , err )
428+ }
429+
430+ vlanMetadata := `
431+ # HELP sonic_fdb_entries_by_vlan Number of FDB entries by VLAN
432+ # TYPE sonic_fdb_entries_by_vlan gauge
433+ `
434+
435+ vlanExpected := `
436+ sonic_fdb_entries_by_vlan{vlan="1000"} 2
437+ sonic_fdb_entries_by_vlan{vlan="2000"} 1
438+ sonic_fdb_entries_by_vlan{vlan="unknown"} 1
439+ `
440+
441+ if err := testutil .CollectAndCompare (fdbCollector , strings .NewReader (vlanMetadata + vlanExpected ), "sonic_fdb_entries_by_vlan" ); err != nil {
442+ t .Errorf ("unexpected collecting result:\n %s" , err )
443+ }
444+
445+ typeMetadata := `
446+ # HELP sonic_fdb_entries_by_type Number of FDB entries by entry type
447+ # TYPE sonic_fdb_entries_by_type gauge
448+ `
449+
450+ typeExpected := `
451+ sonic_fdb_entries_by_type{entry_type="dynamic"} 3
452+ sonic_fdb_entries_by_type{entry_type="static"} 1
453+ `
454+
455+ if err := testutil .CollectAndCompare (fdbCollector , strings .NewReader (typeMetadata + typeExpected ), "sonic_fdb_entries_by_type" ); err != nil {
456+ t .Errorf ("unexpected collecting result:\n %s" , err )
457+ }
458+
459+ statusMetadata := `
460+ # HELP sonic_fdb_entries_skipped Number of FDB entries skipped during latest refresh
461+ # TYPE sonic_fdb_entries_skipped gauge
462+ # HELP sonic_fdb_entries_truncated Whether FDB collection hit max entries limit (1=yes, 0=no)
463+ # TYPE sonic_fdb_entries_truncated gauge
464+ `
465+
466+ statusExpected := `
467+ sonic_fdb_entries_skipped 1
468+ sonic_fdb_entries_truncated 0
469+ `
470+
471+ if err := testutil .CollectAndCompare (fdbCollector , strings .NewReader (statusMetadata + statusExpected ), "sonic_fdb_entries_skipped" , "sonic_fdb_entries_truncated" ); err != nil {
472+ t .Errorf ("unexpected collecting result:\n %s" , err )
473+ }
474+ }
0 commit comments