#include "config.h" #include "test/rpc/test_object_storage.h" #include "helpers/assert.h" CPPUNIT_TEST_SUITE_REGISTRATION(TestObjectStorage); void TestObjectStorage::test_basics() { rpc::object_storage::iterator itr; CPPUNIT_ASSERT(m_storage.empty()); itr = m_storage.insert("test_1", torrent::Object("a"), rpc::object_storage::flag_string_type); CPPUNIT_ASSERT(itr != m_storage.end()); CPPUNIT_ASSERT(&*itr != NULL); CPPUNIT_ASSERT(itr->first.size() == 6 && std::strcmp(itr->first.data(), "test_1") == 0); CPPUNIT_ASSERT(itr->second.object.is_string() && itr->second.object.as_string() == "a"); ASSERT_CATCH_INPUT_ERROR( { m_storage.insert("test_1", torrent::Object("a"), rpc::object_storage::flag_string_type); } ); // Test erase. m_storage.erase(rpc::object_storage::key_type::from_c_str("test_1")); CPPUNIT_ASSERT(m_storage.empty()); // Test with no type flag. ASSERT_CATCH_INPUT_ERROR( { m_storage.insert("test_2", torrent::Object("b"), 0); } ); ASSERT_CATCH_INPUT_ERROR( { m_storage.insert("test_3", torrent::Object("c"), ~rpc::object_storage::mask_type); } ); m_storage.clear(); } void TestObjectStorage::test_conversions() { CPPUNIT_ASSERT(m_storage.insert("test_1", torrent::Object("a"), rpc::object_storage::flag_string_type) != m_storage.end()); CPPUNIT_ASSERT(m_storage.insert_str(std::string("test_2"), torrent::Object("a"), rpc::object_storage::flag_string_type) != m_storage.end()); char raw_3[8] = "test_3\x1"; torrent::raw_string raw_string_3(raw_3, 6); CPPUNIT_ASSERT(m_storage.insert(raw_string_3, torrent::Object("a"), rpc::object_storage::flag_string_type)->first == std::string("test_3")); m_storage.clear(); } void TestObjectStorage::test_validate_keys() { torrent::raw_string raw_string_4("test_4\0foo", 10); ASSERT_CATCH_INPUT_ERROR( { m_storage.insert(raw_string_4, torrent::Object("a"), rpc::object_storage::flag_string_type); } ); ASSERT_CATCH_INPUT_ERROR( { m_storage.insert_str("", torrent::Object("a"), rpc::object_storage::flag_string_type); } ); std::string key_max(rpc::object_storage::key_size - 1, 'k'); CPPUNIT_ASSERT(m_storage.insert_str(key_max, torrent::Object("a"), rpc::object_storage::flag_string_type)->first == key_max); ASSERT_CATCH_INPUT_ERROR( { m_storage.insert_str(key_max + 'k', torrent::Object("a"), rpc::object_storage::flag_string_type); } ); // The over-long key must not have been stored as the empty key. CPPUNIT_ASSERT(m_storage.find_raw_string(torrent::raw_string::from_c_str("")) == m_storage.end()); // An over-long key must not be truncated into a match either. CPPUNIT_ASSERT(m_storage.find_raw_string(torrent::raw_string::from_string(key_max + 'k')) == m_storage.end()); // set_c_str puts the terminating nul at m_data[size()], so size() has to // stay below max_size for that write to land inside the array. rpc::object_storage::key_type key_long; key_long.set_c_str(std::string(rpc::object_storage::key_size + 1, 'k').c_str()); CPPUNIT_ASSERT(key_long.size() < rpc::object_storage::key_size); m_storage.clear(); m_storage.insert_str("test_5", torrent::Object("a"), rpc::object_storage::flag_string_type); // insert rejects a key holding a nul-char, so a lookup must not match past one. CPPUNIT_ASSERT(m_storage.find_raw_string(torrent::raw_string("test_5\0x", 8)) == m_storage.end()); CPPUNIT_ASSERT(m_storage.find_raw_string(torrent::raw_string::from_c_str("test_5")) != m_storage.end()); m_storage.clear(); } // And test many other bad/good string combos. // Test for various conversions of fixed_key_type. void TestObjectStorage::test_access() { m_storage.insert("string_1", torrent::Object("gen_a"), rpc::object_storage::flag_string_type); m_storage.insert("value_1", int64_t(1), rpc::object_storage::flag_value_type); CPPUNIT_ASSERT(m_storage.get_c_str("string_1").as_string() == "gen_a"); CPPUNIT_ASSERT(m_storage.set_c_str_string("string_1", "test").as_string() == "test"); // Test value from raw and normal, list, etc. CPPUNIT_ASSERT(m_storage.get_c_str("value_1").as_value() == 1); CPPUNIT_ASSERT(m_storage.set_c_str_value("value_1", int64_t(2)).as_value() == 2); // CPPUNIT_ASSERT(m_storage.set_c_str_value("value_1", "123").as_value() == 123); // CPPUNIT_ASSERT(m_storage.set_c_str_value("value_1", torrent::raw_string::from_c_str("321")).as_value() == 321); // CPPUNIT_ASSERT(m_storage.set_c_str_value("value_1", torrent::raw_bencode::from_c_str("i567e")).as_value() == 567); // ASSERT_CATCH_INPUT_ERROR( { m_storage.set_c_str_value("value_1", "e123"); } ); // Test string from raw and normal, list, etc. }