diff options
author | JackLivio <jack@livio.io> | 2018-05-23 15:06:04 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-05-23 15:06:04 -0400 |
commit | dd8c006ecd1c5c696e696584aff694462a54ac4b (patch) | |
tree | 7750d6bc886b35a7066bc7564abe594996114947 /src/components | |
parent | 0efd4e201b4713ed40d8fdd2d816270388a4a58f (diff) | |
parent | a8967da62807c457983a029b83ec49a863f95ec0 (diff) | |
download | sdl_core-dd8c006ecd1c5c696e696584aff694462a54ac4b.tar.gz |
Merge pull request #2138 from smartdevicelink/feature/expand_put_file
Feature/expand put file
Diffstat (limited to 'src/components')
7 files changed, 118 insertions, 14 deletions
diff --git a/src/components/application_manager/include/application_manager/smart_object_keys.h b/src/components/application_manager/include/application_manager/smart_object_keys.h index 1c71cec29d..b5bf111449 100644 --- a/src/components/application_manager/include/application_manager/smart_object_keys.h +++ b/src/components/application_manager/include/application_manager/smart_object_keys.h @@ -193,6 +193,7 @@ extern const char* sync_file_name; extern const char* file_name; extern const char* file_type; extern const char* file_size; +extern const char* crc32_check_sum; extern const char* request_type; extern const char* persistent_file; extern const char* file_data; diff --git a/src/components/application_manager/src/commands/mobile/put_file_request.cc b/src/components/application_manager/src/commands/mobile/put_file_request.cc index 602b420ba0..269c9c814e 100644 --- a/src/components/application_manager/src/commands/mobile/put_file_request.cc +++ b/src/components/application_manager/src/commands/mobile/put_file_request.cc @@ -38,6 +38,22 @@ #include "application_manager/application_impl.h" #include "utils/file_system.h" +#include <boost/crc.hpp> + +namespace { +/** +* Calculates CRC32 checksum +* @param binary_data - input data for which CRC32 should be calculated +* @return calculated CRC32 checksum +*/ +uint32_t GetCrc32CheckSum(const std::vector<uint8_t>& binary_data) { + const std::size_t file_size = binary_data.size(); + boost::crc_32_type result; + result.process_bytes(&binary_data[0], file_size); + return result.checksum(); +} + +} // namespace namespace application_manager { @@ -137,7 +153,7 @@ void PutFileRequest::Run() { is_persistent_file_ = false; bool is_system_file = false; length_ = binary_data.size(); - bool is_download_compleate = true; + bool is_download_complete = true; bool offset_exist = (*message_)[strings::msg_params].keyExists(strings::offset); @@ -187,11 +203,29 @@ void PutFileRequest::Run() { return; } const std::string full_path = file_path + "/" + sync_file_name_; - UNUSED(full_path); + const size_t bin_data_size = binary_data.size(); + + if ((*message_)[strings::msg_params].keyExists(strings::crc32_check_sum)) { + LOG4CXX_TRACE(logger_, "Binary Data Size: " << bin_data_size); + const uint32_t crc_received = + (*message_)[strings::msg_params][strings::crc32_check_sum].asUInt(); + LOG4CXX_TRACE(logger_, "CRC32 SUM Received: " << crc_received); + const uint32_t crc_calculated = GetCrc32CheckSum(binary_data); + LOG4CXX_TRACE(logger_, "CRC32 SUM Calculated: " << crc_calculated); + if (crc_calculated != crc_received) { + SendResponse(false, + mobile_apis::Result::CORRUPTED_DATA, + "CRC Check on file failed. File upload has been cancelled, " + "please retry.", + &response_params); + return; + } + } + LOG4CXX_DEBUG(logger_, - "Wrtiting " << binary_data.size() << "bytes to " << full_path - << " (current size is" - << file_system::FileSize(full_path) << ")"); + "Writing " << bin_data_size << " bytes to " << full_path + << " (current size is" + << file_system::FileSize(full_path) << ")"); mobile_apis::Result::eType save_result = application_manager_.SaveBinary( binary_data, file_path, sync_file_name_, offset_); @@ -211,7 +245,7 @@ void PutFileRequest::Run() { if (!is_system_file) { AppFile file(sync_file_name_, is_persistent_file_, - is_download_compleate, + is_download_complete, file_type_); if (0 == offset_) { diff --git a/src/components/application_manager/src/smart_object_keys.cc b/src/components/application_manager/src/smart_object_keys.cc index 26ca8e790f..421796c388 100644 --- a/src/components/application_manager/src/smart_object_keys.cc +++ b/src/components/application_manager/src/smart_object_keys.cc @@ -157,6 +157,7 @@ const char* sync_file_name = "syncFileName"; const char* file_name = "fileName"; const char* file_type = "fileType"; const char* file_size = "fileSize"; +const char* crc32_check_sum = "crc"; const char* request_type = "requestType"; const char* persistent_file = "persistentFile"; const char* file_data = "fileData"; diff --git a/src/components/application_manager/test/commands/mobile/put_file_test.cc b/src/components/application_manager/test/commands/mobile/put_file_test.cc index b48ac67501..575daa7217 100644 --- a/src/components/application_manager/test/commands/mobile/put_file_test.cc +++ b/src/components/application_manager/test/commands/mobile/put_file_test.cc @@ -77,6 +77,7 @@ const std::string kFileName = "sync_file_name.txt"; const int64_t kOffset = 10u; const int64_t kZeroOffset = 0u; const std::string kStorageFolder = "./storage"; +const std::string kFolder = "folder"; const std::string kAppFolder = "app_folder"; } @@ -344,6 +345,64 @@ TEST_F(PutFileRequestTest, Run_InvalidPutFile_UNSUCCESS) { command->Run(); } +TEST_F(PutFileRequestTest, Run_CrcSumEqual_SendSuccessResponse) { + binary_data_ = {1u}; + (*msg_)[am::strings::params][am::strings::binary_data] = binary_data_; + const uint32_t correct_crc_sum = + 2768625435u; // calculated using the GetCrc32CheckSum method + (*msg_)[am::strings::msg_params][am::strings::crc32_check_sum] = + correct_crc_sum; + + ExpectReceiveMessageFromSDK(); + ON_CALL(app_mngr_, get_settings()) + .WillByDefault(ReturnRef(app_mngr_settings_)); + ON_CALL(app_mngr_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(kStorageFolder)); + ON_CALL(*mock_app_, folder_name()).WillByDefault(Return(kFolder)); + const size_t available_space = binary_data_.size() + 1; + ON_CALL(*mock_app_, GetAvailableDiskSpace()) + .WillByDefault(Return(available_space)); + ON_CALL(*mock_app_, AddFile(_)).WillByDefault(Return(true)); + + const std::string file_path = kStorageFolder + "/" + kFolder; + EXPECT_CALL(app_mngr_, SaveBinary(binary_data_, file_path, kFileName, 0u)) + .WillOnce(Return(mobile_apis::Result::SUCCESS)); + EXPECT_CALL(*mock_app_, increment_put_file_in_none_count()); + ExpectManageMobileCommandWithResultCode(mobile_apis::Result::SUCCESS); + PutFileRequestPtr command(CreateCommand<PutFileRequest>(msg_)); + ASSERT_TRUE(command->Init()); + command->Run(); + // The folder was created in the "Run" method + EXPECT_TRUE(file_system::RemoveDirectory(kStorageFolder, true)); +} + +TEST_F(PutFileRequestTest, Run_CrcSumUnequal_SendCorruptedDataResponse) { + binary_data_ = {1u}; + (*msg_)[am::strings::params][am::strings::binary_data] = binary_data_; + const uint32_t incorrect_crc_sum = 0u; + (*msg_)[am::strings::msg_params][am::strings::crc32_check_sum] = + incorrect_crc_sum; + + ExpectReceiveMessageFromSDK(); + ON_CALL(app_mngr_, get_settings()) + .WillByDefault(ReturnRef(app_mngr_settings_)); + ON_CALL(app_mngr_settings_, app_storage_folder()) + .WillByDefault(ReturnRef(kStorageFolder)); + ON_CALL(*mock_app_, folder_name()).WillByDefault(Return(kFolder)); + const size_t available_space = binary_data_.size() + 1; + ON_CALL(*mock_app_, GetAvailableDiskSpace()) + .WillByDefault(Return(available_space)); + ON_CALL(*mock_app_, AddFile(_)).WillByDefault(Return(true)); + + ExpectManageMobileCommandWithResultCode(mobile_apis::Result::CORRUPTED_DATA); + EXPECT_CALL(app_mngr_, SaveBinary(_, _, _, _)).Times(0); + PutFileRequestPtr command(CreateCommand<PutFileRequest>(msg_)); + ASSERT_TRUE(command->Init()); + command->Run(); + // The folder was created in the "Run" method + EXPECT_TRUE(file_system::RemoveDirectory(kStorageFolder, true)); +} + } // namespace put_file } // namespace mobile_commands_test } // namespace commands_test diff --git a/src/components/interfaces/MOBILE_API.xml b/src/components/interfaces/MOBILE_API.xml index d64aef1bf7..2cbae29c8c 100644 --- a/src/components/interfaces/MOBILE_API.xml +++ b/src/components/interfaces/MOBILE_API.xml @@ -135,6 +135,9 @@ <element name="READ_ONLY"> <description>The value being set is read only</description> </element> + <element name="CORRUPTED_DATA"> + <description>The data sent failed to pass CRC check in receiver end</description> + </element> </enum> <enum name="ButtonPressMode"> @@ -5169,6 +5172,9 @@ If offset is set to 0, then length is the total length of the file to be downloaded </description> </param> + <param name="crc" type="Integer" minvalue="0" maxvalue="4294967295" mandatory="false"> + <description> Additional CRC32 checksum to protect data integrity up to 512 Mbits . </description> + </param> </function> <function name="PutFile" functionID="PutFileID" messagetype="response"> @@ -5188,6 +5194,7 @@ <element name="GENERIC_ERROR"/> <element name="REJECTED"/> <element name="UNSUPPORTED_REQUEST"/> + <element name="CORRUPTED_DATA"/> </param> <param name="spaceAvailable" type="Integer" minvalue="0" maxvalue="2000000000" mandatory="true"> diff --git a/src/components/smart_objects/include/smart_objects/number_schema_item.h b/src/components/smart_objects/include/smart_objects/number_schema_item.h index d549b9891a..34c5e3a8a6 100644 --- a/src/components/smart_objects/include/smart_objects/number_schema_item.h +++ b/src/components/smart_objects/include/smart_objects/number_schema_item.h @@ -39,6 +39,7 @@ #include "smart_objects/default_shema_item.h" #include "smart_objects/schema_item_parameter.h" #include "utils/convert_utils.h" +#include "utils/helpers.h" namespace NsSmartDeviceLink { namespace NsSmartObjects { @@ -123,15 +124,16 @@ bool TNumberSchemaItem<NumberType>::isValidNumberType(SmartType type) { NumberType value(0); if ((SmartType_Double == type) && (typeid(double) == typeid(value))) { return true; - } else if ((SmartType_Integer == type) && - (typeid(int32_t) == typeid(value) || - typeid(uint32_t) == typeid(value) || - typeid(int64_t) == typeid(value) || - typeid(double) == typeid(value))) { + } else if (((SmartType_Integer == type) || (SmartType_UInteger == type)) && + helpers::Compare<const std::type_info&, helpers::EQ, helpers::ONE>( + typeid(value), + typeid(int32_t), + typeid(uint32_t), + typeid(int64_t), + typeid(double))) { return true; - } else { - return false; } + return false; } template <typename NumberType> diff --git a/src/components/smart_objects/src/number_schema_item.cc b/src/components/smart_objects/src/number_schema_item.cc index 78be9fe85d..9789434523 100644 --- a/src/components/smart_objects/src/number_schema_item.cc +++ b/src/components/smart_objects/src/number_schema_item.cc @@ -41,7 +41,7 @@ SmartType TNumberSchemaItem<int32_t>::getSmartType() const { template <> SmartType TNumberSchemaItem<uint32_t>::getSmartType() const { - return SmartType_Integer; + return SmartType_UInteger; } template <> |