Loading CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ endif() if (MSVC) target_compile_options(Databaseds PUBLIC /W3) else() target_compile_options(Databaseds PUBLIC -Wall -Wextra -D_FORTIFY_SOURCE=2 -O1) target_compile_options(Databaseds PUBLIC -Wall -Wextra -D_FORTIFY_SOURCE=2 -O1 -Wshadow) endif() Loading DataBase.cpp +27 −27 Original line number Diff line number Diff line Loading @@ -2682,9 +2682,9 @@ Tango::DevString DataBase::db_get_class_for_device(Tango::DevString argin) if(n_rows == 0) { mysql_free_result(result); TangoSys_MemStream tms; tms << "Class not found for " << argin; Tango::Except::throw_exception(DB_IncorrectArguments, tms.str().c_str(), "DataBase::db_get_class_for_device()"); TangoSys_MemStream err; err << "Class not found for " << argin; Tango::Except::throw_exception(DB_IncorrectArguments, err.str().c_str(), "DataBase::db_get_class_for_device()"); } if(n_rows > 0) Loading Loading @@ -3396,7 +3396,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang MYSQL_ROW row; int n_rows = 0, n_props = 0; argout = new Tango::DevVarStringArray; const char *tmp_device, *tmp_attribute; const char *tmp_device; TimeVal before, after; GetTime(before); Loading Loading @@ -3452,7 +3452,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang { for(unsigned int i = 1; i < property_names->length(); i++) { tmp_attribute = (*property_names)[i]; const char *tmp_attribute = (*property_names)[i]; sql_query_stream.str(""); sql_query_stream << "SELECT name,value FROM property_attribute_device WHERE device = \"" << tmp_device << "\" AND attribute LIKE \"" << tmp_attribute << "\" ORDER BY name,count"; Loading Loading @@ -3651,9 +3651,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_nb); (*argout)[n_props - 1] = CORBA::string_dup(n_rows_str); for(int i = 0; i < prop_nb; i++) for(int j = 0; j < prop_nb; j++) { PropDef &pd = (pos->second)[i]; PropDef &pd = (pos->second)[j]; int prop_size = pd.prop_val.size(); int old_n_props = n_props; n_props = n_props + 2 + prop_size; Loading @@ -3663,9 +3663,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_size); (*argout)[old_n_props++] = CORBA::string_dup(n_rows_str); for(int j = 0; j < prop_size; j++) for(int k = 0; k < prop_size; k++) { (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[j].c_str()); (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[k].c_str()); } } } Loading Loading @@ -4089,7 +4089,7 @@ Tango::DevVarLongStringArray *DataBase::db_get_device_info(Tango::DevString argi MYSQL_RES *result; MYSQL_ROW row; int n_rows = 0; int exported, pid; int dev_exported, pid; std::string tmp_device; INFO_STREAM << "DataBase::ImportDevice(): get import info for " << argin << " device " << std::endl; Loading Loading @@ -4180,14 +4180,14 @@ Tango::DevVarLongStringArray *DataBase::db_get_device_info(Tango::DevString argi } } exported = -1; dev_exported = -1; if(row[0] != nullptr) { exported = ParseString<int>(row[0]); dev_exported = ParseString<int>(row[0]); } n_lvalues++; (argout->lvalue).length(n_lvalues); (argout->lvalue)[n_lvalues - 1] = exported; (argout->lvalue)[n_lvalues - 1] = dev_exported; pid = -1; if(row[3] != nullptr) { Loading Loading @@ -5627,7 +5627,7 @@ Tango::DevVarLongStringArray *DataBase::db_import_device(Tango::DevString argin) MYSQL_RES *result; MYSQL_ROW row; int n_rows = 0; int exported, pid; int dev_exported, pid; std::string tmp_device; TimeVal before, after; Loading Loading @@ -5703,14 +5703,14 @@ Tango::DevVarLongStringArray *DataBase::db_import_device(Tango::DevString argin) { (argout->svalue)[n_svalues - 5] = CORBA::string_dup(""); } exported = -1; dev_exported = -1; if(row[0] != nullptr) { exported = ParseString<int>(row[0]); dev_exported = ParseString<int>(row[0]); } n_lvalues++; (argout->lvalue).length(n_lvalues); (argout->lvalue)[n_lvalues - 1] = exported; (argout->lvalue)[n_lvalues - 1] = dev_exported; pid = -1; if(row[3] != nullptr) { Loading Loading @@ -5770,7 +5770,7 @@ Tango::DevVarLongStringArray *DataBase::db_import_event(Tango::DevString argin) MYSQL_RES *result; MYSQL_ROW row; int n_rows = 0; int exported, pid; int dev_exported, pid; std::string tmp_event; TimeVal before, after; Loading Loading @@ -5808,14 +5808,14 @@ Tango::DevVarLongStringArray *DataBase::db_import_event(Tango::DevString argin) (argout->svalue)[n_svalues - 3] = CORBA::string_dup(row[1]); (argout->svalue)[n_svalues - 2] = CORBA::string_dup(row[2]); (argout->svalue)[n_svalues - 1] = CORBA::string_dup(row[4]); exported = -1; dev_exported = -1; if(row[0] != nullptr) { exported = ParseString<int>(row[0]); dev_exported = ParseString<int>(row[0]); } n_lvalues++; (argout->lvalue).length(n_lvalues); (argout->lvalue)[n_lvalues - 1] = exported; (argout->lvalue)[n_lvalues - 1] = dev_exported; pid = -1; if(row[3] != nullptr) { Loading Loading @@ -8081,7 +8081,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev MYSQL_ROW row; int n_rows = 0, n_props = 0; argout = new Tango::DevVarStringArray; const char *tmp_device, *tmp_pipe; const char *tmp_device; TimeVal before, after; GetTime(before); Loading Loading @@ -8135,7 +8135,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev { for(unsigned int i = 1; i < property_names->length(); i++) { tmp_pipe = (*property_names)[i]; const char *tmp_pipe = (*property_names)[i]; sql_query_stream.str(""); sql_query_stream << "SELECT name,value FROM property_pipe_device WHERE device = \"" << tmp_device << "\" AND pipe LIKE \"" << tmp_pipe << "\" ORDER BY name,count"; Loading Loading @@ -8332,9 +8332,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_nb); (*argout)[n_props - 1] = CORBA::string_dup(n_rows_str); for(int i = 0; i < prop_nb; i++) for(int j = 0; j < prop_nb; j++) { PropDef &pd = (pos->second)[i]; PropDef &pd = (pos->second)[j]; int prop_size = pd.prop_val.size(); int old_n_props = n_props; n_props = n_props + 2 + prop_size; Loading @@ -8344,9 +8344,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_size); (*argout)[old_n_props++] = CORBA::string_dup(n_rows_str); for(int j = 0; j < prop_size; j++) for(int k = 0; k < prop_size; k++) { (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[j].c_str()); (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[k].c_str()); } } } Loading DataBaseUtils.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -763,21 +763,21 @@ bool DataBase::host_port_from_ior(const char *iorstr, std::string &h_p) if(host_is_name == false) { struct sockaddr_in s; struct sockaddr_in sock; char service[20]; s.sin_family = AF_INET; sock.sin_family = AF_INET; int res; #ifdef _TG_WINDOWS_ s.sin_addr.s_addr = inet_addr(ho.c_str()); if(s.sin_addr.s_addr != INADDR_NONE) sock.sin_addr.s_addr = inet_addr(ho.c_str()); if(sock.sin_addr.s_addr != INADDR_NONE) #else res = inet_pton(AF_INET, ho.c_str(), &(s.sin_addr.s_addr)); res = inet_pton(AF_INET, ho.c_str(), &(sock.sin_addr.s_addr)); if(res == 1) #endif { res = getnameinfo((const struct sockaddr *) &s, sizeof(s), res = getnameinfo((const struct sockaddr *) &sock, sizeof(sock), ho_name, sizeof(ho_name), service, Loading Utils.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -15,8 +15,10 @@ int ParseString<int>(const char *c_str) if(ret != 1 || ret == EOF) { Tango::Except::throw_exception( DB_ParseStringError, "Could not parse string to number", "DataBase::ParseString"); std::stringstream sstr; sstr << "Could not parse the string \"" << c_str << "\" to number"; Tango::Except::throw_exception(DB_ParseStringError, sstr.str(), "DataBase::ParseString"); } return val; Loading test/test.cpp +122 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,8 @@ std::vector<std::string> ExtractStringVector(Tango::DeviceData &dd) return vec; } Tango::DeviceData MakeDeviceDataStringArray(std::initializer_list<std::string> list = {}) template <typename T> Tango::DeviceData MakeDeviceDataStringArray_impl(T &list) { int idx = 0; Tango::DeviceData dd; Loading @@ -47,6 +48,16 @@ Tango::DeviceData MakeDeviceDataStringArray(std::initializer_list<std::string> l return dd; } Tango::DeviceData MakeDeviceDataStringArray(const std::vector<std::string> &vec) { return MakeDeviceDataStringArray_impl(vec); } Tango::DeviceData MakeDeviceDataStringArray(std::initializer_list<std::string> list = {}) { return MakeDeviceDataStringArray_impl(list); } Tango::DeviceData MakeDeviceDataString(std::string str) { Tango::DeviceData dd; Loading Loading @@ -735,4 +746,114 @@ BOOST_AUTO_TEST_CASE(EventsWork) #endif BOOST_FIXTURE_TEST_CASE(DbGetDeviceAttributeProperty2Works, AddAndExportDeviceFixture) { const std::vector<std::string> input = {device_name, "2", // #attributes "attr0", "3", // #properties of first attribute "attr0_prop0", "1", // # property values: 1 for scalar, > 1 for arrays "attr0_prop0_scalar_val0", "attr0_prop1", "4", "attr0_prop1_array_val0", "attr0_prop1_array_val1", "attr0_prop1_array_val2", "attr0_prop1_array_val3", "attr0_prop2", "1", "attr0_prop2_scalar_val0", "attr1", "1", "attr1_prop0", "1", "attr1_prop0_scalar_val0"}; // insert some attribute properties { auto dd = MakeDeviceDataStringArray(input); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbPutDeviceAttributeProperty2", dd)); } // all attributes { auto dd = MakeDeviceDataStringArray({device_name, "attr0", "attr1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDeviceAttributeProperty2", dd)); auto vec = ExtractStringVector(reply); BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(input), std::end(input)); } // only second attribute { auto dd = MakeDeviceDataStringArray({device_name, "attr1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDeviceAttributeProperty2", dd)); auto vec = ExtractStringVector(reply); std::vector<std::string> ref = {device_name, "1", "attr1", "1", "attr1_prop0", "1", "attr1_prop0_scalar_val0"}; BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(ref), std::end(ref)); } } BOOST_FIXTURE_TEST_CASE(DbGetDevicePipePropertyWorks, AddAndExportDeviceFixture) { const std::vector<std::string> input({device_name, "2", // #pipes "pipe0", "3", // #properties of first pipe "pipe0_prop0", "1", // # property values: 1 for scalar, > 1 for arrays "pipe0_prop0_scalar_val0", "pipe0_prop1", "4", "pipe0_prop1_array_val0", "pipe0_prop1_array_val1", "pipe0_prop1_array_val2", "pipe0_prop1_array_val3", "pipe0_prop2", "1", "pipe0_prop2_scalar_val0", "pipe1", "1", "pipe1_prop0", "1", "pipe1_prop0_scalar_val0"}); // insert some class properties { auto dd = MakeDeviceDataStringArray(input); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbPutDevicePipeProperty", dd)); } // all pipes { auto dd = MakeDeviceDataStringArray({device_name, "pipe0", "pipe1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDevicePipeProperty", dd)); auto vec = ExtractStringVector(reply); BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(input), std::end(input)); } // only second pipe { auto dd = MakeDeviceDataStringArray({device_name, "pipe1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDevicePipeProperty", dd)); auto vec = ExtractStringVector(reply); std::vector<std::string> ref = {device_name, "1", "pipe1", "1", "pipe1_prop0", "1", "pipe1_prop0_scalar_val0"}; BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(ref), std::end(ref)); } } BOOST_AUTO_TEST_SUITE_END() // AllTests Loading
CMakeLists.txt +1 −1 Original line number Diff line number Diff line Loading @@ -40,7 +40,7 @@ endif() if (MSVC) target_compile_options(Databaseds PUBLIC /W3) else() target_compile_options(Databaseds PUBLIC -Wall -Wextra -D_FORTIFY_SOURCE=2 -O1) target_compile_options(Databaseds PUBLIC -Wall -Wextra -D_FORTIFY_SOURCE=2 -O1 -Wshadow) endif() Loading
DataBase.cpp +27 −27 Original line number Diff line number Diff line Loading @@ -2682,9 +2682,9 @@ Tango::DevString DataBase::db_get_class_for_device(Tango::DevString argin) if(n_rows == 0) { mysql_free_result(result); TangoSys_MemStream tms; tms << "Class not found for " << argin; Tango::Except::throw_exception(DB_IncorrectArguments, tms.str().c_str(), "DataBase::db_get_class_for_device()"); TangoSys_MemStream err; err << "Class not found for " << argin; Tango::Except::throw_exception(DB_IncorrectArguments, err.str().c_str(), "DataBase::db_get_class_for_device()"); } if(n_rows > 0) Loading Loading @@ -3396,7 +3396,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang MYSQL_ROW row; int n_rows = 0, n_props = 0; argout = new Tango::DevVarStringArray; const char *tmp_device, *tmp_attribute; const char *tmp_device; TimeVal before, after; GetTime(before); Loading Loading @@ -3452,7 +3452,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang { for(unsigned int i = 1; i < property_names->length(); i++) { tmp_attribute = (*property_names)[i]; const char *tmp_attribute = (*property_names)[i]; sql_query_stream.str(""); sql_query_stream << "SELECT name,value FROM property_attribute_device WHERE device = \"" << tmp_device << "\" AND attribute LIKE \"" << tmp_attribute << "\" ORDER BY name,count"; Loading Loading @@ -3651,9 +3651,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_nb); (*argout)[n_props - 1] = CORBA::string_dup(n_rows_str); for(int i = 0; i < prop_nb; i++) for(int j = 0; j < prop_nb; j++) { PropDef &pd = (pos->second)[i]; PropDef &pd = (pos->second)[j]; int prop_size = pd.prop_val.size(); int old_n_props = n_props; n_props = n_props + 2 + prop_size; Loading @@ -3663,9 +3663,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_attribute_property2(const Tang snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_size); (*argout)[old_n_props++] = CORBA::string_dup(n_rows_str); for(int j = 0; j < prop_size; j++) for(int k = 0; k < prop_size; k++) { (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[j].c_str()); (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[k].c_str()); } } } Loading Loading @@ -4089,7 +4089,7 @@ Tango::DevVarLongStringArray *DataBase::db_get_device_info(Tango::DevString argi MYSQL_RES *result; MYSQL_ROW row; int n_rows = 0; int exported, pid; int dev_exported, pid; std::string tmp_device; INFO_STREAM << "DataBase::ImportDevice(): get import info for " << argin << " device " << std::endl; Loading Loading @@ -4180,14 +4180,14 @@ Tango::DevVarLongStringArray *DataBase::db_get_device_info(Tango::DevString argi } } exported = -1; dev_exported = -1; if(row[0] != nullptr) { exported = ParseString<int>(row[0]); dev_exported = ParseString<int>(row[0]); } n_lvalues++; (argout->lvalue).length(n_lvalues); (argout->lvalue)[n_lvalues - 1] = exported; (argout->lvalue)[n_lvalues - 1] = dev_exported; pid = -1; if(row[3] != nullptr) { Loading Loading @@ -5627,7 +5627,7 @@ Tango::DevVarLongStringArray *DataBase::db_import_device(Tango::DevString argin) MYSQL_RES *result; MYSQL_ROW row; int n_rows = 0; int exported, pid; int dev_exported, pid; std::string tmp_device; TimeVal before, after; Loading Loading @@ -5703,14 +5703,14 @@ Tango::DevVarLongStringArray *DataBase::db_import_device(Tango::DevString argin) { (argout->svalue)[n_svalues - 5] = CORBA::string_dup(""); } exported = -1; dev_exported = -1; if(row[0] != nullptr) { exported = ParseString<int>(row[0]); dev_exported = ParseString<int>(row[0]); } n_lvalues++; (argout->lvalue).length(n_lvalues); (argout->lvalue)[n_lvalues - 1] = exported; (argout->lvalue)[n_lvalues - 1] = dev_exported; pid = -1; if(row[3] != nullptr) { Loading Loading @@ -5770,7 +5770,7 @@ Tango::DevVarLongStringArray *DataBase::db_import_event(Tango::DevString argin) MYSQL_RES *result; MYSQL_ROW row; int n_rows = 0; int exported, pid; int dev_exported, pid; std::string tmp_event; TimeVal before, after; Loading Loading @@ -5808,14 +5808,14 @@ Tango::DevVarLongStringArray *DataBase::db_import_event(Tango::DevString argin) (argout->svalue)[n_svalues - 3] = CORBA::string_dup(row[1]); (argout->svalue)[n_svalues - 2] = CORBA::string_dup(row[2]); (argout->svalue)[n_svalues - 1] = CORBA::string_dup(row[4]); exported = -1; dev_exported = -1; if(row[0] != nullptr) { exported = ParseString<int>(row[0]); dev_exported = ParseString<int>(row[0]); } n_lvalues++; (argout->lvalue).length(n_lvalues); (argout->lvalue)[n_lvalues - 1] = exported; (argout->lvalue)[n_lvalues - 1] = dev_exported; pid = -1; if(row[3] != nullptr) { Loading Loading @@ -8081,7 +8081,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev MYSQL_ROW row; int n_rows = 0, n_props = 0; argout = new Tango::DevVarStringArray; const char *tmp_device, *tmp_pipe; const char *tmp_device; TimeVal before, after; GetTime(before); Loading Loading @@ -8135,7 +8135,7 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev { for(unsigned int i = 1; i < property_names->length(); i++) { tmp_pipe = (*property_names)[i]; const char *tmp_pipe = (*property_names)[i]; sql_query_stream.str(""); sql_query_stream << "SELECT name,value FROM property_pipe_device WHERE device = \"" << tmp_device << "\" AND pipe LIKE \"" << tmp_pipe << "\" ORDER BY name,count"; Loading Loading @@ -8332,9 +8332,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_nb); (*argout)[n_props - 1] = CORBA::string_dup(n_rows_str); for(int i = 0; i < prop_nb; i++) for(int j = 0; j < prop_nb; j++) { PropDef &pd = (pos->second)[i]; PropDef &pd = (pos->second)[j]; int prop_size = pd.prop_val.size(); int old_n_props = n_props; n_props = n_props + 2 + prop_size; Loading @@ -8344,9 +8344,9 @@ Tango::DevVarStringArray *DataBase::db_get_device_pipe_property(const Tango::Dev snprintf(n_rows_str, sizeof(n_rows_str), "%d", prop_size); (*argout)[old_n_props++] = CORBA::string_dup(n_rows_str); for(int j = 0; j < prop_size; j++) for(int k = 0; k < prop_size; k++) { (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[j].c_str()); (*argout)[old_n_props++] = CORBA::string_dup(pd.prop_val[k].c_str()); } } } Loading
DataBaseUtils.cpp +7 −7 Original line number Diff line number Diff line Loading @@ -763,21 +763,21 @@ bool DataBase::host_port_from_ior(const char *iorstr, std::string &h_p) if(host_is_name == false) { struct sockaddr_in s; struct sockaddr_in sock; char service[20]; s.sin_family = AF_INET; sock.sin_family = AF_INET; int res; #ifdef _TG_WINDOWS_ s.sin_addr.s_addr = inet_addr(ho.c_str()); if(s.sin_addr.s_addr != INADDR_NONE) sock.sin_addr.s_addr = inet_addr(ho.c_str()); if(sock.sin_addr.s_addr != INADDR_NONE) #else res = inet_pton(AF_INET, ho.c_str(), &(s.sin_addr.s_addr)); res = inet_pton(AF_INET, ho.c_str(), &(sock.sin_addr.s_addr)); if(res == 1) #endif { res = getnameinfo((const struct sockaddr *) &s, sizeof(s), res = getnameinfo((const struct sockaddr *) &sock, sizeof(sock), ho_name, sizeof(ho_name), service, Loading
Utils.cpp +4 −2 Original line number Diff line number Diff line Loading @@ -15,8 +15,10 @@ int ParseString<int>(const char *c_str) if(ret != 1 || ret == EOF) { Tango::Except::throw_exception( DB_ParseStringError, "Could not parse string to number", "DataBase::ParseString"); std::stringstream sstr; sstr << "Could not parse the string \"" << c_str << "\" to number"; Tango::Except::throw_exception(DB_ParseStringError, sstr.str(), "DataBase::ParseString"); } return val; Loading
test/test.cpp +122 −1 Original line number Diff line number Diff line Loading @@ -30,7 +30,8 @@ std::vector<std::string> ExtractStringVector(Tango::DeviceData &dd) return vec; } Tango::DeviceData MakeDeviceDataStringArray(std::initializer_list<std::string> list = {}) template <typename T> Tango::DeviceData MakeDeviceDataStringArray_impl(T &list) { int idx = 0; Tango::DeviceData dd; Loading @@ -47,6 +48,16 @@ Tango::DeviceData MakeDeviceDataStringArray(std::initializer_list<std::string> l return dd; } Tango::DeviceData MakeDeviceDataStringArray(const std::vector<std::string> &vec) { return MakeDeviceDataStringArray_impl(vec); } Tango::DeviceData MakeDeviceDataStringArray(std::initializer_list<std::string> list = {}) { return MakeDeviceDataStringArray_impl(list); } Tango::DeviceData MakeDeviceDataString(std::string str) { Tango::DeviceData dd; Loading Loading @@ -735,4 +746,114 @@ BOOST_AUTO_TEST_CASE(EventsWork) #endif BOOST_FIXTURE_TEST_CASE(DbGetDeviceAttributeProperty2Works, AddAndExportDeviceFixture) { const std::vector<std::string> input = {device_name, "2", // #attributes "attr0", "3", // #properties of first attribute "attr0_prop0", "1", // # property values: 1 for scalar, > 1 for arrays "attr0_prop0_scalar_val0", "attr0_prop1", "4", "attr0_prop1_array_val0", "attr0_prop1_array_val1", "attr0_prop1_array_val2", "attr0_prop1_array_val3", "attr0_prop2", "1", "attr0_prop2_scalar_val0", "attr1", "1", "attr1_prop0", "1", "attr1_prop0_scalar_val0"}; // insert some attribute properties { auto dd = MakeDeviceDataStringArray(input); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbPutDeviceAttributeProperty2", dd)); } // all attributes { auto dd = MakeDeviceDataStringArray({device_name, "attr0", "attr1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDeviceAttributeProperty2", dd)); auto vec = ExtractStringVector(reply); BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(input), std::end(input)); } // only second attribute { auto dd = MakeDeviceDataStringArray({device_name, "attr1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDeviceAttributeProperty2", dd)); auto vec = ExtractStringVector(reply); std::vector<std::string> ref = {device_name, "1", "attr1", "1", "attr1_prop0", "1", "attr1_prop0_scalar_val0"}; BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(ref), std::end(ref)); } } BOOST_FIXTURE_TEST_CASE(DbGetDevicePipePropertyWorks, AddAndExportDeviceFixture) { const std::vector<std::string> input({device_name, "2", // #pipes "pipe0", "3", // #properties of first pipe "pipe0_prop0", "1", // # property values: 1 for scalar, > 1 for arrays "pipe0_prop0_scalar_val0", "pipe0_prop1", "4", "pipe0_prop1_array_val0", "pipe0_prop1_array_val1", "pipe0_prop1_array_val2", "pipe0_prop1_array_val3", "pipe0_prop2", "1", "pipe0_prop2_scalar_val0", "pipe1", "1", "pipe1_prop0", "1", "pipe1_prop0_scalar_val0"}); // insert some class properties { auto dd = MakeDeviceDataStringArray(input); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbPutDevicePipeProperty", dd)); } // all pipes { auto dd = MakeDeviceDataStringArray({device_name, "pipe0", "pipe1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDevicePipeProperty", dd)); auto vec = ExtractStringVector(reply); BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(input), std::end(input)); } // only second pipe { auto dd = MakeDeviceDataStringArray({device_name, "pipe1"}); Tango::DeviceData reply; BOOST_CHECK_NO_THROW(reply = dp->command_inout("DbGetDevicePipeProperty", dd)); auto vec = ExtractStringVector(reply); std::vector<std::string> ref = {device_name, "1", "pipe1", "1", "pipe1_prop0", "1", "pipe1_prop0_scalar_val0"}; BOOST_CHECK_EQUAL_COLLECTIONS(std::begin(vec), std::end(vec), std::begin(ref), std::end(ref)); } } BOOST_AUTO_TEST_SUITE_END() // AllTests