Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(142)

Side by Side Diff: remoting/android/javatests/src/org/chromium/chromoting/EventTest.java

Issue 1999583002: Add Event and EventTest (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 package org.chromium.chromoting;
6
7 import android.test.InstrumentationTestCase;
8 import android.test.suitebuilder.annotation.MediumTest;
9 import android.test.suitebuilder.annotation.SmallTest;
10
11 import org.chromium.base.test.util.Feature;
12
13 /**
14 * Tests for {@link Event}.
15 */
16 public class EventTest extends InstrumentationTestCase {
17 @SmallTest
18 @Feature({"Chromoting"})
19 public static void testBasicScenario() {
20 Event.Executor<Void> event = new Event.Executor<>();
21 final Counter callTimes = new Counter();
22 int eventId1 = event.add(new Event.ParameterRunnable<Void>() {
23 @Override
24 public void run(Void nil) {
25 callTimes.increment();
26 }
27 });
28 int eventId2 = event.add(new Event.ParameterRunnable<Void>() {
29 @Override
30 public void run(Void nil) {
31 callTimes.increment();
32 }
33 });
34 int eventId3 = event.add(new Event.ParameterRunnable<Void>() {
35 @Override
36 public void run(Void nil) {
37 // Should not reach.
38 assertTrue(false);
39 callTimes.increment();
40 }
41 });
42 assertTrue(eventId1 >= 0);
43 assertTrue(eventId2 >= 0);
44 assertTrue(eventId3 >= 0);
45 assertTrue(event.remove(eventId3));
46 for (int i = 0; i < 100; i++) {
47 assertEquals(event.raise(null), 2);
48 assertEquals(callTimes.get(), (i + 1) << 1);
49 }
50 assertTrue(event.remove(eventId1));
51 assertTrue(event.remove(eventId2));
52 assertFalse(event.remove(eventId3));
53 }
54
55 private static class MultithreadingTestRunner extends Thread {
56 private final Event.Executor<Void> mEvent;
57 private final Pointer<Boolean> mError;
58
59 public MultithreadingTestRunner(Event.Executor<Void> event,
60 Pointer<Boolean> error) {
61 Preconditions.notNull(event);
62 Preconditions.notNull(error);
63 mEvent = event;
64 mError = error;
65 }
66
67 @Override
68 public void run() {
69 for (int i = 0; i < 100; i++) {
70 final Pointer<Boolean> called = new Pointer<>();
71 int id = mEvent.add(new Event.ParameterRunnable<Void>() {
72 @Override
73 public void run(Void nil) {
74 called.set(true);
75 }
76 });
77 if (id < 0) {
78 mError.set(true);
79 }
80 for (int j = 0; j < 100; j++) {
81 called.set(false);
82 if (mEvent.raise(null) <= 0) {
83 mError.set(true);
84 }
85 if (!called.get()) {
86 mError.set(true);
87 }
88 }
89 if (!mEvent.remove(id)) {
90 mError.set(true);
91 }
92 }
93 }
94 }
95
96 @MediumTest
97 @Feature({"Chromoting"})
98 public static void testMultithreading() {
99 Event.Executor<Void> event = new Event.Executor<>();
100 final int threadCount = 10;
101 final Pointer<Boolean> error = new Pointer<>();
102 Thread[] threads = new Thread[threadCount];
103 for (int i = 0; i < threadCount; i++) {
104 threads[i] = new MultithreadingTestRunner(event, error);
105 threads[i].start();
106 }
107 for (int i = 0; i < threadCount; i++) {
108 try {
109 threads[i].join();
110 } catch (InterruptedException exception) {
111 assertTrue(false);
112 }
113 }
114 assertNull(error.get());
115 }
116
117 @SmallTest
118 @Feature({"Chromoting"})
119 public static void testWeakReferred() {
120 Event.Executor<Void> event = new Event.Executor<>();
121 final Pointer<Boolean> called = new Pointer<>();
122 Event.ParameterRunnable<Void> runnable =
123 new Event.ParameterRunnable<Void>() {
124 @Override
125 public void run(Void nil) {
126 called.set(true);
127 }
128 };
129 assertTrue(event.addWeakReferred(runnable));
130 // When runnable is referred, it should be called.
131 for (int i = 0; i < 100; i++) {
132 assertEquals(event.raise(null), 1);
133 assertTrue(called.get());
134 called.set(false);
135 }
136 assertTrue(event.attached());
137
138 // When runnable is not referred anymore, it would be eventually GCed an d removed from event
139 // queue.
140 runnable = null;
141 final int round = 100;
142 int i = 0;
143 for (i = 0; i < round; i++) {
144 System.runFinalization();
145 System.gc();
146 event.raise(null);
147 if (!called.get()) {
148 break;
149 }
150 called.set(false);
151 }
152 assertTrue(i < round);
153 assertFalse(event.attached());
154 }
155
156 @SmallTest
157 @Feature({"Chromoting"})
158 public static void testSelfRemovable() {
159 Event.Executor<Void> event = new Event.Executor<>();
160 final Pointer<Boolean> called = new Pointer<>();
161 final Pointer<Boolean> nextReturn = new Pointer<>();
162 nextReturn.set(true);
163 event.addSelfRemovable(new Event.ParameterCallback<Boolean, Void>() {
164 @Override
165 public Boolean run(Void nil) {
166 called.set(true);
167 return nextReturn.get();
168 }
169 });
170 assertEquals(event.raise(null), 1);
171 assertTrue(called.get());
172 assertTrue(event.attached());
173 called.set(false);
174 nextReturn.set(false);
175 assertEquals(event.raise(null), 1);
176 assertTrue(called.get());
177 assertFalse(event.attached());
178 called.set(false);
179 nextReturn.set(true);
180 assertEquals(event.raise(null), 0);
181 assertFalse(called.get());
182 assertFalse(event.attached());
183 }
184 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698