OSDN Git Service

Remove bg_non_interactive cgroup [ DO NOT MERGE ]
[android-x86/frameworks-base.git] / core / tests / coretests / src / android / os / MessageQueueTest.java
1 /*
2  * Copyright (C) 2007 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 android.os;
18
19 import android.os.Handler;
20 import android.os.Message;
21 import android.os.SystemClock;
22 import android.test.suitebuilder.annotation.MediumTest;
23 import android.test.suitebuilder.annotation.Suppress;
24 import junit.framework.TestCase;
25
26 @Suppress  // Failing.
27 public class MessageQueueTest extends TestCase {
28
29     private static class BaseTestHandler extends TestHandlerThread {
30         Handler mHandler;
31         int mLastMessage;
32         int mCount;
33
34         public BaseTestHandler() {
35         }
36
37         public void go() {
38             mHandler = new Handler() {
39                 public void handleMessage(Message msg) {
40                     BaseTestHandler.this.handleMessage(msg);
41                 }
42             };
43         }
44
45         public void handleMessage(Message msg) {
46             if (!msg.isInUse()) {
47                 failure(new RuntimeException(
48                         "msg.isInuse is false, should always be true, #" + msg.what));
49             }
50             if (mCount <= mLastMessage) {
51                 if (msg.what != mCount) {
52                     failure(new RuntimeException(
53                             "Expected message #" + mCount
54                                     + ", received #" + msg.what));
55                 } else if (mCount == mLastMessage) {
56                     success();
57                 }
58                 mCount++;
59             } else {
60                 failure(new RuntimeException(
61                         "Message received after done, #" + msg.what));
62             }
63         }
64     }
65
66     @MediumTest
67     public void testMessageOrder() throws Exception {
68         TestHandlerThread tester = new BaseTestHandler() {
69             public void go() {
70                 super.go();
71                 long now = SystemClock.uptimeMillis() + 200;
72                 mLastMessage = 4;
73                 mCount = 0;
74                 mHandler.sendMessageAtTime(mHandler.obtainMessage(2), now + 1);
75                 mHandler.sendMessageAtTime(mHandler.obtainMessage(3), now + 2);
76                 mHandler.sendMessageAtTime(mHandler.obtainMessage(4), now + 2);
77                 mHandler.sendMessageAtTime(mHandler.obtainMessage(0), now + 0);
78                 mHandler.sendMessageAtTime(mHandler.obtainMessage(1), now + 0);
79             }
80         };
81
82         tester.doTest(1000);
83     }
84
85     @MediumTest
86     public void testAtFrontOfQueue() throws Exception {
87         TestHandlerThread tester = new BaseTestHandler() {
88             public void go() {
89                 super.go();
90                 long now = SystemClock.uptimeMillis() + 200;
91                 mLastMessage = 3;
92                 mCount = 0;
93                 mHandler.sendMessageAtTime(mHandler.obtainMessage(3), now);
94                 mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(2));
95                 mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(0));
96             }
97
98             public void handleMessage(Message msg) {
99                 super.handleMessage(msg);
100                 if (msg.what == 0) {
101                     mHandler.sendMessageAtFrontOfQueue(mHandler.obtainMessage(1));
102                 }
103             }
104         };
105
106         tester.doTest(1000);
107     }
108
109     private static class TestFieldIntegrityHandler extends TestHandlerThread {
110         Handler mHandler;
111         int mLastMessage;
112         int mCount;
113
114         public TestFieldIntegrityHandler() {
115         }
116
117         public void go() {
118             mHandler = new Handler() {
119                 public void handleMessage(Message msg) {
120                     TestFieldIntegrityHandler.this.handleMessage(msg);
121                 }
122             };
123         }
124
125         public void handleMessage(Message msg) {
126             if (!msg.isInUse()) {
127                 failure(new RuntimeException(
128                         "msg.isInuse is false, should always be true, #" + msg.what));
129             }
130             if (mCount <= mLastMessage) {
131                 if (msg.what != mCount) {
132                     failure(new RuntimeException(
133                             "Expected message #" + mCount
134                                     + ", received #" + msg.what));
135                 } else if (mCount == mLastMessage) {
136                     success();
137                 }
138                 mCount++;
139             } else {
140                 failure(new RuntimeException(
141                         "Message received after done, #" + msg.what));
142             }
143         }
144     }
145
146     @MediumTest
147     public void testFieldIntegrity() throws Exception {
148
149         TestHandlerThread tester = new TestFieldIntegrityHandler() {
150             Bundle mBundle;
151
152             public void go() {
153                 super.go();
154                 mLastMessage = 1;
155                 mCount = 0;
156                 mHandler.sendMessage(mHandler.obtainMessage(0));
157             }
158
159             public void handleMessage(Message msg) {
160                 super.handleMessage(msg);
161                 if (msg.what == 0) {
162                     msg.flags = -1;
163                     msg.what = 1;
164                     msg.arg1 = 456;
165                     msg.arg2 = 789;
166                     msg.obj = this;
167                     msg.replyTo = null;
168                     mBundle = new Bundle();
169                     msg.data = mBundle;
170                     msg.data.putString("key", "value");
171
172                     Message newMsg = mHandler.obtainMessage();
173                     newMsg.copyFrom(msg);
174                     if (newMsg.isInUse() != false) {
175                         failure(new RuntimeException(
176                                 "newMsg.isInUse is true should be false after copyFrom"));
177                     }
178                     if (newMsg.flags != 0) {
179                         failure(new RuntimeException(String.format(
180                         "newMsg.flags is %d should be 0 after copyFrom", newMsg.flags)));
181                     }
182                     if (newMsg.what != 1) {
183                         failure(new RuntimeException(String.format(
184                                 "newMsg.what is %d should be %d after copyFrom", newMsg.what, 1)));
185                     }
186                     if (newMsg.arg1 != 456) {
187                         failure(new RuntimeException(String.format(
188                                 "newMsg.arg1 is %d should be %d after copyFrom", msg.arg1, 456)));
189                     }
190                     if (newMsg.arg2 != 789) {
191                         failure(new RuntimeException(String.format(
192                                 "newMsg.arg2 is %d should be %d after copyFrom", msg.arg2, 789)));
193                     }
194                     if (newMsg.obj != this) {
195                         failure(new RuntimeException(
196                                 "newMsg.obj should be 'this' after copyFrom"));
197                     }
198                     if (newMsg.replyTo != null) {
199                         failure(new RuntimeException(
200                                 "newMsg.replyTo should be null after copyFrom"));
201                     }
202                     if (newMsg.data == mBundle) {
203                         failure(new RuntimeException(
204                                 "newMsg.data should NOT be mBundle after copyFrom"));
205                     }
206                     if (!newMsg.data.getString("key").equals(mBundle.getString("key"))) {
207                         failure(new RuntimeException(String.format(
208                                 "newMsg.data.getString(\"key\") is %s and does not equal" +
209                                 " mBundle.getString(\"key\") which is %s after copyFrom",
210                                 newMsg.data.getString("key"),  mBundle.getString("key"))));
211                     }
212                     if (newMsg.when != 0) {
213                         failure(new RuntimeException(String.format(
214                                 "newMsg.when is %d should be 0 after copyFrom", newMsg.when)));
215                     }
216                     if (newMsg.target != mHandler) {
217                         failure(new RuntimeException(
218                                 "newMsg.target is NOT mHandler after copyFrom"));
219                     }
220                     if (newMsg.callback != null) {
221                         failure(new RuntimeException(
222                                 "newMsg.callback is NOT null after copyFrom"));
223                     }
224
225                     mHandler.sendMessage(newMsg);
226                 } else if (msg.what == 1) {
227                     if (msg.isInUse() != true) {
228                         failure(new RuntimeException(String.format(
229                                 "msg.isInUse is false should be true after when processing %d",
230                                 msg.what)));
231                     }
232                     if (msg.arg1 != 456) {
233                         failure(new RuntimeException(String.format(
234                                 "msg.arg1 is %d should be %d when processing # %d",
235                                 msg.arg1, 456, msg.what)));
236                     }
237                     if (msg.arg2 != 789) {
238                         failure(new RuntimeException(String.format(
239                                 "msg.arg2 is %d should be %d when processing # %d",
240                                 msg.arg2, 789, msg.what)));
241                     }
242                     if (msg.obj != this) {
243                         failure(new RuntimeException(String.format(
244                                 "msg.obj should be 'this' when processing # %d", msg.what)));
245                     }
246                     if (msg.replyTo != null) {
247                         failure(new RuntimeException(String.format(
248                                 "msg.replyTo should be null when processing # %d", msg.what)));
249                     }
250                     if (!msg.data.getString("key").equals(mBundle.getString("key"))) {
251                         failure(new RuntimeException(String.format(
252                                 "msg.data.getString(\"key\") is %s and does not equal" +
253                                 " mBundle.getString(\"key\") which is %s when processing # %d",
254                                 msg.data.getString("key"),  mBundle.getString("key"), msg.what)));
255                     }
256                     if (msg.when != 0) {
257                         failure(new RuntimeException(String.format(
258                                 "msg.when is %d should be 0 when processing # %d",
259                                 msg.when, msg.what)));
260                     }
261                     if (msg.target != null) {
262                         failure(new RuntimeException(String.format(
263                                 "msg.target is NOT null when processing # %d", msg.what)));
264                     }
265                     if (msg.callback != null) {
266                         failure(new RuntimeException(String.format(
267                                 "msg.callback is NOT null when processing # %d", msg.what)));
268                     }
269                 } else {
270                     failure(new RuntimeException(String.format(
271                             "Unexpected msg.what is %d" + msg.what)));
272                 }
273             }
274         };
275
276         tester.doTest(1000);
277     }
278 }