@@ -8,6 +8,8 @@ extern "C" {
8
8
#include " swss/table.h"
9
9
#include " swss/tokenize.h"
10
10
11
+ #include " lib/inc/Recorder.h"
12
+
11
13
#include " meta/sai_serialize.h"
12
14
#include " meta/SaiAttributeList.h"
13
15
@@ -17,9 +19,13 @@ extern "C" {
17
19
#include < chrono>
18
20
#include < vector>
19
21
22
+ #define ASSERT_EQ (a,b ) if ((a) != (b)) { SWSS_LOG_THROW (" ASSERT EQ FAILED: " #a " != " #b); }
23
+
20
24
using namespace saimeta ;
21
25
using namespace sairedis ;
22
26
27
+ const std::string SairedisRecFilename = " sairedis.rec" ;
28
+
23
29
sai_object_type_t sai_object_type_query (
24
30
_In_ sai_object_id_t objectId)
25
31
{
@@ -761,6 +767,144 @@ static sai_object_type_t deserialize_object_type(
761
767
return object_type;
762
768
}
763
769
770
+ static std::vector<std::string> parseFirstRecordedAPI ()
771
+ {
772
+ SWSS_LOG_ENTER ();
773
+
774
+ const auto delimiter = ' |' ;
775
+ std::ifstream infile (SairedisRecFilename);
776
+ std::string line;
777
+ // skip first line
778
+ std::getline (infile, line);
779
+ std::getline (infile, line);
780
+
781
+ std::vector<std::string> tokens;
782
+ std::stringstream sstream (line);
783
+ std::string token;
784
+ // skip first, it is a timestamp
785
+ std::getline (sstream, token, delimiter);
786
+ while (std::getline (sstream, token, delimiter)) {
787
+ tokens.push_back (token);
788
+ }
789
+ return tokens;
790
+ }
791
+
792
+ static void test_recorder_enum_value_capability_query_request (
793
+ sai_object_id_t switch_id,
794
+ sai_object_type_t object_type,
795
+ sai_attr_id_t attr_id,
796
+ const std::vector<std::string>& expectedOutput)
797
+ {
798
+ SWSS_LOG_ENTER ();
799
+
800
+ remove (SairedisRecFilename.c_str ());
801
+
802
+ Recorder recorder;
803
+ recorder.enableRecording (true );
804
+
805
+ sai_s32_list_t enum_values_capability {.count = 0 , .list = nullptr };
806
+
807
+ recorder.recordQueryAattributeEnumValuesCapability (
808
+ switch_id,
809
+ object_type,
810
+ attr_id,
811
+ &enum_values_capability
812
+ );
813
+
814
+ auto tokens = parseFirstRecordedAPI ();
815
+ ASSERT_EQ (tokens, expectedOutput);
816
+ }
817
+
818
+ static void test_recorder_enum_value_capability_query_response (
819
+ sai_status_t status,
820
+ sai_object_type_t object_type,
821
+ sai_attr_id_t attr_id,
822
+ std::vector<int32_t > enumList,
823
+ const std::vector<std::string>& expectedOutput)
824
+ {
825
+ SWSS_LOG_ENTER ();
826
+
827
+ remove (SairedisRecFilename.c_str ());
828
+
829
+ Recorder recorder;
830
+ recorder.enableRecording (true );
831
+
832
+ sai_s32_list_t enum_values_capability;
833
+ enum_values_capability.count = static_cast <int32_t >(enumList.size ());
834
+ enum_values_capability.list = enumList.data ();
835
+
836
+ recorder.recordQueryAattributeEnumValuesCapabilityResponse (
837
+ status,
838
+ object_type,
839
+ attr_id,
840
+ &enum_values_capability
841
+ );
842
+
843
+ auto tokens = parseFirstRecordedAPI ();
844
+ ASSERT_EQ (tokens, expectedOutput);
845
+ }
846
+
847
+ static void test_recorder_enum_value_capability_query ()
848
+ {
849
+ SWSS_LOG_ENTER ();
850
+
851
+ test_recorder_enum_value_capability_query_request (
852
+ 1 ,
853
+ SAI_OBJECT_TYPE_DEBUG_COUNTER,
854
+ SAI_DEBUG_COUNTER_ATTR_TYPE,
855
+ {
856
+ " q" ,
857
+ " attribute_enum_values_capability" ,
858
+ " SAI_OBJECT_TYPE_SWITCH:oid:0x1" ,
859
+ " SAI_DEBUG_COUNTER_ATTR_TYPE=0" ,
860
+ }
861
+ );
862
+ test_recorder_enum_value_capability_query_response (
863
+ SAI_STATUS_SUCCESS,
864
+ SAI_OBJECT_TYPE_DEBUG_COUNTER,
865
+ SAI_DEBUG_COUNTER_ATTR_TYPE,
866
+ {
867
+ SAI_DEBUG_COUNTER_TYPE_PORT_IN_DROP_REASONS,
868
+ SAI_DEBUG_COUNTER_TYPE_PORT_OUT_DROP_REASONS,
869
+ SAI_DEBUG_COUNTER_TYPE_SWITCH_IN_DROP_REASONS,
870
+ SAI_DEBUG_COUNTER_TYPE_SWITCH_OUT_DROP_REASONS,
871
+ },
872
+ {
873
+ " Q" ,
874
+ " attribute_enum_values_capability" ,
875
+ " SAI_STATUS_SUCCESS" ,
876
+ " SAI_DEBUG_COUNTER_ATTR_TYPE=4:SAI_DEBUG_COUNTER_TYPE_PORT_IN_DROP_REASONS,SAI_DEBUG_COUNTER_TYPE_PORT_OUT_DROP_REASONS,"
877
+ " SAI_DEBUG_COUNTER_TYPE_SWITCH_IN_DROP_REASONS,SAI_DEBUG_COUNTER_TYPE_SWITCH_OUT_DROP_REASONS" ,
878
+ }
879
+ );
880
+ test_recorder_enum_value_capability_query_request (
881
+ 1 ,
882
+ SAI_OBJECT_TYPE_DEBUG_COUNTER,
883
+ SAI_DEBUG_COUNTER_ATTR_IN_DROP_REASON_LIST,
884
+ {
885
+ " q" ,
886
+ " attribute_enum_values_capability" ,
887
+ " SAI_OBJECT_TYPE_SWITCH:oid:0x1" ,
888
+ " SAI_DEBUG_COUNTER_ATTR_IN_DROP_REASON_LIST=0" ,
889
+ }
890
+ );
891
+ test_recorder_enum_value_capability_query_response (
892
+ SAI_STATUS_SUCCESS,
893
+ SAI_OBJECT_TYPE_DEBUG_COUNTER,
894
+ SAI_DEBUG_COUNTER_ATTR_IN_DROP_REASON_LIST,
895
+ {
896
+ SAI_IN_DROP_REASON_L2_ANY,
897
+ SAI_IN_DROP_REASON_L3_ANY
898
+ },
899
+ {
900
+ " Q" ,
901
+ " attribute_enum_values_capability" ,
902
+ " SAI_STATUS_SUCCESS" ,
903
+ " SAI_DEBUG_COUNTER_ATTR_IN_DROP_REASON_LIST=2:SAI_IN_DROP_REASON_L2_ANY,SAI_IN_DROP_REASON_L3_ANY"
904
+ }
905
+ );
906
+ }
907
+
764
908
void test_tokenize_bulk_route_entry ()
765
909
{
766
910
SWSS_LOG_ENTER ();
@@ -881,5 +1025,9 @@ int main()
881
1025
test_serialize_bulk_create_route_entry (10 ,10000 );
882
1026
test_serialize_bulk_create_oid (10 ,10000 );
883
1027
1028
+ std::cout << " * test recorder" << std::endl;
1029
+
1030
+ test_recorder_enum_value_capability_query ();
1031
+
884
1032
return 0 ;
885
1033
}
0 commit comments