1248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank/******************************************************************************* 2248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Copyright (C) 2012 Google Inc. 3248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Licensed to The Android Open Source Project. 4248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 5248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Licensed under the Apache License, Version 2.0 (the "License"); 6248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * you may not use this file except in compliance with the License. 7248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * You may obtain a copy of the License at 8248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 9248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * http://www.apache.org/licenses/LICENSE-2.0 10248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 11248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Unless required by applicable law or agreed to in writing, software 12248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * distributed under the License is distributed on an "AS IS" BASIS, 13248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * See the License for the specific language governing permissions and 15248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * limitations under the License. 16248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank *******************************************************************************/ 17248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 18248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankpackage com.android.mail.browse; 19248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 20248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.ContentProvider; 21248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.ContentValues; 22248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.Context; 23248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.content.UriMatcher; 24248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.database.Cursor; 25248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.database.MatrixCursor; 26248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport android.net.Uri; 27248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 28384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedyimport com.android.mail.utils.MatrixCursorWithCachedColumns; 29384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedy 30248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport java.util.ArrayList; 31248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport java.util.HashMap; 32248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankimport java.util.Map.Entry; 33384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedyimport java.util.Set; 34248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 35248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank/** 36248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * TestProvider is a ContentProvider that can be used to simulate the storage and retrieval of 37248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * rows from any ContentProvider, even if that provider does not exist in the caller's package. 38248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 39248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * It is specifically designed to enable testing of sync adapters that create 40248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * ContentProviderOperations (CPOs) that are then executed using ContentResolver.applyBatch(). 41248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Why is this useful? Because we can't instantiate CalendarProvider or ContactsProvider from our 42248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * package, as required by MockContentResolver.addProvider() 43248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 44248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Usage: 45248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 46248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * ContentResolver.applyBatch(MockProvider.AUTHORITY, batch) will cause the CPOs to be executed, 47248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * returning an array of ContentProviderResult; in the case of inserts, the result will include 48248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * a Uri that can be used via query(). Note that the CPOs can contain references to any authority. 49248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 50248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * query() does not allow non-null selection, selectionArgs, or sortOrder arguments; the 51248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * presence of these will result in an UnsupportedOperationException insert() acts as expected, 52248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * returning a Uri that can be directly used in a query 53248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 54248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * delete() and update() do not allow non-null selection or selectionArgs arguments; the presence 55248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * of these will result in an UnsupportedOperationException 56248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 57248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * NOTE: When using any operation other than applyBatch, the Uri to be used must be created with 58248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * MockProvider.uri(yourUri). This guarantees that the operation is sent to MockProvider 59248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 60248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * NOTE: MockProvider only simulates direct storage/retrieval of rows; it does not (and can not) 61248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * simulate other actions (e.g. creation of ancillary data) that the actual provider might perform 62248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 63248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * NOTE: See MockProviderTests for usage examples 64248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank **/ 65248b1b49455785aa2fa426bc28090547abfcb01aMarc Blankpublic class TestProvider extends ContentProvider { 66248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public static final String AUTHORITY = "com.android.mail.mock.provider"; 67248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank /* package */static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH); 68248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 69248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank /* package */static final int TABLE = 100; 70248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank /* package */static final int RECORD = 101; 71248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 72248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public static final String ID_COLUMN = "_id"; 73248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 74248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public TestProvider() { 75248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank super(); 76248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 77248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 78248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public TestProvider(Context context) { 79248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank this(); 80248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank attachInfo(context, null); 81248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 82248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 83248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank // We'll store our values here 84248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank private HashMap<String, ContentValues> mMockStore = new HashMap<String, ContentValues>(); 85248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank // And we'll generate new id's from here 86248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank long mMockId = 1; 87248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 88248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank /** 89248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * Create a Uri for MockProvider from a given Uri 90248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * 91248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * @param uri the Uri from which the MockProvider Uri will be created 92248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank * @return a Uri that can be used with MockProvider 93248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank */ 94248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public static Uri uri(Uri uri) { 95248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank return new Uri.Builder().scheme("content").authority(AUTHORITY) 96248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank .path(uri.getPath().substring(1)).build(); 97248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 98248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 99248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank @Override 100248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public int delete(Uri uri, String selection, String[] selectionArgs) { 101248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (selection != null || selectionArgs != null) { 102248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank throw new UnsupportedOperationException(); 103248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 104248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank String path = uri.getPath(); 105248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (mMockStore.containsKey(path)) { 106248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank mMockStore.remove(path); 107248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank return 1; 108248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } else { 109248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank return 0; 110248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 111248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 112248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 113248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank @Override 114248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public String getType(Uri uri) { 115248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank throw new UnsupportedOperationException(); 116248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 117248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 118248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank @Override 119248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public Uri insert(Uri uri, ContentValues values) { 120248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank // Remove the leading slash 121248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank String table = uri.getPath().substring(1); 122248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank long id = mMockId++; 123248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank Uri newUri = new Uri.Builder().scheme("content").authority(AUTHORITY).path(table) 124248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank .appendPath(Long.toString(id)).build(); 125248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank // Remember to store the _id 126248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank values.put(ID_COLUMN, id); 127248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank mMockStore.put(newUri.getPath(), values); 128248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank int match = sURIMatcher.match(uri); 129248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (match == UriMatcher.NO_MATCH) { 130248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank sURIMatcher.addURI(AUTHORITY, table, TABLE); 131248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank sURIMatcher.addURI(AUTHORITY, table + "/#", RECORD); 132248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 133248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank return newUri; 134248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 135248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 136248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank @Override 137248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public boolean onCreate() { 138248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank return false; 139248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 140248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 141248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank @Override 142248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 143248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank String sortOrder) { 144248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (selection != null || selectionArgs != null || sortOrder != null || projection == null) { 145248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank throw new UnsupportedOperationException(); 146248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 147248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank final int match = sURIMatcher.match(uri(uri)); 148248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank ArrayList<ContentValues> valuesList = new ArrayList<ContentValues>(); 149248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank switch (match) { 150248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank case TABLE: 151248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank Set<Entry<String, ContentValues>> entrySet = mMockStore.entrySet(); 152248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank String prefix = uri.getPath() + "/"; 153248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank for (Entry<String, ContentValues> entry : entrySet) { 154248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (entry.getKey().startsWith(prefix)) { 155248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank valuesList.add(entry.getValue()); 156248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 157248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 158248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank break; 159248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank case RECORD: 160248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank ContentValues values = mMockStore.get(uri.getPath()); 161248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (values != null) { 162248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank valuesList.add(values); 163248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 164248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank break; 165248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank default: 166248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank throw new IllegalArgumentException("Unknown URI " + uri); 167248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 168384b8de1a1e18b29fe392151b06ce6fbe07be4bdScott Kennedy MatrixCursor cursor = new MatrixCursorWithCachedColumns(projection, 1); 169248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank for (ContentValues cv : valuesList) { 170248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank Object[] rowValues = new Object[projection.length]; 171248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank int i = 0; 172248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank for (String column : projection) { 173248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank rowValues[i++] = cv.get(column); 174248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 175248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank cursor.addRow(rowValues); 176248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 177248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank return cursor; 178248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 179248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank 180248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank @Override 181248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank public int update(Uri uri, ContentValues newValues, String selection, String[] selectionArgs) { 182248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (selection != null || selectionArgs != null) { 183248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank throw new UnsupportedOperationException(); 184248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 185248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank final int match = sURIMatcher.match(uri(uri)); 186248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank ArrayList<ContentValues> updateValuesList = new ArrayList<ContentValues>(); 187248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank String path = uri.getPath(); 188248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank switch (match) { 189248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank case TABLE: 190248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank Set<Entry<String, ContentValues>> entrySet = mMockStore.entrySet(); 191248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank String prefix = path + "/"; 192248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank for (Entry<String, ContentValues> entry : entrySet) { 193248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (entry.getKey().startsWith(prefix)) { 194248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank updateValuesList.add(entry.getValue()); 195248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 196248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 197248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank break; 198248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank case RECORD: 199248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank ContentValues cv = mMockStore.get(path); 200248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (cv != null) { 201248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank updateValuesList.add(cv); 202248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 203248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank break; 204248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank default: 205248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank throw new IllegalArgumentException("Unknown URI " + uri); 206248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 207248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank Set<Entry<String, Object>> newValuesSet = newValues.valueSet(); 208248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank for (Entry<String, Object> entry : newValuesSet) { 209248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank String key = entry.getKey(); 210248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank Object value = entry.getValue(); 211248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank for (ContentValues targetValues : updateValuesList) { 212248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank if (value instanceof Integer) { 213248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank targetValues.put(key, (Integer) value); 214248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } else if (value instanceof Long) { 215248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank targetValues.put(key, (Long) value); 216248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } else if (value instanceof String) { 217248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank targetValues.put(key, (String) value); 218248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } else if (value instanceof Boolean) { 219248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank targetValues.put(key, (Boolean) value); 220248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } else { 221248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank throw new IllegalArgumentException(); 222248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 223248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 224248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 225248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank for (ContentValues targetValues : updateValuesList) { 226248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank switch(match) { 227248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank case TABLE: 228248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank mMockStore.put(path + "/" + targetValues.getAsLong(ID_COLUMN), targetValues); 229248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank break; 230248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank case RECORD: 231248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank mMockStore.put(path, targetValues); 232248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank break; 233248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 234248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 235248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank return updateValuesList.size(); 236248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank } 237248b1b49455785aa2fa426bc28090547abfcb01aMarc Blank} 238