Git Product home page Git Product logo

mobly-bundled-snippets's Introduction

Mobly Bundled Snippets is a set of Snippets to allow Mobly tests to control Android devices by exposing a simplified version of the public Android API suitable for testing.

We are adding more APIs as we go. If you have specific needs for certain groups of APIs, feel free to file a request in Issues.

Note: this is not an official Google product.

Usage

  1. Compile and install the bundled snippets

    ./gradlew assembleDebug
    adb install -d -r -g ./build/outputs/apk/debug/mobly-bundled-snippets-debug.apk
    
  2. Use the Mobly snippet shell to interact with the bundled snippets

    snippet_shell.py com.google.android.mobly.snippet.bundled
    >>> print(s.help())
    Known methods:
      bluetoothDisable() returns void  // Disable bluetooth with a 30s timeout.
    ...
      wifiDisable() returns void  // Turns off Wi-Fi with a 30s timeout.
      wifiEnable() returns void  // Turns on Wi-Fi with a 30s timeout.
    ...
    
  3. To use these snippets within Mobly tests, load it on your AndroidDevice objects after registering android_device module:

    def setup_class(self):
      self.ad = self.register_controllers(android_device, min_number=1)[0]
      self.ad.load_snippet('api', 'com.google.android.mobly.snippet.bundled')
    
    def test_enable_wifi(self):
      self.ad.api.wifiEnable()

Develop

If you want to contribute, use the usual github method of forking and sending a pull request.

Before sending a pull request, run the presubmit target to format and run lint over the code. Fix any issues it indicates. When complete, send the pull request.

./gradlew presubmit

This target will reformat the code with googleJavaFormat and run lint. The lint report should open in your default browser.

Be sure to address all off the errors reported by lint. When finished and you run presubmit one last time you should see:

No Issues Found Congratulations!

in your browser.

Other resources

mobly-bundled-snippets's People

Contributors

adorokhine avatar alice1117 avatar amytsengtw avatar arammelk avatar chuanhsiao avatar dthkao avatar eric100lin avatar haoma avatar k2fong avatar kant avatar kdart avatar kingkupps avatar ko1in1u avatar lrbom avatar meng-gen avatar nihald2000 avatar ryancllin avatar sceller avatar stplaydog avatar syaoranx avatar tprotopopov-dev avatar vanhine avatar vitalidim avatar whutchin5 avatar wju-msft avatar xianyuanjia avatar xpconanfan avatar ygw11223 avatar zhaomingyin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

mobly-bundled-snippets's Issues

Build warnings in exception classes

/Users/angli/Developer/mobly-bundled-snippets/src/main/java/com/google/android/mobly/snippet/bundled/AccountSnippet.java:55: warning: [serial] serializable class AccountSnippetException has no definition of serialVersionUID
    private static class AccountSnippetException extends Exception {
                   ^
/Users/angli/Developer/mobly-bundled-snippets/src/main/java/com/google/android/mobly/snippet/bundled/BluetoothAdapterSnippet.java:36: warning: [serial] serializable class BluetoothAdapterSnippetException has no definition of serialVersionUID
    private static class BluetoothAdapterSnippetException extends Exception {
                   ^
/Users/angli/Developer/mobly-bundled-snippets/src/main/java/com/google/android/mobly/snippet/bundled/utils/ApiVersionException.java:4: warning: [serial] serializable class ApiVersionException has no definition of serialVersionUID
public class ApiVersionException extends Exception {
       ^

`:lint` is failing and doesn't say why

:lint FAILED

FAILURE: Build failed with an exception.

* What went wrong:
Execution failed for task ':lint'.
> Lint found errors in the project; aborting build.

  Fix the issues identified by lint, or add the following to your build script to proceed with errors:
  ...
  android {
      lintOptions {
          abortOnError false
      }
  }
  ...

* Try:
Run with --info or --debug option to get more log output.

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':lint'.
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:84)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:55)
        at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:62)
        at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
        at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:88)
        at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:46)
        at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)
        at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
        at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
        at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:236)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:61)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:228)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:215)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:77)
        at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:58)
        at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:32)
        at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:113)
        at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.access$000(DefaultBuildExecuter.java:23)
        at org.gradle.execution.DefaultBuildExecuter$1.proceed(DefaultBuildExecuter.java:43)
        at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:37)
        at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:30)
        at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:196)
        at org.gradle.initialization.DefaultGradleLauncher$3.execute(DefaultGradleLauncher.java:193)
        at org.gradle.internal.Transformers$4.transform(Transformers.java:169)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:106)
        at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:56)
        at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:193)
        at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:119)
        at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:102)
        at org.gradle.launcher.exec.GradleBuildController.run(GradleBuildController.java:71)
        at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
        at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:41)
        at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:75)
        at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:49)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:44)
        at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:29)
        at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:67)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:47)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:26)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:34)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:74)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput$2.call(ForwardClientInput.java:72)
        at org.gradle.util.Swapper.swap(Swapper.java:38)
        at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:72)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:55)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:60)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:72)
        at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:36)
        at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:120)
        at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:50)
        at org.gradle.launcher.daemon.server.DaemonStateCoordinator$1.run(DaemonStateCoordinator.java:297)
        at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
        at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.api.GradleException: Lint found errors in the project; aborting build.

Fix the issues identified by lint, or add the following to your build script to proceed with errors:
...
android {
    lintOptions {
        abortOnError false
    }
}
...
        at com.android.build.gradle.tasks.Lint.abort(Lint.java:300)
        at com.android.build.gradle.tasks.Lint.lintAllVariants(Lint.java:265)
        at com.android.build.gradle.tasks.Lint.lint(Lint.java:123)
        at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.doExecute(DefaultTaskClassInfoStore.java:141)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:134)
        at org.gradle.api.internal.project.taskfactory.DefaultTaskClassInfoStore$StandardTaskAction.execute(DefaultTaskClassInfoStore.java:123)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:632)
        at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:615)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:95)
        at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:76)
        ... 70 more


BUILD FAILED

Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList...

When you follow Mobly-101 tutorial and run the following command:
python3 hello_world_test.py -c sample_config.yml
You see following error:

Process crashed before executing the test(s):
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
	at androidx.test.platform.io.FileTestStorage.<init>(FileTestStorage.java:45)
	at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
	at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
	at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
	at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2261)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/~~TqH6aDW44-ek2Rxsb9RFAQ==/com.google.android.mobly.snippet.bundled-x62zokKJRiTiyC0a9LL1xA==/base.apk"],nativeLibraryDirectories=[/data/app/~~TqH6aDW44-ek2Rxsb9RFAQ==/com.google.android.mobly.snippet.bundled-x62zokKJRiTiyC0a9LL1xA==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
	... 5 more
INSTRUMENTATION_RESULT: shortMsg=Process crashed.

If you following this Mobly discussion, it resolves by adding the following to build.gradle:
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.10'


Regarding contribution guidelines

I didn't update any of these files, but running ./gradlew presubmit gives me Not all files were formatted.
Checkout out the scan results here.

Do let me know if you need anything else.

Thanks!

android Instrument test for Snippet?

Hello, i tried to write a test class for a specific snippet, but i cannot make it work.
Any suggestion?


import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import org.junit.Test;
import org.junit.runner.RunWith;

@SmallTest
@RunWith(AndroidJUnit4.class)
public class DemoTest {

    @Test
    public void testAudioSnippet() {
        AudioSnippet audioSnippet = new AudioSnippet();
        audioSnippet.getMusicMaxVolume();
    }
}

And here is the output when i run test case

Testing started at 12:46 PM ...

04/06 12:46:19: Launching 'testAudioSnippet()' on samsung SM-A530F.
Running tests

$ adb shell am instrument -w -r   -e debug false -e class 'com.google.android.mobly.snippet.bundled.DemoTest#testAudioSnippet' com.google.android.mobly.snippet.bundled.test/com.google.android.mobly.snippet.SnippetRunner
Waiting for process to come online...
Connected to process 14915 on device 'samsung-sm_a530f-5200b9494d8c749d'.
Capturing and displaying logcat messages from application. This behavior can be disabled in the "Logcat output" section of the "Debugger" settings page.
I/snippet.bundle: The ClassLoaderContext is a special shared library.
I/snippet.bundle: The ClassLoaderContext is a special shared library.
I/snippet.bundle: The ClassLoaderContext is a special shared library.
I/snippet.bundle: The ClassLoaderContext is a special shared library.
I/snippet.bundle: The ClassLoaderContext is a special shared library.
I/snippet.bundle: The ClassLoaderContext is a special shared library.
W/snippet.bundle: Accessing hidden method Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Landroid/app/Activity;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; (light greylist, linking)
    Accessing hidden method Landroid/app/Instrumentation;->execStartActivity(Landroid/content/Context;Landroid/os/IBinder;Landroid/os/IBinder;Ljava/lang/String;Landroid/content/Intent;ILandroid/os/Bundle;)Landroid/app/Instrumentation$ActivityResult; (light greylist, linking)
I/MultiDex: VM with version 2.1.0 has multidex support
    Installing application
    VM has multidex support, MultiDex support library is disabled.
D/AndroidRuntime: Shutting down VM
E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.google.android.mobly.snippet.bundled, PID: 14915
    java.lang.RuntimeException: Exception thrown in onCreate() of ComponentInfo{com.google.android.mobly.snippet.bundled.test/com.google.android.mobly.snippet.SnippetRunner}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6242)
        at android.app.ActivityThread.access$1200(ActivityThread.java:237)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1792)
        at android.os.Handler.dispatchMessage(Handler.java:106)
        at android.os.Looper.loop(Looper.java:214)
        at android.app.ActivityThread.main(ActivityThread.java:7073)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.os.Bundle.getString(java.lang.String)' on a null object reference
        at com.google.android.mobly.snippet.util.Log.initLogTag(Log.java:44)
        at com.google.android.mobly.snippet.SnippetRunner.onCreate(SnippetRunner.java:98)
        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:6237)
        at android.app.ActivityThread.access$1200(ActivityThread.java:237) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1792) 
        at android.os.Handler.dispatchMessage(Handler.java:106) 
        at android.os.Looper.loop(Looper.java:214) 
        at android.app.ActivityThread.main(ActivityThread.java:7073) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:964) 
I/Process: Sending signal. PID: 14915 SIG: 9

Started running tests
Test running failed: Instrumentation run failed due to 'Process crashed.'

Unable to create the snippets

I am executing this ./gradlew examples:ex2_espresso:assembleDebug examples:ex4_uiautomator:assembleDebug but again and again getting error. I have already downloaded android version 24,27,28,29. Also set the path in sdk.dir of local.properties. But still getting error.

Publish as android library

Suggestion to publish as an android library, instead of building an application.

Apps could use this and mobly-snippet-lib in their own codebase in an artifact published to maven central.

Update apk output path in doc

In the instructions, ./build/outputs/apk/mobly-bundled-snippets-debug.apk is now ./build/outputs/apk/debug/mobly-bundled-snippets-debug.apk due to gradle updates

test mutiple devices

I was trying to test two devices simultaneously but got confused because the shell only allow me to connect to one device. Could you please add more explanation about how to test multiple devices?

gradle sync failing

"Error:Conflict with dependency 'com.google.errorprone:error_prone_annotations' in project 'mobly-bundled-snippets'. Resolved versions for app (2.0.18) and test app (2.0.19) differ. See http://g.co/androidstudio/app-test-app-conflict for details."

Adding this seems to work around it:
compile 'com.google.errorprone:error_prone_annotations:2.0.19'

Not sure what's going on

Unable to build

When I tried to build the ToT project following the instructions, I got:

$ ./gradlew assembleDebug
...
FAILURE: Build failed with an exception.

* What went wrong:
A problem occurred configuring root project 'mobly-bundled-snippets'.
> Could not resolve all dependencies for configuration ':_debugApkCopy'.
   > Could not find com.google.android.mobly:snippetlib:0.0.1.
     Required by:
         :mobly-bundled-snippets:unspecified

Add method to validate Internet connectivity

Could use a generic method to open a socket to an external site that can used instead of curl. This should be easy enough and will eliminate the need for curl on the device.

Primitive type not working as Rpc params.

05-01 20:35:08.438  5684  5709 E sl4a.JsonRpcServer:110: Invocation error.
05-01 20:35:08.438  5684  5709 E sl4a.JsonRpcServer:110: com.google.android.mobly.snippet.rpc.RpcError: Argument 1 should be of type int.
05-01 20:35:08.438  5684  5709 E sl4a.JsonRpcServer:110: 	at com.google.android.mobly.snippet.rpc.MethodDescriptor.convertParameter(MethodDescriptor.java:163)
05-01 20:35:08.438  5684  5709 E sl4a.JsonRpcServer:110: 	at com.google.android.mobly.snippet.rpc.MethodDescriptor.invoke(MethodDescriptor.java:85)
05-01 20:35:08.438  5684  5709 E sl4a.JsonRpcServer:110: 	at com.google.android.mobly.snippet.rpc.JsonRpcServer.handleRPCConnection(JsonRpcServer.java:108)
05-01 20:35:08.438  5684  5709 E sl4a.JsonRpcServer:110: 	at com.google.android.mobly.snippet.rpc.SimpleServer$ConnectionThread.run(SimpleServer.java:110)

BluetoothAdapter.getAddress() broken since Android M

Since Android M the behavior of BluetoothAdapter.getAddress() is broken and will always return 00:02:00:00:00 as Bluetooth adapter hardware address.

@Rpc(description = "Returns the hardware address of the local Bluetooth adapter.")
public String btGetAddress() {
return mBluetoothAdapter.getAddress();
}

Bluetooth discover tests failing while Bluetooth discovery.

While executing BT sample test with multiple devices, BT discovery fails with require ADMIN permissions though AndroidManifest.xml already has configured for the required BT settings and also on the devices MultiDexApplication is give permission for all the requested permissions.

Manfiest File BT Permissions entries :

    <uses-permission android:name="android.permission.BLUETOOTH" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADMIN" />
    <uses-permission android:name="android.permission.BLUETOOTH_ADVERTISE" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />
    <uses-permission android:name="android.permission.BLUETOOTH_PRIVILEGED" />
    <uses-permission android:name="android.permission.BLUETOOTH_SCAN" />
    <uses-permission android:name="android.permission.BLUETOOTH_CONNECT" />

ADB Logcat Logs for both devices with error messages: bluetooth_test.zip

Error message:

C:\git\moblyTests>python bluetooth_test.py -c sample_multiple_Andriod_Devices.yml
[TwoDeviceTestBed] 08-01 15:51:14.936 INFO ==========> HelloWorldTest <==========
[TwoDeviceTestBed] 08-01 15:51:17.826 INFO [AndroidDevice|TE630A2ZM16101724] Logging debug tag set to "discoverer"
[TwoDeviceTestBed] 08-01 15:51:17.827 INFO [AndroidDevice|RZCW409ZSTX] Logging debug tag set to "target"
[TwoDeviceTestBed] 08-01 15:51:17.827 INFO [AndroidDevice|target] Initializing the snippet package com.google.android.mobly.snippet.bundled.
[TwoDeviceTestBed] 08-01 15:51:21.682 INFO [AndroidDevice|discoverer] Initializing the snippet package com.google.android.mobly.snippet.bundled.
[TwoDeviceTestBed] 08-01 15:51:26.764 INFO [Test] test_bluetooth_discovery
[TwoDeviceTestBed] 08-01 15:51:39.665 ERROR Exception occurred in test_bluetooth_discovery.
Traceback (most recent call last):
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\base_test.py", line 779, in exec_one_test
self._setup_test(test_name)
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\base_test.py", line 528, in _setup_test
self.setup_test()
File "C:\git\moblyTests\bluetooth_test.py", line 32, in setup_test
self.discoverer.mbs.btEnable()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\snippet\client_base.py", line 205, in rpc_call
return self._rpc(name, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\snippet\client_base.py", line 294, in _rpc
return self._handle_rpc_response(rpc_func_name, response_decoded)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\snippet\client_base.py", line 400, in _handle_rpc_response
raise errors.ApiError(self._device, response['error'])
mobly.snippet.errors.ApiError: <AndroidDevice|discoverer>
-------------- Java Stacktrace ---------------
java.lang.SecurityException: Need BLUETOOTH ADMIN permission: Neither user 10143 nor current process has android.permission.BLUETOOTH_ADMIN.
at android.os.Parcel.createException(Parcel.java:2071)
at android.os.Parcel.readException(Parcel.java:2039)
at android.os.Parcel.readException(Parcel.java:1987)
at android.bluetooth.IBluetoothManager$Stub$Proxy.enable(IBluetoothManager.java:515)
at android.bluetooth.BluetoothAdapter.enable(BluetoothAdapter.java:1095)
at com.google.android.mobly.snippet.bundled.bluetooth.BluetoothAdapterSnippet.btEnable(BluetoothAdapterSnippet.java:144)
at java.lang.reflect.Method.invoke(Native Method)
at com.google.android.mobly.snippet.manager.SnippetManager.invoke(SnippetManager.java:287)
at com.google.android.mobly.snippet.manager.SnippetManager.invoke(SnippetManager.java:142)
at com.google.android.mobly.snippet.rpc.MethodDescriptor.invoke(MethodDescriptor.java:101)
at com.google.android.mobly.snippet.util.RpcUtil.invokeRpc(RpcUtil.java:131)
at com.google.android.mobly.snippet.util.RpcUtil.invokeRpc(RpcUtil.java:103)
at com.google.android.mobly.snippet.rpc.JsonRpcServer.handleRPCConnection(JsonRpcServer.java:83)
at com.google.android.mobly.snippet.rpc.SimpleServer$ConnectionThread.run(SimpleServer.java:109)
Caused by: android.os.RemoteException: Remote stack trace:
at android.app.ContextImpl.enforce(ContextImpl.java:1897)
at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:1925)
at com.android.server.BluetoothManagerService.enable(BluetoothManagerService.java:1010)
at android.bluetooth.IBluetoothManager$Stub.onTransact(IBluetoothManager.java:264)
at android.os.Binder.execTransactInternal(Binder.java:1021)


[TwoDeviceTestBed] 08-01 15:51:46.189 INFO [Test] test_bluetooth_discovery ERROR
[TwoDeviceTestBed] 08-01 15:51:47.372 ERROR Failed to stop service "snippets".: <AndroidDevice|target> Failed to stop existing apk. Unexpected output: SNIPPET START, PROTOCOL 1 0

Process crashed before executing the test(s):
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/test/platform/io/OutputDirCalculator$outputDir$2;
at androidx.test.platform.io.OutputDirCalculator.(OutputDirCalculator.kt:27)
at androidx.test.platform.io.FileTestStorage.(FileTestStorage.java:45)
at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2335)
Caused by: java.lang.ClassNotFoundException: androidx.test.platform.io.OutputDirCalculator$outputDir$2
at java.lang.VMClassLoader.findLoadedClass(Native Method)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 6 more
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
... 6 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/~~Tr8pUIgkTc0Qd73d03hFTQ==/com.google.android.mobly.snippet.bundled-J6LCM__JilqZQkJm8IbC2Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~Tr8pUIgkTc0Qd73d03hFTQ==/com.google.android.mobly.snippet.bundled-J6LCM__JilqZQkJm8IbC2Q==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 6 more
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0
.
Traceback (most recent call last):
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\expects.py", line 152, in expect_no_raises
yield
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\service_manager.py", line 204, in stop_all
service.stop()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\services\snippet_management_service.py", line 116, in stop
client.stop()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\snippet_client_v2.py", line 575, in stop
self._stop_server()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\snippet_client_v2.py", line 623, in _stop_server
raise android_device_lib_errors.DeviceError(
mobly.controllers.android_device_lib.errors.DeviceError: <AndroidDevice|target> Failed to stop existing apk. Unexpected output: SNIPPET START, PROTOCOL 1 0

Process crashed before executing the test(s):
java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/test/platform/io/OutputDirCalculator$outputDir$2;
at androidx.test.platform.io.OutputDirCalculator.(OutputDirCalculator.kt:27)
at androidx.test.platform.io.FileTestStorage.(FileTestStorage.java:45)
at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2335)
Caused by: java.lang.ClassNotFoundException: androidx.test.platform.io.OutputDirCalculator$outputDir$2
at java.lang.VMClassLoader.findLoadedClass(Native Method)
at java.lang.ClassLoader.findLoadedClass(ClassLoader.java:738)
at java.lang.ClassLoader.loadClass(ClassLoader.java:363)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 6 more
Caused by: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
... 6 more
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/~~Tr8pUIgkTc0Qd73d03hFTQ==/com.google.android.mobly.snippet.bundled-J6LCM__JilqZQkJm8IbC2Q==/base.apk"],nativeLibraryDirectories=[/data/app/~~Tr8pUIgkTc0Qd73d03hFTQ==/com.google.android.mobly.snippet.bundled-J6LCM__JilqZQkJm8IbC2Q==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:259)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 6 more
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0
.
[TwoDeviceTestBed] 08-01 15:51:50.063 ERROR Failed to stop service "snippets".: <AndroidDevice|discoverer> Failed to stop existing apk. Unexpected output: SNIPPET START, PROTOCOL 1 0

Process crashed before executing the test(s):
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
at androidx.test.platform.io.FileTestStorage.(FileTestStorage.java:45)
at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2196)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/com.google.android.mobly.snippet.bundled-Llnm2jvJYPEv3_aTJQHXDA==/base.apk"],nativeLibraryDirectories=[/data/app/com.google.android.mobly.snippet.bundled-Llnm2jvJYPEv3_aTJQHXDA==/lib/arm, /system/lib, /product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 5 more
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0
.
Traceback (most recent call last):
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\expects.py", line 152, in expect_no_raises
yield
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\service_manager.py", line 204, in stop_all
service.stop()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\services\snippet_management_service.py", line 116, in stop
client.stop()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\snippet_client_v2.py", line 575, in stop
self._stop_server()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\snippet_client_v2.py", line 623, in _stop_server
raise android_device_lib_errors.DeviceError(
mobly.controllers.android_device_lib.errors.DeviceError: <AndroidDevice|discoverer> Failed to stop existing apk. Unexpected output: SNIPPET START, PROTOCOL 1 0

Process crashed before executing the test(s):
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
at androidx.test.platform.io.FileTestStorage.(FileTestStorage.java:45)
at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2196)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/com.google.android.mobly.snippet.bundled-Llnm2jvJYPEv3_aTJQHXDA==/base.apk"],nativeLibraryDirectories=[/data/app/com.google.android.mobly.snippet.bundled-Llnm2jvJYPEv3_aTJQHXDA==/lib/arm, /system/lib, /product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 5 more
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0
.
[TwoDeviceTestBed] 08-01 15:51:50.142 INFO Summary for test class HelloWorldTest: Error 2, Executed 1, Failed 0, Passed 0, Requested 1, Skipped 0
[TwoDeviceTestBed] 08-01 15:51:50.142 INFO Summary for test run TwoDeviceTestBed@08-01-2023_15-51-14-886:
Total time elapsed 35.21022209999501s
Artifacts are saved in "C:\tmp\logs\mobly\TwoDeviceTestBed\08-01-2023_15-51-14-886"
Test summary saved in "C:\tmp\logs\mobly\TwoDeviceTestBed\08-01-2023_15-51-14-886\test_summary.yaml"
Test results: Error 2, Executed 1, Failed 0, Passed 0, Requested 1, Skipped 0

crash

11-19 23:15:16.149 23670 23693 E AndroidRuntime: FATAL EXCEPTION: Instr: com.google.android.mobly.snippet.SnippetRunner
11-19 23:15:16.149 23670 23693 E AndroidRuntime: Process: com.google.android.mobly.snippet.bundled, PID: 23670
11-19 23:15:16.149 23670 23693 E AndroidRuntime: java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at androidx.test.platform.io.FileTestStorage.(FileTestStorage.java:45)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2248)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/~~pumoH_B8Pq6TeL8W9c4saA==/com.google.android.mobly.snippet.bundled-mBslDUDQqX-NyGAqC10LQQ==/base.apk"],nativeLibraryDirectories=[/data/app/~~pumoH_B8Pq6TeL8W9c4saA==/com.google.android.mobly.snippet.bundled-mBslDUDQqX-NyGAqC10LQQ==/lib/arm64, /system/lib64, /system/system_ext/lib64]]
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:218)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
11-19 23:15:16.149 23670 23693 E AndroidRuntime: ... 5 more
11-19 23:15:16.150 23670 23693 W OOMEventManagerFK: Failed to mkdir /data/mqsas/hprof/

gradle deprecation warnings

The setTestClassesDir(File) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the setTestClassesDirs(FileCollection) method instead.
The getTestClassesDir() method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the getTestClassesDirs() method instead.
The ConfigurableReport.setDestination(Object) method has been deprecated and is scheduled to be removed in Gradle 5.0. Please use the method ConfigurableReport.setDestination(File) instead.

Synchronize Rpc calls

We should probably synchronize all the Rpc methods unless there's a valid use case for one to be not synchronized.

Complete basic APIs in BluetoothAdapterSnippet

Currently the BluetoothAdapterSnippet only has enable/disable APIs.
We need to add more functionalities like the following:

  • Make self discoverable
  • Conduct a discover and find nearby discoverable devices
  • Pair with another device
  • Connect to another device
  • List paired devices
  • List connected devices

Script 'scripts/snippet_shell.py' not found

Hello, when I am tring to run "snippet_shell.py com.google.android.mobly.snippet.bundled" by following the instructions, I met error below:
pkg_resources.ResolutionError: Script 'scripts/snippet_shell.py' not found in metadata at '/usr/local/lib/python3.7/site-packages/mobly-1.9.1.dist-info'

What can I fix this problem?

Thanks,
Wolfgao

Add makeToast

Add an rpc that makes a toast on the screen. This serves as an easy way to make sure the bundled snippet functions.

App crash while executing clean up functionality.

App crash while executing clean up functionality.

Stack Trace:

[SampleTestBed] 08-01 09:24:24.006 ERROR Failed to stop service "snippets".: <AndroidDevice|TE630A2ZM16101724> Failed to stop existing apk. Unexpected output: SNIPPET START, PROTOCOL 1 0

Process crashed before executing the test(s):
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
at androidx.test.platform.io.FileTestStorage.(FileTestStorage.java:45)
at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2196)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/com.google.android.mobly.snippet.bundled-vJW7Lks7eh1YfxKG6Nsi0A==/base.apk"],nativeLibraryDirectories=[/data/app/com.google.android.mobly.snippet.bundled-vJW7Lks7eh1YfxKG6Nsi0A==/lib/arm, /system/lib, /product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 5 more
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0
.
Traceback (most recent call last):
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\expects.py", line 152, in expect_no_raises
yield
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\service_manager.py", line 204, in stop_all
service.stop()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\services\snippet_management_service.py", line 116, in stop
client.stop()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\snippet_client_v2.py", line 575, in stop
self._stop_server()
File "C:\Users\Phani.Ranjan.AD\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\LocalCache\local-packages\Python311\site-packages\mobly\controllers\android_device_lib\snippet_client_v2.py", line 623, in _stop_server
raise android_device_lib_errors.DeviceError(
mobly.controllers.android_device_lib.errors.DeviceError: <AndroidDevice|TE630A2ZM16101724> Failed to stop existing apk. Unexpected output: SNIPPET START, PROTOCOL 1 0

Process crashed before executing the test(s):
java.lang.NoClassDefFoundError: Failed resolution of: Lkotlin/jvm/internal/Lambda;
at androidx.test.platform.io.FileTestStorage.(FileTestStorage.java:45)
at androidx.test.runner.AndroidJUnitRunner.registerTestStorage(AndroidJUnitRunner.java:664)
at androidx.test.runner.AndroidJUnitRunner.onStart(AndroidJUnitRunner.java:441)
at com.google.android.mobly.snippet.SnippetRunner.onStart(SnippetRunner.java:139)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:2196)
Caused by: java.lang.ClassNotFoundException: Didn't find class "kotlin.jvm.internal.Lambda" on path: DexPathList[[zip file "/data/app/com.google.android.mobly.snippet.bundled-vJW7Lks7eh1YfxKG6Nsi0A==/base.apk"],nativeLibraryDirectories=[/data/app/com.google.android.mobly.snippet.bundled-vJW7Lks7eh1YfxKG6Nsi0A==/lib/arm, /system/lib, /product/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:196)
at java.lang.ClassLoader.loadClass(ClassLoader.java:379)
at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
... 5 more
INSTRUMENTATION_RESULT: shortMsg=Process crashed.
INSTRUMENTATION_CODE: 0

Test Logs:
test_log.zip

Document a test strategy for new snippets

With this PR #158, there is a question "What are the breakages from bumping the targetSDK?"

It would be good to have a pattern for new snippets at least, to demonstrate that the snippet works on some particular device.

Useful when

  • changing the code of the snippet
  • changing the build such as targetSdk
  • testing against some new device

Bluetooth pairing fails when using two android devices

When using btPairDevice(), the PairingBroadcastReceiver (automatic pairing confirmation) is only registered for the device from which the paring request is started. However, since the corresponding confirmation, for successful pairing must be confirmed on both devices, the PairingBroadcastReceiver must also be registered for the second device.

@Rpc(description = "Pair with a bluetooth device.")
public void btPairDevice(String deviceAddress) throws Throwable {
BluetoothDevice device = mDiscoveryResults.get(deviceAddress);
if (device == null) {
throw new NoSuchElementException(
"No device with address "
+ deviceAddress
+ " has been discovered. Cannot proceed.");
}
mContext.registerReceiver(
new PairingBroadcastReceiver(mContext), PairingBroadcastReceiver.filter);
if (!(boolean) Utils.invokeByReflection(device, "createBond")) {
throw new BluetoothAdapterSnippetException(
"Failed to initiate the pairing process to device: " + deviceAddress);
}
if (!Utils.waitUntil(() -> device.getBondState() == BluetoothDevice.BOND_BONDED, 120)) {
throw new BluetoothAdapterSnippetException(
"Failed to pair with device " + deviceAddress + " after 2min.");
}
}

My solution for this problem was implementing a additional Rpc-function which is only used to register the broadcast receiver for any device as required.

public void btStartPairingBroadcastReceiver () {
    mContext.registerReceiver(new PairingBroadcastReceiver(mContext), PairingBroadcastReceiver.filter);
}

Failed to add Gmail account

I've tried to add gmail account but some error occurs:

Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "C:\SCS\anaconda3\lib\site-packages\mobly-1.9.1-py3.7.egg\mobly\controllers\android_device_lib\jsonrpc_client_base.py", line 355, in rpc_call
    return self._rpc(name, *args)
  File "C:\SCS\anaconda3\lib\site-packages\mobly-1.9.1-py3.7.egg\mobly\controllers\android_device_lib\jsonrpc_client_base.py", line 326, in _rpc
    raise ApiError(self._ad, result['error'])
mobly.controllers.android_device_lib.jsonrpc_client_base.ApiError: <AndroidDevice|5200b9494d8c749d>
-------------- Java Stacktrace ---------------
android.accounts.AuthenticatorException: Sign in failed with status UNKNOWN_ERROR
        at android.accounts.AccountManager.convertErrorToException(AccountManager.java:2533)
        at android.accounts.AccountManager.access$700(AccountManager.java:167)
        at android.accounts.AccountManager$AmsTask$Response.onError(AccountManager.java:2369)
        at android.accounts.IAccountManagerResponse$Stub.onTransact(IAccountManagerResponse.java:70)
        at android.os.Binder.execTransact(Binder.java:739)

Disconnect/Connect with A2DP & Call profiles

Hello,

Currently there is an A2DP snippet, which controls whether media playback(Media audio in BT settings) is connected/disconnected. But in my device BT settings (Samsung Galaxy S9), there is also a setting to connect/disconnect Call audio. Is there a profile that we can use to connect/disconnect all profiles (A2DP & calls) through snippet? That would be very useful.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.