1 /*
2  * Copyright (C) 2008 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 
17 package com.android.music.tests.functional;
18 
19 import android.app.Activity;
20 import android.content.*;
21 import android.app.Instrumentation;
22 import android.content.Intent;
23 import android.test.ActivityInstrumentationTestCase;
24 import android.test.suitebuilder.annotation.LargeTest;
25 import android.util.Log;
26 import android.view.KeyEvent;
27 import android.net.Uri;
28 import android.os.Environment;
29 import android.provider.MediaStore;
30 import android.content.ContentResolver;
31 import android.content.pm.ActivityInfo;
32 import android.database.Cursor;
33 import android.content.Intent;
34 import android.content.BroadcastReceiver;
35 import android.content.IntentFilter;
36 
37 import com.android.music.CreatePlaylist;
38 import com.android.music.TrackBrowserActivity;
39 import com.android.music.MusicUtils;
40 
41 import com.android.music.tests.MusicPlayerNames;
42 
43 import java.io.*;
44 
45 /**
46  * Junit / Instrumentation test case for the TrackBrowserActivity
47 
48  */
49 public class TestSongs extends ActivityInstrumentationTestCase <TrackBrowserActivity>{
50     private static String TAG = "musicplayertests";
51 
TestSongs()52     public TestSongs() {
53         super("com.android.music",TrackBrowserActivity.class);
54     }
55 
56     @Override
setUp()57     protected void setUp() throws Exception {
58         super.setUp();
59     }
60 
61     @Override
tearDown()62     protected void tearDown() throws Exception {
63         super.tearDown();
64     }
65 
66     /**
67      * Add 10 new playlists with unsorted title order
68      */
addNewPlaylist()69     public void addNewPlaylist() throws Exception{
70       Instrumentation inst = getInstrumentation();
71       for (int i=0; i< MusicPlayerNames.NO_OF_PLAYLIST; i++){
72         inst.invokeContextMenuAction(getActivity(), MusicUtils.Defs.NEW_PLAYLIST, 0);
73         Thread.sleep(MusicPlayerNames.WAIT_SHORT_TIME);
74         //Remove the default playlist name
75         for (int j=0; j< MusicPlayerNames.DEFAULT_PLAYLIST_LENGTH; j++)
76           inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DEL);
77         inst.sendStringSync(MusicPlayerNames.unsortedPlaylistTitle[i]);
78         inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
79         inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
80         Thread.sleep(MusicPlayerNames.WAIT_LONG_TIME);
81         inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
82         Thread.sleep(MusicPlayerNames.WAIT_LONG_TIME);
83       }
84     }
85 
copy(File src, File dst)86     private void copy(File src, File dst) throws IOException {
87         InputStream in = new FileInputStream(src);
88         OutputStream out = new FileOutputStream(dst);
89 
90         // Transfer bytes from in to out
91         byte[] buf = new byte[1024];
92         int len;
93         while ((len = in.read(buf)) > 0) {
94             out.write(buf, 0, len);
95         }
96         in.close();
97         out.close();
98         Log.v(TAG, "Copy file");
99       }
100 
101       //Rescan the sdcard after copy the file
rescanSdcard()102       private void rescanSdcard() throws Exception{
103         Intent scanIntent = new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
104              + Environment.getExternalStorageDirectory()));
105         Log.v(TAG,"start the intent");
106         IntentFilter intentFilter = new IntentFilter(Intent.ACTION_MEDIA_SCANNER_STARTED);
107         intentFilter.addDataScheme("file");
108         getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
109             + Environment.getExternalStorageDirectory())));
110           Thread.sleep(MusicPlayerNames.WAIT_VERY_LONG_TIME);
111       }
112 
113 
114     /**
115      * Test case 1: tests the new playlist added with sorted order.
116      * Verification: The new playlist title should be sorted in alphabetical order
117      */
118     @LargeTest
testAddPlaylist()119     public void testAddPlaylist() throws Exception{
120       Cursor mCursor;
121       addNewPlaylist();
122 
123       //Verify the new playlist is created, check the playlist table
124       String[] cols = new String[] {
125           MediaStore.Audio.Playlists.NAME
126       };
127       ContentResolver resolver = getActivity().getContentResolver();
128       if (resolver == null) {
129         System.out.println("resolver = null");
130       } else {
131         String whereclause = MediaStore.Audio.Playlists.NAME + " != ''";
132         mCursor = resolver.query(MediaStore.Audio.Playlists.EXTERNAL_CONTENT_URI,
133           cols, whereclause, null,
134           MediaStore.Audio.Playlists.NAME);
135         //Check the new playlist
136         mCursor.moveToFirst();
137 
138         for (int j=0;j<10;j++){
139           assertEquals("New sorted Playlist title:", MusicPlayerNames.expectedPlaylistTitle[j], mCursor.getString(0));
140           mCursor.moveToNext();
141         }
142       }
143     }
144 
145     /**
146      * Test case 2: Set a song as ringtone
147      * Test case precondition: The testing device should wipe data before
148      * run the test case.
149      * Verification: The count of audio.media.is_ringtone equal to 1.
150      */
151     @LargeTest
testSetRingtone()152     public void testSetRingtone() throws Exception{
153       Cursor mCursor;
154       Instrumentation inst = getInstrumentation();
155       inst.invokeContextMenuAction(getActivity(), MusicUtils.Defs.USE_AS_RINGTONE, 0);
156       //This only check if there only 1 ringtone set in music player
157       ContentResolver resolver = getActivity().getContentResolver();
158       if (resolver == null) {
159         System.out.println("resolver = null");
160       } else {
161         String whereclause = MediaStore.Audio.Media.IS_RINGTONE + " = 1";
162         mCursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
163            null, whereclause, null, null);
164         //Check the new playlist
165         mCursor.moveToFirst();
166         int isRingtoneSet = mCursor.getCount();
167         assertEquals(TAG, MusicPlayerNames.EXPECTED_NO_RINGTONE, isRingtoneSet);
168       }
169     }
170 
171     /**
172      * Test case 3: Delete a song
173      * Test case precondition: Copy a song and rescan the sdcard
174      * Verification: The song is deleted from the sdcard and mediastore
175      */
176     @LargeTest
testDeleteSong()177     public void testDeleteSong() throws Exception{
178       Instrumentation inst = getInstrumentation();
179       Cursor mCursor;
180 
181       //Copy a song from the golden directory
182       Log.v(TAG, "Copy a temp file to the sdcard");
183       File goldenfile = new File(MusicPlayerNames.GOLDENSONG);
184       File toBeDeleteSong = new File(MusicPlayerNames.DELETESONG);
185       copy(goldenfile, toBeDeleteSong);
186       rescanSdcard();
187 
188       //Delete the file from music player
189       Thread.sleep(MusicPlayerNames.WAIT_LONG_TIME);
190       inst.sendStringSync(MusicPlayerNames.TOBEDELETESONGNAME);
191       Thread.sleep(MusicPlayerNames.WAIT_LONG_TIME);
192       inst.invokeContextMenuAction(getActivity(), MusicUtils.Defs.DELETE_ITEM, 0);
193       inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_DOWN);
194       inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DPAD_CENTER);
195       Thread.sleep(MusicPlayerNames.WAIT_LONG_TIME);
196 
197       //Clear the search string
198       for (int j=0; j< MusicPlayerNames.TOBEDELETESONGNAME.length(); j++)
199           inst.sendKeyDownUpSync(KeyEvent.KEYCODE_DEL);
200 
201       //Verfiy the item is removed from sdcard
202       File checkDeletedFile = new File(MusicPlayerNames.DELETESONG);
203       assertFalse(TAG, checkDeletedFile.exists());
204 
205       ContentResolver resolver = getActivity().getContentResolver();
206       if (resolver == null) {
207         System.out.println("resolver = null");
208       } else {
209         String whereclause = MediaStore.Audio.Media.DISPLAY_NAME + " = '" +
210         MusicPlayerNames.TOBEDELETESONGNAME + "'";
211         mCursor = resolver.query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
212            null, whereclause, null, null);
213         boolean isEmptyCursor = mCursor.moveToFirst();
214         assertFalse(TAG,isEmptyCursor);
215       }
216     }
217 }
218 
219