160293197379e522c870c4a28462804207bab505dAdam Lesinski/* 27a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski * Copyright (C) 2016 The Android Open Source Project 360293197379e522c870c4a28462804207bab505dAdam Lesinski * 460293197379e522c870c4a28462804207bab505dAdam Lesinski * Licensed under the Apache License, Version 2.0 (the "License"); 560293197379e522c870c4a28462804207bab505dAdam Lesinski * you may not use this file except in compliance with the License. 660293197379e522c870c4a28462804207bab505dAdam Lesinski * You may obtain a copy of the License at 760293197379e522c870c4a28462804207bab505dAdam Lesinski * 860293197379e522c870c4a28462804207bab505dAdam Lesinski * http://www.apache.org/licenses/LICENSE-2.0 960293197379e522c870c4a28462804207bab505dAdam Lesinski * 1060293197379e522c870c4a28462804207bab505dAdam Lesinski * Unless required by applicable law or agreed to in writing, software 1160293197379e522c870c4a28462804207bab505dAdam Lesinski * distributed under the License is distributed on an "AS IS" BASIS, 1260293197379e522c870c4a28462804207bab505dAdam Lesinski * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1360293197379e522c870c4a28462804207bab505dAdam Lesinski * See the License for the specific language governing permissions and 1460293197379e522c870c4a28462804207bab505dAdam Lesinski * limitations under the License. 1560293197379e522c870c4a28462804207bab505dAdam Lesinski */ 1660293197379e522c870c4a28462804207bab505dAdam Lesinski 1760293197379e522c870c4a28462804207bab505dAdam Lesinski#include "TestHelpers.h" 1860293197379e522c870c4a28462804207bab505dAdam Lesinski 194c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski#include "ziparchive/zip_archive.h" 2060293197379e522c870c4a28462804207bab505dAdam Lesinski 21873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinskiusing ::testing::AssertionFailure; 22873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinskiusing ::testing::AssertionResult; 23873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinskiusing ::testing::AssertionSuccess; 24ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 25873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinskinamespace android { 26ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 27873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam LesinskiAssertionResult ReadFileFromZipToString(const std::string& zip_path, const std::string& file, 28873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski std::string* out_contents) { 294c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski out_contents->clear(); 304c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::ZipArchiveHandle handle; 314c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski int32_t result = OpenArchive(zip_path.c_str(), &handle); 324c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (result != 0) { 33873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionFailure() << "Failed to open zip '" << zip_path 34873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski << "': " << ::ErrorCodeString(result); 354c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 364c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 374c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::ZipString name(file.c_str()); 384c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::ZipEntry entry; 394c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski result = ::FindEntry(handle, name, &entry); 404c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (result != 0) { 414c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::CloseArchive(handle); 42873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionFailure() << "Could not find file '" << file << "' in zip '" << zip_path 43873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski << "' : " << ::ErrorCodeString(result); 444c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 454c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 464c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski out_contents->resize(entry.uncompressed_length); 474c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski result = ::ExtractToMemory( 484c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski handle, &entry, const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(out_contents->data())), 494c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski out_contents->size()); 504c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (result != 0) { 514c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::CloseArchive(handle); 52873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionFailure() << "Failed to extract file '" << file << "' from zip '" << zip_path 53873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski << "': " << ::ErrorCodeString(result); 544c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 554c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 564c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::CloseArchive(handle); 57873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionSuccess(); 584c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski} 594c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 60873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam LesinskiAssertionResult IsStringEqual(const ResTable& table, uint32_t resource_id, 61873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski const char* expected_str) { 627a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski Res_value val; 637a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ssize_t block = table.getResource(resource_id, &val, MAY_NOT_BE_BAG); 647a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (block < 0) { 65873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionFailure() << "could not find resource"; 667a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 677a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 687a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (val.dataType != Res_value::TYPE_STRING) { 69873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionFailure() << "resource is not a string"; 707a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 717a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 727a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const ResStringPool* pool = table.getTableStringBlock(block); 737a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (pool == NULL) { 74873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionFailure() << "table has no string pool for block " << block; 757a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 767a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 777a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const String8 actual_str = pool->string8ObjectAt(val.data); 787a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (String8(expected_str) != actual_str) { 79873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionFailure() << actual_str.string(); 807a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 81873ef0e2302a1581dbcb83b49cefc95dcc41f5a0Adam Lesinski return AssertionSuccess() << actual_str.string(); 827ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski} 837ad1110ecd6a840fcd2895c62668828a1ca029c6Adam Lesinski 847a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski} // namespace android 85