mirror of
https://github.com/budtmo/docker-android.git
synced 2026-07-31 04:07:25 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e27b2e5fdf | ||
|
|
fdd4a86c40 | ||
|
|
15012fd3b4 | ||
|
|
1f440e1a07 | ||
|
|
567a494ccb | ||
|
|
d28c4dc5e0 | ||
|
|
7a052b7e2f | ||
|
|
988397318f | ||
|
|
0d6356ba47 | ||
|
|
0ea71ea6b8 | ||
|
|
08ff64d950 | ||
|
|
fcffca21ff | ||
|
|
95adfd1fbd | ||
|
|
5029d33528 | ||
|
|
c9ab42ecfb | ||
|
|
7c48af9b84 | ||
|
|
e1d6e3cdbe | ||
|
|
648010d519 | ||
|
|
9d3cb60f41 | ||
|
|
e2ad6b75d2 | ||
|
|
486fb5825b | ||
|
|
e56eb0e3ab | ||
|
|
6fe6a80f40 | ||
|
|
f7b30c3129 | ||
|
|
1062da3dcc | ||
|
|
c431118465 | ||
|
|
b6a1a57bed | ||
|
|
83baa09384 | ||
|
|
8a69c64de3 | ||
|
|
488e53149c | ||
|
|
2bc30edf4c | ||
|
|
8d544448f1 | ||
|
|
f7b560a28b |
+4
-1
@@ -6,4 +6,7 @@
|
||||
.coverage
|
||||
coverage.xml
|
||||
xunit.xml
|
||||
coverage/*
|
||||
coverage/*
|
||||
|
||||
# Video
|
||||
video*
|
||||
|
||||
+6
-6
@@ -11,12 +11,12 @@ services:
|
||||
install: "pip install -r requirements.txt"
|
||||
|
||||
env:
|
||||
matrix:
|
||||
- ANDROID_VERSION=5.0.1
|
||||
- ANDROID_VERSION=5.1.1
|
||||
- ANDROID_VERSION=6.0
|
||||
- ANDROID_VERSION=7.0
|
||||
- ANDROID_VERSION=7.1.1
|
||||
- ANDROID_VERSION=5.0.1
|
||||
- ANDROID_VERSION=5.1.1
|
||||
- ANDROID_VERSION=6.0
|
||||
- ANDROID_VERSION=7.0
|
||||
- ANDROID_VERSION=7.1.1
|
||||
- REAL_DEVICE=True
|
||||
|
||||
script: bash travis.sh
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
Docker-Android
|
||||
==============
|
||||
|
||||
[](https://gitter.im/butomo1989/docker-android?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||
[](https://travis-ci.org/butomo1989/docker-android)
|
||||
[](https://codecov.io/gh/butomo1989/docker-android)
|
||||
[](https://www.codacy.com/app/butomo1989/docker-appium?utm_source=github.com&utm_medium=referral&utm_content=butomo1989/docker-appium&utm_campaign=Badge_Grade)
|
||||
@@ -27,7 +28,9 @@ Advantages compare with other docker-android projects
|
||||
2. Emulator for different devices / skins, such as Samsung Galaxy S6, LG Nexus 4, HTC Nexus One and more.
|
||||
3. Ability to connect to Selenium Grid
|
||||
4. Ability to control emulator from outside container by using adb connect
|
||||
5. Open source with more features coming (monkey test, support real devices with screen mirroring and video recording)
|
||||
5. Support real devices with screen mirroring
|
||||
6. Ability to record video during test execution for debugging
|
||||
7. Open source with more features coming
|
||||
|
||||
List of Docker images
|
||||
---------------------
|
||||
@@ -44,6 +47,7 @@ List of Docker images
|
||||
|OSX / Windows|6.0|23|butomo1989/docker-android-arm-6.0|[](https://microbadger.com/images/butomo1989/docker-android-arm-6.0 "Get your own image badge on microbadger.com")|
|
||||
|OSX / Windows|7.0|24|butomo1989/docker-android-arm-7.0|[](https://microbadger.com/images/butomo1989/docker-android-arm-7.0 "Get your own image badge on microbadger.com")|
|
||||
|OSX / Windows|7.1.1|25|butomo1989/docker-android-arm-7.1.1|[](https://microbadger.com/images/butomo1989/docker-android-arm-7.1.1 "Get your own image badge on microbadger.com")|
|
||||
|All |-|-|butomo1989/docker-android-real-device|[](https://microbadger.com/images/butomo1989/docker-android-real-device "Get your own image badge on microbadger.com")|
|
||||
|
||||
List of Devices
|
||||
---------------
|
||||
@@ -126,6 +130,10 @@ If you want to use appium to test UI of your android application, you need to sh
|
||||
docker run --privileged -d -p 6080:6080 -p 4723:4723 -p 5554:5554 -p 5555:5555 -v $PWD/example/sample_apk:/root/tmp -e DEVICE="Nexus 5" -e APPIUM=True -e CONNECT_TO_GRID=True -e APPIUM_HOST="127.0.0.1" -e APPIUM_PORT=4723 -e SELENIUM_HOST="172.17.0.1" -e SELENIUM_PORT=4444 --name android-container butomo1989/docker-android-x86-7.1.1
|
||||
```
|
||||
|
||||
### Video Recording
|
||||
|
||||
You can deactivate auto_record by changing the value to "False" in docker-compose file. e.g. change value to "False" in this [line].
|
||||
|
||||
### Docker-Compose
|
||||
|
||||
![][compose]
|
||||
@@ -201,6 +209,7 @@ docker exec -it android-container tail -f /var/log/supervisor/docker-android.std
|
||||
[docker android nexus]: <images/docker_android_nexus.png>
|
||||
[compose]: <images/compose.png>
|
||||
[connected_devices]: <images/connected_devices.png>
|
||||
[line]: <https://github.com/butomo1989/docker-android/blob/master/docker-compose.yml#L30>
|
||||
[example of compose file]: <docker-compose.yml>
|
||||
[docker-compose]: <https://docs.docker.com/compose/install/>
|
||||
[1.13.0]: <https://github.com/docker/compose/releases/tag/1.13.0>
|
||||
|
||||
Regular → Executable
+11
-3
@@ -14,18 +14,20 @@ services:
|
||||
nexus_7.1.1:
|
||||
image: butomo1989/docker-android-x86-7.1.1
|
||||
privileged: true
|
||||
# Change path of apk that you want to test. I use sample_apk that I provide in folder "example"
|
||||
volumes:
|
||||
- $PWD/example/sample_apk:/root/tmp
|
||||
# Increase scale number if needed
|
||||
scale: 1
|
||||
ports:
|
||||
- 6080
|
||||
# Change path of apk that you want to test. I use sample_apk that I provide in folder "example"
|
||||
volumes:
|
||||
- $PWD/example/sample_apk:/root/tmp
|
||||
- ./video-nexus_7.1.1:/tmp/video
|
||||
environment:
|
||||
- DEVICE=Nexus 5
|
||||
- CONNECT_TO_GRID=True
|
||||
- APPIUM=true
|
||||
- SELENIUM_HOST=selenium_hub
|
||||
- AUTO_RECORD=True
|
||||
|
||||
# Docker-Android for mobile website testing with chrome browser
|
||||
# Chrome browser exists only for version 7.0 and 7.1.1
|
||||
@@ -36,12 +38,15 @@ services:
|
||||
scale: 1
|
||||
ports:
|
||||
- 6080
|
||||
volumes:
|
||||
- ./video-samsung_7.1.1:/tmp/video
|
||||
environment:
|
||||
- DEVICE=Samsung Galaxy S6
|
||||
- CONNECT_TO_GRID=True
|
||||
- APPIUM=true
|
||||
- SELENIUM_HOST=selenium_hub
|
||||
- MOBILE_WEB_TEST=True
|
||||
- AUTO_RECORD=True
|
||||
|
||||
# Docker-Android for mobile website testing with default browser
|
||||
# Default browser exists only for version 5.0.1, 5.1.1 and 6.0
|
||||
@@ -52,9 +57,12 @@ services:
|
||||
scale: 1
|
||||
ports:
|
||||
- 6080
|
||||
volumes:
|
||||
- ./video-samsung_5.1.1:/tmp/video
|
||||
environment:
|
||||
- DEVICE=Samsung Galaxy S6
|
||||
- CONNECT_TO_GRID=True
|
||||
- APPIUM=true
|
||||
- SELENIUM_HOST=selenium_hub
|
||||
- MOBILE_WEB_TEST=True
|
||||
- AUTO_RECORD=True
|
||||
|
||||
+16
-4
@@ -1,4 +1,4 @@
|
||||
FROM appium/appium:1.6.6-beta-p0
|
||||
FROM appium/appium:1.7.1-p1
|
||||
|
||||
LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
|
||||
|
||||
@@ -29,6 +29,13 @@ WORKDIR /root
|
||||
# Numpy, For faster performance: https://github.com/novnc/websockify/issues/77
|
||||
# net-tools
|
||||
# Netstat
|
||||
#------------------
|
||||
# Video Recording
|
||||
#------------------
|
||||
# ffmpeg
|
||||
# Video recorder
|
||||
# jq
|
||||
# Sed for JSON data
|
||||
#==================
|
||||
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
||||
xterm \
|
||||
@@ -39,6 +46,8 @@ RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
||||
menu \
|
||||
python-numpy \
|
||||
net-tools \
|
||||
ffmpeg \
|
||||
jq \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
#=======
|
||||
@@ -74,10 +83,12 @@ ENV ANDROID_VERSION=$ANDROID_VERSION \
|
||||
IMG_TYPE=$IMG_TYPE \
|
||||
BROWSER=$BROWSER
|
||||
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
|
||||
|
||||
RUN echo y | sdkmanager "platforms;android-${API_LEVEL}" && \
|
||||
echo y | sdkmanager "system-images;android-${API_LEVEL};${IMG_TYPE};${SYS_IMG}" && \
|
||||
echo y | sdkmanager "emulator"
|
||||
RUN rm ${ANDROID_HOME}/tools/emulator \
|
||||
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
||||
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
|
||||
&& ln -s ${ANDROID_HOME}/emulator/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
||||
ENV LD_LIBRARY_PATH=$ANDROID_HOME/emulator/lib64:$ANDROID_HOME/emulator/lib64/qt/lib
|
||||
|
||||
#==============================================
|
||||
# Download chrome driver v2.26
|
||||
@@ -100,6 +111,7 @@ ENV DISPLAY=:0 \
|
||||
LOCAL_PORT=5900 \
|
||||
TARGET_PORT=6080 \
|
||||
TIMEOUT=1 \
|
||||
VIDEO_PATH=/tmp/video \
|
||||
LOG_PATH=/var/log/supervisor
|
||||
|
||||
#===============
|
||||
|
||||
+17
-4
@@ -1,4 +1,4 @@
|
||||
FROM appium/appium:1.6.6-beta-p0
|
||||
FROM appium/appium:1.7.1-p1
|
||||
|
||||
LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
|
||||
|
||||
@@ -30,6 +30,13 @@ WORKDIR /root
|
||||
# net-tools
|
||||
# Netstat
|
||||
#------------------
|
||||
# Video Recording
|
||||
#------------------
|
||||
# ffmpeg
|
||||
# Video recorder
|
||||
# jq
|
||||
# Sed for JSON data
|
||||
#------------------
|
||||
# KVM Package
|
||||
# for emulator x86
|
||||
# https://help.ubuntu.com/community/KVM/Installation
|
||||
@@ -48,6 +55,8 @@ RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
||||
menu \
|
||||
python-numpy \
|
||||
net-tools \
|
||||
ffmpeg \
|
||||
jq \
|
||||
qemu-kvm \
|
||||
libvirt-bin \
|
||||
ubuntu-vm-builder \
|
||||
@@ -87,10 +96,13 @@ ENV ANDROID_VERSION=$ANDROID_VERSION \
|
||||
IMG_TYPE=$IMG_TYPE \
|
||||
BROWSER=$BROWSER
|
||||
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
|
||||
|
||||
RUN echo y | sdkmanager "platforms;android-${API_LEVEL}" && \
|
||||
echo y | sdkmanager "system-images;android-${API_LEVEL};${IMG_TYPE};${SYS_IMG}" && \
|
||||
echo y | sdkmanager "emulator"
|
||||
RUN rm ${ANDROID_HOME}/tools/emulator \
|
||||
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
||||
RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
|
||||
&& ln -s ${ANDROID_HOME}/emulator/emulator64-${PROCESSOR} ${ANDROID_HOME}/tools/emulator
|
||||
ENV LD_LIBRARY_PATH=$ANDROID_HOME/emulator/lib64:$ANDROID_HOME/emulator/lib64/qt/lib
|
||||
|
||||
|
||||
#==============================================
|
||||
# Download chrome driver v2.26
|
||||
@@ -113,6 +125,7 @@ ENV DISPLAY=:0 \
|
||||
LOCAL_PORT=5900 \
|
||||
TARGET_PORT=6080 \
|
||||
TIMEOUT=1 \
|
||||
VIDEO_PATH=/tmp/video \
|
||||
LOG_PATH=/var/log/supervisor
|
||||
|
||||
#===============
|
||||
|
||||
+117
-1
@@ -1 +1,117 @@
|
||||
# TODO
|
||||
FROM appium/appium:1.7.1-p1
|
||||
|
||||
LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
|
||||
|
||||
#=============
|
||||
# Set WORKDIR
|
||||
#=============
|
||||
WORKDIR /root
|
||||
|
||||
#==================
|
||||
# General Packages
|
||||
#------------------
|
||||
# xterm
|
||||
# Terminal emulator
|
||||
# supervisor
|
||||
# Process manager
|
||||
# socat
|
||||
# Port forwarder
|
||||
#------------------
|
||||
# NoVNC Packages
|
||||
#------------------
|
||||
# x11vnc
|
||||
# VNC server for X display
|
||||
# openbox
|
||||
# Windows manager
|
||||
# menu
|
||||
# Debian menu
|
||||
# python-numpy
|
||||
# Numpy, For faster performance: https://github.com/novnc/websockify/issues/77
|
||||
# net-tools
|
||||
# Netstat
|
||||
#------------------
|
||||
# Video Recording
|
||||
#------------------
|
||||
# ffmpeg
|
||||
# Video recorder
|
||||
# jq
|
||||
# Sed for JSON data
|
||||
#==================
|
||||
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
|
||||
xterm \
|
||||
supervisor \
|
||||
socat \
|
||||
x11vnc \
|
||||
openbox \
|
||||
menu \
|
||||
python-numpy \
|
||||
net-tools \
|
||||
ffmpeg \
|
||||
jq \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
#=======
|
||||
# noVNC
|
||||
# Use same commit id that docker-selenium uses
|
||||
# https://github.com/elgalu/docker-selenium/blob/236b861177bd2917d864e52291114b1f5e4540d7/Dockerfile#L412-L413
|
||||
#=======
|
||||
ENV NOVNC_SHA="b403cb92fb8de82d04f305b4f14fa978003890d7" \
|
||||
WEBSOCKIFY_SHA="558a6439f14b0d85a31145541745e25c255d576b"
|
||||
RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}.zip" \
|
||||
&& unzip -x noVNC.zip \
|
||||
&& rm noVNC.zip \
|
||||
&& mv noVNC-${NOVNC_SHA} noVNC \
|
||||
&& wget -nv -O websockify.zip "https://github.com/kanaka/websockify/archive/${WEBSOCKIFY_SHA}.zip" \
|
||||
&& unzip -x websockify.zip \
|
||||
&& mv websockify-${WEBSOCKIFY_SHA} ./noVNC/utils/websockify \
|
||||
&& rm websockify.zip \
|
||||
&& ln noVNC/vnc_auto.html noVNC/index.html
|
||||
|
||||
#==============================================
|
||||
# Download Adb remote screen
|
||||
#==============================================
|
||||
RUN wget -nv -O asm.zip "http://adakoda.github.io/android-screen-monitor/download/3.0.0/ASM_3_00.zip" \
|
||||
&& unzip asm.zip \
|
||||
&& rm asm.zip
|
||||
|
||||
#================================================
|
||||
# noVNC Default Configurations
|
||||
# These Configurations can be changed through -e
|
||||
#================================================
|
||||
ENV DISPLAY=:0 \
|
||||
SCREEN=0 \
|
||||
SCREEN_WIDTH=1600 \
|
||||
SCREEN_HEIGHT=900 \
|
||||
SCREEN_DEPTH=16 \
|
||||
LOCAL_PORT=5900 \
|
||||
TARGET_PORT=6080 \
|
||||
TIMEOUT=1 \
|
||||
VIDEO_PATH=/tmp/video \
|
||||
LOG_PATH=/var/log/supervisor
|
||||
|
||||
#=========================
|
||||
# Set default variables
|
||||
#=========================
|
||||
ENV REAL_DEVICE=True
|
||||
ENV BROWSER=android
|
||||
|
||||
#===============
|
||||
# Expose Ports
|
||||
#---------------
|
||||
# 4723
|
||||
# Appium port
|
||||
# 6080
|
||||
# noVNC port
|
||||
# 5555
|
||||
# ADB connection port
|
||||
#===============
|
||||
EXPOSE 4723 6080 5555
|
||||
|
||||
#===================
|
||||
# Run docker-appium
|
||||
#===================
|
||||
COPY src /root/src
|
||||
COPY supervisord.conf /root/
|
||||
RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf
|
||||
|
||||
CMD /usr/bin/supervisord --configuration supervisord.conf
|
||||
|
||||
+1
-1
@@ -163,7 +163,7 @@ function build() {
|
||||
for v in "${versions[@]}"; do
|
||||
# Find image type and default web browser
|
||||
if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ]; then
|
||||
IMG_TYPE=android
|
||||
IMG_TYPE=default
|
||||
BROWSER=browser
|
||||
elif [ "$v" == "6.0" ]; then
|
||||
# It is because there is no ARM EABI v7a System Image for 6.0
|
||||
|
||||
@@ -0,0 +1,48 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
read -p "Task (build|push|all) : " TASK
|
||||
else
|
||||
TASK=$1
|
||||
fi
|
||||
|
||||
if [ -z "$2" ]; then
|
||||
read -p "Release version: " RELEASE
|
||||
else
|
||||
RELEASE=$2
|
||||
fi
|
||||
|
||||
IMAGE="butomo1989/docker-android"
|
||||
FILE_NAME=docker/Real_device
|
||||
|
||||
image_version="$IMAGE-real-device:$RELEASE"
|
||||
image_latest="$IMAGE-real-device:latest"
|
||||
|
||||
function build() {
|
||||
echo "[BUILD] Image name: $image_version and $image_latest"
|
||||
echo "[BUILD] Dockerfile: $FILE_NAME"
|
||||
docker build -t $image_version -f $FILE_NAME .
|
||||
docker tag $image_version $image_latest
|
||||
}
|
||||
|
||||
function push() {
|
||||
echo "[PUSH] Image name: $image_version and $image_latest"
|
||||
docker push $image_version
|
||||
docker push $image_latest
|
||||
}
|
||||
|
||||
case $TASK in
|
||||
build)
|
||||
build
|
||||
;;
|
||||
push)
|
||||
push
|
||||
;;
|
||||
all)
|
||||
build
|
||||
push
|
||||
;;
|
||||
*)
|
||||
echo "Invalid environment! Valid options: test, build, push, all"
|
||||
;;
|
||||
esac
|
||||
+27
-20
@@ -5,13 +5,23 @@ import logging
|
||||
import os
|
||||
import subprocess
|
||||
|
||||
from src import CONFIG_FILE, ROOT, CHROME_DRIVER
|
||||
from src import CHROME_DRIVER, CONFIG_FILE, ROOT
|
||||
from src import log
|
||||
|
||||
log.init()
|
||||
logger = logging.getLogger('app')
|
||||
|
||||
|
||||
def symlink_force(target, link_name):
|
||||
try:
|
||||
os.symlink(target, link_name)
|
||||
except OSError as e:
|
||||
import errno
|
||||
if e.errno == errno.EEXIST:
|
||||
os.remove(link_name)
|
||||
os.symlink(target, link_name)
|
||||
|
||||
|
||||
def get_or_raise(env: str) -> str:
|
||||
"""
|
||||
Check if needed environment variables are given.
|
||||
@@ -61,22 +71,9 @@ def prepare_avd(device: str, avd_name: str):
|
||||
:param device: Device name
|
||||
:param avd_name: Name of android virtual device / emulator
|
||||
"""
|
||||
cmd = 'echo no | android create avd -f -n {name} -t android-{api} -b {img_type}{sys_img}'.format(
|
||||
name=avd_name, api=API_LEVEL, img_type='google_apis/' if IMG_TYPE == 'google_apis' else '',
|
||||
sys_img=SYS_IMG)
|
||||
|
||||
# Link emulator skins
|
||||
skin_rsc_path = os.path.join(ROOT, 'devices', 'skins')
|
||||
logger.info('Skin ressource path: {rsc}'.format(rsc=skin_rsc_path))
|
||||
skin_dst_path = os.path.join(ANDROID_HOME, 'platforms', 'android-{api}'.format(api=API_LEVEL), 'skins')
|
||||
logger.info('Skin destination path: {dst}'.format(dst=skin_dst_path))
|
||||
for s in os.listdir(skin_rsc_path):
|
||||
os.symlink(os.path.join(skin_rsc_path, s), os.path.join(skin_dst_path, s))
|
||||
|
||||
# Hardware and its skin
|
||||
device_name_bash = device.replace(' ', '\ ')
|
||||
skin_name = device.replace(' ', '_').lower()
|
||||
logger.info('Device name in bash: {db}, Skin name: {skin}'.format(db=device_name_bash, skin=skin_name))
|
||||
|
||||
# For custom hardware profile
|
||||
profile_dst_path = os.path.join(ROOT, '.android', 'devices.xml')
|
||||
@@ -85,12 +82,21 @@ def prepare_avd(device: str, avd_name: str):
|
||||
profile_src_path = os.path.join(ROOT, 'devices', 'profiles', '{profile}.xml'.format(profile=skin_name))
|
||||
logger.info('Hardware profile resource path: {rsc}'.format(rsc=profile_src_path))
|
||||
logger.info('Hardware profile destination path: {dst}'.format(dst=profile_dst_path))
|
||||
os.symlink(profile_src_path, profile_dst_path)
|
||||
symlink_force(profile_src_path, profile_dst_path)
|
||||
|
||||
# Append command
|
||||
cmd += ' -d {device} -s {skin}'.format(device=device_name_bash, skin=skin_name)
|
||||
logger.info('AVD creation command: {cmd}'.format(cmd=cmd))
|
||||
subprocess.check_call(cmd, shell=True)
|
||||
avd_path = '/'.join([ANDROID_HOME, 'android_emulator'])
|
||||
creation_cmd = 'avdmanager create avd -f -n {name} -b {img_type}/{sys_img} -k "system-images;android-{api_lvl};' \
|
||||
'{img_type};{sys_img}" -d {device} -p {path}'.format(name=avd_name, img_type=IMG_TYPE, sys_img=SYS_IMG,
|
||||
api_lvl=API_LEVEL, device=device_name_bash,
|
||||
path=avd_path)
|
||||
logger.info('Command to create avd: {command}'.format(command=creation_cmd))
|
||||
subprocess.check_call(creation_cmd, shell=True)
|
||||
|
||||
skin_path = '/'.join([ANDROID_HOME, 'devices', 'skins', skin_name])
|
||||
config_path = '/'.join([avd_path, 'config.ini'])
|
||||
with open(config_path, 'a') as file:
|
||||
file.write('skin.path={sp}'.format(sp=skin_path))
|
||||
logger.info('Skin was added in config.ini')
|
||||
|
||||
|
||||
def appium_run(avd_name: str):
|
||||
@@ -176,8 +182,9 @@ def run():
|
||||
|
||||
logger.info('Preparing emulator...')
|
||||
prepare_avd(device, avd_name)
|
||||
|
||||
logger.info('Run emulator...')
|
||||
cmd = 'emulator -avd {name}'.format(name=avd_name)
|
||||
cmd = 'emulator -avd {name} -gpu off'.format(name=avd_name)
|
||||
subprocess.Popen(cmd.split())
|
||||
|
||||
appium = convert_str_to_bool(str(os.getenv('APPIUM', False)))
|
||||
|
||||
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ -z $REAL_DEVICE ]; then
|
||||
python3 -m src.app
|
||||
else
|
||||
CMD="appium"
|
||||
if [ ! -z "$CONNECT_TO_GRID" ]; then
|
||||
NODE_CONFIG_JSON="/root/src/nodeconfig.json"
|
||||
/root/generate_config.sh $NODE_CONFIG_JSON
|
||||
CMD+=" --nodeconfig $NODE_CONFIG_JSON"
|
||||
fi
|
||||
$CMD
|
||||
fi
|
||||
@@ -0,0 +1,8 @@
|
||||
#!/bin/bash
|
||||
|
||||
if [ -z "$REAL_DEVICE"]; then
|
||||
echo "Container is using android emulator"
|
||||
else
|
||||
echo "Starting android screen mirro..."
|
||||
java -jar /root/asm.jar $ANDROID_HOME
|
||||
fi
|
||||
@@ -0,0 +1,47 @@
|
||||
#!/bin/bash
|
||||
|
||||
function start() {
|
||||
mkdir -p $VIDEO_PATH
|
||||
name="$(date '+%d_%m_%Y_%H_%M_%S').mp4"
|
||||
echo "Start video recording"
|
||||
ffmpeg -video_size 1599x899 -framerate 15 -f x11grab -i $DISPLAY $VIDEO_PATH/$name -y
|
||||
}
|
||||
|
||||
function stop() {
|
||||
echo "Stop video recording"
|
||||
kill $(ps -ef | grep [f]fmpeg | awk '{print $2}')
|
||||
}
|
||||
|
||||
function auto_record() {
|
||||
echo "Auto record: $AUTO_RECORD"
|
||||
sleep 6
|
||||
|
||||
while [ $AUTO_RECORD == "True" ]; do
|
||||
# Check if there is test running
|
||||
no_test=true
|
||||
while $no_test; do
|
||||
task=$(curl -s localhost:4723/wd/hub/sessions | jq -r '.value')
|
||||
if [ "$task" == "" ] || [ "$task" == "[]" ]; then
|
||||
sleep .5
|
||||
else
|
||||
start &
|
||||
no_test=false
|
||||
fi
|
||||
done
|
||||
|
||||
# Check if test is finished
|
||||
while [ $no_test == false ]; do
|
||||
task=$(curl -s localhost:4723/wd/hub/sessions | jq -r '.value')
|
||||
if [ "$task" == "" ] || [ "$task" == "[]" ]; then
|
||||
stop
|
||||
no_test=true
|
||||
else
|
||||
sleep .5
|
||||
fi
|
||||
done
|
||||
done
|
||||
|
||||
echo "Auto recording is disabled!"
|
||||
}
|
||||
|
||||
$@
|
||||
@@ -10,6 +10,25 @@ from src import app
|
||||
class TestApp(TestCase):
|
||||
"""Unit test class to test other methods in the app."""
|
||||
|
||||
@classmethod
|
||||
def test_symlink(self):
|
||||
res = os.path.join('testFile1.txt')
|
||||
dest = os.path.join('link_testFile1.txt')
|
||||
open(res, 'a').close()
|
||||
app.symlink_force(res, dest)
|
||||
os.remove(res)
|
||||
os.remove(dest)
|
||||
|
||||
@classmethod
|
||||
def test_symlink_already_exist(self):
|
||||
res = os.path.join('testFile1.txt')
|
||||
dest = os.path.join('link_testFile1.txt')
|
||||
open(res, 'a').close()
|
||||
open(dest, 'a').close()
|
||||
app.symlink_force(res, dest)
|
||||
os.remove(res)
|
||||
os.remove(dest)
|
||||
|
||||
def test_valid_env(self):
|
||||
key = 'ENV_1'
|
||||
os.environ[key] = 'test'
|
||||
|
||||
+17
-21
@@ -8,34 +8,30 @@ from src import app
|
||||
|
||||
|
||||
@mock.patch('subprocess.check_call')
|
||||
@mock.patch('os.symlink')
|
||||
class TestAvd(TestCase):
|
||||
"""Unit test class to test method create_avd."""
|
||||
|
||||
def setUp(self):
|
||||
self.avd_name = 'test_avd'
|
||||
|
||||
def test_nexus_avd_as_default(self, mocked_suprocess, mocked_sys_link):
|
||||
with mock.patch('os.listdir') as mocked_list_dir:
|
||||
mocked_list_dir.return_value = ['file1', 'file2']
|
||||
self.assertFalse(mocked_list_dir.called)
|
||||
self.assertFalse(mocked_sys_link.called)
|
||||
self.assertFalse(mocked_suprocess.called)
|
||||
app.prepare_avd('Nexus 5', self.avd_name)
|
||||
self.assertTrue(mocked_list_dir.called)
|
||||
self.assertTrue(mocked_sys_link.called)
|
||||
self.assertTrue(mocked_suprocess.called)
|
||||
@mock.patch("builtins.open", create=True)
|
||||
def test_nexus_avd_as_default(self, mocked_suprocess, mocked_open):
|
||||
self.assertFalse(mocked_suprocess.called)
|
||||
self.assertFalse(mocked_open.called)
|
||||
app.prepare_avd('Nexus 5', self.avd_name)
|
||||
self.assertTrue(mocked_suprocess.called)
|
||||
self.assertTrue(mocked_open.called)
|
||||
|
||||
def test_samsung_avd(self, mocked_suprocess, mocked_sys_link):
|
||||
with mock.patch('os.listdir') as mocked_list_dir:
|
||||
mocked_list_dir.return_value = ['file1', 'file2']
|
||||
self.assertFalse(mocked_list_dir.called)
|
||||
self.assertFalse(mocked_sys_link.called)
|
||||
self.assertFalse(mocked_suprocess.called)
|
||||
app.prepare_avd('Samsung Galaxy S6', self.avd_name)
|
||||
self.assertTrue(mocked_list_dir.called)
|
||||
self.assertTrue(mocked_sys_link.called)
|
||||
self.assertTrue(mocked_suprocess.called)
|
||||
@mock.patch('os.symlink')
|
||||
@mock.patch("builtins.open", create=True)
|
||||
def test_samsung_avd(self, mocked_suprocess, mocked_sys_link, mocked_open):
|
||||
self.assertFalse(mocked_sys_link.called)
|
||||
self.assertFalse(mocked_suprocess.called)
|
||||
self.assertFalse(mocked_open.called)
|
||||
app.prepare_avd('Samsung Galaxy S6', self.avd_name)
|
||||
self.assertTrue(mocked_sys_link.called)
|
||||
self.assertTrue(mocked_suprocess.called)
|
||||
self.assertTrue(mocked_open.called)
|
||||
|
||||
def tearDown(self):
|
||||
if os.getenv('DEVICE'):
|
||||
|
||||
+24
-1
@@ -2,33 +2,56 @@
|
||||
nodaemon=true
|
||||
logfile=%(ENV_LOG_PATH)s/supervisord.log
|
||||
childlogdir=%(ENV_LOG_PATH)s
|
||||
priority=1
|
||||
|
||||
[program:xvfb]
|
||||
command=/usr/bin/Xvfb %(ENV_DISPLAY)s -screen %(ENV_SCREEN)s %(ENV_SCREEN_WIDTH)sx%(ENV_SCREEN_HEIGHT)sx%(ENV_SCREEN_DEPTH)s
|
||||
stdout_logfile=%(ENV_LOG_PATH)s/xvfb.stdout.log
|
||||
stderr_logfile=%(ENV_LOG_PATH)s/xvfb.stderr.log
|
||||
priority=1
|
||||
|
||||
[program:openbox]
|
||||
command=/usr/bin/openbox-session
|
||||
stdout_logfile=%(ENV_LOG_PATH)s/openbox.stdout.log
|
||||
stderr_logfile=%(ENV_LOG_PATH)s/openbox.stderr.log
|
||||
priority=2
|
||||
|
||||
[program:x11vnc]
|
||||
command=/usr/bin/x11vnc -display %(ENV_DISPLAY)s -nopw -forever -shared
|
||||
stdout_logfile=%(ENV_LOG_PATH)s/x11vnc.stdout.log
|
||||
stderr_logfile=%(ENV_LOG_PATH)s/x11vnc.stderr.log
|
||||
priority=2
|
||||
|
||||
[program:novnc]
|
||||
command=./noVNC/utils/launch.sh --vnc localhost:%(ENV_LOCAL_PORT)s --listen %(ENV_TARGET_PORT)s
|
||||
stdout_logfile=%(ENV_LOG_PATH)s/novnc.stdout.log
|
||||
stderr_logfile=%(ENV_LOG_PATH)s/novnc.stderr.log
|
||||
priority=2
|
||||
|
||||
[program:port-forward]
|
||||
command=./src/port_forward.sh
|
||||
autorestart=false
|
||||
priority=1
|
||||
|
||||
;startsecs to fix "not expected" error. see: https://github.com/Supervisor/supervisor/issues/212#issuecomment-47933372
|
||||
[program:android-screen-mirror]
|
||||
command=./src/asm.sh
|
||||
autorestart=false
|
||||
startsecs=0
|
||||
stdout_logfile=%(ENV_LOG_PATH)s/android-screen-mirror.stdout.log
|
||||
stderr_logfile=%(ENV_LOG_PATH)s/android-screen-mirror.stderr.log
|
||||
priority=3
|
||||
|
||||
[program:docker-appium]
|
||||
command=python3 -m src.app
|
||||
command=./src/appium.sh
|
||||
autorestart=false
|
||||
stdout_logfile=%(ENV_LOG_PATH)s/docker-android.stdout.log
|
||||
stderr_logfile=%(ENV_LOG_PATH)s/docker-android.stderr.log
|
||||
priority=4
|
||||
|
||||
[program:auto-recording]
|
||||
command=./src/record.sh auto_record
|
||||
autorestart=false
|
||||
stdout_logfile=%(ENV_LOG_PATH)s/video-recording.stdout.log
|
||||
stderr_logfile=%(ENV_LOG_PATH)s/video-recording.stderr.log
|
||||
priority=4
|
||||
|
||||
@@ -5,10 +5,15 @@ if [ -z "$TRAVIS_TAG" ]; then
|
||||
echo "UNIT TEST ONLY"
|
||||
bash release.sh test all all 0.1
|
||||
else
|
||||
echo "Log in to docker hub"
|
||||
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
|
||||
echo "[Version: $ANDROID_VERSION] RUN UNIT TEST, BUILD DOCKER IMAGES AND PUSH THOSE TO DOCKER HUB"
|
||||
bash release.sh all $ANDROID_VERSION all $TRAVIS_TAG
|
||||
if [ ! -z "$ANDROID_VERSION" ]; then
|
||||
echo "Log in to docker hub"
|
||||
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
|
||||
echo "[Version: $ANDROID_VERSION] RUN UNIT TEST, BUILD DOCKER IMAGES AND PUSH THOSE TO DOCKER HUB"
|
||||
bash release.sh all $ANDROID_VERSION all $TRAVIS_TAG
|
||||
elif [ ! -z "$REAL_DEVICE" ]; then
|
||||
echo "[SUPPORT FOR REAL DEVICE: BUILD DOCKER IMAGES AND PUSH THOSE TO DOCKER HUB ]"
|
||||
bash release_real.sh all $TRAVIS_TAG
|
||||
fi
|
||||
echo "Log out of docker hub"
|
||||
docker logout
|
||||
fi
|
||||
|
||||
Reference in New Issue
Block a user