@@ -847,6 +847,178 @@ TEST_P(Common, snapshotIterator)
847847 }
848848}
849849
850+ // Auxiliary callback function for counting number of templates in a snapshot
851+ bool snapshot_iterator_count_cb (const struct fds_template *tmplt, void *data)
852+ {
853+ (void ) tmplt;
854+
855+ size_t *count = reinterpret_cast <size_t *>(data);
856+ (*count)++;
857+
858+ return true ;
859+ }
860+
861+ // Try to create a deep copy of a Template snapshot
862+ TEST_P (Common, snapshotDeepCopy)
863+ {
864+ const struct fds_template *tmplt;
865+ const fds_tsnapshot_t *snap = nullptr ;
866+ fds_tsnapshot_t *snap_copy = nullptr ;
867+ size_t count;
868+
869+ // Create an IE manager and load definitions
870+ fds_iemgr_t *iemgr = fds_iemgr_create ();
871+ ASSERT_NE (iemgr, nullptr );
872+ ASSERT_EQ (fds_iemgr_read_file (iemgr, " ./data/iana.xml" , false ), FDS_OK);
873+ fds_tmgr_set_iemgr (tmgr, iemgr);
874+
875+ // Create a copy of an empty snapshot
876+ EXPECT_EQ (fds_tmgr_set_time (tmgr, 10000 ), FDS_OK);
877+ ASSERT_EQ (fds_tmgr_snapshot_get (tmgr, &snap), FDS_OK);
878+ ASSERT_NE (snap, nullptr );
879+ snap_copy = fds_tsnapshot_deep_copy (snap);
880+ ASSERT_NE (snap_copy, nullptr );
881+ EXPECT_TRUE (fds_tsnapshot_eq (snap, snap_copy));
882+
883+ count = 0 ;
884+ fds_tsnapshot_for (snap_copy, &snapshot_iterator_count_cb, &count);
885+ ASSERT_EQ (count, 0U );
886+
887+ fds_tsnapshot_destroy (snap_copy);
888+
889+ // Create a copy of a snapshot with some templates
890+ const uint16_t tid1 = 1234 ;
891+ const uint16_t tid2 = 2000 ;
892+ const uint16_t tid3 = 256 ;
893+ struct fds_template *t1 = TMock::create (TMock::type::DATA_BASIC_FLOW, tid1);
894+ struct fds_template *t2 = TMock::create (TMock::type::OPTS_ERPOC_RSTAT, tid2);
895+ struct fds_template *t3 = TMock::create (TMock::type::DATA_BASIC_BIFLOW, tid3);
896+ EXPECT_EQ (fds_tmgr_template_add (tmgr, t1), FDS_OK);
897+ EXPECT_EQ (fds_tmgr_template_add (tmgr, t2), FDS_OK);
898+ EXPECT_EQ (fds_tmgr_template_add (tmgr, t3), FDS_OK);
899+
900+ ASSERT_EQ (fds_tmgr_snapshot_get (tmgr, &snap), FDS_OK);
901+ ASSERT_NE (snap, nullptr );
902+ snap_copy = fds_tsnapshot_deep_copy (snap);
903+ ASSERT_NE (snap_copy, nullptr );
904+ EXPECT_TRUE (fds_tsnapshot_eq (snap, snap_copy));
905+
906+ /*
907+ * Destroy the template manager
908+ * (the templates in deeply copied snapshot should be still accessible)
909+ */
910+ fds_tmgr_destroy (tmgr);
911+ tmgr = nullptr ;
912+
913+ // Try to access the templates in the copied snapshop
914+ count = 0 ;
915+ fds_tsnapshot_for (snap_copy, &snapshot_iterator_count_cb, &count);
916+ ASSERT_EQ (count, 3U );
917+
918+ tmplt = fds_tsnapshot_template_get (snap_copy, tid1); // TID 1
919+ ASSERT_NE (tmplt, nullptr );
920+ EXPECT_NE (tmplt->raw .data , nullptr );
921+ EXPECT_EQ (tmplt->fields_rev , nullptr );
922+
923+ for (uint16_t i = 0 ; i < tmplt->fields_cnt_total ; ++i) {
924+ const struct fds_tfield *field = &tmplt->fields [i];
925+
926+ // Just try to touch a memory of template and IE manager
927+ EXPECT_NE (field->id , 0U );
928+ if (field->def ) {
929+ EXPECT_EQ (field->id , field->def ->id );
930+ }
931+ }
932+
933+ tmplt = fds_tsnapshot_template_get (snap_copy, tid3); // TID 3
934+ ASSERT_NE (tmplt, nullptr );
935+ EXPECT_NE (tmplt->raw .data , nullptr );
936+ ASSERT_NE (tmplt->fields_rev , nullptr );
937+
938+ for (uint16_t i = 0 ; i < tmplt->fields_cnt_total ; ++i) {
939+ const struct fds_tfield *field = &tmplt->fields [i];
940+ const struct fds_tfield *field_rev = &tmplt->fields_rev [i];
941+
942+ // Just try to touch a memory of template and IE manager
943+ EXPECT_NE (field->id , 0U );
944+
945+ if (field->def ) {
946+ EXPECT_EQ (field->id , field->def ->id );
947+ }
948+
949+ EXPECT_NE (field_rev->id , 0U );
950+
951+ if (field_rev->def ) {
952+ EXPECT_EQ (field_rev->id , field_rev->def ->id );
953+ }
954+ }
955+
956+ fds_tsnapshot_destroy (snap_copy);
957+ fds_iemgr_destroy (iemgr);
958+ }
959+
960+ // Try to compare two independent snapshots with the same Templates
961+ TEST_P (Common, snapshotEq)
962+ {
963+ // Create an IE manager and load definitions
964+ fds_iemgr_t *iemgr = fds_iemgr_create ();
965+ ASSERT_NE (iemgr, nullptr );
966+ ASSERT_EQ (fds_iemgr_read_file (iemgr, " ./data/iana.xml" , false ), FDS_OK);
967+
968+ // Create a secondary independent Template manager with the IE manager
969+ fds_tmgr_t *tmgr2 = fds_tmgr_create (GetParam ());
970+ ASSERT_NE (tmgr2, nullptr );
971+ ASSERT_EQ (fds_tmgr_set_iemgr (tmgr2, iemgr), FDS_OK);
972+
973+ // Set different export time
974+ const uint32_t time1 = 2147483647 ;
975+ const uint32_t time2 = 2147483657 ;
976+ EXPECT_EQ (fds_tmgr_set_time (tmgr, time1), FDS_OK);
977+ EXPECT_EQ (fds_tmgr_set_time (tmgr2, time2), FDS_OK);
978+
979+ // Fill the primary Template manager with Templates
980+ const uint16_t tid1 = 1234 ;
981+ const uint16_t tid2 = 1235 ;
982+ const uint16_t tid3 = 12222 ;
983+ struct fds_template *t1 = TMock::create (TMock::type::DATA_BASIC_FLOW, tid1);
984+ struct fds_template *t2 = TMock::create (TMock::type::OPTS_MPROC_STAT, tid2);
985+ struct fds_template *t3 = TMock::create (TMock::type::OPTS_FKEY, tid3);
986+ EXPECT_EQ (fds_tmgr_template_add (tmgr, t1), FDS_OK);
987+ EXPECT_EQ (fds_tmgr_template_add (tmgr, t2), FDS_OK);
988+ EXPECT_EQ (fds_tmgr_template_add (tmgr, t3), FDS_OK);
989+
990+ const fds_tsnapshot_t *snap = nullptr ;
991+ EXPECT_EQ (fds_tmgr_snapshot_get (tmgr, &snap), FDS_OK);
992+ EXPECT_TRUE (fds_tsnapshot_eq (snap, snap));
993+
994+ const fds_tsnapshot_t *snap2 = nullptr ;
995+ EXPECT_EQ (fds_tmgr_snapshot_get (tmgr2, &snap2), FDS_OK);
996+
997+ // Compare the primary (filled) with secondary (empty) snapshot
998+ EXPECT_FALSE (fds_tsnapshot_eq (snap, snap2));
999+
1000+ // Fill the secondary Template manager
1001+ t1 = TMock::create (TMock::type::DATA_BASIC_FLOW, tid1);
1002+ t2 = TMock::create (TMock::type::OPTS_MPROC_STAT, tid2);
1003+ t3 = TMock::create (TMock::type::OPTS_FKEY, tid3);
1004+ EXPECT_EQ (fds_tmgr_template_add (tmgr2, t1), FDS_OK);
1005+ EXPECT_EQ (fds_tmgr_template_add (tmgr2, t2), FDS_OK);
1006+ EXPECT_EQ (fds_tmgr_template_add (tmgr2, t3), FDS_OK);
1007+
1008+ // Compare the primary with the secondary snapshot
1009+ EXPECT_EQ (fds_tmgr_snapshot_get (tmgr2, &snap2), FDS_OK);
1010+ EXPECT_TRUE (fds_tsnapshot_eq (snap, snap2));
1011+
1012+ // Slightly modify secondary template manager so it is different
1013+ struct fds_template *t4 = TMock::create (TMock::type::DATA_BASIC_BIFLOW, 1236 );
1014+ EXPECT_EQ (fds_tmgr_template_add (tmgr2, t4), FDS_OK);
1015+
1016+ EXPECT_EQ (fds_tmgr_snapshot_get (tmgr2, &snap2), FDS_OK);
1017+ EXPECT_FALSE (fds_tsnapshot_eq (snap, snap2));
1018+
1019+ fds_tmgr_destroy (tmgr2);
1020+ fds_iemgr_destroy (iemgr);
1021+ }
8501022
8511023// TODO: Multiple updates of the same template at the same time + cleanup
8521024
0 commit comments