summaryrefslogtreecommitdiff
path: root/tools/aapt2/proto/TableProtoSerializer_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/aapt2/proto/TableProtoSerializer_test.cpp')
-rw-r--r--tools/aapt2/proto/TableProtoSerializer_test.cpp147
1 files changed, 93 insertions, 54 deletions
diff --git a/tools/aapt2/proto/TableProtoSerializer_test.cpp b/tools/aapt2/proto/TableProtoSerializer_test.cpp
index dd995d858d77..2bd976796f53 100644
--- a/tools/aapt2/proto/TableProtoSerializer_test.cpp
+++ b/tools/aapt2/proto/TableProtoSerializer_test.cpp
@@ -16,49 +16,47 @@
#include "ResourceTable.h"
#include "proto/ProtoSerialize.h"
-#include "test/Builders.h"
-#include "test/Common.h"
-#include "test/Context.h"
+#include "test/Test.h"
-#include <gtest/gtest.h>
+using namespace google::protobuf::io;
namespace aapt {
TEST(TableProtoSerializer, SerializeSinglePackage) {
std::unique_ptr<IAaptContext> context = test::ContextBuilder().build();
std::unique_ptr<ResourceTable> table = test::ResourceTableBuilder()
- .setPackageId(u"com.app.a", 0x7f)
- .addFileReference(u"@com.app.a:layout/main", ResourceId(0x7f020000),
- u"res/layout/main.xml")
- .addReference(u"@com.app.a:layout/other", ResourceId(0x7f020001),
- u"@com.app.a:layout/main")
- .addString(u"@com.app.a:string/text", {}, u"hi")
- .addValue(u"@com.app.a:id/foo", {}, util::make_unique<Id>())
+ .setPackageId("com.app.a", 0x7f)
+ .addFileReference("com.app.a:layout/main", ResourceId(0x7f020000),
+ "res/layout/main.xml")
+ .addReference("com.app.a:layout/other", ResourceId(0x7f020001),
+ "com.app.a:layout/main")
+ .addString("com.app.a:string/text", {}, "hi")
+ .addValue("com.app.a:id/foo", {}, util::make_unique<Id>())
.build();
Symbol publicSymbol;
publicSymbol.state = SymbolState::kPublic;
- ASSERT_TRUE(table->setSymbolState(test::parseNameOrDie(u"@com.app.a:layout/main"),
+ ASSERT_TRUE(table->setSymbolState(test::parseNameOrDie("com.app.a:layout/main"),
ResourceId(0x7f020000),
publicSymbol, context->getDiagnostics()));
- Id* id = test::getValue<Id>(table.get(), u"@com.app.a:id/foo");
+ Id* id = test::getValue<Id>(table.get(), "com.app.a:id/foo");
ASSERT_NE(nullptr, id);
// Make a plural.
std::unique_ptr<Plural> plural = util::make_unique<Plural>();
- plural->values[Plural::One] = util::make_unique<String>(table->stringPool.makeRef(u"one"));
- ASSERT_TRUE(table->addResource(test::parseNameOrDie(u"@com.app.a:plurals/hey"),
- ConfigDescription{}, std::string(), std::move(plural),
+ plural->values[Plural::One] = util::make_unique<String>(table->stringPool.makeRef("one"));
+ ASSERT_TRUE(table->addResource(test::parseNameOrDie("com.app.a:plurals/hey"),
+ ConfigDescription{}, {}, std::move(plural),
context->getDiagnostics()));
// Make a resource with different products.
- ASSERT_TRUE(table->addResource(test::parseNameOrDie(u"@com.app.a:integer/one"),
- test::parseConfigOrDie("land"), std::string(),
+ ASSERT_TRUE(table->addResource(test::parseNameOrDie("com.app.a:integer/one"),
+ test::parseConfigOrDie("land"), {},
test::buildPrimitive(android::Res_value::TYPE_INT_DEC, 123u),
context->getDiagnostics()));
- ASSERT_TRUE(table->addResource(test::parseNameOrDie(u"@com.app.a:integer/one"),
- test::parseConfigOrDie("land"), std::string("tablet"),
+ ASSERT_TRUE(table->addResource(test::parseNameOrDie("com.app.a:integer/one"),
+ test::parseConfigOrDie("land"), "tablet",
test::buildPrimitive(android::Res_value::TYPE_INT_DEC, 321u),
context->getDiagnostics()));
@@ -66,10 +64,10 @@ TEST(TableProtoSerializer, SerializeSinglePackage) {
// The reference should point to a resource outside of this table to test that both
// name and id get serialized.
Reference expectedRef;
- expectedRef.name = test::parseNameOrDie(u"@android:layout/main");
+ expectedRef.name = test::parseNameOrDie("android:layout/main");
expectedRef.id = ResourceId(0x01020000);
- ASSERT_TRUE(table->addResource(test::parseNameOrDie(u"@com.app.a:layout/abc"),
- ConfigDescription::defaultConfig(), std::string(),
+ ASSERT_TRUE(table->addResource(test::parseNameOrDie("com.app.a:layout/abc"),
+ ConfigDescription::defaultConfig(), {},
util::make_unique<Reference>(expectedRef),
context->getDiagnostics()));
@@ -81,28 +79,28 @@ TEST(TableProtoSerializer, SerializeSinglePackage) {
context->getDiagnostics());
ASSERT_NE(nullptr, newTable);
- Id* newId = test::getValue<Id>(newTable.get(), u"@com.app.a:id/foo");
+ Id* newId = test::getValue<Id>(newTable.get(), "com.app.a:id/foo");
ASSERT_NE(nullptr, newId);
EXPECT_EQ(id->isWeak(), newId->isWeak());
Maybe<ResourceTable::SearchResult> result = newTable->findResource(
- test::parseNameOrDie(u"@com.app.a:layout/main"));
+ test::parseNameOrDie("com.app.a:layout/main"));
AAPT_ASSERT_TRUE(result);
EXPECT_EQ(SymbolState::kPublic, result.value().type->symbolStatus.state);
EXPECT_EQ(SymbolState::kPublic, result.value().entry->symbolStatus.state);
// Find the product-dependent values
BinaryPrimitive* prim = test::getValueForConfigAndProduct<BinaryPrimitive>(
- newTable.get(), u"@com.app.a:integer/one", test::parseConfigOrDie("land"), "");
+ newTable.get(), "com.app.a:integer/one", test::parseConfigOrDie("land"), "");
ASSERT_NE(nullptr, prim);
EXPECT_EQ(123u, prim->value.data);
prim = test::getValueForConfigAndProduct<BinaryPrimitive>(
- newTable.get(), u"@com.app.a:integer/one", test::parseConfigOrDie("land"), "tablet");
+ newTable.get(), "com.app.a:integer/one", test::parseConfigOrDie("land"), "tablet");
ASSERT_NE(nullptr, prim);
EXPECT_EQ(321u, prim->value.data);
- Reference* actualRef = test::getValue<Reference>(newTable.get(), u"@com.app.a:layout/abc");
+ Reference* actualRef = test::getValue<Reference>(newTable.get(), "com.app.a:layout/abc");
ASSERT_NE(nullptr, actualRef);
AAPT_ASSERT_TRUE(actualRef->name);
AAPT_ASSERT_TRUE(actualRef->id);
@@ -115,37 +113,70 @@ TEST(TableProtoSerializer, SerializeFileHeader) {
ResourceFile f;
f.config = test::parseConfigOrDie("hdpi-v9");
- f.name = test::parseNameOrDie(u"@com.app.a:layout/main");
+ f.name = test::parseNameOrDie("com.app.a:layout/main");
f.source.path = "res/layout-hdpi-v9/main.xml";
- f.exportedSymbols.push_back(SourcedResourceName{ test::parseNameOrDie(u"@+id/unchecked"), 23u });
+ f.exportedSymbols.push_back(SourcedResourceName{ test::parseNameOrDie("id/unchecked"), 23u });
- const std::string expectedData = "1234";
-
- std::unique_ptr<pb::CompiledFile> pbFile = serializeCompiledFileToPb(f);
+ const std::string expectedData1 = "123";
+ const std::string expectedData2 = "1234";
std::string outputStr;
{
- google::protobuf::io::StringOutputStream outStream(&outputStr);
- CompiledFileOutputStream outFileStream(&outStream, pbFile.get());
-
- ASSERT_TRUE(outFileStream.Write(expectedData.data(), expectedData.size()));
- ASSERT_TRUE(outFileStream.Finish());
+ std::unique_ptr<pb::CompiledFile> pbFile1 = serializeCompiledFileToPb(f);
+
+ f.name.entry = "__" + f.name.entry + "$0";
+ std::unique_ptr<pb::CompiledFile> pbFile2 = serializeCompiledFileToPb(f);
+
+ StringOutputStream outStream(&outputStr);
+ CompiledFileOutputStream outFileStream(&outStream);
+ outFileStream.WriteLittleEndian32(2);
+ outFileStream.WriteCompiledFile(pbFile1.get());
+ outFileStream.WriteData(expectedData1.data(), expectedData1.size());
+ outFileStream.WriteCompiledFile(pbFile2.get());
+ outFileStream.WriteData(expectedData2.data(), expectedData2.size());
+ ASSERT_FALSE(outFileStream.HadError());
}
CompiledFileInputStream inFileStream(outputStr.data(), outputStr.size());
- const pb::CompiledFile* newPbFile = inFileStream.CompiledFile();
- ASSERT_NE(nullptr, newPbFile);
+ uint32_t numFiles = 0;
+ ASSERT_TRUE(inFileStream.ReadLittleEndian32(&numFiles));
+ ASSERT_EQ(2u, numFiles);
+
+ // Read the first compiled file.
- std::unique_ptr<ResourceFile> file = deserializeCompiledFileFromPb(*newPbFile, Source{ "test" },
+ pb::CompiledFile newPbFile;
+ ASSERT_TRUE(inFileStream.ReadCompiledFile(&newPbFile));
+
+ std::unique_ptr<ResourceFile> file = deserializeCompiledFileFromPb(newPbFile, Source("test"),
context->getDiagnostics());
ASSERT_NE(nullptr, file);
- std::string actualData((const char*)inFileStream.data(), inFileStream.size());
- EXPECT_EQ(expectedData, actualData);
- EXPECT_EQ(0u, reinterpret_cast<uintptr_t>(inFileStream.data()) & 0x03);
+ uint64_t offset, len;
+ ASSERT_TRUE(inFileStream.ReadDataMetaData(&offset, &len));
+
+ std::string actualData(outputStr.data() + offset, len);
+ EXPECT_EQ(expectedData1, actualData);
+
+ // Expect the data to be aligned.
+ EXPECT_EQ(0u, offset & 0x03);
ASSERT_EQ(1u, file->exportedSymbols.size());
- EXPECT_EQ(test::parseNameOrDie(u"@+id/unchecked"), file->exportedSymbols[0].name);
+ EXPECT_EQ(test::parseNameOrDie("id/unchecked"), file->exportedSymbols[0].name);
+
+ // Read the second compiled file.
+
+ ASSERT_TRUE(inFileStream.ReadCompiledFile(&newPbFile));
+
+ file = deserializeCompiledFileFromPb(newPbFile, Source("test"), context->getDiagnostics());
+ ASSERT_NE(nullptr, file);
+
+ ASSERT_TRUE(inFileStream.ReadDataMetaData(&offset, &len));
+
+ actualData = std::string(outputStr.data() + offset, len);
+ EXPECT_EQ(expectedData2, actualData);
+
+ // Expect the data to be aligned.
+ EXPECT_EQ(0u, offset & 0x03);
}
TEST(TableProtoSerializer, DeserializeCorruptHeaderSafely) {
@@ -156,19 +187,27 @@ TEST(TableProtoSerializer, DeserializeCorruptHeaderSafely) {
std::string outputStr;
{
- google::protobuf::io::StringOutputStream outStream(&outputStr);
- CompiledFileOutputStream outFileStream(&outStream, pbFile.get());
-
- ASSERT_TRUE(outFileStream.Write(expectedData.data(), expectedData.size()));
- ASSERT_TRUE(outFileStream.Finish());
+ StringOutputStream outStream(&outputStr);
+ CompiledFileOutputStream outFileStream(&outStream);
+ outFileStream.WriteLittleEndian32(1);
+ outFileStream.WriteCompiledFile(pbFile.get());
+ outFileStream.WriteData(expectedData.data(), expectedData.size());
+ ASSERT_FALSE(outFileStream.HadError());
}
- outputStr[0] = 0xff;
+ outputStr[4] = 0xff;
CompiledFileInputStream inFileStream(outputStr.data(), outputStr.size());
- EXPECT_EQ(nullptr, inFileStream.CompiledFile());
- EXPECT_EQ(nullptr, inFileStream.data());
- EXPECT_EQ(0u, inFileStream.size());
+
+ uint32_t numFiles = 0;
+ EXPECT_TRUE(inFileStream.ReadLittleEndian32(&numFiles));
+ EXPECT_EQ(1u, numFiles);
+
+ pb::CompiledFile newPbFile;
+ EXPECT_FALSE(inFileStream.ReadCompiledFile(&newPbFile));
+
+ uint64_t offset, len;
+ EXPECT_FALSE(inFileStream.ReadDataMetaData(&offset, &len));
}
} // namespace aapt