package denominator.mock;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.inject.Singleton;
import dagger.Provides;
import denominator.AllProfileResourceRecordSetApi;
import denominator.BasicProvider;
import denominator.CheckConnection;
import denominator.DNSApiManager;
import denominator.ResourceRecordSetApi;
import denominator.ZoneApi;
import denominator.config.NothingToClose;
import denominator.model.ResourceRecordSet;
import denominator.profile.GeoResourceRecordSetApi;
import denominator.profile.WeightedResourceRecordSetApi;
import static denominator.common.Preconditions.checkArgument;
import static denominator.model.ResourceRecordSets.notNull;
import static java.util.Arrays.asList;
import static java.util.Collections.synchronizedMap;
/**
* in-memory {@code Provider}, used for testing.
*/
public class MockProvider extends BasicProvider {
private final String url;
public MockProvider() {
this(null);
}
/**
* @param url if empty or null use default
*/
public MockProvider(String url) {
this.url = url == null || url.isEmpty() ? "mem:mock" : url;
}
@Override
public String url() {
return url;
}
@Override
public Map<String, Collection<String>> profileToRecordTypes() {
Map<String, Collection<String>> result = super.profileToRecordTypes();
List<String> special = new ArrayList<String>(basicRecordTypes());
special.remove("SOA");
result.put("geo", Collections.unmodifiableList(special));
result.put("weighted", result.get("geo"));
return result;
}
@dagger.Module(injects = DNSApiManager.class, complete = false, // denominator.Provider
includes = NothingToClose.class)
public static final class Module {
/**
* Backing data for all views.
*/
private final Map<String, Collection<ResourceRecordSet<?>>> data;
private final Map<String, Collection<String>> supportedRegions;
private final SortedSet<Integer> supportedWeights;
public Module() {
data = synchronizedMap(new LinkedHashMap<String, Collection<ResourceRecordSet<?>>>(2));
SortedSet<Integer> weights = new TreeSet<Integer>();
for (int i = 0;i <= 100; i++) {
weights.add(i);
}
this.supportedWeights = Collections.unmodifiableSortedSet(weights);
Map<String, Collection<String>> region = new LinkedHashMap<String, Collection<String>>();
region.put("United States", asList("AL", "AK", "AS", "AZ", "AR", "AA", "AE", "AP", "CA", "CO",
"CT", "DE", "DC", "FM", "FL", "GA", "GU", "HI", "ID", "IL",
"IN", "IA", "KS", "KY", "LA", "ME", "MH", "MD", "MA", "MI",
"MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY",
"NC", "ND", "MP", "OH", "OK", "OR", "PW", "PA", "PR", "RI",
"SC", "SD", "TN", "TX", "UT", "VT", "VI", "VA", "WA", "WV",
"WI", "WY"));
region.put("Mexico", asList("AG", "CM", "CP", "CH", "CA", "CL", "DU", "GJ", "GR", "HI", "JA",
"MX", "MC", "MR", "NA", "OA", "PU", "QE", "SI", "SO", "TB", "TM",
"TL", "VE", "YU", "ZA"));
this.supportedRegions = Collections.unmodifiableMap(region);
}
@Provides
CheckConnection alwaysOK() {
return new CheckConnection() {
public boolean ok() {
return true;
}
};
}
@Provides
@Singleton
ZoneApi provideZoneApi() {
return new MockZoneApi(data);
}
@Provides
ResourceRecordSetApi.Factory provideResourceRecordSetApiFactory() {
return new denominator.ResourceRecordSetApi.Factory() {
@Override
public ResourceRecordSetApi create(String name) {
return new MockResourceRecordSetApi(data, name);
}
};
}
@Provides
AllProfileResourceRecordSetApi.Factory provideAllProfileResourceRecordSetApiFactory() {
return new denominator.AllProfileResourceRecordSetApi.Factory() {
@Override
public AllProfileResourceRecordSetApi create(String name) {
return new MockAllProfileResourceRecordSetApi(data, name, notNull());
}
};
}
@Provides
GeoResourceRecordSetApi.Factory provideGeoResourceRecordSetApiFactory() {
return new GeoResourceRecordSetApi.Factory() {
@Override
public GeoResourceRecordSetApi create(String name) {
return new MockGeoResourceRecordSetApi(data, name, supportedRegions);
}
};
}
@Provides
WeightedResourceRecordSetApi.Factory provideWeightedResourceRecordSetApiFactory() {
return new WeightedResourceRecordSetApi.Factory() {
@Override
public WeightedResourceRecordSetApi create(String name) {
return new MockWeightedResourceRecordSetApi(data, name, supportedWeights);
}
};
}
}
}