1ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee/*
2ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * Copyright (C) 2014 The Android Open Source Project
3ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee *
4ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * Licensed under the Apache License, Version 2.0 (the "License");
5ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * you may not use this file except in compliance with the License.
6ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * You may obtain a copy of the License at
7ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee *
8ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee *      http://www.apache.org/licenses/LICENSE-2.0
9ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee *
10ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * Unless required by applicable law or agreed to in writing, software
11ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * distributed under the License is distributed on an "AS IS" BASIS,
12ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * See the License for the specific language governing permissions and
14ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee * limitations under the License.
15ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee */
16ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
17ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leepackage com.android.providers.tv;
18ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
19ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport com.google.android.collect.Sets;
20ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
21ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.content.ContentUris;
22ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.content.ContentValues;
23ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.content.Intent;
24fb7edc337587faafccd9e3f262187e7632c3a6a0Jae Seoimport android.content.pm.ProviderInfo;
25ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.database.Cursor;
26ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.media.tv.TvContract;
27ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.media.tv.TvContract.Channels;
28ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.media.tv.TvContract.Programs;
29ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.media.tv.TvContract.WatchedPrograms;
30ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.net.Uri;
31ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.os.Bundle;
32ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.os.SystemClock;
33ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.provider.Settings;
34291cd14f062ea27fd3018ded7485ca6bbbcd6517Dongwon Kangimport android.test.suitebuilder.annotation.Suppress;
35ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.test.mock.MockContentProvider;
36ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport android.test.mock.MockContentResolver;
37291cd14f062ea27fd3018ded7485ca6bbbcd6517Dongwon Kangimport android.test.ServiceTestCase;
38ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
39ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport java.util.ArrayList;
40ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport java.util.Arrays;
41ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport java.util.Collection;
42ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport java.util.HashSet;
43ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport java.util.Objects;
44ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leeimport java.util.Set;
45ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
46ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Leepublic class EpgDataCleanupServiceTests extends ServiceTestCase<EpgDataCleanupService> {
47023be771801a56970689b2cfe4892d04a66e99b9Chulwoo Lee    private static final String FAKE_INPUT_ID = "EpgDataCleanupServiceTests";
48023be771801a56970689b2cfe4892d04a66e99b9Chulwoo Lee
49ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private MockContentResolver mResolver;
509c7110178fd390ed520e83522ecc5b54835e0778Conrad Chen    private TvProviderForTesting mProvider;
51ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
52ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    public EpgDataCleanupServiceTests() {
53ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        super(EpgDataCleanupService.class);
54ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
55ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
56ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    @Override
57ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    protected void setUp() throws Exception {
58ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        super.setUp();
59ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
60ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        mResolver = new MockContentResolver();
61ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        // DateUtils tries to access Settings provider to get date format string.
62ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        mResolver.addProvider(Settings.AUTHORITY, new MockContentProvider() {
63ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            @Override
64ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            public Bundle call(String method, String request, Bundle args) {
65ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                return new Bundle();
66ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            }
67ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        });
68ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
69ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        mProvider = new TvProviderForTesting();
70ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        mResolver.addProvider(TvContract.AUTHORITY, mProvider);
71ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
72ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        setContext(new MockTvProviderContext(mResolver, getSystemContext()));
73fb7edc337587faafccd9e3f262187e7632c3a6a0Jae Seo
74fb7edc337587faafccd9e3f262187e7632c3a6a0Jae Seo        final ProviderInfo info = new ProviderInfo();
75fb7edc337587faafccd9e3f262187e7632c3a6a0Jae Seo        info.authority = TvContract.AUTHORITY;
76fb7edc337587faafccd9e3f262187e7632c3a6a0Jae Seo        mProvider.attachInfoForTesting(getContext(), info);
77ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
78ecfa5fd8a9d974f26f36132687b554248ce9657aDongwon Kang        Utils.clearTvProvider(mResolver);
79ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        startService(new Intent(getContext(), EpgDataCleanupService.class));
80ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
81ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
82ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    @Override
83ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    protected void tearDown() throws Exception {
84ecfa5fd8a9d974f26f36132687b554248ce9657aDongwon Kang        Utils.clearTvProvider(mResolver);
85ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        mProvider.shutdown();
86ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        super.tearDown();
87ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
88ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
89ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private static class Program {
90ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        long id;
91ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        final long startTime;
92ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        final long endTime;
93ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
94ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        Program(long startTime, long endTime) {
95ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            this(-1, startTime, endTime);
96ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
97ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
98ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        Program(long id, long startTime, long endTime) {
99ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            this.id = id;
100ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            this.startTime = startTime;
101ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            this.endTime = endTime;
102ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
103ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
104ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        @Override
105ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        public boolean equals(Object obj) {
106ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            if (!(obj instanceof Program)) {
107ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                return false;
108ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            }
109ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            Program that = (Program) obj;
110ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            return Objects.equals(id, that.id)
111ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                    && Objects.equals(startTime, that.startTime)
112ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                    && Objects.equals(endTime, that.endTime);
113ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
114ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
115ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        @Override
116ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        public int hashCode() {
117ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            return Objects.hash(id, startTime, endTime);
118ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
119ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
120ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        @Override
121ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        public String toString() {
122ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            return "Program(id=" + id + ",start=" + startTime + ",end=" + endTime + ")";
123ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
124ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
125ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
126ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private long insertChannel() {
127ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        ContentValues values = new ContentValues();
128023be771801a56970689b2cfe4892d04a66e99b9Chulwoo Lee        values.put(Channels.COLUMN_INPUT_ID, FAKE_INPUT_ID);
129ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        Uri uri = mResolver.insert(Channels.CONTENT_URI, values);
130ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertNotNull(uri);
131ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        return ContentUris.parseId(uri);
132ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
133ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
134ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private void insertPrograms(Program... programs) {
135ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        insertPrograms(Arrays.asList(programs));
136ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
137ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
138ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private void insertPrograms(Collection<Program> programs) {
139ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        long channelId = insertChannel();
140ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
141ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        ContentValues values = new ContentValues();
142ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        values.put(Programs.COLUMN_CHANNEL_ID, channelId);
143ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        for (Program program : programs) {
144ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            values.put(Programs.COLUMN_START_TIME_UTC_MILLIS, program.startTime);
145ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            values.put(Programs.COLUMN_END_TIME_UTC_MILLIS, program.endTime);
146ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            Uri uri = mResolver.insert(Programs.CONTENT_URI, values);
147ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            assertNotNull(uri);
148ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            program.id = ContentUris.parseId(uri);
149ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
150ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
151ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
152ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private Set<Program> queryPrograms() {
153ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        String[] projection = new String[] {
154ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            Programs._ID,
155ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            Programs.COLUMN_START_TIME_UTC_MILLIS,
156ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            Programs.COLUMN_END_TIME_UTC_MILLIS,
157ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        };
158ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
159ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        Cursor cursor = mResolver.query(Programs.CONTENT_URI, projection, null, null, null);
160ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertNotNull(cursor);
161ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        try {
162ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            Set<Program> programs = Sets.newHashSet();
163ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            while (cursor.moveToNext()) {
164ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                programs.add(new Program(cursor.getLong(0), cursor.getLong(1), cursor.getLong(2)));
165ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            }
166ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            return programs;
167ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        } finally {
168ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            cursor.close();
169ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
170ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
171ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
172ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private void insertWatchedPrograms(Program... programs) {
173ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        insertWatchedPrograms(Arrays.asList(programs));
174ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
175ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
176ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private void insertWatchedPrograms(Collection<Program> programs) {
177ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        long channelId = insertChannel();
178ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
179ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        ContentValues values = new ContentValues();
180ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        values.put(WatchedPrograms.COLUMN_PACKAGE_NAME, getContext().getPackageName());
181ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        values.put(WatchedPrograms.COLUMN_CHANNEL_ID, channelId);
182ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        for (Program program : programs) {
183ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            values.put(WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS, program.startTime);
184ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            values.put(WatchedPrograms.COLUMN_WATCH_END_TIME_UTC_MILLIS, program.endTime);
1859c7110178fd390ed520e83522ecc5b54835e0778Conrad Chen            Uri uri = mProvider.insertWatchedProgramSync(values);
186ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            assertNotNull(uri);
187ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            program.id = ContentUris.parseId(uri);
188ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
189ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
190ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
191ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    private Set<Program> queryWatchedPrograms() {
192ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        String[] projection = new String[] {
193ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            WatchedPrograms._ID,
194ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            WatchedPrograms.COLUMN_WATCH_START_TIME_UTC_MILLIS,
195ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            WatchedPrograms.COLUMN_WATCH_END_TIME_UTC_MILLIS,
196ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        };
197ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
198ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        Cursor cursor = mResolver.query(WatchedPrograms.CONTENT_URI, projection, null, null, null);
199ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertNotNull(cursor);
200ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        try {
201ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            Set<Program> programs = Sets.newHashSet();
202ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            while (cursor.moveToNext()) {
203ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                programs.add(new Program(cursor.getLong(0), cursor.getLong(1), cursor.getLong(2)));
204ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            }
205ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            return programs;
206ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        } finally {
207ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            cursor.close();
208ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
209ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
210ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
211ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    @Override
212ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    public void testServiceTestCaseSetUpProperly() throws Exception {
213ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertNotNull(getService());
214ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
215ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
216ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    public void testClearOldPrograms() {
217ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        Program program = new Program(1, 2);
218ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        insertPrograms(program);
219ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
220ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOldPrograms(2);
221ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertEquals("Program should NOT be deleted if it ended at given time.",
222ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                Sets.newHashSet(program), queryPrograms());
223ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
224ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOldPrograms(3);
225ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertTrue("Program should be deleted if it ended before given time.",
226ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                queryPrograms().isEmpty());
227ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
228ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        ArrayList<Program> programs = new ArrayList<Program>();
229ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        for (int i = 0; i < 10; i++) {
230ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            programs.add(new Program(999 + i, 1000 + i));
231ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
232ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        insertPrograms(programs);
233ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
234ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOldPrograms(1005);
235ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertEquals("Program should be deleted if and only if it ended before given time.",
236ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                new HashSet<Program>(programs.subList(5, 10)), queryPrograms());
237ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
238ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
239291cd14f062ea27fd3018ded7485ca6bbbcd6517Dongwon Kang    // Disable temporarily since it's not trivial to fix due to asynchronous implementation of
240291cd14f062ea27fd3018ded7485ca6bbbcd6517Dongwon Kang    // watch history management.
241ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    public void testClearOldWatchedPrograms() {
242ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        Program program = new Program(1, 2);
243ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        insertWatchedPrograms(program);
244ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
245ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOldWatchHistory(1);
246ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertEquals("Watch history should NOT be deleted if watch started at given time.",
247ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                Sets.newHashSet(program), queryWatchedPrograms());
248ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
249ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOldWatchHistory(2);
250ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertTrue("Watch history shuold be deleted if watch started before given time.",
251ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                queryWatchedPrograms().isEmpty());
252ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
253ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        ArrayList<Program> programs = new ArrayList<Program>();
254ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        for (int i = 0; i < 10; i++) {
255ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            programs.add(new Program(1000 + i, 1001 + i));
256ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
257ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        insertWatchedPrograms(programs);
258ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
259ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOldWatchHistory(1005);
260ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertEquals("Watch history should be deleted if and only if it started before given time.",
261ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                new HashSet<Program>(programs.subList(5, 10)), queryWatchedPrograms());
262ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
263ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
264291cd14f062ea27fd3018ded7485ca6bbbcd6517Dongwon Kang    // Disable temporarily since it's not trivial to fix due to asynchronous implementation of
265291cd14f062ea27fd3018ded7485ca6bbbcd6517Dongwon Kang    // watch history management.
266ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    public void testClearOverflowWatchHistory() {
267ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        ArrayList<Program> programs = new ArrayList<Program>();
268ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        for (int i = 0; i < 10; i++) {
269ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee            programs.add(new Program(1000 + i, 1001 + i));
270ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        }
271ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        insertWatchedPrograms(programs);
272ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
273ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOverflowWatchHistory(5);
274ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertEquals("Watch history should be deleted in watch start time order.",
275ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee                new HashSet<Program>(programs.subList(5, 10)), queryWatchedPrograms());
276ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee
277ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        getService().clearOverflowWatchHistory(0);
278ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee        assertTrue("All history should be deleted.", queryWatchedPrograms().isEmpty());
279ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee    }
280ac117ad70762672243573f9c8a5ea3220c4884bfJi-Hwan Lee}
281