blob: 9bc1977ed230d2beb51beca60913a1ad0c1f6778 [file] [log] [blame]
/*
* Copyright (C) 2012 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.ide.common.res2;
import com.google.common.base.Charsets;
import com.google.common.collect.ListMultimap;
import com.google.common.io.Files;
import junit.framework.TestCase;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.regex.Matcher;
import javax.imageio.ImageIO;
public abstract class BaseTestCase extends TestCase {
protected void verifyResourceExists(DataMap<? extends DataItem> dataMap,
String... dataItemKeys) {
ListMultimap<String, ? extends DataItem> map = dataMap.getDataMap();
for (String resKey : dataItemKeys) {
List<? extends DataItem> items = map.get(resKey);
assertTrue("resource '" + resKey + "' is missing!", items.size() > 0);
}
}
/**
* Compares two resource maps.
*
* if <var>fullCompare</var> is <code>true</code> then it'll make sure the multimaps contains
* the same number of items, otherwise it'll only checks that each resource key is present
* in both maps.
*
* @param dataMap1 the first resource Map
* @param dataMap2 the second resource Map
* @param fullCompare whether a full compare is requested.
*/
protected void compareResourceMaps(DataMap<? extends DataItem> dataMap1,
DataMap<? extends DataItem> dataMap2,
boolean fullCompare) {
assertEquals(dataMap1.size(), dataMap2.size());
// compare the resources are all the same
ListMultimap<String, ? extends DataItem> map1 = dataMap1.getDataMap();
ListMultimap<String, ? extends DataItem> map2 = dataMap2.getDataMap();
for (String key : map1.keySet()) {
List<? extends DataItem> items1 = map1.get(key);
List<? extends DataItem> items2 = map2.get(key);
if (fullCompare) {
assertEquals("Wrong size for " + key, items1.size(), items2.size());
} else {
boolean map1HasItem = !items1.isEmpty();
boolean map2HasItem = !items2.isEmpty();
assertEquals("resource " + key + " missing from one map", map1HasItem, map2HasItem);
}
}
}
protected static void checkImageColor(File file, int expectedColor) throws IOException {
assertTrue("File '" + file.getAbsolutePath() + "' does not exist.", file.isFile());
BufferedImage image = ImageIO.read(file);
int rgb = image.getRGB(0, 0);
assertEquals(String.format("Expected: 0x%08X, actual: 0x%08X for file %s",
expectedColor, rgb, file),
expectedColor, rgb);
}
/**
* Returns a folder containing a merger blob data for the given test data folder.
*
* This is to work around the fact that the merger blob data contains full path, but we don't
* know where this project is located on the drive. This rewrites the blob to contain the
* actual folder.
* (The blobs written in the test data contains placeholders for the path root and path
* separators)
*
* @param folder
* @return
* @throws java.io.IOException
*/
protected static File getMergedBlobFolder(File folder) throws IOException {
File originalMerger = new File(folder, DataMerger.FN_MERGER_XML);
String content = Files.toString(originalMerger, Charsets.UTF_8);
// search and replace $TOP$ with the root and $SEP$ with the platform separator.
content = content.replaceAll(
"\\$TOP\\$", Matcher.quoteReplacement(folder.getAbsolutePath())).
replaceAll("\\$SEP\\$", Matcher.quoteReplacement(File.separator));
File tempFolder = Files.createTempDir();
Files.write(content, new File(tempFolder, DataMerger.FN_MERGER_XML), Charsets.UTF_8);
return tempFolder;
}
/**
* Post {@link #getMergedBlobFolder(java.io.File)} check. After the DataMerger is created
* from the file generated, this checks that the file replacement works and all the files are
* where they are supposed to be.
*
* @param dataMerger
*/
protected void checkSourceFolders(
DataMerger<? extends DataItem, ? extends DataFile, ? extends DataSet> dataMerger) {
// Loop on all the data sets.
for (DataSet<? extends DataItem, ? extends DataFile> set : dataMerger.getDataSets()) {
// get the source files and verify they exists.
List<File> files = set.getSourceFiles();
for (File file : files) {
assertTrue("Not a folder: " + file.getAbsolutePath(), file.isDirectory());
}
// for each source file, also check that the files inside are in fact inside
// them. We don't check if those files are there though because the tests could
// be testing with missing files to simulate updates.
ListMultimap<String, ? extends DataItem> itemMap = set.getDataMap();
for (DataItem item : itemMap.values()) {
DataFile dataFile = item.getSource();
File file = dataFile.getFile();
assertNotNull("Not in source file: " + file.getAbsolutePath(),
set.findMatchingSourceFile(file));
}
}
}
protected static void checkLogger(RecordingLogger logger) {
if (!logger.getErrorMsgs().isEmpty()) {
assertTrue(logger.getErrorMsgs().get(0), false);
}
}
}