/mobile/android/base/tests/ContentProviderTest.java.in

https://github.com/diogogmt/mozilla-central · Autoconf · 236 lines · 191 code · 44 blank · 1 comment · 5 complexity · 554e8148aaaa4dea5dce723aa796cc7b MD5 · raw file

  1. #filter substitution
  2. package @ANDROID_PACKAGE_NAME@.tests;
  3. import @ANDROID_PACKAGE_NAME@.*;
  4. import android.content.ContentProvider;
  5. import android.content.ContentProviderClient;
  6. import android.content.ContentValues;
  7. import android.content.Context;
  8. import android.content.ContentProviderResult;
  9. import android.content.ContentProviderOperation;
  10. import android.content.OperationApplicationException;
  11. import android.content.res.Resources;
  12. import android.database.Cursor;
  13. import android.os.Build;
  14. import android.net.Uri;
  15. import android.test.AndroidTestCase;
  16. import android.test.IsolatedContext;
  17. import android.test.ProviderTestCase2;
  18. import android.test.RenamingDelegatingContext;
  19. import android.test.mock.MockContentResolver;
  20. import android.test.mock.MockContext;
  21. import android.util.Log;
  22. import java.io.File;
  23. import java.lang.reflect.Method;
  24. import java.util.ArrayList;
  25. import java.util.HashMap;
  26. /*
  27. * ContentProviderTest provides the infrastructure to run content provider
  28. * tests in an controlled/isolated environment, guaranteeing that your tests
  29. * will not affect or be affected by any UI-related code. This is basically
  30. * a heavily adapted port of Android's ProviderTestCase2 to work on Mozilla's
  31. * infrastructure.
  32. */
  33. abstract class ContentProviderTest extends AndroidTestCase {
  34. protected ContentProvider mProvider;
  35. protected MockContentResolver mResolver;
  36. protected Assert mAsserter;
  37. protected ClassLoader mClassLoader;
  38. protected ArrayList<Runnable> mTests;
  39. protected Class mProviderClass;
  40. protected Class mProviderContract;
  41. protected String mProviderAuthority;
  42. protected IsolatedContext mProviderContext;
  43. protected String mLogFile;
  44. private class ContentProviderMockContext extends MockContext {
  45. @Override
  46. public Resources getResources() {
  47. return getContext().getResources();
  48. }
  49. @Override
  50. public File getDir(String name, int mode) {
  51. return getContext().getDir(this.getClass().getSimpleName() + "_" + name, mode);
  52. }
  53. @Override
  54. public Context getApplicationContext() {
  55. return this;
  56. }
  57. }
  58. private class DelegatingTestContentProvider extends ContentProvider {
  59. ContentProvider mTargetProvider;
  60. public DelegatingTestContentProvider(ContentProvider targetProvider) {
  61. super();
  62. mTargetProvider = targetProvider;
  63. }
  64. private Uri appendTestParam(Uri uri) {
  65. try {
  66. return appendUriParam(uri, "PARAM_IS_TEST", "1");
  67. } catch (Exception e) {}
  68. return null;
  69. }
  70. @Override
  71. public boolean onCreate() {
  72. return mTargetProvider.onCreate();
  73. }
  74. @Override
  75. public String getType(Uri uri) {
  76. return mTargetProvider.getType(uri);
  77. }
  78. @Override
  79. public int delete(Uri uri, String selection, String[] selectionArgs) {
  80. return mTargetProvider.delete(appendTestParam(uri), selection, selectionArgs);
  81. }
  82. @Override
  83. public Uri insert(Uri uri, ContentValues values) {
  84. return mTargetProvider.insert(appendTestParam(uri), values);
  85. }
  86. @Override
  87. public int update(Uri uri, ContentValues values, String selection,
  88. String[] selectionArgs) {
  89. return mTargetProvider.update(appendTestParam(uri), values,
  90. selection, selectionArgs);
  91. }
  92. @Override
  93. public Cursor query(Uri uri, String[] projection, String selection,
  94. String[] selectionArgs, String sortOrder) {
  95. return mTargetProvider.query(appendTestParam(uri), projection, selection,
  96. selectionArgs, sortOrder);
  97. }
  98. @Override
  99. public ContentProviderResult[] applyBatch (ArrayList<ContentProviderOperation> operations)
  100. throws OperationApplicationException {
  101. return mTargetProvider.applyBatch(operations);
  102. }
  103. @Override
  104. public int bulkInsert(Uri uri, ContentValues[] values) {
  105. return mTargetProvider.bulkInsert(appendTestParam(uri), values);
  106. }
  107. }
  108. private void setUpProviderClassAndAuthority(String providerClassName,
  109. String authorityField) throws Exception {
  110. mProviderContract = mClassLoader.loadClass("org.mozilla.gecko.db.BrowserContract");
  111. mProviderAuthority = (String) mProviderContract.getField(authorityField).get(null);
  112. mProviderClass = mClassLoader.loadClass(providerClassName);
  113. }
  114. private void setUpContentProvider() throws Exception {
  115. mResolver = new MockContentResolver();
  116. final String filenamePrefix = this.getClass().getSimpleName() + ".";
  117. RenamingDelegatingContext targetContextWrapper =
  118. new RenamingDelegatingContext(
  119. new ContentProviderMockContext(),
  120. getContext(),
  121. filenamePrefix);
  122. mProviderContext = new IsolatedContext(mResolver, targetContextWrapper);
  123. ContentProvider targetProvider = (ContentProvider) mProviderClass.newInstance();
  124. targetProvider.attachInfo(mProviderContext, null);
  125. mProvider = new DelegatingTestContentProvider(targetProvider);
  126. mProvider.attachInfo(mProviderContext, null);
  127. mResolver.addProvider(mProviderAuthority, mProvider);
  128. }
  129. private void loadRobotiumConfig() {
  130. String configFile = FennecNativeDriver.getFile("/mnt/sdcard/robotium.config");
  131. HashMap config = FennecNativeDriver.convertTextToTable(configFile);
  132. mLogFile = (String) config.get("logfile");
  133. }
  134. public Uri getContentUri(String className) throws Exception {
  135. return getUriColumn(className, "CONTENT_URI");
  136. }
  137. public Uri getUriColumn(String className, String columnId) throws Exception {
  138. Class aClass = mClassLoader.loadClass("org.mozilla.gecko.db.BrowserContract$" + className);
  139. return (Uri) aClass.getField(columnId).get(null);
  140. }
  141. public String getStringColumn(String className, String columnId) throws Exception {
  142. Class aClass = mClassLoader.loadClass("org.mozilla.gecko.db.BrowserContract$" + className);
  143. return (String) aClass.getField(columnId).get(null);
  144. }
  145. public int getIntColumn(String className, String columnId) throws Exception {
  146. Class aClass = mClassLoader.loadClass("org.mozilla.gecko.db.BrowserContract$" + className);
  147. Integer intColumn = (Integer) aClass.getField(columnId).get(null);
  148. return intColumn.intValue();
  149. }
  150. public Uri appendUriParam(Uri uri, String paramName, String value) throws Exception {
  151. String param = (String) mProviderContract.getField(paramName).get(null);
  152. return uri.buildUpon().appendQueryParameter(param, value).build();
  153. }
  154. public void setTestName(String testName) {
  155. mAsserter.setTestName(this.getClass().getName() + " - " + testName);
  156. }
  157. public void setTestType(String type) {
  158. if (type.equals("talos")) {
  159. mAsserter = new FennecTalosAssert();
  160. } else {
  161. mAsserter = new FennecMochitestAssert();
  162. }
  163. mAsserter.setLogFile(mLogFile);
  164. mAsserter.setTestName(this.getClass().getName());
  165. }
  166. public void setUp() throws Exception {
  167. throw new Exception("You should call setUp(providerClassName, authorityUriField) instead");
  168. }
  169. public void setUp(String providerClassName, String authorityUriField) throws Exception {
  170. super.setUp();
  171. mClassLoader = getContext().getClassLoader();
  172. mTests = new ArrayList<Runnable>();
  173. loadRobotiumConfig();
  174. setUpProviderClassAndAuthority(providerClassName, authorityUriField);
  175. setUpContentProvider();
  176. }
  177. public void tearDown() throws Exception {
  178. if (Build.VERSION.SDK_INT >= 11) {
  179. mProvider.shutdown();
  180. }
  181. String databaseName = null;
  182. try {
  183. Method getDatabasePath =
  184. mProviderClass.getDeclaredMethod("getDatabasePath", String.class, boolean.class);
  185. String defaultProfile = (String) mProviderContract.getField("DEFAULT_PROFILE").get(null);
  186. databaseName = (String) getDatabasePath.invoke(mProvider, defaultProfile, true /* is test */);
  187. } catch (Exception e) {}
  188. if (databaseName != null)
  189. mProviderContext.deleteDatabase(databaseName);
  190. super.tearDown();
  191. }
  192. }