Compare commits

..
22 Commits
Author SHA1 Message Date
butomo1989 0ea71ea6b8 Refactored auto-recording function 2017-10-30 20:42:36 +01:00
butomo1989 08ff64d950 Fixed docker-compose volume 2017-10-30 20:41:27 +01:00
butomo1989 fcffca21ff Fixed error due to file name 2017-10-27 21:02:00 +02:00
butomo1989 95adfd1fbd Installed jq 2017-10-27 21:00:10 +02:00
butomo1989 5029d33528 Fixed error 2017-10-27 20:59:19 +02:00
Budi UtomoandGitHub c9ab42ecfb Merge pull request #28 from thelittlefireman/master
fix file error when start/stop/start container
2017-08-01 16:16:12 +02:00
thelittlefiremanandGitHub 7c48af9b84 fix codacy-bot warrning 2017-08-01 10:30:04 +02:00
thelittlefiremanandGitHub e1d6e3cdbe delete useless code 2017-07-31 15:58:38 +02:00
thelittlefiremanandGitHub 648010d519 delete useless code 2017-07-31 15:56:50 +02:00
thelittlefiremanandGitHub 9d3cb60f41 add unit test last case 2017-07-31 15:28:33 +02:00
thelittlefiremanandGitHub e2ad6b75d2 add unit test to symlink_force 2017-07-31 15:12:46 +02:00
thelittlefiremanandGitHub 486fb5825b fix bad python impl 2017-07-29 22:51:36 +02:00
thelittlefiremanandGitHub e56eb0e3ab fix : file already exist on start and stop container 2017-07-28 22:45:34 +02:00
thelittlefiremanandGitHub 6fe6a80f40 Merge pull request #1 from thelittlefireman/thelittlefireman-fix-files-already-exist
fix python error when files already exist
2017-07-28 15:15:08 +02:00
thelittlefiremanandGitHub f7b30c3129 fix python error when files already exist
related to :
```
  File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main                                                                                                                                 
    "__main__", mod_spec)                                                                                                                                                                              
  File "/usr/lib/python3.5/runpy.py", line 85, in _run_code                                                                                                                                            
    exec(code, run_globals)                                                                                                                                                                            
  File "/root/src/app.py", line 189, in <module>                                                                                                                                                       
    run()                                                                                                                                                                                              
  File "/root/src/app.py", line 178, in run                                                                                                                                                            
    prepare_avd(device, avd_name)                                                                                                                                                                      
  File "/root/src/app.py", line 74, in prepare_avd                                                                                                                                                     
    os.symlink(os.path.join(skin_rsc_path, s), os.path.join(skin_dst_path, s))                                                                                                                         
FileExistsError: [Errno 17] File exists: '/root/devices/skins/galaxy_nexus' -> '/root/platforms/android-25/skins/galaxy_nexus'                                                                         
Traceback (most recent call last):                                                                                                                                                                     
  File "/usr/lib/python3.5/runpy.py", line 184, in _run_module_as_main                                                                                                                                 
    "__main__", mod_spec)                                                                                                                                                                              
  File "/usr/lib/python3.5/runpy.py", line 85, in _run_code                                                                                                                                            
    exec(code, run_globals)                                                                                                                                                                            
  File "/root/src/app.py", line 189, in <module>                                                                                                                                                       
    run()                                                                                                                                                                                              
  File "/root/src/app.py", line 178, in run                                                                                                                                                            
    prepare_avd(device, avd_name)                                                                                                                                                                      
  File "/root/src/app.py", line 74, in prepare_avd                                                                                                                                                     
    os.symlink(os.path.join(skin_rsc_path, s), os.path.join(skin_dst_path, s))                                                                                                                         
FileExistsError: [Errno 17] File exists: '/root/devices/skins/galaxy_nexus' -> '/root/platforms/android-25/skins/galaxy_nexus' 
```
2017-07-28 15:13:45 +02:00
butomo1989 b6a1a57bed Enable video recording 2017-07-14 20:40:14 +02:00
butomo1989 83baa09384 Fixed not expected error in supervisor 2017-07-13 18:55:32 +02:00
Budi UtomoandGitHub 8a69c64de3 Merge pull request #22 from andrcuns/real_device_mirroring
Real device mirroring
2017-07-08 23:57:52 +02:00
Andrejs Cunskis 488e53149c Release script for image with real device support 2017-07-07 23:46:04 +03:00
Andrejs Cunskis 2bc30edf4c Add support for real device and screen mirroring 2017-07-03 22:50:37 +03:00
butomo1989 8d544448f1 All badges in one line 2017-06-29 09:05:56 +02:00
The Gitter BadgerandBudi Utomo f7b560a28b Add Gitter badge (#19) 2017-06-29 09:04:05 +02:00
15 changed files with 335 additions and 18 deletions
+4 -1
View File
@@ -6,4 +6,7 @@
.coverage
coverage.xml
xunit.xml
coverage/*
coverage/*
# Video
video*
+6 -6
View File
@@ -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
View File
@@ -1,6 +1,7 @@
Docker-Android
==============
[![Join the chat at https://gitter.im/butomo1989/docker-android](https://badges.gitter.im/butomo1989/docker-android.svg)](https://gitter.im/butomo1989/docker-android?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
[![Build Status](https://travis-ci.org/butomo1989/docker-android.svg?branch=master)](https://travis-ci.org/butomo1989/docker-android)
[![codecov](https://codecov.io/gh/butomo1989/docker-android/branch/master/graph/badge.svg)](https://codecov.io/gh/butomo1989/docker-android)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/3f000ffb97db45a59161814e1434c429)](https://www.codacy.com/app/butomo1989/docker-appium?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=butomo1989/docker-appium&amp;utm_campaign=Badge_Grade)
+11 -3
View File
@@ -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
+10
View File
@@ -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/*
#=======
@@ -100,6 +109,7 @@ ENV DISPLAY=:0 \
LOCAL_PORT=5900 \
TARGET_PORT=6080 \
TIMEOUT=1 \
VIDEO_PATH=/tmp/video \
LOG_PATH=/var/log/supervisor
#===============
+10
View File
@@ -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 \
@@ -113,6 +122,7 @@ ENV DISPLAY=:0 \
LOCAL_PORT=5900 \
TARGET_PORT=6080 \
TIMEOUT=1 \
VIDEO_PATH=/tmp/video \
LOG_PATH=/var/log/supervisor
#===============
+117 -1
View File
@@ -1 +1,117 @@
# TODO
FROM appium/appium:1.6.6-beta-p0
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
+48
View File
@@ -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
+10 -2
View File
@@ -4,6 +4,7 @@ import json
import logging
import os
import subprocess
import errno
from src import CONFIG_FILE, ROOT, CHROME_DRIVER
from src import log
@@ -11,6 +12,13 @@ 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:
if e.errno == errno.EEXIST:
os.remove(link_name)
os.symlink(target, link_name)
def get_or_raise(env: str) -> str:
"""
@@ -71,7 +79,7 @@ def prepare_avd(device: str, avd_name: str):
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))
symlink_force(os.path.join(skin_rsc_path, s), os.path.join(skin_dst_path, s))
# Hardware and its skin
device_name_bash = device.replace(' ', '\ ')
@@ -85,7 +93,7 @@ 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)
+13
View File
@@ -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
+8
View File
@@ -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
+47
View File
@@ -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!"
}
$@
+17
View File
@@ -10,6 +10,23 @@ from src import app
class TestApp(TestCase):
"""Unit test class to test other methods in the app."""
#create symlink
@classmethod
def test_symlink_correct(self):
os.mknod(os.path.join("./","testFile1.txt"))
app.symlink_force(os.path.join("./","testFile1.txt"),os.path.join("./","link_testFile1.txt"))
os.remove(os.path.join("./","testFile1.txt"))
os.remove(os.path.join("./","link_testFile1.txt"))
#link already exist
@classmethod
def test_symlink_already_exist(self):
os.mknod(os.path.join("./","testFile2.txt"))
os.mknod(os.path.join("./","link_testFile2.txt"))
app.symlink_force(os.path.join("./","testFile2.txt"),os.path.join("./","link_testFile2.txt"))
os.remove(os.path.join("./","testFile2.txt"))
os.remove(os.path.join("./","link_testFile2.txt"))
def test_valid_env(self):
key = 'ENV_1'
os.environ[key] = 'test'
+24 -1
View File
@@ -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
+9 -4
View File
@@ -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