mirror of
https://github.com/google/nomulus.git
synced 2025-05-15 00:47:11 +02:00
Clean up test "load resources" methods and classes
There is a big mix of different "load Resources" from different libraries depending on where you were and what type of resource you want. Now there is a clear hirarchy: ResourceUtils: for use in actual (non-test) code, reads a file from a context directory TestDataHelper (uses ResourceUtils): for use in tests, reads a file from a context directory + "/testdata". Also caches the resource so calling it multiple times with the same file will not read the file multiple times. Library specific helpers (e.g. ToolsTestData) (uses TestDataHelper): for use in that library's tests only, reads from a specific testdata directory. ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=177027533
This commit is contained in:
parent
bbe2584da4
commit
95647528b8
12 changed files with 66 additions and 75 deletions
|
@ -15,28 +15,62 @@
|
|||
package google.registry.testing;
|
||||
|
||||
import static google.registry.util.CollectionUtils.nullToEmpty;
|
||||
import static google.registry.util.ResourceUtils.readResourceBytes;
|
||||
import static google.registry.util.ResourceUtils.readResourceUtf8;
|
||||
|
||||
import com.google.auto.value.AutoValue;
|
||||
import com.google.common.io.ByteSource;
|
||||
import java.util.Map;
|
||||
import java.util.Map.Entry;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
/** Contains helper methods for dealing with test data. */
|
||||
public final class TestDataHelper {
|
||||
|
||||
@AutoValue
|
||||
abstract static class FileKey {
|
||||
abstract Class<?> context();
|
||||
|
||||
abstract String filename();
|
||||
|
||||
static FileKey create(Class<?> context, String filename) {
|
||||
return new AutoValue_TestDataHelper_FileKey(context, filename);
|
||||
}
|
||||
}
|
||||
|
||||
private static final Map<FileKey, String> fileCache = new ConcurrentHashMap<>();
|
||||
private static final Map<FileKey, ByteSource> byteCache = new ConcurrentHashMap<>();
|
||||
|
||||
/**
|
||||
* Loads a text file from the "testdata" directory relative to the location of the specified
|
||||
* context class.
|
||||
*/
|
||||
public static String loadFile(Class<?> context, String filename) {
|
||||
return fileCache.computeIfAbsent(
|
||||
FileKey.create(context, filename),
|
||||
k -> readResourceUtf8(context, "testdata/" + filename));
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a text file from the "testdata" directory relative to the location of the specified
|
||||
* context class, and substitutes in values for placeholders of the form <code>%tagname%</code>.
|
||||
*/
|
||||
public static String loadFileWithSubstitutions(
|
||||
Class<?> context, String filename, Map<String, String> substitutions) {
|
||||
return applySubstitutions(readResourceUtf8(context, "testdata/" + filename), substitutions);
|
||||
}
|
||||
|
||||
/** Applies the given substitutions to the given string and returns the result. */
|
||||
public static String applySubstitutions(String fileContents, Map<String, String> substitutions) {
|
||||
String fileContents = loadFile(context, filename);
|
||||
for (Entry<String, String> entry : nullToEmpty(substitutions).entrySet()) {
|
||||
fileContents = fileContents.replaceAll("%" + entry.getKey() + "%", entry.getValue());
|
||||
}
|
||||
return fileContents;
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads a {@link ByteSource} from the "testdata" directory relative to the location of the
|
||||
* specified context class.
|
||||
*/
|
||||
public static ByteSource loadBytes(Class<?> context, String filename) {
|
||||
return byteCache.computeIfAbsent(
|
||||
FileKey.create(context, filename),
|
||||
k -> readResourceBytes(context, "testdata/" + filename));
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue