fix android unit tests and add better macos instructions
This commit is contained in:
		
							
								
								
									
										81
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										81
									
								
								README.md
									
									
									
									
									
								
							@@ -16,10 +16,13 @@ Development of Veilid on GNU/Linux requires a Debian variant such as Debian
 | 
			
		||||
itself, Ubuntu or Mint. Pull requests to support other distributions would be
 | 
			
		||||
welcome!
 | 
			
		||||
 | 
			
		||||
Development requires the Android SDK and NDK be installed.
 | 
			
		||||
Running the setup script requires:
 | 
			
		||||
* Android SDK and NDK
 | 
			
		||||
* Rust
 | 
			
		||||
 | 
			
		||||
You may decide to use Android Studio to maintain your Android dependencies. If
 | 
			
		||||
so, use the dependency manager within your IDE. If you do so, you may skip to
 | 
			
		||||
You may decide to use Android Studio [here](https://developer.android.com/studio) 
 | 
			
		||||
to maintain your Android dependencies. If so, use the dependency manager 
 | 
			
		||||
within your IDE. If you do so, you may skip to 
 | 
			
		||||
[Run Veilid setup script](#Run Veilid setup script).
 | 
			
		||||
 | 
			
		||||
* build-tools;30.0.3
 | 
			
		||||
@@ -45,8 +48,9 @@ your path.
 | 
			
		||||
```shell
 | 
			
		||||
cat << EOF >> ~/.profile 
 | 
			
		||||
export ANDROID_SDK_ROOT=<path to sdk>
 | 
			
		||||
export ANDROID_NDK_HOME=<path to ndk>
 | 
			
		||||
export PATH=${ANDROID_SDK_ROOT}/platform-tools"
 | 
			
		||||
export ANDROID_NDK_HOME=$ANDROID_SDK_ROOT/ndk/22.0.7026061
 | 
			
		||||
export PATH=\$PATH:$ANDROID_SDK_ROOT/platform-tools
 | 
			
		||||
EOF
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Run Veilid setup script
 | 
			
		||||
@@ -60,7 +64,72 @@ pull the remaining Rust dependencies:
 | 
			
		||||
 | 
			
		||||
### macOS
 | 
			
		||||
 | 
			
		||||
**TODO**
 | 
			
		||||
Development of Veilid on MacOS is possible on both Intel and ARM hardware.
 | 
			
		||||
 | 
			
		||||
Development requires:
 | 
			
		||||
* Xcode, preferably latest version
 | 
			
		||||
* Homebrew [here](https://brew.sh)
 | 
			
		||||
* Android SDK and NDK
 | 
			
		||||
* Java 8
 | 
			
		||||
* Rust
 | 
			
		||||
 | 
			
		||||
You may decide to use Android Studio [here](https://developer.android.com/studio) 
 | 
			
		||||
to maintain your Android dependencies. If so, use the dependency manager 
 | 
			
		||||
within your IDE. If you do so, you may skip to 
 | 
			
		||||
[Run Veilid setup script](#Run Veilid setup script).
 | 
			
		||||
 | 
			
		||||
* build-tools;30.0.3
 | 
			
		||||
* ndk;22.0.7026061
 | 
			
		||||
* cmake;3.22.1
 | 
			
		||||
 | 
			
		||||
#### Setup Java
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
brew install openjdk@8
 | 
			
		||||
```
 | 
			
		||||
and then symlink it as appropriate for your system:
 | 
			
		||||
 | 
			
		||||
Intel:
 | 
			
		||||
```shell
 | 
			
		||||
sudo ln -sfn /usr/local/opt/openjdk@8/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-8.jdk
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
ARM:
 | 
			
		||||
```shell
 | 
			
		||||
sudo ln -sfn /opt/homebrew/openjdk@8/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-8.jdk
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#### Setup Dependencies using the CLI
 | 
			
		||||
 | 
			
		||||
Otherwise, you may choose to use Android `sdkmanager`. Use 
 | 
			
		||||
the command line to install the requisite package versions: `brew install android-commandlinetools`
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
sdkmanager --install "build-tools;30.0.3"
 | 
			
		||||
sdkmanager --install "ndk;22.0.7026061"
 | 
			
		||||
sdkmanager --install "cmake;3.22.1"
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
Export environment variables and add the Android SDK platform-tools directory to
 | 
			
		||||
your path.
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
cat << EOF >> ~/.zshenv
 | 
			
		||||
export ANDROID_SDK_ROOT=$HOME/Library/Android/sdk
 | 
			
		||||
export ANDROID_NDK_HOME=$HOME/Library/Android/sdk/ndk/22.0.7026061
 | 
			
		||||
export PATH=\$PATH:$HOME/Library/Android/sdk/platform-tools
 | 
			
		||||
EOF
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
#### Run Veilid setup script
 | 
			
		||||
 | 
			
		||||
Now you may run the MacOS setup script to check your development environment and
 | 
			
		||||
pull the remaining Rust dependencies:
 | 
			
		||||
 | 
			
		||||
```shell
 | 
			
		||||
./setup_macos.sh
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
### Windows
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@ else
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# ensure ANDROID_NDK_HOME is defined and exists
 | 
			
		||||
if [ -d "$ANDROID_NDK_HOME" ]; then
 | 
			
		||||
    echo '[X] $ANDROID_NDK_HOME is defined and exists' 
 | 
			
		||||
@@ -55,8 +54,24 @@ else
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure rustup is installed
 | 
			
		||||
if command -v rustup &> /dev/null; then 
 | 
			
		||||
    echo '[X] rustup is available in the path'
 | 
			
		||||
else
 | 
			
		||||
    echo 'rustup is not available in the path'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure cargo is installed
 | 
			
		||||
if command -v cargo &> /dev/null; then 
 | 
			
		||||
    echo '[X] cargo is available in the path'
 | 
			
		||||
else
 | 
			
		||||
    echo 'cargo is not available in the path'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# install targets
 | 
			
		||||
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
 | 
			
		||||
rustup target add aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android wasm32-unknown-unknown
 | 
			
		||||
 | 
			
		||||
# install cargo packages
 | 
			
		||||
cargo install wasm-bindgen-cli
 | 
			
		||||
 
 | 
			
		||||
@@ -6,17 +6,53 @@ if [ ! "$(uname)" == "Darwin" ]; then
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# install targets
 | 
			
		||||
rustup target add aarch64-apple-darwin aarch64-apple-ios x86_64-apple-darwin x86_64-apple-ios wasm32-unknown-unknown
 | 
			
		||||
# ensure ANDROID_SDK_ROOT is defined and exists
 | 
			
		||||
if [ -d "$ANDROID_SDK_ROOT" ]; then
 | 
			
		||||
    echo '[X] $ANDROID_SDK_ROOT is defined and exists' 
 | 
			
		||||
else
 | 
			
		||||
    echo '$ANDROID_SDK_ROOT is not defined or does not exist'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# install cargo packages
 | 
			
		||||
cargo install wasm-bindgen-cli
 | 
			
		||||
# ensure ANDROID_NDK_HOME is defined and exists
 | 
			
		||||
if [ -d "$ANDROID_NDK_HOME" ]; then
 | 
			
		||||
    echo '[X] $ANDROID_NDK_HOME is defined and exists' 
 | 
			
		||||
else
 | 
			
		||||
    echo '$ANDROID_NDK_HOME is not defined or does not exist'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# install bitcode compatible ios toolchain
 | 
			
		||||
# echo Manual Step:
 | 
			
		||||
# echo   install +ios-arm64-1.57.0 toolchain for bitcode from https://github.com/getditto/rust-bitcode/releases/latest and unzip
 | 
			
		||||
# echo   xattr -d -r com.apple.quarantine .
 | 
			
		||||
# echo   ./install.sh
 | 
			
		||||
# ensure ndk is installed
 | 
			
		||||
if [ -f "$ANDROID_NDK_HOME/ndk-build" ]; then
 | 
			
		||||
    echo '[X] Android NDK is installed at the location $ANDROID_NDK_HOME' 
 | 
			
		||||
else
 | 
			
		||||
    echo 'Android NDK is not installed at the location $ANDROID_NDK_HOME'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure cmake is installed
 | 
			
		||||
if [ -d "$ANDROID_SDK_ROOT/cmake" ]; then
 | 
			
		||||
    echo '[X] Android SDK CMake is installed' 
 | 
			
		||||
else
 | 
			
		||||
    echo 'Android SDK CMake is not installed'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure emulator is installed
 | 
			
		||||
if [ -d "$ANDROID_SDK_ROOT/emulator" ]; then
 | 
			
		||||
    echo '[X] Android SDK emulator is installed' 
 | 
			
		||||
else
 | 
			
		||||
    echo 'Android SDK emulator is not installed'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure adb is installed
 | 
			
		||||
if command -v adb &> /dev/null; then 
 | 
			
		||||
    echo '[X] adb is available in the path'
 | 
			
		||||
else
 | 
			
		||||
    echo 'adb is not available in the path'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure brew is installed
 | 
			
		||||
if command -v brew &> /dev/null; then 
 | 
			
		||||
@@ -34,6 +70,34 @@ else
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure rustup is installed
 | 
			
		||||
if command -v rustup &> /dev/null; then 
 | 
			
		||||
    echo '[X] rustup is available in the path'
 | 
			
		||||
else
 | 
			
		||||
    echo 'rustup is not available in the path'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# ensure cargo is installed
 | 
			
		||||
if command -v cargo &> /dev/null; then 
 | 
			
		||||
    echo '[X] cargo is available in the path'
 | 
			
		||||
else
 | 
			
		||||
    echo 'cargo is not available in the path'
 | 
			
		||||
    exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# install targets
 | 
			
		||||
rustup target add aarch64-apple-darwin aarch64-apple-ios x86_64-apple-darwin x86_64-apple-ios wasm32-unknown-unknown aarch64-linux-android armv7-linux-androideabi i686-linux-android x86_64-linux-android
 | 
			
		||||
 | 
			
		||||
# install cargo packages
 | 
			
		||||
cargo install wasm-bindgen-cli
 | 
			
		||||
 | 
			
		||||
# install bitcode compatible ios toolchain
 | 
			
		||||
# echo Manual Step:
 | 
			
		||||
# echo   install +ios-arm64-1.57.0 toolchain for bitcode from https://github.com/getditto/rust-bitcode/releases/latest and unzip
 | 
			
		||||
# echo   xattr -d -r com.apple.quarantine .
 | 
			
		||||
# echo   ./install.sh
 | 
			
		||||
 | 
			
		||||
# ensure we have command line tools
 | 
			
		||||
xcode-select --install
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -385,14 +385,6 @@ impl NetworkInterfaces {
 | 
			
		||||
        inner.interface_address_cache.clone()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn with_best_addresses<F, R>(&self, f: F) -> R
 | 
			
		||||
    where
 | 
			
		||||
        F: FnOnce(&[IpAddr]) -> R,
 | 
			
		||||
    {
 | 
			
		||||
        let inner = self.inner.lock();
 | 
			
		||||
        f(&inner.interface_address_cache)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    /////////////////////////////////////////////
 | 
			
		||||
 | 
			
		||||
    fn cache_best_addresses(inner: &mut NetworkInterfacesInner) {
 | 
			
		||||
 
 | 
			
		||||
@@ -268,9 +268,8 @@ impl Network {
 | 
			
		||||
        if !from.ip().is_unspecified() {
 | 
			
		||||
            vec![*from]
 | 
			
		||||
        } else {
 | 
			
		||||
            self.unlocked_inner
 | 
			
		||||
                .interfaces
 | 
			
		||||
                .best_addresses()
 | 
			
		||||
            let addrs = self.get_usable_interface_addresses();
 | 
			
		||||
            addrs
 | 
			
		||||
                .iter()
 | 
			
		||||
                .filter_map(|a| {
 | 
			
		||||
                    // We create sockets that are only ipv6 or ipv6 (not dual, so only translate matching unspecified address)
 | 
			
		||||
@@ -311,11 +310,21 @@ impl Network {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn with_interface_addresses<F, R>(&self, f: F) -> R
 | 
			
		||||
    where
 | 
			
		||||
        F: FnOnce(&[IpAddr]) -> R,
 | 
			
		||||
    {
 | 
			
		||||
        self.unlocked_inner.interfaces.with_best_addresses(f)
 | 
			
		||||
    pub fn is_usable_interface_address(&self, addr: IpAddr) -> bool {
 | 
			
		||||
        let usable_addrs = self.get_usable_interface_addresses();
 | 
			
		||||
        usable_addrs.contains(&addr)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn get_usable_interface_addresses(&self) -> Vec<IpAddr> {
 | 
			
		||||
        let addrs = self.unlocked_inner.interfaces.best_addresses();
 | 
			
		||||
        let addrs: Vec<IpAddr> = addrs
 | 
			
		||||
            .into_iter()
 | 
			
		||||
            .filter(|addr| {
 | 
			
		||||
                let address = Address::from_ip_addr(*addr);
 | 
			
		||||
                address.is_local() || address.is_global()
 | 
			
		||||
            })
 | 
			
		||||
            .collect();
 | 
			
		||||
        addrs
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    // See if our interface addresses have changed, if so we need to punt the network
 | 
			
		||||
@@ -591,7 +600,7 @@ impl Network {
 | 
			
		||||
        {
 | 
			
		||||
            let mut inner = self.inner.lock();
 | 
			
		||||
            inner.enable_ipv4 = false;
 | 
			
		||||
            for addr in self.unlocked_inner.interfaces.best_addresses() {
 | 
			
		||||
            for addr in self.get_usable_interface_addresses() {
 | 
			
		||||
                if addr.is_ipv4() {
 | 
			
		||||
                    log_net!(debug "enable address {:?} as ipv4", addr);
 | 
			
		||||
                    inner.enable_ipv4 = true;
 | 
			
		||||
 
 | 
			
		||||
@@ -332,14 +332,15 @@ impl Network {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // See if this public address is also a local interface address we haven't registered yet
 | 
			
		||||
                let is_interface_address = self.with_interface_addresses(|ip_addrs| {
 | 
			
		||||
                    for ip_addr in ip_addrs {
 | 
			
		||||
                        if pdi_addr.ip() == *ip_addr {
 | 
			
		||||
                let is_interface_address = (|| {
 | 
			
		||||
                    for ip_addr in self.get_usable_interface_addresses() {
 | 
			
		||||
                        if pdi_addr.ip() == ip_addr {
 | 
			
		||||
                            return true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    false
 | 
			
		||||
                });
 | 
			
		||||
                })();
 | 
			
		||||
 | 
			
		||||
                if !local_dial_info_list.contains(&pdi) && is_interface_address {
 | 
			
		||||
                    routing_table.register_dial_info(
 | 
			
		||||
                        RoutingDomain::LocalNetwork,
 | 
			
		||||
@@ -428,15 +429,9 @@ impl Network {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // See if this public address is also a local interface address
 | 
			
		||||
                let is_interface_address = self.with_interface_addresses(|ip_addrs| {
 | 
			
		||||
                    for ip_addr in ip_addrs {
 | 
			
		||||
                        if gsa.ip() == *ip_addr {
 | 
			
		||||
                            return true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    false
 | 
			
		||||
                });
 | 
			
		||||
                if !registered_addresses.contains(&gsa.ip()) && is_interface_address {
 | 
			
		||||
                if !registered_addresses.contains(&gsa.ip())
 | 
			
		||||
                    && self.is_usable_interface_address(gsa.ip())
 | 
			
		||||
                {
 | 
			
		||||
                    routing_table.register_dial_info(
 | 
			
		||||
                        RoutingDomain::LocalNetwork,
 | 
			
		||||
                        pdi,
 | 
			
		||||
@@ -559,15 +554,9 @@ impl Network {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // See if this public address is also a local interface address
 | 
			
		||||
                let is_interface_address = self.with_interface_addresses(|ip_addrs| {
 | 
			
		||||
                    for ip_addr in ip_addrs {
 | 
			
		||||
                        if gsa.ip() == *ip_addr {
 | 
			
		||||
                            return true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    false
 | 
			
		||||
                });
 | 
			
		||||
                if !registered_addresses.contains(&gsa.ip()) && is_interface_address {
 | 
			
		||||
                if !registered_addresses.contains(&gsa.ip())
 | 
			
		||||
                    && self.is_usable_interface_address(gsa.ip())
 | 
			
		||||
                {
 | 
			
		||||
                    routing_table.register_dial_info(
 | 
			
		||||
                        RoutingDomain::LocalNetwork,
 | 
			
		||||
                        pdi,
 | 
			
		||||
@@ -679,15 +668,7 @@ impl Network {
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                // See if this public address is also a local interface address
 | 
			
		||||
                let is_interface_address = self.with_interface_addresses(|ip_addrs| {
 | 
			
		||||
                    for ip_addr in ip_addrs {
 | 
			
		||||
                        if pdi_addr.ip() == *ip_addr {
 | 
			
		||||
                            return true;
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    false
 | 
			
		||||
                });
 | 
			
		||||
                if is_interface_address {
 | 
			
		||||
                if self.is_usable_interface_address(pdi_addr.ip()) {
 | 
			
		||||
                    routing_table.register_dial_info(
 | 
			
		||||
                        RoutingDomain::LocalNetwork,
 | 
			
		||||
                        pdi,
 | 
			
		||||
 
 | 
			
		||||
@@ -282,15 +282,12 @@ impl Network {
 | 
			
		||||
        trace!("network stopped");
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub fn with_interface_addresses<F, R>(&self, f: F) -> R
 | 
			
		||||
    where
 | 
			
		||||
        F: FnOnce(&[IpAddr]) -> R,
 | 
			
		||||
    {
 | 
			
		||||
        f(&[])
 | 
			
		||||
    pub fn is_usable_interface_address(&self, addr: IpAddr) -> bool {
 | 
			
		||||
        false
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    pub async fn check_interface_addresses(&self) -> EyreResult<bool> {
 | 
			
		||||
        Ok(false)
 | 
			
		||||
    pub fn get_usable_interface_addresses(&self) -> Vec<IpAddr> {
 | 
			
		||||
        Vec::new()
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    //////////////////////////////////////////
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										3
									
								
								veilid-core/src/tests/android/.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								veilid-core/src/tests/android/.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							@@ -8,14 +8,13 @@
 | 
			
		||||
        <option name="disableWrapperSourceDistributionNotification" value="true" />
 | 
			
		||||
        <option name="distributionType" value="DEFAULT_WRAPPED" />
 | 
			
		||||
        <option name="externalProjectPath" value="$PROJECT_DIR$" />
 | 
			
		||||
        <option name="gradleJvm" value="1.8" />
 | 
			
		||||
        <option name="gradleJvm" value="Embedded JDK" />
 | 
			
		||||
        <option name="modules">
 | 
			
		||||
          <set>
 | 
			
		||||
            <option value="$PROJECT_DIR$" />
 | 
			
		||||
            <option value="$PROJECT_DIR$/app" />
 | 
			
		||||
          </set>
 | 
			
		||||
        </option>
 | 
			
		||||
        <option name="resolveModulePerSourceSet" value="false" />
 | 
			
		||||
      </GradleProjectSettings>
 | 
			
		||||
    </option>
 | 
			
		||||
  </component>
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								veilid-core/src/tests/android/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								veilid-core/src/tests/android/.idea/misc.xml
									
									
									
										generated
									
									
									
								
							@@ -1,6 +1,6 @@
 | 
			
		||||
<?xml version="1.0" encoding="UTF-8"?>
 | 
			
		||||
<project version="4">
 | 
			
		||||
  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
 | 
			
		||||
  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" project-jdk-name="1.8" project-jdk-type="JavaSDK">
 | 
			
		||||
    <output url="file://$PROJECT_DIR$/build/classes" />
 | 
			
		||||
  </component>
 | 
			
		||||
  <component name="ProjectType">
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										20
									
								
								veilid-core/src/tests/android/adb+.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										20
									
								
								veilid-core/src/tests/android/adb+.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,20 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
# Script adb+
 | 
			
		||||
# Usage
 | 
			
		||||
# You can run any command adb provide on all your current devices
 | 
			
		||||
# ./adb+ <command> is the equivalent of ./adb -s <serial number> <command>
 | 
			
		||||
#
 | 
			
		||||
# Examples
 | 
			
		||||
# ./adb+ version
 | 
			
		||||
# ./adb+ install apidemo.apk
 | 
			
		||||
# ./adb+ uninstall com.example.android.apis
 | 
			
		||||
 | 
			
		||||
adb devices | while read line
 | 
			
		||||
do
 | 
			
		||||
    if [ ! "$line" = "" ] && [ `echo $line | awk '{print $2}'` = "device" ]
 | 
			
		||||
    then
 | 
			
		||||
        device=`echo $line | awk '{print $1}'`
 | 
			
		||||
        echo "$device $@ ..."
 | 
			
		||||
        adb -s $device $@
 | 
			
		||||
    fi
 | 
			
		||||
done
 | 
			
		||||
@@ -67,6 +67,7 @@ cargo {
 | 
			
		||||
    targetDirectory = "../../../../../target"
 | 
			
		||||
    prebuiltToolchains = true
 | 
			
		||||
    profile = gradle.startParameter.taskNames.any{it.toLowerCase().contains("debug")} ? "debug" : "release"
 | 
			
		||||
    pythonCommand = "python3"
 | 
			
		||||
    features {
 | 
			
		||||
        defaultAnd("android_tests", "rt-tokio")
 | 
			
		||||
    }
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										2
									
								
								veilid-core/src/tests/android/install_on_all_devices.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								veilid-core/src/tests/android/install_on_all_devices.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
./gradlew installDebug
 | 
			
		||||
							
								
								
									
										3
									
								
								veilid-core/src/tests/android/remove_from_all_devices.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										3
									
								
								veilid-core/src/tests/android/remove_from_all_devices.sh
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,3 @@
 | 
			
		||||
#!/bin/bash
 | 
			
		||||
./adb+.sh uninstall com.veilid.veilidcore.veilidcore_android_tests
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user