1/*
2 * Copyright (C) 2011 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.mediaframeworktest.unit;
18
19import android.content.ContentValues;
20import android.content.IContentProvider;
21import android.media.MediaInserter;
22import android.net.Uri;
23import android.provider.MediaStore.Audio;
24import android.provider.MediaStore.Files;
25import android.provider.MediaStore.Images;
26import android.provider.MediaStore.Video;
27import android.test.InstrumentationTestCase;
28import android.test.suitebuilder.annotation.SmallTest;
29
30import dalvik.annotation.TestTargetClass;
31
32import org.easymock.EasyMock;
33import org.easymock.IArgumentMatcher;
34
35@TestTargetClass(MediaInserter.class)
36public class MediaInserterTest extends InstrumentationTestCase {
37
38    private MediaInserter mMediaInserter;
39    private static final int TEST_BUFFER_SIZE = 10;
40    private IContentProvider mMockProvider;
41
42    private int mFilesCounter;
43    private int mAudioCounter;
44    private int mVideoCounter;
45    private int mImagesCounter;
46
47    private static final String sVolumeName = "external";
48    private static final Uri sAudioUri = Audio.Media.getContentUri(sVolumeName);
49    private static final Uri sVideoUri = Video.Media.getContentUri(sVolumeName);
50    private static final Uri sImagesUri = Images.Media.getContentUri(sVolumeName);
51    private static final Uri sFilesUri = Files.getContentUri(sVolumeName);
52
53    private static class MediaUriMatcher implements IArgumentMatcher {
54        private Uri mUri;
55
56        private MediaUriMatcher(Uri uri) {
57            mUri = uri;
58        }
59
60        @Override
61        public boolean matches(Object argument) {
62            if (!(argument instanceof Uri)) {
63                return false;
64            }
65
66            Uri actualUri = (Uri) argument;
67            if (actualUri == mUri) return true;
68            return false;
69        }
70
71        @Override
72        public void appendTo(StringBuffer buffer) {
73            buffer.append("expected a TableUri '").append(mUri).append("'");
74        }
75
76        private static Uri expectMediaUri(Uri in) {
77            EasyMock.reportMatcher(new MediaUriMatcher(in));
78            return null;
79        }
80    }
81
82    @Override
83    protected void setUp() throws Exception {
84        super.setUp();
85        mMockProvider = EasyMock.createMock(IContentProvider.class);
86        mMediaInserter = new MediaInserter(mMockProvider, TEST_BUFFER_SIZE);
87        mFilesCounter = 0;
88        mAudioCounter = 0;
89        mVideoCounter = 0;
90        mImagesCounter = 0;
91    }
92
93    private ContentValues createFileContent() {
94        ContentValues values = new ContentValues();
95        values.put("_data", "/mnt/sdcard/file" + ++mFilesCounter);
96        return values;
97    }
98
99    private ContentValues createAudioContent() {
100        ContentValues values = new ContentValues();
101        values.put("_data", "/mnt/sdcard/audio" + ++mAudioCounter);
102        return values;
103    }
104
105    private ContentValues createVideoContent() {
106        ContentValues values = new ContentValues();
107        values.put("_data", "/mnt/sdcard/video" + ++mVideoCounter);
108        return values;
109    }
110
111    private ContentValues createImageContent() {
112        ContentValues values = new ContentValues();
113        values.put("_data", "/mnt/sdcard/image" + ++mImagesCounter);
114        return values;
115    }
116
117    private ContentValues createContent(Uri uri) {
118        if (uri == sFilesUri) return createFileContent();
119        else if (uri == sAudioUri) return createAudioContent();
120        else if (uri == sVideoUri) return createVideoContent();
121        else if (uri == sImagesUri) return createImageContent();
122        else throw new IllegalArgumentException("Unknown URL: " + uri.toString());
123    }
124
125    private void fillBuffer(Uri uri, int numberOfFiles) throws Exception {
126        ContentValues values;
127        for (int i = 0; i < numberOfFiles; ++i) {
128            values = createContent(uri);
129            mMediaInserter.insert(uri, values);
130        }
131    }
132
133    @SmallTest
134    public void testInsertContentsLessThanBufferSize() throws Exception {
135        EasyMock.replay(mMockProvider);
136
137        fillBuffer(sFilesUri, TEST_BUFFER_SIZE - 4);
138        fillBuffer(sAudioUri, TEST_BUFFER_SIZE - 3);
139        fillBuffer(sVideoUri, TEST_BUFFER_SIZE - 2);
140        fillBuffer(sImagesUri, TEST_BUFFER_SIZE - 1);
141
142        EasyMock.verify(mMockProvider);
143    }
144
145    @SmallTest
146    public void testInsertContentsEqualToBufferSize() throws Exception {
147        EasyMock.expect(mMockProvider.bulkInsert(
148                (Uri) EasyMock.anyObject(), (ContentValues[]) EasyMock.anyObject())).andReturn(1);
149        EasyMock.expectLastCall().times(4);
150        EasyMock.replay(mMockProvider);
151
152        fillBuffer(sFilesUri, TEST_BUFFER_SIZE);
153        fillBuffer(sAudioUri, TEST_BUFFER_SIZE);
154        fillBuffer(sVideoUri, TEST_BUFFER_SIZE);
155        fillBuffer(sImagesUri, TEST_BUFFER_SIZE);
156
157        EasyMock.verify(mMockProvider);
158    }
159
160    @SmallTest
161    public void testInsertContentsMoreThanBufferSize() throws Exception {
162        EasyMock.expect(mMockProvider.bulkInsert(
163                (Uri) EasyMock.anyObject(), (ContentValues[]) EasyMock.anyObject())).andReturn(1);
164        EasyMock.expectLastCall().times(4);
165        EasyMock.replay(mMockProvider);
166
167        fillBuffer(sFilesUri, TEST_BUFFER_SIZE + 1);
168        fillBuffer(sAudioUri, TEST_BUFFER_SIZE + 2);
169        fillBuffer(sVideoUri, TEST_BUFFER_SIZE + 3);
170        fillBuffer(sImagesUri, TEST_BUFFER_SIZE + 4);
171
172        EasyMock.verify(mMockProvider);
173    }
174
175    @SmallTest
176    public void testFlushAllWithEmptyContents() throws Exception {
177        EasyMock.replay(mMockProvider);
178
179        mMediaInserter.flushAll();
180
181        EasyMock.verify(mMockProvider);
182    }
183
184    @SmallTest
185    public void testFlushAllWithSomeContents() throws Exception {
186        EasyMock.expect(mMockProvider.bulkInsert(
187                (Uri) EasyMock.anyObject(), (ContentValues[]) EasyMock.anyObject())).andReturn(1);
188        EasyMock.expectLastCall().times(4);
189        EasyMock.replay(mMockProvider);
190
191        fillBuffer(sFilesUri, TEST_BUFFER_SIZE - 4);
192        fillBuffer(sAudioUri, TEST_BUFFER_SIZE - 3);
193        fillBuffer(sVideoUri, TEST_BUFFER_SIZE - 2);
194        fillBuffer(sImagesUri, TEST_BUFFER_SIZE - 1);
195        mMediaInserter.flushAll();
196
197        EasyMock.verify(mMockProvider);
198    }
199
200    @SmallTest
201    public void testInsertContentsAfterFlushAll() throws Exception {
202        EasyMock.expect(mMockProvider.bulkInsert(
203                (Uri) EasyMock.anyObject(), (ContentValues[]) EasyMock.anyObject())).andReturn(1);
204        EasyMock.expectLastCall().times(8);
205        EasyMock.replay(mMockProvider);
206
207        fillBuffer(sFilesUri, TEST_BUFFER_SIZE - 4);
208        fillBuffer(sAudioUri, TEST_BUFFER_SIZE - 3);
209        fillBuffer(sVideoUri, TEST_BUFFER_SIZE - 2);
210        fillBuffer(sImagesUri, TEST_BUFFER_SIZE - 1);
211        mMediaInserter.flushAll();
212
213        fillBuffer(sFilesUri, TEST_BUFFER_SIZE + 1);
214        fillBuffer(sAudioUri, TEST_BUFFER_SIZE + 2);
215        fillBuffer(sVideoUri, TEST_BUFFER_SIZE + 3);
216        fillBuffer(sImagesUri, TEST_BUFFER_SIZE + 4);
217
218        EasyMock.verify(mMockProvider);
219    }
220
221    @SmallTest
222    public void testInsertContentsWithDifferentSizePerContentType() throws Exception {
223        EasyMock.expect(mMockProvider.bulkInsert(MediaUriMatcher.expectMediaUri(sFilesUri),
224                (ContentValues[]) EasyMock.anyObject())).andReturn(1);
225        EasyMock.expectLastCall().times(1);
226        EasyMock.expect(mMockProvider.bulkInsert(MediaUriMatcher.expectMediaUri(sAudioUri),
227                (ContentValues[]) EasyMock.anyObject())).andReturn(1);
228        EasyMock.expectLastCall().times(2);
229        EasyMock.expect(mMockProvider.bulkInsert(MediaUriMatcher.expectMediaUri(sVideoUri),
230                (ContentValues[]) EasyMock.anyObject())).andReturn(1);
231        EasyMock.expectLastCall().times(3);
232        EasyMock.expect(mMockProvider.bulkInsert(MediaUriMatcher.expectMediaUri(sImagesUri),
233                (ContentValues[]) EasyMock.anyObject())).andReturn(1);
234        EasyMock.expectLastCall().times(4);
235        EasyMock.replay(mMockProvider);
236
237        for (int i = 0; i < TEST_BUFFER_SIZE; ++i) {
238            fillBuffer(sFilesUri, 1);
239            fillBuffer(sAudioUri, 2);
240            fillBuffer(sVideoUri, 3);
241            fillBuffer(sImagesUri, 4);
242        }
243
244        EasyMock.verify(mMockProvider);
245    }
246}
247