Skip to content

Commit 2904cbb

Browse files
authored
[flutter_plugin_tools] Also look for Java tests in plugin path (flutter#3742)
1 parent 7a3dd31 commit 2904cbb

File tree

5 files changed

+145
-24
lines changed

5 files changed

+145
-24
lines changed

packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/DartMessenger.java

+20-18
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
package io.flutter.plugins.camera;
66

77
import android.os.Handler;
8-
import android.os.Looper;
98
import android.text.TextUtils;
9+
import androidx.annotation.NonNull;
1010
import androidx.annotation.Nullable;
1111
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
1212
import io.flutter.plugin.common.BinaryMessenger;
@@ -17,6 +17,7 @@
1717
import java.util.Map;
1818

1919
class DartMessenger {
20+
@NonNull private final Handler handler;
2021
@Nullable private MethodChannel cameraChannel;
2122
@Nullable private MethodChannel deviceChannel;
2223

@@ -41,9 +42,10 @@ enum CameraEventType {
4142
}
4243
}
4344

44-
DartMessenger(BinaryMessenger messenger, long cameraId) {
45+
DartMessenger(BinaryMessenger messenger, long cameraId, @NonNull Handler handler) {
4546
cameraChannel = new MethodChannel(messenger, "flutter.io/cameraPlugin/camera" + cameraId);
4647
deviceChannel = new MethodChannel(messenger, "flutter.io/cameraPlugin/device");
48+
this.handler = handler;
4749
}
4850

4951
void sendDeviceOrientationChangeEvent(PlatformChannel.DeviceOrientation orientation) {
@@ -106,14 +108,14 @@ void send(CameraEventType eventType, Map<String, Object> args) {
106108
if (cameraChannel == null) {
107109
return;
108110
}
109-
new Handler(Looper.getMainLooper())
110-
.post(
111-
new Runnable() {
112-
@Override
113-
public void run() {
114-
cameraChannel.invokeMethod(eventType.method, args);
115-
}
116-
});
111+
112+
handler.post(
113+
new Runnable() {
114+
@Override
115+
public void run() {
116+
cameraChannel.invokeMethod(eventType.method, args);
117+
}
118+
});
117119
}
118120

119121
void send(DeviceEventType eventType) {
@@ -124,13 +126,13 @@ void send(DeviceEventType eventType, Map<String, Object> args) {
124126
if (deviceChannel == null) {
125127
return;
126128
}
127-
new Handler(Looper.getMainLooper())
128-
.post(
129-
new Runnable() {
130-
@Override
131-
public void run() {
132-
deviceChannel.invokeMethod(eventType.method, args);
133-
}
134-
});
129+
130+
handler.post(
131+
new Runnable() {
132+
@Override
133+
public void run() {
134+
deviceChannel.invokeMethod(eventType.method, args);
135+
}
136+
});
135137
}
136138
}

packages/camera/camera/android/src/main/java/io/flutter/plugins/camera/MethodCallHandlerImpl.java

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66

77
import android.app.Activity;
88
import android.hardware.camera2.CameraAccessException;
9+
import android.os.Handler;
10+
import android.os.Looper;
911
import androidx.annotation.NonNull;
1012
import androidx.annotation.Nullable;
1113
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
@@ -353,7 +355,9 @@ private void instantiateCamera(MethodCall call, Result result) throws CameraAcce
353355
boolean enableAudio = call.argument("enableAudio");
354356
TextureRegistry.SurfaceTextureEntry flutterSurfaceTexture =
355357
textureRegistry.createSurfaceTexture();
356-
DartMessenger dartMessenger = new DartMessenger(messenger, flutterSurfaceTexture.id());
358+
DartMessenger dartMessenger =
359+
new DartMessenger(
360+
messenger, flutterSurfaceTexture.id(), new Handler(Looper.getMainLooper()));
357361
camera =
358362
new Camera(
359363
activity,

packages/camera/camera/android/src/test/java/io/flutter/plugins/camera/DartMessengerTest.java

+28-2
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,11 @@
66

77
import static junit.framework.TestCase.assertNull;
88
import static org.junit.Assert.assertEquals;
9+
import static org.mockito.ArgumentMatchers.any;
10+
import static org.mockito.Mockito.doAnswer;
11+
import static org.mockito.Mockito.mock;
912

13+
import android.os.Handler;
1014
import androidx.annotation.NonNull;
1115
import io.flutter.embedding.engine.systemchannels.PlatformChannel;
1216
import io.flutter.plugin.common.BinaryMessenger;
@@ -19,6 +23,8 @@
1923
import java.util.List;
2024
import org.junit.Before;
2125
import org.junit.Test;
26+
import org.mockito.invocation.InvocationOnMock;
27+
import org.mockito.stubbing.Answer;
2228

2329
public class DartMessengerTest {
2430
/** A {@link BinaryMessenger} implementation that does nothing but save its messages. */
@@ -43,20 +49,24 @@ List<ByteBuffer> getMessages() {
4349
}
4450
}
4551

52+
private Handler mockHandler;
4653
private DartMessenger dartMessenger;
4754
private FakeBinaryMessenger fakeBinaryMessenger;
4855

4956
@Before
5057
public void setUp() {
58+
mockHandler = mock(Handler.class);
5159
fakeBinaryMessenger = new FakeBinaryMessenger();
52-
dartMessenger = new DartMessenger(fakeBinaryMessenger, 0);
60+
dartMessenger = new DartMessenger(fakeBinaryMessenger, 0, mockHandler);
5361
}
5462

5563
@Test
5664
public void sendCameraErrorEvent_includesErrorDescriptions() {
57-
dartMessenger.sendCameraErrorEvent("error description");
65+
doAnswer(createPostHandlerAnswer()).when(mockHandler).post(any(Runnable.class));
5866

67+
dartMessenger.sendCameraErrorEvent("error description");
5968
List<ByteBuffer> sentMessages = fakeBinaryMessenger.getMessages();
69+
6070
assertEquals(1, sentMessages.size());
6171
MethodCall call = decodeSentMessage(sentMessages.get(0));
6272
assertEquals("error", call.method);
@@ -65,6 +75,7 @@ public void sendCameraErrorEvent_includesErrorDescriptions() {
6575

6676
@Test
6777
public void sendCameraInitializedEvent_includesPreviewSize() {
78+
doAnswer(createPostHandlerAnswer()).when(mockHandler).post(any(Runnable.class));
6879
dartMessenger.sendCameraInitializedEvent(0, 0, ExposureMode.auto, FocusMode.auto, true, true);
6980

7081
List<ByteBuffer> sentMessages = fakeBinaryMessenger.getMessages();
@@ -81,6 +92,7 @@ public void sendCameraInitializedEvent_includesPreviewSize() {
8192

8293
@Test
8394
public void sendCameraClosingEvent() {
95+
doAnswer(createPostHandlerAnswer()).when(mockHandler).post(any(Runnable.class));
8496
dartMessenger.sendCameraClosingEvent();
8597

8698
List<ByteBuffer> sentMessages = fakeBinaryMessenger.getMessages();
@@ -92,6 +104,7 @@ public void sendCameraClosingEvent() {
92104

93105
@Test
94106
public void sendDeviceOrientationChangedEvent() {
107+
doAnswer(createPostHandlerAnswer()).when(mockHandler).post(any(Runnable.class));
95108
dartMessenger.sendDeviceOrientationChangeEvent(PlatformChannel.DeviceOrientation.PORTRAIT_UP);
96109

97110
List<ByteBuffer> sentMessages = fakeBinaryMessenger.getMessages();
@@ -101,6 +114,19 @@ public void sendDeviceOrientationChangedEvent() {
101114
assertEquals(call.argument("orientation"), "portraitUp");
102115
}
103116

117+
private static Answer<Boolean> createPostHandlerAnswer() {
118+
return new Answer<Boolean>() {
119+
@Override
120+
public Boolean answer(InvocationOnMock invocation) throws Throwable {
121+
Runnable runnable = invocation.getArgument(0, Runnable.class);
122+
if (runnable != null) {
123+
runnable.run();
124+
}
125+
return true;
126+
}
127+
};
128+
}
129+
104130
private MethodCall decodeSentMessage(ByteBuffer sentMessage) {
105131
sentMessage.position(0);
106132

script/tool/lib/src/java_test_command.dart

+6-3
Original file line numberDiff line numberDiff line change
@@ -32,9 +32,12 @@ class JavaTestCommand extends PluginCommand {
3232
final Stream<Directory> examplesWithTests = getExamples().where(
3333
(Directory d) =>
3434
isFlutterPackage(d, fileSystem) &&
35-
fileSystem
36-
.directory(p.join(d.path, 'android', 'app', 'src', 'test'))
37-
.existsSync());
35+
(fileSystem
36+
.directory(p.join(d.path, 'android', 'app', 'src', 'test'))
37+
.existsSync() ||
38+
fileSystem
39+
.directory(p.join(d.path, '..', 'android', 'src', 'test'))
40+
.existsSync()));
3841

3942
final List<String> failingPackages = <String>[];
4043
final List<String> missingFlutterBuild = <String>[];
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
// Copyright 2013 The Flutter 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+
import 'package:args/command_runner.dart';
6+
import 'package:file/file.dart';
7+
import 'package:flutter_plugin_tools/src/java_test_command.dart';
8+
import 'package:path/path.dart' as p;
9+
import 'package:test/test.dart';
10+
11+
import 'util.dart';
12+
13+
void main() {
14+
group('$JavaTestCommand', () {
15+
CommandRunner<JavaTestCommand> runner;
16+
final RecordingProcessRunner processRunner = RecordingProcessRunner();
17+
18+
setUp(() {
19+
initializeFakePackages();
20+
final JavaTestCommand command = JavaTestCommand(
21+
mockPackagesDir, mockFileSystem,
22+
processRunner: processRunner);
23+
24+
runner =
25+
CommandRunner<Null>('java_test_test', 'Test for $JavaTestCommand');
26+
runner.addCommand(command);
27+
});
28+
29+
tearDown(() {
30+
cleanupPackages();
31+
processRunner.recordedCalls.clear();
32+
});
33+
34+
test('Should run Java tests in Android implementation folder', () async {
35+
final Directory plugin = createFakePlugin(
36+
'plugin1',
37+
isAndroidPlugin: true,
38+
isFlutter: true,
39+
withSingleExample: true,
40+
withExtraFiles: <List<String>>[
41+
<String>['example/android', 'gradlew'],
42+
<String>['android/src/test', 'example_test.java'],
43+
],
44+
);
45+
46+
await runner.run(<String>['java-test']);
47+
48+
expect(
49+
processRunner.recordedCalls,
50+
orderedEquals(<ProcessCall>[
51+
ProcessCall(
52+
p.join(plugin.path, 'example/android/gradlew'),
53+
<String>['testDebugUnitTest', '--info'],
54+
p.join(plugin.path, 'example/android'),
55+
),
56+
]),
57+
);
58+
});
59+
60+
test('Should run Java tests in example folder', () async {
61+
final Directory plugin = createFakePlugin(
62+
'plugin1',
63+
isAndroidPlugin: true,
64+
isFlutter: true,
65+
withSingleExample: true,
66+
withExtraFiles: <List<String>>[
67+
<String>['example/android', 'gradlew'],
68+
<String>['example/android/app/src/test', 'example_test.java'],
69+
],
70+
);
71+
72+
await runner.run(<String>['java-test']);
73+
74+
expect(
75+
processRunner.recordedCalls,
76+
orderedEquals(<ProcessCall>[
77+
ProcessCall(
78+
p.join(plugin.path, 'example/android/gradlew'),
79+
<String>['testDebugUnitTest', '--info'],
80+
p.join(plugin.path, 'example/android'),
81+
),
82+
]),
83+
);
84+
});
85+
});
86+
}

0 commit comments

Comments
 (0)