1 package com.android.providers.tv; 2 3 import android.content.pm.ProviderInfo; 4 import android.database.Cursor; 5 import android.media.tv.TvContract; 6 import android.media.tv.TvContract.Programs; 7 import android.os.Bundle; 8 import android.provider.Settings; 9 import android.test.AndroidTestCase; 10 import android.test.mock.MockContentProvider; 11 import android.test.mock.MockContentResolver; 12 import com.android.providers.tv.Utils.Program; 13 import java.util.Arrays; 14 15 import com.google.android.collect.Sets; 16 17 public class UnrecognizedColumnsTest extends AndroidTestCase { 18 private static final String PERMISSION_ACCESS_ALL_EPG_DATA = 19 "com.android.providers.tv.permission.ACCESS_ALL_EPG_DATA"; 20 private static final String PERMISSION_READ_TV_LISTINGS = "android.permission.READ_TV_LISTINGS"; 21 22 private static final String MY_PACKAGE = "example.my"; 23 private static final String ANOTHER_PACKAGE = "example.another"; 24 25 private MockContentResolver mResolver; 26 private TvProviderForTesting mProvider; 27 private MockTvProviderContext mContext; 28 private Program mProgram; 29 30 @Override setUp()31 protected void setUp() throws Exception { 32 super.setUp(); 33 34 mResolver = new MockContentResolver(); 35 mResolver.addProvider(Settings.AUTHORITY, new MockContentProvider() { 36 @Override 37 public Bundle call(String method, String request, Bundle args) { 38 return new Bundle(); 39 } 40 }); 41 42 mProvider = new TvProviderForTesting(); 43 mResolver.addProvider(TvContract.AUTHORITY, mProvider); 44 45 mContext = new MockTvProviderContext(mResolver, getContext()); 46 // get data of the calling package only 47 mContext.grantOrRejectPermission(PERMISSION_ACCESS_ALL_EPG_DATA, false); 48 mContext.grantOrRejectPermission(PERMISSION_READ_TV_LISTINGS, false); 49 50 setContext(mContext); 51 52 final ProviderInfo info = new ProviderInfo(); 53 info.authority = TvContract.AUTHORITY; 54 mProvider.attachInfoForTesting(getContext(), info); 55 } 56 57 58 @Override tearDown()59 protected void tearDown() throws Exception { 60 Utils.clearTvProvider(mResolver); 61 mProvider.setOpenHelper(null, true); 62 mProvider.shutdown(); 63 super.tearDown(); 64 } 65 testUnrecognizedColumns()66 public void testUnrecognizedColumns() { 67 insertPrograms(); 68 69 String[] projection = new String[] { 70 TvContract.Programs._ID, 71 "_random_name", 72 " with spaces ", 73 "\' in single quotes \'", 74 "\" in double quotes \"", 75 "quotes \' inside \' this \" name \"", 76 }; 77 78 Cursor cursor = 79 mResolver.query(TvContract.Programs.CONTENT_URI, projection, null, null, null); 80 assertNotNull(cursor); 81 cursor.moveToNext(); 82 assertEquals(1, cursor.getCount()); 83 84 assertEquals( 85 "Column names don't match.", 86 Arrays.asList( 87 Programs._ID, 88 "_random_name", 89 " with spaces ", 90 "\' in single quotes \'", 91 "\" in double quotes \"", 92 "quotes \' inside \' this \" name \""), 93 Arrays.asList(cursor.getColumnNames())); 94 95 assertEquals(mProgram.id, cursor.getLong(0)); 96 assertNull(cursor.getString(1)); 97 assertNull(cursor.getString(2)); 98 assertNull(cursor.getString(3)); 99 assertNull(cursor.getString(4)); 100 assertNull(cursor.getString(5)); 101 } 102 insertPrograms()103 private void insertPrograms() { 104 mProvider.callingPackage = MY_PACKAGE; 105 long myChannelId = Utils.insertChannel(mResolver); 106 mProgram = new Program(1, MY_PACKAGE); 107 Utils.insertPrograms(mResolver, myChannelId, mProgram); 108 109 mProvider.callingPackage = ANOTHER_PACKAGE; 110 long anotherChannelId = Utils.insertChannel(mResolver); 111 Program anotherProgram = new Program(2, ANOTHER_PACKAGE); 112 Utils.insertPrograms(mResolver, anotherChannelId, anotherProgram); 113 114 mProvider.callingPackage = MY_PACKAGE; 115 } 116 } 117