TestHelpers.cpp revision 4c67a475a334e4f65238d439a3339195e03c03be
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 197a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski#include <unistd.h> 20ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 21ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski#include "android-base/logging.h" 224c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski#include "ziparchive/zip_archive.h" 2360293197379e522c870c4a28462804207bab505dAdam Lesinski 2460293197379e522c870c4a28462804207bab505dAdam Lesinskinamespace android { 2560293197379e522c870c4a28462804207bab505dAdam Lesinski 26ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinskistatic std::string sTestDataPath; 27ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 28ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinskivoid SetTestDataPath(const std::string& path) { sTestDataPath = path; } 29ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 30ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinskiconst std::string& GetTestDataPath() { 31ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski CHECK(!sTestDataPath.empty()) << "no test data path set."; 32ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski return sTestDataPath; 33ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski} 34ea7897954f6339dcc2e5af1584f72c6b2ecd7a67Adam Lesinski 354c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski::testing::AssertionResult ReadFileFromZipToString(const std::string& zip_path, 364c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski const std::string& file, 374c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski std::string* out_contents) { 384c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski out_contents->clear(); 394c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::ZipArchiveHandle handle; 404c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski int32_t result = OpenArchive(zip_path.c_str(), &handle); 414c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (result != 0) { 424c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski return ::testing::AssertionFailure() << "Failed to open zip '" << zip_path 434c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski << "': " << ::ErrorCodeString(result); 444c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 454c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 464c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::ZipString name(file.c_str()); 474c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::ZipEntry entry; 484c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski result = ::FindEntry(handle, name, &entry); 494c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (result != 0) { 504c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::CloseArchive(handle); 514c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski return ::testing::AssertionFailure() << "Could not find file '" << file << "' in zip '" 524c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski << zip_path << "' : " << ::ErrorCodeString(result); 534c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 544c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 554c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski out_contents->resize(entry.uncompressed_length); 564c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski result = ::ExtractToMemory( 574c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski handle, &entry, const_cast<uint8_t*>(reinterpret_cast<const uint8_t*>(out_contents->data())), 584c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski out_contents->size()); 594c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski if (result != 0) { 604c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::CloseArchive(handle); 614c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski return ::testing::AssertionFailure() << "Failed to extract file '" << file << "' from zip '" 624c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski << zip_path << "': " << ::ErrorCodeString(result); 634c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski } 644c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 654c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski ::CloseArchive(handle); 664c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski return ::testing::AssertionSuccess(); 674c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski} 684c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski 694c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski::testing::AssertionResult IsStringEqual(const ResTable& table, uint32_t resource_id, 707a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const char* expected_str) { 717a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski Res_value val; 727a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski ssize_t block = table.getResource(resource_id, &val, MAY_NOT_BE_BAG); 737a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (block < 0) { 747a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski return ::testing::AssertionFailure() << "could not find resource"; 757a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 767a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 777a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (val.dataType != Res_value::TYPE_STRING) { 787a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski return ::testing::AssertionFailure() << "resource is not a string"; 797a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 807a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 817a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const ResStringPool* pool = table.getTableStringBlock(block); 827a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (pool == NULL) { 834c67a475a334e4f65238d439a3339195e03c03beAdam Lesinski return ::testing::AssertionFailure() << "table has no string pool for block " << block; 847a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 857a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski 867a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski const String8 actual_str = pool->string8ObjectAt(val.data); 877a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski if (String8(expected_str) != actual_str) { 887a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski return ::testing::AssertionFailure() << actual_str.string(); 897a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski } 907a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski return ::testing::AssertionSuccess() << actual_str.string(); 9160293197379e522c870c4a28462804207bab505dAdam Lesinski} 9260293197379e522c870c4a28462804207bab505dAdam Lesinski 937a37b74d37ff79e805c9e97d977e07bfec753c5aAdam Lesinski} // namespace android 94