Home | History | Annotate | Download | only in tv
      1 /*
      2  * Copyright (C) 2017 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.providers.tv;
     18 
     19 import android.content.Context;
     20 import android.content.pm.ProviderInfo;
     21 import android.database.Cursor;
     22 import android.database.sqlite.SQLiteDatabase;
     23 import android.media.tv.TvContract;
     24 import android.os.Bundle;
     25 import android.provider.Settings;
     26 import android.test.AndroidTestCase;
     27 import android.test.mock.MockContentProvider;
     28 import android.test.mock.MockContentResolver;
     29 
     30 public class DatabaseHelperTest extends AndroidTestCase {
     31     private static final int BASE_DATABASE_VERSION = 23;
     32 
     33     private DatabaseHelperForTesting mDatabaseHelper;
     34     private MockContentResolver mResolver;
     35     private TvProviderForTesting mProvider;
     36 
     37     @Override
     38     protected void setUp() throws Exception {
     39         super.setUp();
     40         mResolver = new MockContentResolver();
     41         mResolver.addProvider(Settings.AUTHORITY, new MockContentProvider() {
     42             @Override
     43             public Bundle call(String method, String request, Bundle args) {
     44                 return new Bundle();
     45             }
     46         });
     47 
     48         mProvider = new TvProviderForTesting();
     49         mResolver.addProvider(TvContract.AUTHORITY, mProvider);
     50 
     51         setContext(new MockTvProviderContext(mResolver, getContext()));
     52 
     53         final ProviderInfo info = new ProviderInfo();
     54         info.authority = TvContract.AUTHORITY;
     55         mProvider.attachInfoForTesting(getContext(), info);
     56         mDatabaseHelper = new DatabaseHelperForTesting(getContext(), BASE_DATABASE_VERSION);
     57         mProvider.setOpenHelper(mDatabaseHelper);
     58     }
     59 
     60     @Override
     61     protected void tearDown() throws Exception {
     62         mProvider.shutdown();
     63         super.tearDown();
     64     }
     65 
     66     public void testUpgradeDatabase() {
     67         SQLiteDatabase db = mDatabaseHelper.getReadableDatabase();
     68         assertEquals(BASE_DATABASE_VERSION, db.getVersion());
     69         mDatabaseHelper.close();
     70 
     71         mProvider.setOpenHelper(
     72                 new DatabaseHelperForTesting(getContext(), TvProvider.DATABASE_VERSION));
     73 
     74         try (Cursor cursor = mResolver.query(
     75                 TvContract.Channels.CONTENT_URI, null, null, null, null)) {
     76             assertNotNull(cursor);
     77         }
     78         try (Cursor cursor = mResolver.query(
     79                 TvContract.Programs.CONTENT_URI, null, null, null, null)) {
     80             assertNotNull(cursor);
     81         }
     82         try (Cursor cursor = mResolver.query(
     83                 TvContract.WatchedPrograms.CONTENT_URI, null, null, null, null)) {
     84             assertNotNull(cursor);
     85         }
     86         try (Cursor cursor = mResolver.query(
     87                 TvContract.RecordedPrograms.CONTENT_URI, null, null, null, null)) {
     88             assertNotNull(cursor);
     89         }
     90         try (Cursor cursor = mResolver.query(
     91                 TvContract.PreviewPrograms.CONTENT_URI, null, null, null, null)) {
     92             assertNotNull(cursor);
     93         }
     94         try (Cursor cursor = mResolver.query(
     95                 TvContract.WatchNextPrograms.CONTENT_URI, null, null, null, null)) {
     96             assertNotNull(cursor);
     97         }
     98     }
     99 
    100     private static class DatabaseHelperForTesting extends TvProvider.DatabaseHelper {
    101         private static final String DATABASE_NAME ="tvtest.db";
    102 
    103         private DatabaseHelperForTesting(Context context, int version) {
    104             super(context, DATABASE_NAME, version);
    105         }
    106 
    107         @Override
    108         public void onCreate(SQLiteDatabase db) {
    109             // Set up the database schema for version 23.
    110             db.execSQL("CREATE TABLE " + TvProvider.CHANNELS_TABLE + " ("
    111                     + TvContract.Channels._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
    112                     + TvContract.Channels.COLUMN_PACKAGE_NAME + " TEXT NOT NULL,"
    113                     + TvContract.Channels.COLUMN_INPUT_ID + " TEXT NOT NULL,"
    114                     + TvContract.Channels.COLUMN_TYPE + " TEXT NOT NULL DEFAULT '" + TvContract
    115                     .Channels.TYPE_OTHER + "',"
    116                     + TvContract.Channels.COLUMN_SERVICE_TYPE + " TEXT NOT NULL DEFAULT '"
    117                     + TvContract.Channels.SERVICE_TYPE_AUDIO_VIDEO + "',"
    118                     + TvContract.Channels.COLUMN_ORIGINAL_NETWORK_ID
    119                     + " INTEGER NOT NULL DEFAULT 0,"
    120                     + TvContract.Channels.COLUMN_TRANSPORT_STREAM_ID
    121                     + " INTEGER NOT NULL DEFAULT 0,"
    122                     + TvContract.Channels.COLUMN_SERVICE_ID + " INTEGER NOT NULL DEFAULT 0,"
    123                     + TvContract.Channels.COLUMN_DISPLAY_NUMBER + " TEXT,"
    124                     + TvContract.Channels.COLUMN_DISPLAY_NAME + " TEXT,"
    125                     + TvContract.Channels.COLUMN_NETWORK_AFFILIATION + " TEXT,"
    126                     + TvContract.Channels.COLUMN_DESCRIPTION + " TEXT,"
    127                     + TvContract.Channels.COLUMN_VIDEO_FORMAT + " TEXT,"
    128                     + TvContract.Channels.COLUMN_BROWSABLE + " INTEGER NOT NULL DEFAULT 0,"
    129                     + TvContract.Channels.COLUMN_SEARCHABLE + " INTEGER NOT NULL DEFAULT 1,"
    130                     + TvContract.Channels.COLUMN_LOCKED + " INTEGER NOT NULL DEFAULT 0,"
    131                     + TvContract.Channels.COLUMN_INTERNAL_PROVIDER_DATA + " BLOB,"
    132                     + TvProvider.CHANNELS_COLUMN_LOGO + " BLOB,"
    133                     + TvContract.Channels.COLUMN_VERSION_NUMBER + " INTEGER,"
    134                     // Needed for foreign keys in other tables.
    135                     + "UNIQUE(" + TvContract.Channels._ID + ","
    136                     + TvContract.Channels.COLUMN_PACKAGE_NAME + ")"
    137                     + ");");
    138             db.execSQL("CREATE TABLE " + TvProvider.PROGRAMS_TABLE + " ("
    139                     + TvContract.Programs._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
    140                     + TvContract.Programs.COLUMN_PACKAGE_NAME + " TEXT NOT NULL,"
    141                     + TvContract.Programs.COLUMN_CHANNEL_ID + " INTEGER,"
    142                     + TvContract.Programs.COLUMN_TITLE + " TEXT,"
    143                     + TvContract.Programs.COLUMN_SEASON_NUMBER + " TEXT,"
    144                     + TvContract.Programs.COLUMN_EPISODE_NUMBER + " TEXT,"
    145                     + TvContract.Programs.COLUMN_EPISODE_TITLE + " TEXT,"
    146                     + TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS + " INTEGER,"
    147                     + TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS + " INTEGER,"
    148                     + TvContract.Programs.COLUMN_BROADCAST_GENRE + " TEXT,"
    149                     + TvContract.Programs.COLUMN_CANONICAL_GENRE + " TEXT,"
    150                     + TvContract.Programs.COLUMN_SHORT_DESCRIPTION + " TEXT,"
    151                     + TvContract.Programs.COLUMN_LONG_DESCRIPTION + " TEXT,"
    152                     + TvContract.Programs.COLUMN_VIDEO_WIDTH + " INTEGER,"
    153                     + TvContract.Programs.COLUMN_VIDEO_HEIGHT + " INTEGER,"
    154                     + TvContract.Programs.COLUMN_AUDIO_LANGUAGE + " TEXT,"
    155                     + TvContract.Programs.COLUMN_CONTENT_RATING + " TEXT,"
    156                     + TvContract.Programs.COLUMN_POSTER_ART_URI + " TEXT,"
    157                     + TvContract.Programs.COLUMN_THUMBNAIL_URI + " TEXT,"
    158                     + TvContract.Programs.COLUMN_INTERNAL_PROVIDER_DATA + " BLOB,"
    159                     + TvContract.Programs.COLUMN_VERSION_NUMBER + " INTEGER,"
    160                     + "FOREIGN KEY("
    161                     + TvContract.Programs.COLUMN_CHANNEL_ID + ","
    162                     + TvContract.Programs.COLUMN_PACKAGE_NAME
    163                     + ") REFERENCES " + TvProvider.CHANNELS_TABLE + "("
    164                     + TvContract.Channels._ID + "," + TvContract.Channels.COLUMN_PACKAGE_NAME
    165                     + ") ON UPDATE CASCADE ON DELETE CASCADE"
    166                     + ");");
    167             db.execSQL("CREATE INDEX " + TvProvider.PROGRAMS_TABLE_PACKAGE_NAME_INDEX + " ON "
    168                     + TvProvider.PROGRAMS_TABLE
    169                     + "(" + TvContract.Programs.COLUMN_PACKAGE_NAME + ");");
    170             db.execSQL("CREATE INDEX " + TvProvider.PROGRAMS_TABLE_CHANNEL_ID_INDEX + " ON "
    171                     + TvProvider.PROGRAMS_TABLE
    172                     + "(" + TvContract.Programs.COLUMN_CHANNEL_ID + ");");
    173             db.execSQL("CREATE INDEX " + TvProvider.PROGRAMS_TABLE_START_TIME_INDEX + " ON "
    174                     + TvProvider.PROGRAMS_TABLE
    175                     + "(" + TvContract.Programs.COLUMN_START_TIME_UTC_MILLIS + ");");
    176             db.execSQL("CREATE INDEX " + TvProvider.PROGRAMS_TABLE_END_TIME_INDEX + " ON "
    177                     + TvProvider.PROGRAMS_TABLE
    178                     + "(" + TvContract.Programs.COLUMN_END_TIME_UTC_MILLIS + ");");
    179             db.execSQL("CREATE TABLE " + TvProvider.WATCHED_PROGRAMS_TABLE + " ("
    180                     + TvContract.WatchedPrograms._ID + " INTEGER PRIMARY KEY AUTOINCREMENT,"
    181                     + TvContract.WatchedPrograms.COLUMN_PACKAGE_NAME + " TEXT NOT NULL,"
    182                     + TvContract.WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS
    183                     + " INTEGER NOT NULL DEFAULT 0,"
    184                     + TvContract.WatchedPrograms.COLUMN_WATCH_END_TIME_UTC_MILLIS
    185                     + " INTEGER NOT NULL DEFAULT 0,"
    186                     + TvContract.WatchedPrograms.COLUMN_CHANNEL_ID + " INTEGER,"
    187                     + TvContract.WatchedPrograms.COLUMN_TITLE + " TEXT,"
    188                     + TvContract.WatchedPrograms.COLUMN_START_TIME_UTC_MILLIS + " INTEGER,"
    189                     + TvContract.WatchedPrograms.COLUMN_END_TIME_UTC_MILLIS + " INTEGER,"
    190                     + TvContract.WatchedPrograms.COLUMN_DESCRIPTION + " TEXT,"
    191                     + TvContract.WatchedPrograms.COLUMN_INTERNAL_TUNE_PARAMS + " TEXT,"
    192                     + TvContract.WatchedPrograms.COLUMN_INTERNAL_SESSION_TOKEN + " TEXT NOT NULL,"
    193                     + TvProvider.WATCHED_PROGRAMS_COLUMN_CONSOLIDATED
    194                     + " INTEGER NOT NULL DEFAULT 0,"
    195                     + "FOREIGN KEY("
    196                     + TvContract.WatchedPrograms.COLUMN_CHANNEL_ID + ","
    197                     + TvContract.WatchedPrograms.COLUMN_PACKAGE_NAME
    198                     + ") REFERENCES " + TvProvider.CHANNELS_TABLE + "("
    199                     + TvContract.Channels._ID + "," + TvContract.Channels.COLUMN_PACKAGE_NAME
    200                     + ") ON UPDATE CASCADE ON DELETE CASCADE"
    201                     + ");");
    202             db.execSQL("CREATE INDEX " + TvProvider.WATCHED_PROGRAMS_TABLE_CHANNEL_ID_INDEX + " ON "
    203                     + TvProvider.WATCHED_PROGRAMS_TABLE
    204                     + "(" + TvContract.WatchedPrograms.COLUMN_CHANNEL_ID + ");");
    205         }
    206 
    207         @Override
    208         public void onDowngrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    209             assertEquals(BASE_DATABASE_VERSION, newVersion);
    210             db.execSQL("DROP TABLE IF EXISTS " + TvProvider.WATCH_NEXT_PROGRAMS_TABLE);
    211             db.execSQL("DROP TABLE IF EXISTS " + TvProvider.PREVIEW_PROGRAMS_TABLE);
    212             db.execSQL("DROP TABLE IF EXISTS " + TvProvider.RECORDED_PROGRAMS_TABLE);
    213             db.execSQL("DROP TABLE IF EXISTS " + TvProvider.WATCHED_PROGRAMS_TABLE);
    214             db.execSQL("DROP TABLE IF EXISTS " + TvProvider.PROGRAMS_TABLE);
    215             db.execSQL("DROP TABLE IF EXISTS " + TvProvider.CHANNELS_TABLE);
    216             onCreate(db);
    217         }
    218     }
    219 }
    220