diff --git a/src/DirectPlay8Address.cpp b/src/DirectPlay8Address.cpp index 1c323d4..c2fd3ba 100644 --- a/src/DirectPlay8Address.cpp +++ b/src/DirectPlay8Address.cpp @@ -370,14 +370,14 @@ HRESULT DirectPlay8Address::StringComponentA::get_component(LPVOID pvBuffer, PDW { *pdwDataType = DPNA_DATATYPE_STRING_ANSI; - if(*pdwBufferSize > value.length() && pvBuffer != NULL) + if(*pdwBufferSize >= value.length() && pvBuffer != NULL) { - strcpy((char*)(pvBuffer), value.c_str()); - *pdwBufferSize = value.length() + 1; + memcpy(pvBuffer, value.data(), value.length()); + *pdwBufferSize = value.length(); return S_OK; } else{ - *pdwBufferSize = value.length() + 1; + *pdwBufferSize = value.length(); return DPNERR_BUFFERTOOSMALL; } } diff --git a/tests/DirectPlay8Address.cpp b/tests/DirectPlay8Address.cpp index 5dce47b..40b7d6f 100644 --- a/tests/DirectPlay8Address.cpp +++ b/tests/DirectPlay8Address.cpp @@ -152,6 +152,15 @@ TEST_F(DirectPlay8AddressWithWStringComponent, ComponentByIndexSizeBig) std::wstring(REFVAL, (REFVSIZE / sizeof(wchar_t)))); } +TEST_F(DirectPlay8AddressWithWStringComponent, ComponentByIndexWrongIndex) +{ + DWORD ksize = sizeof(kbuf); + DWORD vsize = sizeof(vbuf); + DWORD type; + + ASSERT_EQ(idp8->GetComponentByIndex(1, (wchar_t*)(kbuf), &ksize, (void*)(vbuf), &vsize, &type), DPNERR_DOESNOTEXIST); +} + TEST_F(DirectPlay8AddressWithWStringComponent, ComponentByNameBufferSizeZero) { DWORD vsize = 0; @@ -199,3 +208,250 @@ TEST_F(DirectPlay8AddressWithWStringComponent, ComponentByNameBufferSizeBig) EXPECT_EQ(std::wstring((const wchar_t*)(vbuf), (vsize / sizeof(wchar_t))), std::wstring(REFVAL, (REFVSIZE / sizeof(wchar_t)))); } + +TEST_F(DirectPlay8AddressWithWStringComponent, ComponentByNameWrongName) +{ + DWORD vsize = sizeof(vbuf); + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(L"wrongkey", (void*)(vbuf), &vsize, &type), DPNERR_DOESNOTEXIST); +} + +TEST_F(DirectPlay8AddressWithWStringComponent, Clear) +{ + ASSERT_EQ(idp8->Clear(), S_OK); + + { + DWORD num; + ASSERT_EQ(idp8->GetNumComponents(&num), S_OK); + ASSERT_EQ(num, (DWORD)(0)); + } + + { + DWORD vsize = sizeof(vbuf); + DWORD type; + + EXPECT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), DPNERR_DOESNOTEXIST); + } + + { + DWORD ksize = sizeof(kbuf); + DWORD vsize = sizeof(vbuf); + DWORD type; + + ASSERT_EQ(idp8->GetComponentByIndex(0, (wchar_t*)(kbuf), &ksize, (void*)(vbuf), &vsize, &type), DPNERR_DOESNOTEXIST); + } +} + +class DirectPlay8AddressWithAStringComponent: public DirectPlay8AddressInitial +{ + protected: + const wchar_t *REFKEY = L"key"; + + const char *REFVAL = "ASCII string value"; + const DWORD REFVSIZE = 19; + + unsigned char vbuf[256]; + + virtual void SetUp() override + { + memset(vbuf, 0xFF, sizeof(vbuf)); + + ASSERT_EQ(idp8->AddComponent(REFKEY, REFVAL, REFVSIZE, DPNA_DATATYPE_STRING_ANSI), S_OK); + } +}; + +TEST_F(DirectPlay8AddressWithAStringComponent, HasOneComponent) +{ + DWORD num; + ASSERT_EQ(idp8->GetNumComponents(&num), S_OK); + EXPECT_EQ(num, (DWORD)(1)); +} + +TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeZero) +{ + DWORD vsize = 0; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, NULL, &vsize, &type), DPNERR_BUFFERTOOSMALL); + + EXPECT_EQ(vsize, REFVSIZE); +} + +TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeSmall) +{ + DWORD vsize = REFVSIZE - 1; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), DPNERR_BUFFERTOOSMALL); + + EXPECT_EQ(vsize, REFVSIZE); +} + +TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeExact) +{ + DWORD vsize = REFVSIZE; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); + + EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_STRING_ANSI)); + + EXPECT_EQ(std::string((const char*)(vbuf), vsize), std::string(REFVAL, REFVSIZE)); +} + +TEST_F(DirectPlay8AddressWithAStringComponent, ComponentByNameBufferSizeBig) +{ + DWORD vsize = REFVSIZE * 2; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); + + EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_STRING_ANSI)); + + EXPECT_EQ(std::string((const char*)(vbuf), vsize), std::string(REFVAL, REFVSIZE)); +} + +class DirectPlay8AddressWithDWORDComponent: public DirectPlay8AddressInitial +{ + protected: + const wchar_t *REFKEY = L"key"; + + const DWORD REFVAL = 0x0EA7BEEF; + const DWORD REFVSIZE = sizeof(REFVAL); + + unsigned char vbuf[256]; + + virtual void SetUp() override + { + memset(vbuf, 0xFF, sizeof(vbuf)); + + ASSERT_EQ(idp8->AddComponent(REFKEY, &REFVAL, REFVSIZE, DPNA_DATATYPE_DWORD), S_OK); + } +}; + +TEST_F(DirectPlay8AddressWithDWORDComponent, HasOneComponent) +{ + DWORD num; + ASSERT_EQ(idp8->GetNumComponents(&num), S_OK); + EXPECT_EQ(num, (DWORD)(1)); +} + +TEST_F(DirectPlay8AddressWithDWORDComponent, ComponentByNameBufferSizeZero) +{ + DWORD vsize = 0; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, NULL, &vsize, &type), DPNERR_BUFFERTOOSMALL); + + EXPECT_EQ(vsize, REFVSIZE); +} + +TEST_F(DirectPlay8AddressWithDWORDComponent, ComponentByNameBufferSizeSmall) +{ + DWORD vsize = REFVSIZE - 1; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), DPNERR_BUFFERTOOSMALL); + + EXPECT_EQ(vsize, REFVSIZE); +} + +TEST_F(DirectPlay8AddressWithDWORDComponent, ComponentByNameBufferSizeExact) +{ + DWORD vsize = REFVSIZE; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); + + EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_DWORD)); + + EXPECT_EQ(*(DWORD*)(vbuf), REFVAL); +} + +TEST_F(DirectPlay8AddressWithDWORDComponent, ComponentByNameBufferSizeBig) +{ + DWORD vsize = REFVSIZE * 2; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); + + EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_DWORD)); + + EXPECT_EQ(*(DWORD*)(vbuf), REFVAL); +} + +class DirectPlay8AddressWithGUIDComponent: public DirectPlay8AddressInitial +{ + protected: + const wchar_t *REFKEY = L"key"; + + const GUID REFVAL = CLSID_DirectPlay8Address; + const DWORD REFVSIZE = sizeof(REFVAL); + + unsigned char vbuf[256]; + + virtual void SetUp() override + { + memset(vbuf, 0xFF, sizeof(vbuf)); + + ASSERT_EQ(idp8->AddComponent(REFKEY, &REFVAL, REFVSIZE, DPNA_DATATYPE_GUID), S_OK); + } +}; + +TEST_F(DirectPlay8AddressWithGUIDComponent, HasOneComponent) +{ + DWORD num; + ASSERT_EQ(idp8->GetNumComponents(&num), S_OK); + EXPECT_EQ(num, (DWORD)(1)); +} + +TEST_F(DirectPlay8AddressWithGUIDComponent, ComponentByNameBufferSizeZero) +{ + DWORD vsize = 0; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, NULL, &vsize, &type), DPNERR_BUFFERTOOSMALL); + + EXPECT_EQ(vsize, REFVSIZE); +} + +TEST_F(DirectPlay8AddressWithGUIDComponent, ComponentByNameBufferSizeSmall) +{ + DWORD vsize = REFVSIZE - 1; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), DPNERR_BUFFERTOOSMALL); + + EXPECT_EQ(vsize, REFVSIZE); +} + +TEST_F(DirectPlay8AddressWithGUIDComponent, ComponentByNameBufferSizeExact) +{ + DWORD vsize = REFVSIZE; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); + + EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_GUID)); + + EXPECT_EQ(*(GUID*)(vbuf), REFVAL); +} + +TEST_F(DirectPlay8AddressWithGUIDComponent, ComponentByNameBufferSizeBig) +{ + DWORD vsize = REFVSIZE * 2; + DWORD type; + + ASSERT_EQ(idp8->GetComponentByName(REFKEY, (void*)(vbuf), &vsize, &type), S_OK); + + EXPECT_EQ(vsize, REFVSIZE); + EXPECT_EQ(type, (DWORD)(DPNA_DATATYPE_GUID)); + + EXPECT_EQ(*(GUID*)(vbuf), REFVAL); +}