blob: 2487116a9b9396a6163064496437d4176ac05f10 [file] [log] [blame]
/*
* Copyright (C) 2010 Google Inc.
*
* 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.i18n.addressinput;
import com.android.i18n.addressinput.testing.AddressDataMapLoader;
import com.android.i18n.addressinput.testing.AsyncTestCase;
import org.json.JSONException;
import org.json.JSONObject;
public class CacheDataTest extends AsyncTestCase {
private CacheData cache;
private static final String DELIM = "~";
private static final String CANADA_KEY = "data/CA";
private static final String US_KEY = "data/US";
private static final String CALIFORNIA_KEY = "data/US/CA";
private static final String INVALID_KEY = "data/asIOSDxcowW";
private static final String EXAMPLE_LOCAL_US_KEY = "examples/US/local/_default";
// Data key for Da-an District, Taipei Taiwan
private static final String TW_KEY = "data/TW/\u53F0\u5317\u5E02/\u5927\u5B89\u5340";
private static final String FRANCE_KEY = "data/FR";
private static Integer listenerInvokeCount = 0;
private static boolean reachedMaxCount = false;
@Override
public void setUp() {
cache = new CacheData();
}
public void testJsonConstructor() {
// Creating cache with content.
String id = "data/CA";
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(AddressDataMapLoader.TEST_COUNTRY_DATA.get(id));
} catch (JSONException jsonException) {
// If this throws an exception the test fails.
fail("Can't parse json object");
}
cache.addToJsoMap(id, jsonObject);
String toBackup = cache.getJsonString();
// Creating cache from saved data.
cache = new CacheData(toBackup);
assertTrue(cache.containsKey(id));
}
public void testJsonConstructorTruncatedProperString() {
// Creating cache with content.
String id = "data/CA";
try {
JSONObject jsonObject = new JSONObject(AddressDataMapLoader.TEST_COUNTRY_DATA.get(id));
String jsonString = jsonObject.toString();
jsonString = jsonString.substring(0, jsonString.length() / 2);
cache = new CacheData(jsonString);
assertTrue(cache.toString(), cache.isEmpty());
} catch (JSONException jsonException) {
// If this throws an exception the test fails.
fail("Can't parse json object");
}
}
public void testSimpleFetching() {
final LookupKey key = new LookupKey.Builder(CANADA_KEY).build();
delayTestFinish(10000);
cache.fetchDynamicData(key, null, new DataLoadListener() {
boolean beginCalled = false;
@Override
public void dataLoadingBegin() {
beginCalled = true;
}
@Override
public void dataLoadingEnd() {
assertTrue("dataLoadingBegin should be called", beginCalled);
JsoMap map = cache.getObj(CANADA_KEY);
assertTrue(map.containsKey(AddressDataKey.ID.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.LANG.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.ZIP.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.FMT.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.SUB_KEYS.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.SUB_NAMES.name().toLowerCase()));
assertFalse(map.containsKey(AddressDataKey.SUB_LNAMES.name().toLowerCase()));
int namesSize =
map.get(AddressDataKey.SUB_NAMES.name().toLowerCase()).split(DELIM).length;
int keysSize =
map.get(AddressDataKey.SUB_KEYS.name().toLowerCase()).split(DELIM).length;
assertEquals("Expect 13 states in Canada.", 13, namesSize);
assertEquals(namesSize, keysSize);
finishTest();
}
});
}
public void testFetchingTaiwanData() {
final LookupKey key = new LookupKey.Builder(TW_KEY).build();
delayTestFinish(10000);
cache.fetchDynamicData(key, null, new DataLoadListener() {
boolean beginCalled = false;
@Override
public void dataLoadingBegin() {
beginCalled = true;
}
@Override
public void dataLoadingEnd() {
assertTrue("dataLoadingBegin should be called", beginCalled);
JsoMap map = cache.getObj(TW_KEY);
assertTrue(map.containsKey(AddressDataKey.ID.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.KEY.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.LANG.name().toLowerCase()));
assertTrue(map.containsKey(AddressDataKey.ZIP.name().toLowerCase()));
assertFalse(map.containsKey(AddressDataKey.FMT.name().toLowerCase()));
assertFalse(map.containsKey(AddressDataKey.SUB_KEYS.name().toLowerCase()));
assertFalse(map.containsKey(AddressDataKey.SUB_NAMES.name().toLowerCase()));
assertFalse(map.containsKey(AddressDataKey.SUB_LNAMES.name().toLowerCase()));
// Da-an district.
assertEquals("\u5927\u5B89\u5340",
map.get(AddressDataKey.KEY.name().toLowerCase()));
assertEquals("zh-hant", map.get(AddressDataKey.LANG.name().toLowerCase()));
finishTest();
}
});
}
public void testFetchingExamples() {
final LookupKey key = new LookupKey.Builder(EXAMPLE_LOCAL_US_KEY).build();
delayTestFinish(10000);
cache.fetchDynamicData(key, null, new DataLoadListener() {
boolean beginCalled = false;
@Override
public void dataLoadingBegin() {
beginCalled = true;
}
@Override
public void dataLoadingEnd() {
assertTrue("dataLoadingBegin should be called", beginCalled);
JsoMap map = cache.getObj(EXAMPLE_LOCAL_US_KEY);
assertTrue(map.containsKey("name"));
finishTest();
}
});
}
public void testFetchingOneKeyManyTimes() {
final LookupKey key = new LookupKey.Builder(CALIFORNIA_KEY).build();
final int maxCount = 10;
class CounterListener implements DataLoadListener {
@Override
public void dataLoadingBegin() {
listenerInvokeCount++;
if (listenerInvokeCount == maxCount) {
reachedMaxCount = true;
}
assertTrue("CounterListener's dataLoadingBegin should not be invoked for more "
+ "than " + maxCount + " times",
listenerInvokeCount <= maxCount);
}
@Override
public void dataLoadingEnd() {
listenerInvokeCount--;
assertTrue(listenerInvokeCount >= 0);
if (listenerInvokeCount == 0) {
assertTrue("Expect to see key " + key + " cached when CounterListener's "
+ " dataLoadingEnd is invoked",
cache.containsKey(key.toString()));
assertTrue("Expect CounterListener's dataLoadingEnd to be triggered "
+ maxCount + " times in total", reachedMaxCount);
finishTest();
}
}
}
delayTestFinish(10000);
for (int i = 0; i < maxCount; ++i) {
cache.fetchDynamicData(key, null, new CounterListener());
}
// Null listeners should not affect results.
cache.fetchDynamicData(key, null, null);
cache.fetchDynamicData(key, null, null);
cache.fetchDynamicData(key, null, null);
}
public void testFetchAgainRightAfterOneFetchStart() {
final LookupKey key = new LookupKey.Builder(US_KEY).build();
delayTestFinish(10000);
cache.fetchDynamicData(key, null, null);
cache.fetchDynamicData(key, null, new DataLoadListener() {
boolean beginCalled = false;
@Override
public void dataLoadingBegin() {
assertFalse("data for key " + key + " should not be fetched yet",
cache.containsKey(key.toString()));
beginCalled = true;
}
@Override
public void dataLoadingEnd() {
assertTrue("dataLoadingBegin should be called", beginCalled);
assertTrue(cache.containsKey(key.toString()));
cache.fetchDynamicData(key, null, new DataLoadListener() {
boolean beginCalled2 = false;
@Override
public void dataLoadingBegin() {
beginCalled2 = true;
}
@Override
public void dataLoadingEnd() {
assertTrue("dataLoadingBegin should be called", beginCalled2);
assertTrue(cache.containsKey(key.toString()));
finishTest();
}
});
}
});
}
public void testInvalidKey() {
final LookupKey key = new LookupKey.Builder(INVALID_KEY).build();
delayTestFinish(15000);
cache.fetchDynamicData(key, null, new DataLoadListener() {
boolean beginCalled = false;
@Override
public void dataLoadingBegin() {
beginCalled = true;
}
@Override
public void dataLoadingEnd() {
assertTrue("dataLoadingBegin should be called", beginCalled);
assertFalse(cache.containsKey(key.toString()));
finishTest();
}
});
}
public void testSetUrl() {
final LookupKey key = new LookupKey.Builder(FRANCE_KEY).build();
final String originalUrl = cache.getUrl();
assertFalse(FRANCE_KEY + " should not be in the cache. Do you request it before this test?",
cache.containsKey(key.toString()));
delayTestFinish(10000);
// Something that is not an URL.
cache.setUrl("FDSSfdfdsfasdfadsf");
cache.fetchDynamicData(key, null, new DataLoadListener() {
boolean beginCalled = false;
@Override
public void dataLoadingBegin() {
beginCalled = true;
}
@Override
public void dataLoadingEnd() {
assertTrue("dataLoadingBegin should be called", beginCalled);
assertFalse(cache.containsKey(key.toString()));
cache.setUrl(originalUrl);
finishTest();
}
});
}
}