blob: 05c9c57e240983f7a4189b8896ef68803b831c22 [file] [log] [blame]
Daichi Hirono6de8a0e2015-10-27 16:18:17 +09001/*
2 * Copyright (C) 2015 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
Daichi Hirono9678f602015-10-22 12:35:05 +090017package com.android.mtp;
18
Daichi Hirono9678f602015-10-22 12:35:05 +090019import android.database.Cursor;
20import android.mtp.MtpConstants;
21import android.mtp.MtpObjectInfo;
22import android.provider.DocumentsContract;
Daichi Hirono49f920f2015-11-19 10:19:52 +090023import android.provider.DocumentsContract.Document;
Daichi Hirono0378da42015-11-05 11:56:12 +090024import android.provider.DocumentsContract.Root;
Daichi Hirono9678f602015-10-22 12:35:05 +090025import android.test.AndroidTestCase;
26import android.test.suitebuilder.annotation.SmallTest;
27
Daichi Hirono49f920f2015-11-19 10:19:52 +090028import java.io.FileNotFoundException;
Daichi Hirono49f920f2015-11-19 10:19:52 +090029
Daichi Hirono9984ebd2015-12-15 16:02:27 +090030import static android.provider.DocumentsContract.Document.*;
Daichi Hirono259ce802015-11-20 17:51:53 +090031import static com.android.mtp.MtpDatabase.strings;
Daichi Hirono9984ebd2015-12-15 16:02:27 +090032import static com.android.mtp.MtpDatabaseConstants.*;
Daichi Hirono49f920f2015-11-19 10:19:52 +090033
Daichi Hirono9678f602015-10-22 12:35:05 +090034@SmallTest
35public class MtpDatabaseTest extends AndroidTestCase {
36 private final String[] COLUMN_NAMES = new String[] {
37 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +090038 MtpDatabaseConstants.COLUMN_DEVICE_ID,
39 MtpDatabaseConstants.COLUMN_STORAGE_ID,
40 MtpDatabaseConstants.COLUMN_OBJECT_HANDLE,
Daichi Hirono9678f602015-10-22 12:35:05 +090041 DocumentsContract.Document.COLUMN_MIME_TYPE,
42 DocumentsContract.Document.COLUMN_DISPLAY_NAME,
43 DocumentsContract.Document.COLUMN_SUMMARY,
44 DocumentsContract.Document.COLUMN_LAST_MODIFIED,
45 DocumentsContract.Document.COLUMN_ICON,
46 DocumentsContract.Document.COLUMN_FLAGS,
Daichi Hirono4b54e032015-12-11 15:24:53 +090047 DocumentsContract.Document.COLUMN_SIZE,
48 MtpDatabaseConstants.COLUMN_DOCUMENT_TYPE
Daichi Hirono9678f602015-10-22 12:35:05 +090049 };
50
Daichi Hirono85a808b2015-10-27 17:22:13 +090051 private final TestResources resources = new TestResources();
Daichi Hirono4604b742015-11-12 12:12:48 +090052 MtpDatabase mDatabase;
53
54 @Override
55 public void setUp() {
Daichi Hirono47eb1922015-11-16 13:01:31 +090056 mDatabase = new MtpDatabase(getContext(), MtpDatabaseConstants.FLAG_DATABASE_IN_MEMORY);
Daichi Hirono4604b742015-11-12 12:12:48 +090057 }
58
59 @Override
60 public void tearDown() {
61 mDatabase.close();
62 mDatabase = null;
63 }
Daichi Hirono85a808b2015-10-27 17:22:13 +090064
Daichi Hirono9984ebd2015-12-15 16:02:27 +090065 private static int getInt(Cursor cursor, String columnName) {
66 return cursor.getInt(cursor.getColumnIndex(columnName));
67 }
68
69 private static boolean isNull(Cursor cursor, String columnName) {
70 return cursor.isNull(cursor.getColumnIndex(columnName));
71 }
72
73 private static String getString(Cursor cursor, String columnName) {
74 return cursor.getString(cursor.getColumnIndex(columnName));
75 }
76
Daichi Hirono81d48532015-12-16 15:03:19 +090077 public void testPutSingleStorageDocuments() throws Exception {
78 mDatabase.getMapper().startAddingDocuments(null);
Daichi Hironoebd24052016-02-06 21:05:57 +090079 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
80 0, "Device", null /* deviceKey */, true, new MtpRoot[0], null, null));
Daichi Hirono81d48532015-12-16 15:03:19 +090081 mDatabase.getMapper().stopAddingDocuments(null);
82
83 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +090084 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
85 new MtpRoot(0, 1, "Storage", 1000, 2000, "")
Daichi Hirono81d48532015-12-16 15:03:19 +090086 });
87 mDatabase.getMapper().stopAddingDocuments("1");
88
89 {
90 final Cursor cursor = mDatabase.queryRootDocuments(COLUMN_NAMES);
91 assertEquals(1, cursor.getCount());
92
93 cursor.moveToNext();
94 assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID));
95 assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID));
96 assertEquals(1, getInt(cursor, COLUMN_STORAGE_ID));
97 assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE));
Daichi Hirono8e873642016-02-07 15:17:16 +090098 assertEquals(
99 DocumentsContract.Document.MIME_TYPE_DIR, getString(cursor, COLUMN_MIME_TYPE));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900100 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono81d48532015-12-16 15:03:19 +0900101 assertTrue(isNull(cursor, COLUMN_SUMMARY));
102 assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED));
103 assertEquals(R.drawable.ic_root_mtp, getInt(cursor, COLUMN_ICON));
104 assertEquals(0, getInt(cursor, COLUMN_FLAGS));
105 assertEquals(1000, getInt(cursor, COLUMN_SIZE));
106 assertEquals(
Daichi Hirono8e873642016-02-07 15:17:16 +0900107 MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE,
108 getInt(cursor, COLUMN_DOCUMENT_TYPE));
Daichi Hirono81d48532015-12-16 15:03:19 +0900109
110 cursor.close();
111 }
112
113 {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900114 final Cursor cursor = mDatabase.queryRoots(resources, new String [] {
Daichi Hirono81d48532015-12-16 15:03:19 +0900115 Root.COLUMN_ROOT_ID,
116 Root.COLUMN_FLAGS,
117 Root.COLUMN_ICON,
118 Root.COLUMN_TITLE,
119 Root.COLUMN_SUMMARY,
120 Root.COLUMN_DOCUMENT_ID,
121 Root.COLUMN_AVAILABLE_BYTES,
122 Root.COLUMN_CAPACITY_BYTES
123 });
124 assertEquals(1, cursor.getCount());
125
126 cursor.moveToNext();
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900127 assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID));
Daichi Hirono81d48532015-12-16 15:03:19 +0900128 assertEquals(
129 Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE,
130 getInt(cursor, Root.COLUMN_FLAGS));
131 assertEquals(R.drawable.ic_root_mtp, getInt(cursor, Root.COLUMN_ICON));
132 assertEquals("Device Storage", getString(cursor, Root.COLUMN_TITLE));
133 assertTrue(isNull(cursor, Root.COLUMN_SUMMARY));
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900134 assertEquals(1, getInt(cursor, Root.COLUMN_DOCUMENT_ID));
Daichi Hirono81d48532015-12-16 15:03:19 +0900135 assertEquals(1000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES));
136 assertEquals(2000, getInt(cursor, Root.COLUMN_CAPACITY_BYTES));
137
138 cursor.close();
139 }
140 }
141
142 public void testPutStorageDocuments() throws Exception {
Daichi Hirono619afda2016-02-07 14:23:43 +0900143 addTestDevice();
144
145 mDatabase.getMapper().startAddingDocuments("1");
146 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900147 new MtpRoot(0, 1, "Storage", 1000, 2000, ""),
148 new MtpRoot(0, 2, "Storage", 2000, 4000, ""),
149 new MtpRoot(0, 3, "/@#%&<>Storage", 3000, 6000,"")
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900150 });
Daichi Hirono9678f602015-10-22 12:35:05 +0900151
Daichi Hirono0378da42015-11-05 11:56:12 +0900152 {
Daichi Hirono4604b742015-11-12 12:12:48 +0900153 final Cursor cursor = mDatabase.queryRootDocuments(COLUMN_NAMES);
Daichi Hirono0378da42015-11-05 11:56:12 +0900154 assertEquals(3, cursor.getCount());
Daichi Hirono9678f602015-10-22 12:35:05 +0900155
Daichi Hirono0378da42015-11-05 11:56:12 +0900156 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900157 assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900158 assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID));
159 assertEquals(1, getInt(cursor, COLUMN_STORAGE_ID));
160 assertTrue(isNull(cursor, COLUMN_OBJECT_HANDLE));
161 assertEquals(DocumentsContract.Document.MIME_TYPE_DIR, getString(cursor, COLUMN_MIME_TYPE));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900162 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900163 assertTrue(isNull(cursor, COLUMN_SUMMARY));
164 assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED));
165 assertEquals(R.drawable.ic_root_mtp, getInt(cursor, COLUMN_ICON));
166 assertEquals(0, getInt(cursor, COLUMN_FLAGS));
167 assertEquals(1000, getInt(cursor, COLUMN_SIZE));
Daichi Hirono4b54e032015-12-11 15:24:53 +0900168 assertEquals(
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900169 MtpDatabaseConstants.DOCUMENT_TYPE_STORAGE, getInt(cursor, COLUMN_DOCUMENT_TYPE));
Daichi Hirono9678f602015-10-22 12:35:05 +0900170
Daichi Hirono0378da42015-11-05 11:56:12 +0900171 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900172 assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900173 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono9678f602015-10-22 12:35:05 +0900174
Daichi Hirono0378da42015-11-05 11:56:12 +0900175 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900176 assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900177 assertEquals("/@#%&<>Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono88d2f782015-10-27 16:41:06 +0900178
Daichi Hirono0378da42015-11-05 11:56:12 +0900179 cursor.close();
180 }
Daichi Hirono9678f602015-10-22 12:35:05 +0900181 }
182
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900183 private MtpObjectInfo createDocument(int objectHandle, String name, int format, int size) {
Daichi Hirono9678f602015-10-22 12:35:05 +0900184 final MtpObjectInfo.Builder builder = new MtpObjectInfo.Builder();
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900185 builder.setObjectHandle(objectHandle);
186 builder.setName(name);
187 builder.setFormat(format);
188 builder.setCompressedSize(size);
189 return builder.build();
190 }
Daichi Hirono9678f602015-10-22 12:35:05 +0900191
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900192 public void testPutChildDocuments() throws Exception {
Daichi Hirono619afda2016-02-07 14:23:43 +0900193 addTestDevice();
194 addTestStorage("1");
195
196 mDatabase.getMapper().startAddingDocuments("2");
197 mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900198 createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
199 createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024),
200 createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024)
201 });
202
Daichi Hirono619afda2016-02-07 14:23:43 +0900203 final Cursor cursor = mDatabase.queryChildDocuments(COLUMN_NAMES, "2");
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900204 assertEquals(3, cursor.getCount());
205
Daichi Hirono9678f602015-10-22 12:35:05 +0900206 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900207 assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900208 assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID));
209 assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID));
210 assertEquals(100, getInt(cursor, COLUMN_OBJECT_HANDLE));
211 assertEquals("text/plain", getString(cursor, COLUMN_MIME_TYPE));
212 assertEquals("note.txt", getString(cursor, COLUMN_DISPLAY_NAME));
213 assertTrue(isNull(cursor, COLUMN_SUMMARY));
214 assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED));
215 assertTrue(isNull(cursor, COLUMN_ICON));
Daichi Hirono9678f602015-10-22 12:35:05 +0900216 assertEquals(
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900217 COLUMN_FLAGS,
Daichi Hirono9678f602015-10-22 12:35:05 +0900218 DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
219 DocumentsContract.Document.FLAG_SUPPORTS_WRITE,
Daichi Hirono88d2f782015-10-27 16:41:06 +0900220 cursor.getInt(9));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900221 assertEquals(1024, getInt(cursor, COLUMN_SIZE));
Daichi Hirono4b54e032015-12-11 15:24:53 +0900222 assertEquals(
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900223 MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900224
225 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900226 assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900227 assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID));
228 assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID));
229 assertEquals(101, getInt(cursor, COLUMN_OBJECT_HANDLE));
230 assertEquals("image/jpeg", getString(cursor, COLUMN_MIME_TYPE));
231 assertEquals("image.jpg", getString(cursor, COLUMN_DISPLAY_NAME));
232 assertTrue(isNull(cursor, COLUMN_SUMMARY));
233 assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED));
234 assertTrue(isNull(cursor, COLUMN_ICON));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900235 assertEquals(
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900236 COLUMN_FLAGS,
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900237 DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
238 DocumentsContract.Document.FLAG_SUPPORTS_WRITE,
239 cursor.getInt(9));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900240 assertEquals(2 * 1024 * 1024, getInt(cursor, COLUMN_SIZE));
Daichi Hirono4b54e032015-12-11 15:24:53 +0900241 assertEquals(
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900242 MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900243
244 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900245 assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900246 assertEquals(0, getInt(cursor, COLUMN_DEVICE_ID));
247 assertEquals(0, getInt(cursor, COLUMN_STORAGE_ID));
248 assertEquals(102, getInt(cursor, COLUMN_OBJECT_HANDLE));
249 assertEquals("audio/mpeg", getString(cursor, COLUMN_MIME_TYPE));
250 assertEquals("music.mp3", getString(cursor, COLUMN_DISPLAY_NAME));
251 assertTrue(isNull(cursor, COLUMN_SUMMARY));
252 assertTrue(isNull(cursor, COLUMN_LAST_MODIFIED));
253 assertTrue(isNull(cursor, COLUMN_ICON));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900254 assertEquals(
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900255 COLUMN_FLAGS,
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900256 DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
257 DocumentsContract.Document.FLAG_SUPPORTS_WRITE,
258 cursor.getInt(9));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900259 assertEquals(3 * 1024 * 1024, getInt(cursor, COLUMN_SIZE));
Daichi Hirono4b54e032015-12-11 15:24:53 +0900260 assertEquals(
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900261 MtpDatabaseConstants.DOCUMENT_TYPE_OBJECT, getInt(cursor, COLUMN_DOCUMENT_TYPE));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900262
263 cursor.close();
Daichi Hirono9678f602015-10-22 12:35:05 +0900264 }
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900265
266 public void testRestoreIdForRootDocuments() throws Exception {
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900267 final String[] columns = new String[] {
268 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +0900269 MtpDatabaseConstants.COLUMN_STORAGE_ID,
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900270 DocumentsContract.Document.COLUMN_DISPLAY_NAME
271 };
Daichi Hirono4604b742015-11-12 12:12:48 +0900272
Daichi Hirono619afda2016-02-07 14:23:43 +0900273 // Add device and two storages.
274 addTestDevice();
275 mDatabase.getMapper().startAddingDocuments("1");
276 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900277 new MtpRoot(0, 100, "Storage A", 1000, 0, ""),
278 new MtpRoot(0, 101, "Storage B", 1001, 0, "")
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900279 });
280
281 {
Daichi Hirono4604b742015-11-12 12:12:48 +0900282 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900283 assertEquals(2, cursor.getCount());
284 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900285 assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900286 assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900287 assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900288 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900289 assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900290 assertEquals(101, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900291 assertEquals("Storage B", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900292 cursor.close();
293 }
294
Daichi Hirono619afda2016-02-07 14:23:43 +0900295 // Clear mapping and add a device.
Daichi Hirono259ce802015-11-20 17:51:53 +0900296 mDatabase.getMapper().clearMapping();
Daichi Hirono619afda2016-02-07 14:23:43 +0900297 addTestDevice();
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900298
299 {
Daichi Hirono4604b742015-11-12 12:12:48 +0900300 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hirono8e873642016-02-07 15:17:16 +0900301 assertEquals(0, cursor.getCount());
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900302 cursor.close();
303 }
304
Daichi Hirono619afda2016-02-07 14:23:43 +0900305 // Add two storages, but one's name is different from previous one.
306 mDatabase.getMapper().startAddingDocuments("1");
307 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900308 new MtpRoot(0, 200, "Storage A", 2000, 0, ""),
309 new MtpRoot(0, 202, "Storage C", 2002, 0, "")
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900310 });
Daichi Hirono619afda2016-02-07 14:23:43 +0900311 mDatabase.getMapper().stopAddingDocuments("1");
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900312
313 {
Daichi Hirono8e873642016-02-07 15:17:16 +0900314 // After compeleting mapping, Storage A can be obtained with new storage ID.
Daichi Hirono4604b742015-11-12 12:12:48 +0900315 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900316 assertEquals(2, cursor.getCount());
317 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900318 assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900319 assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900320 assertEquals("Storage A", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900321 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900322 assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900323 assertEquals(202, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900324 assertEquals("Storage C", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900325 cursor.close();
326 }
327 }
328
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900329 public void testRestoreIdForChildDocuments() throws Exception {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900330 final String[] columns = new String[] {
331 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +0900332 MtpDatabaseConstants.COLUMN_OBJECT_HANDLE,
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900333 DocumentsContract.Document.COLUMN_DISPLAY_NAME
334 };
Daichi Hirono619afda2016-02-07 14:23:43 +0900335
336 addTestDevice();
337 addTestStorage("1");
338
339 mDatabase.getMapper().startAddingDocuments("2");
340 mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900341 createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
342 createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024),
343 createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024)
344 });
Daichi Hirono259ce802015-11-20 17:51:53 +0900345 mDatabase.getMapper().clearMapping();
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900346
Daichi Hirono619afda2016-02-07 14:23:43 +0900347 addTestDevice();
348 addTestStorage("1");
349
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900350 {
Daichi Hirono8e873642016-02-07 15:17:16 +0900351 // Don't return objects that lost MTP object handles.
Daichi Hirono619afda2016-02-07 14:23:43 +0900352 final Cursor cursor = mDatabase.queryChildDocuments(columns, "2");
Daichi Hirono8e873642016-02-07 15:17:16 +0900353 assertEquals(0, cursor.getCount());
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900354 cursor.close();
355 }
356
Daichi Hirono619afda2016-02-07 14:23:43 +0900357 mDatabase.getMapper().startAddingDocuments("2");
358 mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900359 createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
360 createDocument(203, "video.mp4", MtpConstants.FORMAT_MP4_CONTAINER, 1024),
361 });
Daichi Hirono619afda2016-02-07 14:23:43 +0900362 mDatabase.getMapper().stopAddingDocuments("2");
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900363
364 {
Daichi Hirono619afda2016-02-07 14:23:43 +0900365 final Cursor cursor = mDatabase.queryChildDocuments(columns, "2");
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900366 assertEquals(2, cursor.getCount());
367
368 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900369 assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900370 assertEquals(200, getInt(cursor, COLUMN_OBJECT_HANDLE));
371 assertEquals("note.txt", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900372
373 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900374 assertEquals(6, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900375 assertEquals(203, getInt(cursor, COLUMN_OBJECT_HANDLE));
376 assertEquals("video.mp4", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono619afda2016-02-07 14:23:43 +0900377
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900378 cursor.close();
379 }
380 }
381
Daichi Hironob3fe72b2015-12-15 07:45:06 +0000382 public void testRestoreIdForDifferentDevices() throws Exception {
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900383 final String[] columns = new String[] {
384 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +0900385 MtpDatabaseConstants.COLUMN_STORAGE_ID,
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900386 DocumentsContract.Document.COLUMN_DISPLAY_NAME
387 };
Daichi Hirono0378da42015-11-05 11:56:12 +0900388 final String[] rootColumns = new String[] {
389 Root.COLUMN_ROOT_ID,
390 Root.COLUMN_AVAILABLE_BYTES
391 };
Daichi Hirono81d48532015-12-16 15:03:19 +0900392 mDatabase.getMapper().startAddingDocuments(null);
Daichi Hirono619afda2016-02-07 14:23:43 +0900393 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
Daichi Hironoebd24052016-02-06 21:05:57 +0900394 0, "Device A", "Device key A", true, new MtpRoot[0], null, null));
Daichi Hirono619afda2016-02-07 14:23:43 +0900395 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
Daichi Hironoebd24052016-02-06 21:05:57 +0900396 1, "Device B", "Device key B", true, new MtpRoot[0], null, null));
Daichi Hirono81d48532015-12-16 15:03:19 +0900397 mDatabase.getMapper().stopAddingDocuments(null);
398
399 mDatabase.getMapper().startAddingDocuments("1");
400 mDatabase.getMapper().startAddingDocuments("2");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900401 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
402 new MtpRoot(0, 100, "Storage", 0, 0, "")
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900403 });
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900404 mDatabase.getMapper().putStorageDocuments("2", new MtpRoot[] {
405 new MtpRoot(1, 100, "Storage", 0, 0, "")
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900406 });
407
408 {
Daichi Hirono4604b742015-11-12 12:12:48 +0900409 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900410 assertEquals(2, cursor.getCount());
411 cursor.moveToNext();
Daichi Hirono81d48532015-12-16 15:03:19 +0900412 assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900413 assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900414 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900415 cursor.moveToNext();
Daichi Hirono81d48532015-12-16 15:03:19 +0900416 assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900417 assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900418 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900419 cursor.close();
420 }
421
Daichi Hirono0378da42015-11-05 11:56:12 +0900422 {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900423 final Cursor cursor = mDatabase.queryRoots(resources, rootColumns);
Daichi Hirono0378da42015-11-05 11:56:12 +0900424 assertEquals(2, cursor.getCount());
425 cursor.moveToNext();
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900426 assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900427 assertEquals(0, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES));
Daichi Hirono0378da42015-11-05 11:56:12 +0900428 cursor.moveToNext();
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900429 assertEquals(2, getInt(cursor, Root.COLUMN_ROOT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900430 assertEquals(0, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES));
Daichi Hirono0378da42015-11-05 11:56:12 +0900431 cursor.close();
432 }
433
Daichi Hirono259ce802015-11-20 17:51:53 +0900434 mDatabase.getMapper().clearMapping();
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900435
Daichi Hirono619afda2016-02-07 14:23:43 +0900436 mDatabase.getMapper().startAddingDocuments(null);
437 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
Daichi Hironoebd24052016-02-06 21:05:57 +0900438 0, "Device A", "Device key A", true, new MtpRoot[0], null, null));
Daichi Hirono619afda2016-02-07 14:23:43 +0900439 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
Daichi Hironoebd24052016-02-06 21:05:57 +0900440 1, "Device B", "Device key B", true, new MtpRoot[0], null, null));
Daichi Hirono619afda2016-02-07 14:23:43 +0900441 mDatabase.getMapper().stopAddingDocuments(null);
442
Daichi Hirono81d48532015-12-16 15:03:19 +0900443 mDatabase.getMapper().startAddingDocuments("1");
444 mDatabase.getMapper().startAddingDocuments("2");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900445 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
446 new MtpRoot(0, 200, "Storage", 2000, 0, "")
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900447 });
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900448 mDatabase.getMapper().putStorageDocuments("2", new MtpRoot[] {
449 new MtpRoot(1, 300, "Storage", 3000, 0, "")
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900450 });
Daichi Hirono81d48532015-12-16 15:03:19 +0900451 mDatabase.getMapper().stopAddingDocuments("1");
452 mDatabase.getMapper().stopAddingDocuments("2");
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900453
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900454 {
Daichi Hirono4604b742015-11-12 12:12:48 +0900455 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900456 assertEquals(2, cursor.getCount());
457 cursor.moveToNext();
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900458 assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900459 assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900460 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900461 cursor.moveToNext();
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900462 assertEquals(4, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900463 assertEquals(300, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900464 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900465 cursor.close();
466 }
Daichi Hirono0378da42015-11-05 11:56:12 +0900467
468 {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900469 final Cursor cursor = mDatabase.queryRoots(resources, rootColumns);
Daichi Hirono0378da42015-11-05 11:56:12 +0900470 assertEquals(2, cursor.getCount());
471 cursor.moveToNext();
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900472 assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900473 assertEquals(2000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES));
Daichi Hirono0378da42015-11-05 11:56:12 +0900474 cursor.moveToNext();
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900475 assertEquals(2, getInt(cursor, Root.COLUMN_ROOT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900476 assertEquals(3000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES));
Daichi Hirono0378da42015-11-05 11:56:12 +0900477 cursor.close();
478 }
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900479 }
480
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900481 public void testRestoreIdForDifferentParents() throws Exception {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900482 final String[] columns = new String[] {
483 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +0900484 MtpDatabaseConstants.COLUMN_OBJECT_HANDLE
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900485 };
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900486
Daichi Hirono619afda2016-02-07 14:23:43 +0900487 // Add device, storage, and two directories.
488 addTestDevice();
489 addTestStorage("1");
490 mDatabase.getMapper().startAddingDocuments("2");
491 mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] {
492 createDocument(50, "A", MtpConstants.FORMAT_ASSOCIATION, 0),
493 createDocument(51, "B", MtpConstants.FORMAT_ASSOCIATION, 0),
494 });
495 mDatabase.getMapper().stopAddingDocuments("2");
496
497 // Put note.txt in each directory.
498 mDatabase.getMapper().startAddingDocuments("3");
499 mDatabase.getMapper().startAddingDocuments("4");
500 mDatabase.getMapper().putChildDocuments(0, "3", new MtpObjectInfo[] {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900501 createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
502 });
Daichi Hirono619afda2016-02-07 14:23:43 +0900503 mDatabase.getMapper().putChildDocuments(0, "4", new MtpObjectInfo[] {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900504 createDocument(101, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
505 });
Daichi Hirono619afda2016-02-07 14:23:43 +0900506
507 // Clear mapping.
Daichi Hirono259ce802015-11-20 17:51:53 +0900508 mDatabase.getMapper().clearMapping();
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900509
Daichi Hirono619afda2016-02-07 14:23:43 +0900510 // Add device, storage, and two directories again.
511 addTestDevice();
512 addTestStorage("1");
513 mDatabase.getMapper().startAddingDocuments("2");
514 mDatabase.getMapper().putChildDocuments(0, "2", new MtpObjectInfo[] {
515 createDocument(50, "A", MtpConstants.FORMAT_ASSOCIATION, 0),
516 createDocument(51, "B", MtpConstants.FORMAT_ASSOCIATION, 0),
517 });
518 mDatabase.getMapper().stopAddingDocuments("2");
519
520 // Add note.txt in each directory again.
521 mDatabase.getMapper().startAddingDocuments("3");
522 mDatabase.getMapper().startAddingDocuments("4");
523 mDatabase.getMapper().putChildDocuments(0, "3", new MtpObjectInfo[] {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900524 createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
525 });
Daichi Hirono619afda2016-02-07 14:23:43 +0900526 mDatabase.getMapper().putChildDocuments(0, "4", new MtpObjectInfo[] {
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900527 createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
528 });
Daichi Hirono619afda2016-02-07 14:23:43 +0900529 mDatabase.getMapper().stopAddingDocuments("3");
530 mDatabase.getMapper().stopAddingDocuments("4");
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900531
Daichi Hirono619afda2016-02-07 14:23:43 +0900532 // Check if the two note.txt are mapped correctly.
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900533 {
Daichi Hirono619afda2016-02-07 14:23:43 +0900534 final Cursor cursor = mDatabase.queryChildDocuments(columns, "3");
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900535 assertEquals(1, cursor.getCount());
536 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900537 assertEquals(5, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900538 assertEquals(200, getInt(cursor, COLUMN_OBJECT_HANDLE));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900539 cursor.close();
540 }
541 {
Daichi Hirono619afda2016-02-07 14:23:43 +0900542 final Cursor cursor = mDatabase.queryChildDocuments(columns, "4");
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900543 assertEquals(1, cursor.getCount());
544 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900545 assertEquals(6, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9fca5412016-02-07 13:20:22 +0900546 assertEquals(201, getInt(cursor, COLUMN_OBJECT_HANDLE));
Daichi Hironoa8a3722e2015-10-26 16:39:54 +0900547 cursor.close();
548 }
549 }
550
Daichi Hirono619afda2016-02-07 14:23:43 +0900551 public void testClearMtpIdentifierBeforeResolveRootDocuments() throws Exception {
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900552 final String[] columns = new String[] {
553 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +0900554 MtpDatabaseConstants.COLUMN_STORAGE_ID,
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900555 DocumentsContract.Document.COLUMN_DISPLAY_NAME
556 };
Daichi Hirono0378da42015-11-05 11:56:12 +0900557 final String[] rootColumns = new String[] {
558 Root.COLUMN_ROOT_ID,
559 Root.COLUMN_AVAILABLE_BYTES
560 };
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900561
Daichi Hirono8e873642016-02-07 15:17:16 +0900562 addTestDevice();
Daichi Hirono81d48532015-12-16 15:03:19 +0900563
564 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900565 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
566 new MtpRoot(0, 100, "Storage", 0, 0, ""),
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900567 });
Daichi Hirono259ce802015-11-20 17:51:53 +0900568 mDatabase.getMapper().clearMapping();
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900569
Daichi Hironoebd24052016-02-06 21:05:57 +0900570 addTestDevice();
Daichi Hirono619afda2016-02-07 14:23:43 +0900571
572 try (final Cursor cursor = mDatabase.queryRoots(resources, rootColumns)) {
573 assertEquals(1, cursor.getCount());
574 cursor.moveToNext();
575 assertEquals("1", getString(cursor, Root.COLUMN_ROOT_ID));
576 }
577
Daichi Hirono81d48532015-12-16 15:03:19 +0900578 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900579 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
580 new MtpRoot(0, 200, "Storage", 2000, 0, ""),
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900581 });
Daichi Hirono259ce802015-11-20 17:51:53 +0900582 mDatabase.getMapper().clearMapping();
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900583
Daichi Hironoebd24052016-02-06 21:05:57 +0900584 addTestDevice();
Daichi Hirono619afda2016-02-07 14:23:43 +0900585
Daichi Hirono81d48532015-12-16 15:03:19 +0900586 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900587 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
588 new MtpRoot(0, 300, "Storage", 3000, 0, ""),
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900589 });
Daichi Hirono81d48532015-12-16 15:03:19 +0900590 mDatabase.getMapper().stopAddingDocuments("1");
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900591
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900592 {
Daichi Hirono4604b742015-11-12 12:12:48 +0900593 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900594 assertEquals(1, cursor.getCount());
595 cursor.moveToNext();
Daichi Hirono81d48532015-12-16 15:03:19 +0900596 assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900597 assertEquals(300, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900598 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900599 cursor.close();
600 }
Daichi Hirono0378da42015-11-05 11:56:12 +0900601 {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900602 final Cursor cursor = mDatabase.queryRoots(resources, rootColumns);
Daichi Hirono0378da42015-11-05 11:56:12 +0900603 assertEquals(1, cursor.getCount());
604 cursor.moveToNext();
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900605 assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900606 assertEquals(3000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES));
Daichi Hirono0378da42015-11-05 11:56:12 +0900607 cursor.close();
608 }
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900609 }
610
611 public void testPutSameNameRootsAfterClearing() throws Exception {
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900612 final String[] columns = new String[] {
613 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +0900614 MtpDatabaseConstants.COLUMN_STORAGE_ID,
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900615 DocumentsContract.Document.COLUMN_DISPLAY_NAME
616 };
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900617
Daichi Hirono619afda2016-02-07 14:23:43 +0900618 // Add a device and a storage.
619 addTestDevice();
620 addTestStorage("1");
621
622 // Disconnect devices.
Daichi Hirono259ce802015-11-20 17:51:53 +0900623 mDatabase.getMapper().clearMapping();
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900624
Daichi Hirono619afda2016-02-07 14:23:43 +0900625 // Add a device and two storages that has same name.
626 addTestDevice();
627 mDatabase.getMapper().startAddingDocuments("1");
628 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900629 new MtpRoot(0, 200, "Storage", 2000, 0, ""),
630 new MtpRoot(0, 201, "Storage", 2001, 0, ""),
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900631 });
Daichi Hirono619afda2016-02-07 14:23:43 +0900632 mDatabase.getMapper().stopAddingDocuments("1");
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900633
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900634 {
Daichi Hirono4604b742015-11-12 12:12:48 +0900635 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900636 assertEquals(2, cursor.getCount());
Daichi Hirono619afda2016-02-07 14:23:43 +0900637
638 // First storage reuse document ID of previous storage.
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900639 cursor.moveToNext();
Daichi Hirono9fca5412016-02-07 13:20:22 +0900640 // One reuses exisitng document ID 1.
Daichi Hirono619afda2016-02-07 14:23:43 +0900641 assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900642 assertEquals(200, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900643 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono619afda2016-02-07 14:23:43 +0900644
645 // Second one has new document ID.
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900646 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900647 assertEquals(3, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900648 assertEquals(201, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900649 assertEquals("Storage", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hirono619afda2016-02-07 14:23:43 +0900650
Daichi Hirono6de8a0e2015-10-27 16:18:17 +0900651 cursor.close();
652 }
653 }
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900654
Daichi Hirono619afda2016-02-07 14:23:43 +0900655 public void testReplaceExistingRoots() throws Exception {
Daichi Hirono8e873642016-02-07 15:17:16 +0900656 addTestDevice();
Daichi Hirono81d48532015-12-16 15:03:19 +0900657
Daichi Hirono4604b742015-11-12 12:12:48 +0900658 // The client code should be able to replace existing rows with new information.
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900659 // Add one.
Daichi Hirono81d48532015-12-16 15:03:19 +0900660 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900661 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
662 new MtpRoot(0, 100, "Storage A", 0, 0, ""),
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900663 });
Daichi Hirono81d48532015-12-16 15:03:19 +0900664 mDatabase.getMapper().stopAddingDocuments("1");
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900665 // Replace it.
Daichi Hirono81d48532015-12-16 15:03:19 +0900666 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900667 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
668 new MtpRoot(0, 100, "Storage B", 1000, 1000, ""),
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900669 });
Daichi Hirono81d48532015-12-16 15:03:19 +0900670 mDatabase.getMapper().stopAddingDocuments("1");
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900671 {
672 final String[] columns = new String[] {
673 DocumentsContract.Document.COLUMN_DOCUMENT_ID,
Daichi Hirono18d70d52015-11-13 15:19:47 +0900674 MtpDatabaseConstants.COLUMN_STORAGE_ID,
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900675 DocumentsContract.Document.COLUMN_DISPLAY_NAME
676 };
Daichi Hirono4604b742015-11-12 12:12:48 +0900677 final Cursor cursor = mDatabase.queryRootDocuments(columns);
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900678 assertEquals(1, cursor.getCount());
679 cursor.moveToNext();
Daichi Hirono81d48532015-12-16 15:03:19 +0900680 assertEquals(2, getInt(cursor, COLUMN_DOCUMENT_ID));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900681 assertEquals(100, getInt(cursor, COLUMN_STORAGE_ID));
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900682 assertEquals("Storage B", getString(cursor, COLUMN_DISPLAY_NAME));
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900683 cursor.close();
684 }
685 {
686 final String[] columns = new String[] {
687 Root.COLUMN_ROOT_ID,
Daichi Hirono81d48532015-12-16 15:03:19 +0900688 Root.COLUMN_TITLE,
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900689 Root.COLUMN_AVAILABLE_BYTES
690 };
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900691 final Cursor cursor = mDatabase.queryRoots(resources, columns);
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900692 assertEquals(1, cursor.getCount());
693 cursor.moveToNext();
Daichi Hirono6a5ea7e2016-02-02 16:35:03 +0900694 assertEquals(1, getInt(cursor, Root.COLUMN_ROOT_ID));
Daichi Hirono81d48532015-12-16 15:03:19 +0900695 assertEquals("Device Storage B", getString(cursor, Root.COLUMN_TITLE));
Daichi Hirono9984ebd2015-12-15 16:02:27 +0900696 assertEquals(1000, getInt(cursor, Root.COLUMN_AVAILABLE_BYTES));
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900697 cursor.close();
698 }
699 }
700
Daichi Hirono619afda2016-02-07 14:23:43 +0900701 public void testFailToReplaceExisitingUnmappedRoots() throws Exception {
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900702 // The client code should not be able to replace rows before resolving 'unmapped' rows.
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900703 // Add one.
Daichi Hirono619afda2016-02-07 14:23:43 +0900704 addTestDevice();
Daichi Hirono81d48532015-12-16 15:03:19 +0900705 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900706 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
707 new MtpRoot(0, 100, "Storage A", 0, 0, ""),
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900708 });
Daichi Hirono259ce802015-11-20 17:51:53 +0900709 mDatabase.getMapper().clearMapping();
Daichi Hirono49f920f2015-11-19 10:19:52 +0900710
Daichi Hirono619afda2016-02-07 14:23:43 +0900711 addTestDevice();
712 try (final Cursor oldCursor =
713 mDatabase.queryRoots(resources, strings(Root.COLUMN_ROOT_ID))) {
714 assertEquals(1, oldCursor.getCount());
715 oldCursor.moveToNext();
716 assertEquals("1", getString(oldCursor, Root.COLUMN_ROOT_ID));
Daichi Hirono49f920f2015-11-19 10:19:52 +0900717
Daichi Hirono619afda2016-02-07 14:23:43 +0900718 // Add one.
719 mDatabase.getMapper().startAddingDocuments("1");
720 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
721 new MtpRoot(0, 101, "Storage B", 1000, 1000, ""),
722 });
723 // Add one more before resolving unmapped documents.
724 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
725 new MtpRoot(0, 102, "Storage B", 1000, 1000, ""),
726 });
727 mDatabase.getMapper().stopAddingDocuments("1");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900728
Daichi Hirono619afda2016-02-07 14:23:43 +0900729 // Because the roots shares the same name, the roots should have new IDs.
730 try (final Cursor newCursor = mDatabase.queryChildDocuments(
731 strings(Document.COLUMN_DOCUMENT_ID), "1")) {
732 assertEquals(2, newCursor.getCount());
733 newCursor.moveToNext();
734 assertFalse(oldCursor.getString(0).equals(newCursor.getString(0)));
735 newCursor.moveToNext();
736 assertFalse(oldCursor.getString(0).equals(newCursor.getString(0)));
737 }
738 }
Daichi Hirono49f920f2015-11-19 10:19:52 +0900739 }
740
Daichi Hirono619afda2016-02-07 14:23:43 +0900741 public void testQueryDocuments() throws Exception {
742 addTestDevice();
743 addTestStorage("1");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900744
Daichi Hirono619afda2016-02-07 14:23:43 +0900745 final Cursor cursor = mDatabase.queryDocument("2", strings(Document.COLUMN_DISPLAY_NAME));
Daichi Hirono49f920f2015-11-19 10:19:52 +0900746 assertEquals(1, cursor.getCount());
747 cursor.moveToNext();
Daichi Hirono619afda2016-02-07 14:23:43 +0900748 assertEquals("Storage", getString(cursor, Document.COLUMN_DISPLAY_NAME));
Daichi Hirono49f920f2015-11-19 10:19:52 +0900749 cursor.close();
750 }
751
Daichi Hirono619afda2016-02-07 14:23:43 +0900752 public void testQueryRoots() throws Exception {
Daichi Hirono81d48532015-12-16 15:03:19 +0900753 // Add device document.
Daichi Hirono8e873642016-02-07 15:17:16 +0900754 addTestDevice();
Daichi Hirono81d48532015-12-16 15:03:19 +0900755
756 // It the device does not have storages, it shows a device root.
757 {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900758 final Cursor cursor = mDatabase.queryRoots(resources, strings(Root.COLUMN_TITLE));
Daichi Hirono81d48532015-12-16 15:03:19 +0900759 assertEquals(1, cursor.getCount());
760 cursor.moveToNext();
761 assertEquals("Device", cursor.getString(0));
762 cursor.close();
763 }
764
765 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900766 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
767 new MtpRoot(0, 100, "Storage A", 0, 0, "")
Daichi Hirono81d48532015-12-16 15:03:19 +0900768 });
769 mDatabase.getMapper().stopAddingDocuments("1");
770
771 // It the device has single storage, it shows a storage root.
772 {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900773 final Cursor cursor = mDatabase.queryRoots(resources, strings(Root.COLUMN_TITLE));
Daichi Hirono81d48532015-12-16 15:03:19 +0900774 assertEquals(1, cursor.getCount());
775 cursor.moveToNext();
776 assertEquals("Device Storage A", cursor.getString(0));
777 cursor.close();
778 }
779
780 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900781 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
782 new MtpRoot(0, 100, "Storage A", 0, 0, ""),
783 new MtpRoot(0, 101, "Storage B", 0, 0, "")
Daichi Hirono81d48532015-12-16 15:03:19 +0900784 });
785 mDatabase.getMapper().stopAddingDocuments("1");
786
787 // It the device has multiple storages, it shows a device root.
788 {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900789 final Cursor cursor = mDatabase.queryRoots(resources, strings(Root.COLUMN_TITLE));
Daichi Hirono81d48532015-12-16 15:03:19 +0900790 assertEquals(1, cursor.getCount());
791 cursor.moveToNext();
792 assertEquals("Device", cursor.getString(0));
793 cursor.close();
794 }
795 }
796
Daichi Hirono49f920f2015-11-19 10:19:52 +0900797 public void testGetParentId() throws FileNotFoundException {
Daichi Hirono619afda2016-02-07 14:23:43 +0900798 addTestDevice();
Daichi Hirono49f920f2015-11-19 10:19:52 +0900799
Daichi Hirono7a375c42015-12-14 17:14:29 +0900800 mDatabase.getMapper().startAddingDocuments("1");
Daichi Hirono619afda2016-02-07 14:23:43 +0900801 mDatabase.getMapper().putStorageDocuments("1", new MtpRoot[] {
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900802 new MtpRoot(0, 100, "Storage A", 0, 0, ""),
Daichi Hirono49f920f2015-11-19 10:19:52 +0900803 });
Daichi Hirono7a375c42015-12-14 17:14:29 +0900804 mDatabase.getMapper().stopAddingDocuments("1");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900805
Daichi Hirono7a375c42015-12-14 17:14:29 +0900806 mDatabase.getMapper().startAddingDocuments("2");
Daichi Hirono259ce802015-11-20 17:51:53 +0900807 mDatabase.getMapper().putChildDocuments(
Daichi Hirono49f920f2015-11-19 10:19:52 +0900808 0,
809 "2",
810 new MtpObjectInfo[] {
811 createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
812 });
Daichi Hirono7a375c42015-12-14 17:14:29 +0900813 mDatabase.getMapper().stopAddingDocuments("2");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900814
Daichi Hirono619afda2016-02-07 14:23:43 +0900815 assertEquals("2", mDatabase.getParentIdentifier("3").mDocumentId);
816 }
817
818 public void testDeleteDocument() throws Exception {
819 addTestDevice();
820 addTestStorage("1");
821
822 mDatabase.getMapper().startAddingDocuments("2");
823 mDatabase.getMapper().putChildDocuments(
824 0,
825 "2",
826 new MtpObjectInfo[] {
827 createDocument(200, "dir", MtpConstants.FORMAT_ASSOCIATION, 1024),
828 });
829 mDatabase.getMapper().stopAddingDocuments("2");
830
831 mDatabase.getMapper().startAddingDocuments("3");
832 mDatabase.getMapper().putChildDocuments(
833 0,
834 "3",
835 new MtpObjectInfo[] {
836 createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
837 });
838 mDatabase.getMapper().stopAddingDocuments("3");
839
840 mDatabase.deleteDocument("3");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900841
842 {
843 // Do not query deleted documents.
844 final Cursor cursor =
Daichi Hirono619afda2016-02-07 14:23:43 +0900845 mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900846 assertEquals(0, cursor.getCount());
847 cursor.close();
848 }
849
850 {
851 // Child document should be deleted also.
852 final Cursor cursor =
Daichi Hirono619afda2016-02-07 14:23:43 +0900853 mDatabase.queryDocument("4", strings(Document.COLUMN_DOCUMENT_ID));
Daichi Hirono49f920f2015-11-19 10:19:52 +0900854 assertEquals(0, cursor.getCount());
855 cursor.close();
856 }
857 }
858
Daichi Hirono619afda2016-02-07 14:23:43 +0900859 public void testPutNewDocument() throws Exception {
860 addTestDevice();
861 addTestStorage("1");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900862
863 assertEquals(
Daichi Hirono619afda2016-02-07 14:23:43 +0900864 "3",
Daichi Hirono49f920f2015-11-19 10:19:52 +0900865 mDatabase.putNewDocument(
Daichi Hirono619afda2016-02-07 14:23:43 +0900866 0, "2", createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024)));
Daichi Hirono49f920f2015-11-19 10:19:52 +0900867
868 {
869 final Cursor cursor =
Daichi Hirono619afda2016-02-07 14:23:43 +0900870 mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2");
Daichi Hirono49f920f2015-11-19 10:19:52 +0900871 assertEquals(1, cursor.getCount());
872 cursor.moveToNext();
873 assertEquals("3", cursor.getString(0));
874 cursor.close();
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900875 }
Daichi Hirono619afda2016-02-07 14:23:43 +0900876
877 // The new document should not be mapped with existing invalidated document.
878 mDatabase.getMapper().clearMapping();
Daichi Hirono8e873642016-02-07 15:17:16 +0900879 addTestDevice();
880 addTestStorage("1");
881
Daichi Hirono619afda2016-02-07 14:23:43 +0900882 mDatabase.getMapper().startAddingDocuments("2");
883 mDatabase.putNewDocument(
884 0,
885 "2",
886 createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024));
887 mDatabase.getMapper().stopAddingDocuments("2");
888
889 {
890 final Cursor cursor =
891 mDatabase.queryChildDocuments(strings(Document.COLUMN_DOCUMENT_ID), "2");
892 assertEquals(1, cursor.getCount());
893 cursor.moveToNext();
894 assertEquals("4", cursor.getString(0));
895 cursor.close();
896 }
Daichi Hironocfcb0c02015-11-10 12:52:59 +0900897 }
Daichi Hirono20754c52015-12-15 18:52:26 +0900898
Daichi Hirono619afda2016-02-07 14:23:43 +0900899 public void testGetDocumentIdForDevice() throws Exception {
900 addTestDevice();
901 assertEquals("1", mDatabase.getDocumentIdForDevice(0));
Daichi Hirono20754c52015-12-15 18:52:26 +0900902 }
Daichi Hirono83983d72016-01-29 17:37:36 +0900903
Daichi Hirono619afda2016-02-07 14:23:43 +0900904 public void testGetClosedDevice() throws Exception {
Daichi Hirono83983d72016-01-29 17:37:36 +0900905 mDatabase.getMapper().startAddingDocuments(null);
906 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
Daichi Hironoebd24052016-02-06 21:05:57 +0900907 0, "Device", null /* deviceKey */, /* opened is */ false, new MtpRoot[0], null,
908 null));
Daichi Hirono83983d72016-01-29 17:37:36 +0900909 mDatabase.getMapper().stopAddingDocuments(null);
910
911 final String[] columns = new String [] {
912 DocumentsContract.Root.COLUMN_ROOT_ID,
913 DocumentsContract.Root.COLUMN_TITLE,
914 DocumentsContract.Root.COLUMN_AVAILABLE_BYTES
915 };
Daichi Hironof83ccbd2016-02-04 16:58:55 +0900916 try (final Cursor cursor = mDatabase.queryRoots(resources, columns)) {
Daichi Hirono83983d72016-01-29 17:37:36 +0900917 assertEquals(1, cursor.getCount());
918 assertTrue(cursor.moveToNext());
919 assertEquals(1, cursor.getLong(0));
920 assertEquals("Device", cursor.getString(1));
921 assertTrue(cursor.isNull(2));
922 }
923 }
Daichi Hirono619afda2016-02-07 14:23:43 +0900924
Daichi Hironoebd24052016-02-06 21:05:57 +0900925 public void testMappingWithoutKey() throws FileNotFoundException {
926 mDatabase.getMapper().startAddingDocuments(null);
927 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
928 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null,
929 null));
930 mDatabase.getMapper().stopAddingDocuments(null);
931
932 mDatabase.getMapper().startAddingDocuments(null);
933 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
934 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null,
935 null));
936 mDatabase.getMapper().stopAddingDocuments(null);
937
938 try (final Cursor cursor =
939 mDatabase.queryRoots(resources, strings(DocumentsContract.Root.COLUMN_ROOT_ID))) {
940 assertEquals(1, cursor.getCount());
941 assertTrue(cursor.moveToNext());
942 assertEquals(1, cursor.getLong(0));
943 }
944 }
945
946 public void testMappingFailsWithoutKey() throws FileNotFoundException {
947 mDatabase.getMapper().startAddingDocuments(null);
948 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
949 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null,
950 null));
951 mDatabase.getMapper().stopAddingDocuments(null);
952
953 // MTP identifier is cleared here. Mapping no longer works without device key.
954 mDatabase.getMapper().startAddingDocuments(null);
955 mDatabase.getMapper().stopAddingDocuments(null);
956
957 mDatabase.getMapper().startAddingDocuments(null);
958 mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
959 0, "Device", null /* device key */, /* opened is */ true, new MtpRoot[0], null,
960 null));
961 mDatabase.getMapper().stopAddingDocuments(null);
962
963 try (final Cursor cursor =
964 mDatabase.queryRoots(resources, strings(DocumentsContract.Root.COLUMN_ROOT_ID))) {
965 assertEquals(1, cursor.getCount());
966 assertTrue(cursor.moveToNext());
967 assertEquals(2, cursor.getLong(0));
968 }
969 }
970
971 public void testUpdateDocumentWithoutChange() throws FileNotFoundException {
972 mDatabase.getMapper().startAddingDocuments(null);
973 assertTrue(mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
974 0, "Device", "device_key", /* opened is */ true, new MtpRoot[0], null,
975 null)));
976 assertFalse(mDatabase.getMapper().stopAddingDocuments(null));
977
978 mDatabase.getMapper().startAddingDocuments(null);
979 assertFalse(mDatabase.getMapper().putDeviceDocument(new MtpDeviceRecord(
980 0, "Device", "device_key", /* opened is */ true, new MtpRoot[0], null,
981 null)));
982 assertFalse(mDatabase.getMapper().stopAddingDocuments(null));
983 }
984
Daichi Hirono619afda2016-02-07 14:23:43 +0900985 private void addTestDevice() throws FileNotFoundException {
Daichi Hironof578fa22016-02-19 18:05:42 +0900986 TestUtil.addTestDevice(mDatabase);
Daichi Hirono619afda2016-02-07 14:23:43 +0900987 }
988
989 private void addTestStorage(String parentId) throws FileNotFoundException {
Daichi Hironof578fa22016-02-19 18:05:42 +0900990 TestUtil.addTestStorage(mDatabase, parentId);
Daichi Hirono619afda2016-02-07 14:23:43 +0900991 }
Daichi Hirono9678f602015-10-22 12:35:05 +0900992}