blob: 5d68e341fd3395f53c664f10f78225153b7335a8 [file] [log] [blame] [view]
# Standalone Snippet App Example
This tutorial shows you how to create a standalone Mobly snippet app. To create
a snippet app that controls (instruments) another app under test, please see
[Example 2](../ex2_espresso/README.md).
## Tutorial
1. Use Android Studio to create a new app project.
1. Link against Mobly Snippet Lib in your `build.gradle` file
```
dependencies {
implementation 'com.google.android.mobly:mobly-snippet-lib:1.3.1'
}
```
1. Write a Java class implementing `Snippet` and add methods to trigger the
behaviour that you want. Annotate them with `@Rpc`
```java
package com.my.app;
...
public class ExampleSnippet implements Snippet {
@Rpc(description='Returns a string containing the given number.')
public String getFoo(Integer input) {
return "foo " + input;
}
@Override
public void shutdown() {}
}
```
1. Add any classes that implement the `Snippet` interface in your
`AndroidManifest.xml` application section as `meta-data`
```xml
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app">
<application>
<meta-data
android:name="mobly-snippets"
android:value="com.my.app.test.MySnippet1,
com.my.app.test.MySnippet2" />
...
```
1. Add an `instrumentation` tag to your `AndroidManifest.xml` so that the
framework can launch your server through an `instrument` command.
```xml
<manifest
xmlns:android="http://schemas.android.com/apk/res/android"
package="com.my.app">
<application>...</application>
<instrumentation
android:name="com.google.android.mobly.snippet.ServerRunner"
android:targetPackage="com.my.app" />
</manifest>
```
1. Build your apk and install it on your phone
1. In your Mobly python test, connect to your snippet .apk in `setup_class`
```python
class HelloWorldTest(base_test.BaseTestClass):
def setup_class(self):
self.ads = self.register_controller(android_device)
self.dut1 = self.ads[0]
self.dut1.load_snippet(name='snippet', package='com.my.app.test')
```
6. Invoke your needed functionality within your test
```python
def test_get_foo(self):
actual_foo = self.dut1.snippet.getFoo(5)
asserts.assert_equal("foo 5", actual_foo)
```
## Running the example code
This folder contains a fully working example of a standalone snippet apk.
1. Compile the example
./gradlew examples:ex1_standalone_app:assembleDebug
1. Install the apk on your phone
adb install -r ./examples/ex1_standalone_app/build/outputs/apk/debug/ex1_standalone_app-debug.apk
1. Use `snippet_shell` from mobly to trigger `getFoo()`:
snippet_shell.py com.google.android.mobly.snippet.example1
>>> print(s.help())
Known methods:
getBar(String) returns String // Returns the given string with the prefix "bar"
getFoo(Integer) returns String // Returns the given integer with the prefix "foo"
>>> s.getFoo(5)
u'foo 5'