blob: 00cdbd81bd4cad3af0e1ae2ed8196c7f793e4618 [file]
/*
* Copyright (C) 2025 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "config.h"
#include "IPCTestUtilities.h"
#include "Helpers/Test.h"
#include "TransferString.h"
namespace TestWebKitAPI {
// Tests that String -> IPC::TransferString -> String is the same as String.
// Tests that StringView -> IPC::TransferString -> String is the same as String.
TEST(TransferStringTests, CreateFromString)
{
Vector<Latin1Character> longLatin1Data(FillWith { }, 1024*1024, 'a');
Vector<char16_t> longUnicodeData(FillWith { }, 1024*1200, u'a');
String subcases[] = {
{ },
""_s,
"ab"_s,
String { longLatin1Data },
String { longUnicodeData },
longUnicodeData.span().first(0), // Empty unicode.
};
bool bools[] = { false, true };
for (bool releaseToCopy : bools) {
for (auto& subcase : subcases) {
{
SCOPED_TRACE(::testing::Message() << "TransferString(String) releaseToCopy: " << releaseToCopy << " subcase: \"" << subcase << "\"");
auto ts = IPC::TransferString::create(subcase);
EXPECT_TRUE(ts.has_value());
auto string = releaseToCopy ? WTF::move(*ts).releaseToCopy() : WTF::move(*ts).release();
EXPECT_EQ(string, subcase);
}
{
SCOPED_TRACE(::testing::Message() << "TransferString(StringView) releaseToCopy: " << releaseToCopy << " subcase: \"" << subcase << "\"");
auto ts = IPC::TransferString::create(StringView { subcase });
EXPECT_TRUE(ts.has_value());
auto string = releaseToCopy ? WTF::move(*ts).releaseToCopy() : WTF::move(*ts).release();
EXPECT_EQ(string, subcase);
}
{
SCOPED_TRACE(::testing::Message() << "TransferString(String) IPC encode/decode, releaseToCopy: " << releaseToCopy << " subcase: \"" << subcase << "\"");
auto ts = IPC::TransferString::create(subcase);
EXPECT_TRUE(ts.has_value());
auto tsAfterIPC = copyViaEncoder(*ts);
ASSERT_TRUE(tsAfterIPC.has_value());
auto string = releaseToCopy ? WTF::move(*tsAfterIPC).releaseToCopy() : WTF::move(*tsAfterIPC).release();
EXPECT_EQ(string, subcase);
}
{
SCOPED_TRACE(::testing::Message() << "TransferString(StringView) IPC encode/decode, releaseToCopy: " << releaseToCopy << " subcase: \"" << subcase << "\"");
auto ts = IPC::TransferString::create(StringView { subcase });
EXPECT_TRUE(ts.has_value());
auto tsAfterIPC = copyViaEncoder(*ts);
ASSERT_TRUE(tsAfterIPC.has_value());
auto string = releaseToCopy ? WTF::move(*tsAfterIPC).releaseToCopy() : WTF::move(*tsAfterIPC).release();
EXPECT_EQ(string, subcase);
}
}
}
}
}