MtpDatabaseTest.java revision 18d70d5b7c46d2a35f66a6a76ba319eacf62e6c6
1/*
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
17package com.android.mtp;
18
19import android.database.Cursor;
20import android.mtp.MtpConstants;
21import android.mtp.MtpObjectInfo;
22import android.provider.DocumentsContract;
23import android.provider.DocumentsContract.Root;
24import android.test.AndroidTestCase;
25import android.test.suitebuilder.annotation.SmallTest;
26
27@SmallTest
28public class MtpDatabaseTest extends AndroidTestCase {
29    private final String[] COLUMN_NAMES = new String[] {
30        DocumentsContract.Document.COLUMN_DOCUMENT_ID,
31        MtpDatabaseConstants.COLUMN_DEVICE_ID,
32        MtpDatabaseConstants.COLUMN_STORAGE_ID,
33        MtpDatabaseConstants.COLUMN_OBJECT_HANDLE,
34        DocumentsContract.Document.COLUMN_MIME_TYPE,
35        DocumentsContract.Document.COLUMN_DISPLAY_NAME,
36        DocumentsContract.Document.COLUMN_SUMMARY,
37        DocumentsContract.Document.COLUMN_LAST_MODIFIED,
38        DocumentsContract.Document.COLUMN_ICON,
39        DocumentsContract.Document.COLUMN_FLAGS,
40        DocumentsContract.Document.COLUMN_SIZE
41    };
42
43    private final TestResources resources = new TestResources();
44
45    public void testPutRootDocuments() throws Exception {
46        final MtpDatabase database = new MtpDatabase(getContext());
47        database.startAddingRootDocuments(0);
48        database.putRootDocuments(0, resources, new MtpRoot[] {
49                new MtpRoot(0, 1, "Device", "Storage", 1000, 2000, ""),
50                new MtpRoot(0, 2, "Device", "Storage", 2000, 4000, ""),
51                new MtpRoot(0, 3, "Device", "/@#%&<>Storage", 3000, 6000,"")
52        });
53
54        {
55            final Cursor cursor = database.queryRootDocuments(COLUMN_NAMES);
56            assertEquals(3, cursor.getCount());
57
58            cursor.moveToNext();
59            assertEquals("documentId", 1, cursor.getInt(0));
60            assertEquals("deviceId", 0, cursor.getInt(1));
61            assertEquals("storageId", 1, cursor.getInt(2));
62            assertTrue("objectHandle", cursor.isNull(3));
63            assertEquals("mimeType", DocumentsContract.Document.MIME_TYPE_DIR, cursor.getString(4));
64            assertEquals("displayName", "Device Storage", cursor.getString(5));
65            assertTrue("summary", cursor.isNull(6));
66            assertTrue("lastModified", cursor.isNull(7));
67            assertTrue("icon", cursor.isNull(8));
68            assertEquals("flag", 0, cursor.getInt(9));
69            assertEquals("size", 1000, cursor.getInt(10));
70
71            cursor.moveToNext();
72            assertEquals("documentId", 2, cursor.getInt(0));
73            assertEquals("displayName", "Device Storage", cursor.getString(5));
74
75            cursor.moveToNext();
76            assertEquals("documentId", 3, cursor.getInt(0));
77            assertEquals("displayName", "Device /@#%&<>Storage", cursor.getString(5));
78
79            cursor.close();
80        }
81
82        {
83            final Cursor cursor = database.queryRoots(new String [] {
84                    Root.COLUMN_ROOT_ID,
85                    Root.COLUMN_FLAGS,
86                    Root.COLUMN_ICON,
87                    Root.COLUMN_TITLE,
88                    Root.COLUMN_SUMMARY,
89                    Root.COLUMN_DOCUMENT_ID,
90                    Root.COLUMN_AVAILABLE_BYTES,
91                    Root.COLUMN_CAPACITY_BYTES
92            });
93            assertEquals(3, cursor.getCount());
94
95            cursor.moveToNext();
96            assertEquals(1, cursor.getInt(0));
97            assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1));
98            assertTrue(cursor.isNull(2));
99            assertEquals("Device Storage", cursor.getString(3));
100            assertTrue(cursor.isNull(4));
101            assertEquals(1, cursor.getInt(5));
102            assertEquals(1000, cursor.getInt(6));
103            assertEquals(2000, cursor.getInt(7));
104
105            cursor.moveToNext();
106            assertEquals(2, cursor.getInt(0));
107            assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1));
108            assertTrue(cursor.isNull(2));
109            assertEquals("Device Storage", cursor.getString(3));
110            assertTrue(cursor.isNull(4));
111            assertEquals(2, cursor.getInt(5));
112            assertEquals(2000, cursor.getInt(6));
113            assertEquals(4000, cursor.getInt(7));
114
115            cursor.moveToNext();
116            assertEquals(3, cursor.getInt(0));
117            assertEquals(Root.FLAG_SUPPORTS_IS_CHILD | Root.FLAG_SUPPORTS_CREATE, cursor.getInt(1));
118            assertTrue(cursor.isNull(2));
119            assertEquals("Device /@#%&<>Storage", cursor.getString(3));
120            assertTrue(cursor.isNull(4));
121            assertEquals(3, cursor.getInt(5));
122            assertEquals(3000, cursor.getInt(6));
123            assertEquals(6000, cursor.getInt(7));
124
125            cursor.close();
126        }
127    }
128
129    private MtpObjectInfo createDocument(int objectHandle, String name, int format, int size) {
130        final MtpObjectInfo.Builder builder = new MtpObjectInfo.Builder();
131        builder.setObjectHandle(objectHandle);
132        builder.setName(name);
133        builder.setFormat(format);
134        builder.setCompressedSize(size);
135        return builder.build();
136    }
137
138    public void testPutChildDocuments() throws Exception {
139        final MtpDatabase database = new MtpDatabase(getContext());
140        database.startAddingChildDocuments("parentId");
141        database.putChildDocuments(0, "parentId", new MtpObjectInfo[] {
142                createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
143                createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024),
144                createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024)
145        });
146
147        final Cursor cursor = database.queryChildDocuments(COLUMN_NAMES, "parentId");
148        assertEquals(3, cursor.getCount());
149
150        cursor.moveToNext();
151        assertEquals("documentId", 1, cursor.getInt(0));
152        assertEquals("deviceId", 0, cursor.getInt(1));
153        assertEquals("storageId", 0, cursor.getInt(2));
154        assertEquals("objectHandle", 100, cursor.getInt(3));
155        assertEquals("mimeType", "text/plain", cursor.getString(4));
156        assertEquals("displayName", "note.txt", cursor.getString(5));
157        assertTrue("summary", cursor.isNull(6));
158        assertTrue("lastModified", cursor.isNull(7));
159        assertTrue("icon", cursor.isNull(8));
160        assertEquals(
161                "flag",
162                DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
163                DocumentsContract.Document.FLAG_SUPPORTS_WRITE,
164                cursor.getInt(9));
165        assertEquals("size", 1024, cursor.getInt(10));
166
167        cursor.moveToNext();
168        assertEquals("documentId", 2, cursor.getInt(0));
169        assertEquals("deviceId", 0, cursor.getInt(1));
170        assertEquals("storageId", 0, cursor.getInt(2));
171        assertEquals("objectHandle", 101, cursor.getInt(3));
172        assertEquals("mimeType", "image/jpeg", cursor.getString(4));
173        assertEquals("displayName", "image.jpg", cursor.getString(5));
174        assertTrue("summary", cursor.isNull(6));
175        assertTrue("lastModified", cursor.isNull(7));
176        assertTrue("icon", cursor.isNull(8));
177        assertEquals(
178                "flag",
179                DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
180                DocumentsContract.Document.FLAG_SUPPORTS_WRITE,
181                cursor.getInt(9));
182        assertEquals("size", 2 * 1024 * 1024, cursor.getInt(10));
183
184        cursor.moveToNext();
185        assertEquals("documentId", 3, cursor.getInt(0));
186        assertEquals("deviceId", 0, cursor.getInt(1));
187        assertEquals("storageId", 0, cursor.getInt(2));
188        assertEquals("objectHandle", 102, cursor.getInt(3));
189        assertEquals("mimeType", "audio/mpeg", cursor.getString(4));
190        assertEquals("displayName", "music.mp3", cursor.getString(5));
191        assertTrue("summary", cursor.isNull(6));
192        assertTrue("lastModified", cursor.isNull(7));
193        assertTrue("icon", cursor.isNull(8));
194        assertEquals(
195                "flag",
196                DocumentsContract.Document.FLAG_SUPPORTS_DELETE |
197                DocumentsContract.Document.FLAG_SUPPORTS_WRITE,
198                cursor.getInt(9));
199        assertEquals("size", 3 * 1024 * 1024, cursor.getInt(10));
200
201        cursor.close();
202    }
203
204    public void testRestoreIdForRootDocuments() throws Exception {
205        final MtpDatabase database = new MtpDatabase(getContext());
206        final String[] columns = new String[] {
207                DocumentsContract.Document.COLUMN_DOCUMENT_ID,
208                MtpDatabaseConstants.COLUMN_STORAGE_ID,
209                DocumentsContract.Document.COLUMN_DISPLAY_NAME
210        };
211        final String[] rootColumns = new String[] {
212                Root.COLUMN_ROOT_ID,
213                Root.COLUMN_AVAILABLE_BYTES
214        };
215        database.startAddingRootDocuments(0);
216        database.putRootDocuments(0, resources, new MtpRoot[] {
217                new MtpRoot(0, 100, "Device", "Storage A", 1000, 0, ""),
218                new MtpRoot(0, 101, "Device", "Storage B", 1001, 0, "")
219        });
220
221        {
222            final Cursor cursor = database.queryRootDocuments(columns);
223            assertEquals(2, cursor.getCount());
224            cursor.moveToNext();
225            assertEquals("documentId", 1, cursor.getInt(0));
226            assertEquals("storageId", 100, cursor.getInt(1));
227            assertEquals("name", "Device Storage A", cursor.getString(2));
228            cursor.moveToNext();
229            assertEquals("documentId", 2, cursor.getInt(0));
230            assertEquals("storageId", 101, cursor.getInt(1));
231            assertEquals("name", "Device Storage B", cursor.getString(2));
232            cursor.close();
233        }
234
235        {
236            final Cursor cursor = database.queryRoots(rootColumns);
237            assertEquals(2, cursor.getCount());
238            cursor.moveToNext();
239            assertEquals("rootId", 1, cursor.getInt(0));
240            assertEquals("availableBytes", 1000, cursor.getInt(1));
241            cursor.moveToNext();
242            assertEquals("rootId", 2, cursor.getInt(0));
243            assertEquals("availableBytes", 1001, cursor.getInt(1));
244            cursor.close();
245        }
246
247        database.clearMapping();
248
249        {
250            final Cursor cursor = database.queryRootDocuments(columns);
251            assertEquals(2, cursor.getCount());
252            cursor.moveToNext();
253            assertEquals("documentId", 1, cursor.getInt(0));
254            assertTrue("storageId", cursor.isNull(1));
255            assertEquals("name", "Device Storage A", cursor.getString(2));
256            cursor.moveToNext();
257            assertEquals("documentId", 2, cursor.getInt(0));
258            assertTrue("storageId", cursor.isNull(1));
259            assertEquals("name", "Device Storage B", cursor.getString(2));
260            cursor.close();
261        }
262
263        {
264            final Cursor cursor = database.queryRoots(rootColumns);
265            assertEquals(2, cursor.getCount());
266            cursor.moveToNext();
267            assertEquals("rootId", 1, cursor.getInt(0));
268            assertEquals("availableBytes", 1000, cursor.getInt(1));
269            cursor.moveToNext();
270            assertEquals("rootId", 2, cursor.getInt(0));
271            assertEquals("availableBytes", 1001, cursor.getInt(1));
272            cursor.close();
273        }
274
275        database.startAddingRootDocuments(0);
276        database.putRootDocuments(0, resources, new MtpRoot[] {
277                new MtpRoot(0, 200, "Device", "Storage A", 2000, 0, ""),
278                new MtpRoot(0, 202, "Device", "Storage C", 2002, 0, "")
279        });
280
281        {
282            final Cursor cursor = database.queryRootDocuments(columns);
283            assertEquals(3, cursor.getCount());
284            cursor.moveToNext();
285            assertEquals("documentId", 1, cursor.getInt(0));
286            assertTrue("storageId", cursor.isNull(1));
287            assertEquals("name", "Device Storage A", cursor.getString(2));
288            cursor.moveToNext();
289            assertEquals("documentId", 2, cursor.getInt(0));
290            assertTrue("storageId", cursor.isNull(1));
291            assertEquals("name", "Device Storage B", cursor.getString(2));
292            cursor.moveToNext();
293            assertEquals("documentId", 4, cursor.getInt(0));
294            assertEquals("storageId", 202, cursor.getInt(1));
295            assertEquals("name", "Device Storage C", cursor.getString(2));
296            cursor.close();
297        }
298
299        {
300            final Cursor cursor = database.queryRoots(rootColumns);
301            assertEquals(3, cursor.getCount());
302            cursor.moveToNext();
303            assertEquals("rootId", 1, cursor.getInt(0));
304            assertEquals("availableBytes", 1000, cursor.getInt(1));
305            cursor.moveToNext();
306            assertEquals("rootId", 2, cursor.getInt(0));
307            assertEquals("availableBytes", 1001, cursor.getInt(1));
308            cursor.moveToNext();
309            assertEquals("rootId", 4, cursor.getInt(0));
310            assertEquals("availableBytes", 2002, cursor.getInt(1));
311            cursor.close();
312        }
313
314        database.stopAddingRootDocuments(0);
315
316        {
317            final Cursor cursor = database.queryRootDocuments(columns);
318            assertEquals(2, cursor.getCount());
319            cursor.moveToNext();
320            assertEquals("documentId", 1, cursor.getInt(0));
321            assertEquals("storageId", 200, cursor.getInt(1));
322            assertEquals("name", "Device Storage A", cursor.getString(2));
323            cursor.moveToNext();
324            assertEquals("documentId", 4, cursor.getInt(0));
325            assertEquals("storageId", 202, cursor.getInt(1));
326            assertEquals("name", "Device Storage C", cursor.getString(2));
327            cursor.close();
328        }
329
330        {
331            final Cursor cursor = database.queryRoots(rootColumns);
332            assertEquals(2, cursor.getCount());
333            cursor.moveToNext();
334            assertEquals("rootId", 1, cursor.getInt(0));
335            assertEquals("availableBytes", 2000, cursor.getInt(1));
336            cursor.moveToNext();
337            assertEquals("rootId", 4, cursor.getInt(0));
338            assertEquals("availableBytes", 2002, cursor.getInt(1));
339            cursor.close();
340        }
341    }
342
343    public void testRestoreIdForChildDocuments() throws Exception {
344        final MtpDatabase database = new MtpDatabase(getContext());
345        final String[] columns = new String[] {
346                DocumentsContract.Document.COLUMN_DOCUMENT_ID,
347                MtpDatabaseConstants.COLUMN_OBJECT_HANDLE,
348                DocumentsContract.Document.COLUMN_DISPLAY_NAME
349        };
350        database.startAddingChildDocuments("parentId");
351        database.putChildDocuments(0, "parentId", new MtpObjectInfo[] {
352                createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
353                createDocument(101, "image.jpg", MtpConstants.FORMAT_EXIF_JPEG, 2 * 1024 * 1024),
354                createDocument(102, "music.mp3", MtpConstants.FORMAT_MP3, 3 * 1024 * 1024)
355        });
356        database.clearMapping();
357
358        {
359            final Cursor cursor = database.queryChildDocuments(columns, "parentId");
360            assertEquals(3, cursor.getCount());
361
362            cursor.moveToNext();
363            assertEquals("documentId", 1, cursor.getInt(0));
364            assertTrue("objectHandle", cursor.isNull(1));
365            assertEquals("name", "note.txt", cursor.getString(2));
366
367            cursor.moveToNext();
368            assertEquals("documentId", 2, cursor.getInt(0));
369            assertTrue("objectHandle", cursor.isNull(1));
370            assertEquals("name", "image.jpg", cursor.getString(2));
371
372            cursor.moveToNext();
373            assertEquals("documentId", 3, cursor.getInt(0));
374            assertTrue("objectHandle", cursor.isNull(1));
375            assertEquals("name", "music.mp3", cursor.getString(2));
376
377            cursor.close();
378        }
379
380        database.startAddingChildDocuments("parentId");
381        database.putChildDocuments(0, "parentId", new MtpObjectInfo[] {
382                createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
383                createDocument(203, "video.mp4", MtpConstants.FORMAT_MP4_CONTAINER, 1024),
384        });
385
386        {
387            final Cursor cursor = database.queryChildDocuments(columns, "parentId");
388            assertEquals(4, cursor.getCount());
389
390            cursor.moveToPosition(3);
391            assertEquals("documentId", 5, cursor.getInt(0));
392            assertEquals("objectHandle", 203, cursor.getInt(1));
393            assertEquals("name", "video.mp4", cursor.getString(2));
394
395            cursor.close();
396        }
397
398        database.stopAddingChildDocuments("parentId");
399
400        {
401            final Cursor cursor = database.queryChildDocuments(columns, "parentId");
402            assertEquals(2, cursor.getCount());
403
404            cursor.moveToNext();
405            assertEquals("documentId", 1, cursor.getInt(0));
406            assertEquals("objectHandle", 200, cursor.getInt(1));
407            assertEquals("name", "note.txt", cursor.getString(2));
408
409            cursor.moveToNext();
410            assertEquals("documentId", 5, cursor.getInt(0));
411            assertEquals("objectHandle", 203, cursor.getInt(1));
412            assertEquals("name", "video.mp4", cursor.getString(2));
413            cursor.close();
414        }
415    }
416
417    public void testRestoreIdForDifferentDevices() throws Exception {
418        final MtpDatabase database = new MtpDatabase(getContext());
419        final String[] columns = new String[] {
420                DocumentsContract.Document.COLUMN_DOCUMENT_ID,
421                MtpDatabaseConstants.COLUMN_STORAGE_ID,
422                DocumentsContract.Document.COLUMN_DISPLAY_NAME
423        };
424        final String[] rootColumns = new String[] {
425                Root.COLUMN_ROOT_ID,
426                Root.COLUMN_AVAILABLE_BYTES
427        };
428        database.startAddingRootDocuments(0);
429        database.startAddingRootDocuments(1);
430        database.putRootDocuments(0, resources, new MtpRoot[] {
431                new MtpRoot(0, 100, "Device", "Storage", 0, 0, "")
432        });
433        database.putRootDocuments(1, resources, new MtpRoot[] {
434                new MtpRoot(1, 100, "Device", "Storage", 0, 0, "")
435        });
436
437        {
438            final Cursor cursor = database.queryRootDocuments(columns);
439            assertEquals(2, cursor.getCount());
440            cursor.moveToNext();
441            assertEquals("documentId", 1, cursor.getInt(0));
442            assertEquals("storageId", 100, cursor.getInt(1));
443            assertEquals("name", "Device Storage", cursor.getString(2));
444            cursor.moveToNext();
445            assertEquals("documentId", 2, cursor.getInt(0));
446            assertEquals("storageId", 100, cursor.getInt(1));
447            assertEquals("name", "Device Storage", cursor.getString(2));
448            cursor.close();
449        }
450
451        {
452            final Cursor cursor = database.queryRoots(rootColumns);
453            assertEquals(2, cursor.getCount());
454            cursor.moveToNext();
455            assertEquals("rootId", 1, cursor.getInt(0));
456            assertEquals("availableBytes", 0, cursor.getInt(1));
457            cursor.moveToNext();
458            assertEquals("rootId", 2, cursor.getInt(0));
459            assertEquals("availableBytes", 0, cursor.getInt(1));
460            cursor.close();
461        }
462
463        database.clearMapping();
464
465        database.startAddingRootDocuments(0);
466        database.startAddingRootDocuments(1);
467        database.putRootDocuments(0, resources, new MtpRoot[] {
468                new MtpRoot(0, 200, "Device", "Storage", 2000, 0, "")
469        });
470        database.putRootDocuments(1, resources, new MtpRoot[] {
471                new MtpRoot(1, 300, "Device", "Storage", 3000, 0, "")
472        });
473        database.stopAddingRootDocuments(0);
474        database.stopAddingRootDocuments(1);
475
476        {
477            final Cursor cursor = database.queryRootDocuments(columns);
478            assertEquals(2, cursor.getCount());
479            cursor.moveToNext();
480            assertEquals("documentId", 1, cursor.getInt(0));
481            assertEquals("storageId", 200, cursor.getInt(1));
482            assertEquals("name", "Device Storage", cursor.getString(2));
483            cursor.moveToNext();
484            assertEquals("documentId", 2, cursor.getInt(0));
485            assertEquals("storageId", 300, cursor.getInt(1));
486            assertEquals("name", "Device Storage", cursor.getString(2));
487            cursor.close();
488        }
489
490        {
491            final Cursor cursor = database.queryRoots(rootColumns);
492            assertEquals(2, cursor.getCount());
493            cursor.moveToNext();
494            assertEquals("rootId", 1, cursor.getInt(0));
495            assertEquals("availableBytes", 2000, cursor.getInt(1));
496            cursor.moveToNext();
497            assertEquals("rootId", 2, cursor.getInt(0));
498            assertEquals("availableBytes", 3000, cursor.getInt(1));
499            cursor.close();
500        }
501    }
502
503    public void testRestoreIdForDifferentParents() throws Exception {
504        final MtpDatabase database = new MtpDatabase(getContext());
505        final String[] columns = new String[] {
506                DocumentsContract.Document.COLUMN_DOCUMENT_ID,
507                MtpDatabaseConstants.COLUMN_OBJECT_HANDLE
508        };
509
510        database.startAddingChildDocuments("parentId1");
511        database.startAddingChildDocuments("parentId2");
512        database.putChildDocuments(0, "parentId1", new MtpObjectInfo[] {
513                createDocument(100, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
514        });
515        database.putChildDocuments(0, "parentId2", new MtpObjectInfo[] {
516                createDocument(101, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
517        });
518        database.clearMapping();
519
520        database.startAddingChildDocuments("parentId1");
521        database.startAddingChildDocuments("parentId2");
522        database.putChildDocuments(0, "parentId1", new MtpObjectInfo[] {
523                createDocument(200, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
524        });
525        database.putChildDocuments(0, "parentId2", new MtpObjectInfo[] {
526                createDocument(201, "note.txt", MtpConstants.FORMAT_TEXT, 1024),
527        });
528        database.stopAddingChildDocuments("parentId1");
529
530        {
531            final Cursor cursor = database.queryChildDocuments(columns, "parentId1");
532            assertEquals(1, cursor.getCount());
533            cursor.moveToNext();
534            assertEquals("documentId", 1, cursor.getInt(0));
535            assertEquals("objectHandle", 200, cursor.getInt(1));
536            cursor.close();
537        }
538        {
539            final Cursor cursor = database.queryChildDocuments(columns, "parentId2");
540            assertEquals(1, cursor.getCount());
541            cursor.moveToNext();
542            assertEquals("documentId", 2, cursor.getInt(0));
543            assertTrue("objectHandle", cursor.isNull(1));
544            cursor.close();
545        }
546    }
547
548    public void testClearMtpIdentifierBeforeResolveRootDocuments() {
549        final MtpDatabase database = new MtpDatabase(getContext());
550        final String[] columns = new String[] {
551                DocumentsContract.Document.COLUMN_DOCUMENT_ID,
552                MtpDatabaseConstants.COLUMN_STORAGE_ID,
553                DocumentsContract.Document.COLUMN_DISPLAY_NAME
554        };
555        final String[] rootColumns = new String[] {
556                Root.COLUMN_ROOT_ID,
557                Root.COLUMN_AVAILABLE_BYTES
558        };
559
560        database.startAddingRootDocuments(0);
561        database.putRootDocuments(0, resources, new MtpRoot[] {
562                new MtpRoot(0, 100, "Device", "Storage", 0, 0, ""),
563        });
564        database.clearMapping();
565
566        database.startAddingRootDocuments(0);
567        database.putRootDocuments(0, resources, new MtpRoot[] {
568                new MtpRoot(0, 200, "Device", "Storage", 2000, 0, ""),
569        });
570        database.clearMapping();
571
572        database.startAddingRootDocuments(0);
573        database.putRootDocuments(0, resources, new MtpRoot[] {
574                new MtpRoot(0, 300, "Device", "Storage", 3000, 0, ""),
575        });
576        database.stopAddingRootDocuments(0);
577
578        {
579            final Cursor cursor = database.queryRootDocuments(columns);
580            assertEquals(1, cursor.getCount());
581            cursor.moveToNext();
582            assertEquals("documentId", 1, cursor.getInt(0));
583            assertEquals("storageId", 300, cursor.getInt(1));
584            assertEquals("name", "Device Storage", cursor.getString(2));
585            cursor.close();
586        }
587        {
588            final Cursor cursor = database.queryRoots(rootColumns);
589            assertEquals(1, cursor.getCount());
590            cursor.moveToNext();
591            assertEquals("rootId", 1, cursor.getInt(0));
592            assertEquals("availableBytes", 3000, cursor.getInt(1));
593            cursor.close();
594        }
595    }
596
597    public void testPutSameNameRootsAfterClearing() throws Exception {
598        final MtpDatabase database = new MtpDatabase(getContext());
599        final String[] columns = new String[] {
600                DocumentsContract.Document.COLUMN_DOCUMENT_ID,
601                MtpDatabaseConstants.COLUMN_STORAGE_ID,
602                DocumentsContract.Document.COLUMN_DISPLAY_NAME
603        };
604        final String[] rootColumns = new String[] {
605                Root.COLUMN_ROOT_ID,
606                Root.COLUMN_AVAILABLE_BYTES
607        };
608
609        database.startAddingRootDocuments(0);
610        database.putRootDocuments(0, resources, new MtpRoot[] {
611                new MtpRoot(0, 100, "Device", "Storage", 0, 0, ""),
612        });
613        database.clearMapping();
614
615        database.startAddingRootDocuments(0);
616        database.putRootDocuments(0, resources, new MtpRoot[] {
617                new MtpRoot(0, 200, "Device", "Storage", 2000, 0, ""),
618                new MtpRoot(0, 201, "Device", "Storage", 2001, 0, ""),
619        });
620        database.stopAddingRootDocuments(0);
621
622        {
623            final Cursor cursor = database.queryRootDocuments(columns);
624            assertEquals(2, cursor.getCount());
625            cursor.moveToNext();
626            assertEquals("documentId", 2, cursor.getInt(0));
627            assertEquals("storageId", 200, cursor.getInt(1));
628            assertEquals("name", "Device Storage", cursor.getString(2));
629            cursor.moveToNext();
630            assertEquals("documentId", 3, cursor.getInt(0));
631            assertEquals("storageId", 201, cursor.getInt(1));
632            assertEquals("name", "Device Storage", cursor.getString(2));
633            cursor.close();
634        }
635        {
636            final Cursor cursor = database.queryRoots(rootColumns);
637            assertEquals(2, cursor.getCount());
638            cursor.moveToNext();
639            assertEquals("rootId", 2, cursor.getInt(0));
640            assertEquals("availableBytes", 2000, cursor.getInt(1));
641            cursor.moveToNext();
642            assertEquals("rootId", 3, cursor.getInt(0));
643            assertEquals("availableBytes", 2001, cursor.getInt(1));
644            cursor.close();
645        }
646    }
647
648    public void testReplaceExistingRoots() {
649        // The client code should be able to replace exisitng rows with new information.
650        final MtpDatabase database = new MtpDatabase(getContext());
651        // Add one.
652        database.startAddingRootDocuments(0);
653        database.putRootDocuments(0, resources, new MtpRoot[] {
654                new MtpRoot(0, 100, "Device", "Storage A", 0, 0, ""),
655        });
656        database.stopAddingRootDocuments(0);
657        // Replace it.
658        database.startAddingRootDocuments(0);
659        database.putRootDocuments(0, resources, new MtpRoot[] {
660                new MtpRoot(0, 100, "Device", "Storage B", 1000, 1000, ""),
661        });
662        database.stopAddingRootDocuments(0);
663        {
664            final String[] columns = new String[] {
665                    DocumentsContract.Document.COLUMN_DOCUMENT_ID,
666                    MtpDatabaseConstants.COLUMN_STORAGE_ID,
667                    DocumentsContract.Document.COLUMN_DISPLAY_NAME
668            };
669            final Cursor cursor = database.queryRootDocuments(columns);
670            assertEquals(1, cursor.getCount());
671            cursor.moveToNext();
672            assertEquals("documentId", 1, cursor.getInt(0));
673            assertEquals("storageId", 100, cursor.getInt(1));
674            assertEquals("name", "Device Storage B", cursor.getString(2));
675            cursor.close();
676        }
677        {
678            final String[] columns = new String[] {
679                    Root.COLUMN_ROOT_ID,
680                    Root.COLUMN_AVAILABLE_BYTES
681            };
682            final Cursor cursor = database.queryRoots(columns);
683            assertEquals(1, cursor.getCount());
684            cursor.moveToNext();
685            assertEquals("rootId", 1, cursor.getInt(0));
686            assertEquals("availableBytes", 1000, cursor.getInt(1));
687            cursor.close();
688        }
689    }
690
691    public void _testFailToReplaceExisitingUnmappedRoots() {
692        // The client code should not be able to replace rows before resolving 'unmapped' rows.
693        final MtpDatabase database = new MtpDatabase(getContext());
694        // Add one.
695        database.startAddingRootDocuments(0);
696        database.putRootDocuments(0, resources, new MtpRoot[] {
697                new MtpRoot(0, 100, "Device", "Storage A", 0, 0, ""),
698        });
699        database.clearMapping();
700        // Add one.
701        database.putRootDocuments(0, resources, new MtpRoot[] {
702                new MtpRoot(0, 100, "Device", "Storage B", 1000, 1000, ""),
703        });
704        // Add one more before resolving unmapped documents.
705        try {
706            database.putRootDocuments(0, resources, new MtpRoot[] {
707                    new MtpRoot(0, 100, "Device", "Storage B", 1000, 1000, ""),
708            });
709            fail();
710        } catch (Throwable e) {
711            assertTrue(e instanceof Error);
712        }
713    }
714}
715