1a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang/*
2a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * Copyright (C) 2011 The Android Open Source Project
3a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang *
4a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * Licensed under the Apache License, Version 2.0 (the "License");
5a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * you may not use this file except in compliance with the License.
6a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * You may obtain a copy of the License at
7a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang *
8a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang *      http://www.apache.org/licenses/LICENSE-2.0
9a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang *
10a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * Unless required by applicable law or agreed to in writing, software
11a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * distributed under the License is distributed on an "AS IS" BASIS,
12a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * See the License for the specific language governing permissions and
14a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * limitations under the License.
15a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang */
16a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
17a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangpackage android.app;
18a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
19a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
20a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport android.content.Context;
21a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport android.content.Intent;
22a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport android.net.Uri;
23a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport android.os.SystemClock;
24a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport android.test.InstrumentationTestCase;
25a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport android.test.RepetitiveTest;
26a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport android.test.TimedTest;
27a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
28a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangimport java.util.Random;
29a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
30a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang/**
31a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * Test which spams notification manager with a large number of notifications, for both stress and
32a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang * performance testing.
33a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang */
34a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuangpublic class NotificationStressTest extends InstrumentationTestCase {
35a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
36a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    private static final int NUM_ITERATIONS = 200;
37a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    private static final int[] ICONS = new int[] {
38a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_call_mute,
39a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_chat,
40a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_error,
41a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_missed_call,
42a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_more,
43a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_sdcard,
44a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_sdcard_prepare,
45a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_sdcard_usb,
46a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_sync,
47a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_sync_noanim,
48a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        android.R.drawable.stat_notify_voicemail,
49a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    };
50a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
51a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    private final Random mRandom = new Random();
52a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    private Context mContext;
53a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    private NotificationManager mNotificationManager;
54a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    private int notifyId = 0;
55a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
56a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    @Override
57a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    protected void setUp() throws Exception {
58a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        super.setUp();
59a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        mContext = getInstrumentation().getContext();
60a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        mNotificationManager = (NotificationManager) mContext.getSystemService(
61a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang                Context.NOTIFICATION_SERVICE);
62a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    }
63a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
64a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    @Override
65a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    protected void tearDown() throws Exception {
66a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        super.tearDown();
67a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        mNotificationManager.cancelAll();
68a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    }
69a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
70a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    @RepetitiveTest(numIterations=NUM_ITERATIONS)
71a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    public void testNotificationStress() {
72a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        // Cancel one of every five notifications to vary load on notification manager
73a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        if (notifyId % 5 == 4) {
74a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang            mNotificationManager.cancel(notifyId - 4);
75a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        }
76a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        sendNotification(notifyId++, "testNotificationStressNotify");
77a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    }
78a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang
79a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    private void sendNotification(int id, CharSequence text) {
80a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        // Create "typical" notification with random icon
81a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        Notification notification = new Notification(ICONS[mRandom.nextInt(ICONS.length)], text,
82a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang                System.currentTimeMillis());
83a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        // Fill in arbitrary content
84a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.google.com"));
85a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
86a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        CharSequence title = text + " " + id;
87a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        CharSequence subtitle = String.valueOf(System.currentTimeMillis());
88a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        notification.setLatestEventInfo(mContext, title, subtitle, pendingIntent);
89a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        mNotificationManager.notify(id, notification);
90a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang        SystemClock.sleep(10);
91a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang    }
92a760e55783ee30b0f3494e113a1c37003c9d1770Tsu Chiang Chuang}
93