Compare commits

..
34 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
butomo1989 0e578710f3 Automated all steps from PR #12 2017-06-14 15:06:01 +02:00
butomo1989 65df456066 Using docker-appium as base image 2017-06-14 15:04:19 +02:00
butomo1989 5b694c2c55 Fixed issue #13 regarding arm image for 6.0 2017-06-09 11:59:07 +02:00
AndrejsandBudi Utomo 6406504f94 Possibility to run appium with custom chromedriver executable (#12)
* Possibility to run appium with custom chromedriver executable
* Unit test added
* README update
2017-06-09 10:44:58 +02:00
butomo1989 b7c4538896 Downgraded selenium to be able to run E2E Tests 2017-06-02 16:55:51 +02:00
butomo1989 c7d988bd61 Refactored 2017-06-02 15:30:51 +02:00
butomo1989 47e968927a Updated Sample and End2End Tests 2017-06-02 14:49:55 +02:00
butomo1989 dcf196ec4a Run E2E Tests only if needed 2017-06-02 13:18:00 +02:00
butomo1989 aff1b062e1 Added End-2-End Test 2017-06-02 12:14:14 +02:00
butomo1989 59f6e4bd33 Mocked os package in unit tests to clear all warning messages 2017-05-30 17:25:07 +02:00
butomo1989 0b9af7e6b2 Using git tag for same docker images 2017-05-30 16:28:28 +02:00
butomo1989 d9b5f8d86c Using latest version of build tool 2017-05-30 16:26:09 +02:00
27 changed files with 591 additions and 189 deletions
+4 -1
View File
@@ -6,4 +6,7 @@
.coverage .coverage
coverage.xml coverage.xml
xunit.xml xunit.xml
coverage/* coverage/*
# Video
video*
+6 -6
View File
@@ -11,12 +11,12 @@ services:
install: "pip install -r requirements.txt" install: "pip install -r requirements.txt"
env: env:
matrix: - ANDROID_VERSION=5.0.1
- ANDROID_VERSION=5.0.1 - ANDROID_VERSION=5.1.1
- ANDROID_VERSION=5.1.1 - ANDROID_VERSION=6.0
- ANDROID_VERSION=6.0 - ANDROID_VERSION=7.0
- ANDROID_VERSION=7.0 - ANDROID_VERSION=7.1.1
- ANDROID_VERSION=7.1.1 - REAL_DEVICE=True
script: bash travis.sh script: bash travis.sh
+1
View File
@@ -1,6 +1,7 @@
Docker-Android 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) [![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) [![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) [![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: nexus_7.1.1:
image: butomo1989/docker-android-x86-7.1.1 image: butomo1989/docker-android-x86-7.1.1
privileged: true 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 # Increase scale number if needed
scale: 1 scale: 1
ports: ports:
- 6080 - 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: environment:
- DEVICE=Nexus 5 - DEVICE=Nexus 5
- CONNECT_TO_GRID=True - CONNECT_TO_GRID=True
- APPIUM=true - APPIUM=true
- SELENIUM_HOST=selenium_hub - SELENIUM_HOST=selenium_hub
- AUTO_RECORD=True
# Docker-Android for mobile website testing with chrome browser # Docker-Android for mobile website testing with chrome browser
# Chrome browser exists only for version 7.0 and 7.1.1 # Chrome browser exists only for version 7.0 and 7.1.1
@@ -36,12 +38,15 @@ services:
scale: 1 scale: 1
ports: ports:
- 6080 - 6080
volumes:
- ./video-samsung_7.1.1:/tmp/video
environment: environment:
- DEVICE=Samsung Galaxy S6 - DEVICE=Samsung Galaxy S6
- CONNECT_TO_GRID=True - CONNECT_TO_GRID=True
- APPIUM=true - APPIUM=true
- SELENIUM_HOST=selenium_hub - SELENIUM_HOST=selenium_hub
- MOBILE_WEB_TEST=True - MOBILE_WEB_TEST=True
- AUTO_RECORD=True
# Docker-Android for mobile website testing with default browser # Docker-Android for mobile website testing with default browser
# Default browser exists only for version 5.0.1, 5.1.1 and 6.0 # Default browser exists only for version 5.0.1, 5.1.1 and 6.0
@@ -52,9 +57,12 @@ services:
scale: 1 scale: 1
ports: ports:
- 6080 - 6080
volumes:
- ./video-samsung_5.1.1:/tmp/video
environment: environment:
- DEVICE=Samsung Galaxy S6 - DEVICE=Samsung Galaxy S6
- CONNECT_TO_GRID=True - CONNECT_TO_GRID=True
- APPIUM=true - APPIUM=true
- SELENIUM_HOST=selenium_hub - SELENIUM_HOST=selenium_hub
- MOBILE_WEB_TEST=True - MOBILE_WEB_TEST=True
- AUTO_RECORD=True
+22 -49
View File
@@ -1,6 +1,6 @@
FROM ubuntu:16.04 FROM appium/appium:1.6.6-beta-p0
ENV DEBIAN_FRONTEND noninteractive LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
#============= #=============
# Set WORKDIR # Set WORKDIR
@@ -10,29 +10,15 @@ WORKDIR /root
#================== #==================
# General Packages # General Packages
#------------------ #------------------
# wget
# Network downloader
# unzip
# Unzip zip file
# curl
# Transfer data from or to a server
# xterm # xterm
# Terminal emulator # Terminal emulator
# supervisor # supervisor
# Process manager # Process manager
# openjdk-8-jdk
# Java
# libqt5webkit5
# Web content engine (Fix issue in Android)
# socat # socat
# Port forwarder # Port forwarder
# libgconf-2-4
# Required package for chrome and chromedriver to run on Linux
#------------------ #------------------
# NoVNC Packages # NoVNC Packages
#------------------ #------------------
# xvfb
# X virtual framebuffer
# x11vnc # x11vnc
# VNC server for X display # VNC server for X display
# openbox # openbox
@@ -43,23 +29,25 @@ WORKDIR /root
# Numpy, For faster performance: https://github.com/novnc/websockify/issues/77 # Numpy, For faster performance: https://github.com/novnc/websockify/issues/77
# net-tools # net-tools
# Netstat # Netstat
#------------------
# Video Recording
#------------------
# ffmpeg
# Video recorder
# jq
# Sed for JSON data
#================== #==================
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \ RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
wget \
unzip \
curl \
xterm \ xterm \
supervisor \ supervisor \
openjdk-8-jdk \
libqt5webkit5 \
socat \ socat \
libgconf-2-4 \
xvfb \
x11vnc \ x11vnc \
openbox \ openbox \
menu \ menu \
python-numpy \ python-numpy \
net-tools \ net-tools \
ffmpeg \
jq \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
#======= #=======
@@ -79,52 +67,36 @@ RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}
&& rm websockify.zip \ && rm websockify.zip \
&& ln noVNC/vnc_auto.html noVNC/index.html && ln noVNC/vnc_auto.html noVNC/index.html
#=====================
# Install Android SDK
#=====================
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
ENV PATH ${PATH}:${JAVA_HOME}/bin
ENV SDK_VERSION=25.2.3 \
ANDROID_HOME=/root
RUN wget -nv -O android.zip https://dl.google.com/android/repository/tools_r${SDK_VERSION}-linux.zip \
&& unzip android.zip && rm android.zip
ENV PATH ${PATH}:${ANDROID_HOME}/tools
RUN echo y | android update sdk --no-ui -a --filter platform-tools
ENV PATH ${PATH}:${ANDROID_HOME}/platform-tools
#====================================
# Install latest nodejs, npm, appium
#====================================
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - \
&& apt-get -qqy update && apt-get -qqy install nodejs && rm -rf /var/lib/apt/lists/*
ENV APPIUM_VERSION 1.6.3
RUN npm install -g appium@$APPIUM_VERSION && npm cache clean
#====================== #======================
# Install SDK packages # Install SDK packages
#====================== #======================
ARG ANDROID_VERSION=5.0.1 ARG ANDROID_VERSION=5.0.1
ARG BUILD_TOOL=25.0.3
ARG API_LEVEL=21 ARG API_LEVEL=21
ARG PROCESSOR=x86 ARG PROCESSOR=x86
ARG SYS_IMG=x86_64 ARG SYS_IMG=x86_64
ARG IMG_TYPE=google_apis ARG IMG_TYPE=google_apis
ARG BROWSER=android ARG BROWSER=android
ENV ANDROID_VERSION=$ANDROID_VERSION \ ENV ANDROID_VERSION=$ANDROID_VERSION \
BUILD_TOOL=$BUILD_TOOL \
API_LEVEL=$API_LEVEL \ API_LEVEL=$API_LEVEL \
PROCESSOR=$PROCESSOR \ PROCESSOR=$PROCESSOR \
SYS_IMG=$SYS_IMG \ SYS_IMG=$SYS_IMG \
IMG_TYPE=$IMG_TYPE \ IMG_TYPE=$IMG_TYPE \
BROWSER=$BROWSER BROWSER=$BROWSER
RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL}
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
RUN rm ${ANDROID_HOME}/tools/emulator \ RUN rm ${ANDROID_HOME}/tools/emulator \
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${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} RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
#==============================================
# Download chrome driver v2.26
# to be able to use chrome browser in emulator
# Issue: https://github.com/butomo1989/docker-android/commit/6406504f944dae73d0a0c5d8e71a17a47dff9b33
#==============================================
RUN wget -nv -O chrome.zip "https://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip" \
&& unzip -x chrome.zip \
&& rm chrome.zip
#================================================ #================================================
# noVNC Default Configurations # noVNC Default Configurations
# These Configurations can be changed through -e # These Configurations can be changed through -e
@@ -137,6 +109,7 @@ ENV DISPLAY=:0 \
LOCAL_PORT=5900 \ LOCAL_PORT=5900 \
TARGET_PORT=6080 \ TARGET_PORT=6080 \
TIMEOUT=1 \ TIMEOUT=1 \
VIDEO_PATH=/tmp/video \
LOG_PATH=/var/log/supervisor LOG_PATH=/var/log/supervisor
#=============== #===============
@@ -165,7 +138,7 @@ COPY src /root/src
COPY supervisord.conf /root/ COPY supervisord.conf /root/
RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf RUN chmod -R +x /root/src && chmod +x /root/supervisord.conf
HEALTHCHECK --interval=2s --timeout=600s --retries=1 \ HEALTHCHECK --interval=2s --timeout=40s --retries=1 \
CMD adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done' CMD adb wait-for-device shell 'while [[ -z $(getprop sys.boot_completed) ]]; do sleep 1; done'
CMD /usr/bin/supervisord --configuration supervisord.conf CMD /usr/bin/supervisord --configuration supervisord.conf
+21 -48
View File
@@ -1,6 +1,6 @@
FROM ubuntu:16.04 FROM appium/appium:1.6.6-beta-p0
ENV DEBIAN_FRONTEND noninteractive LABEL maintainer "Budi Utomo <budi.ut.1989@gmail.com>"
#============= #=============
# Set WORKDIR # Set WORKDIR
@@ -10,29 +10,15 @@ WORKDIR /root
#================== #==================
# General Packages # General Packages
#------------------ #------------------
# wget
# Network downloader
# unzip
# Unzip zip file
# curl
# Transfer data from or to a server
# xterm # xterm
# Terminal emulator # Terminal emulator
# supervisor # supervisor
# Process manager # Process manager
# openjdk-8-jdk
# Java
# libqt5webkit5
# Web content engine (Fix issue in Android)
# socat # socat
# Port forwarder # Port forwarder
# libgconf-2-4
# Required package for chrome and chromedriver to run on Linux
#------------------ #------------------
# NoVNC Packages # NoVNC Packages
#------------------ #------------------
# xvfb
# X virtual framebuffer
# x11vnc # x11vnc
# VNC server for X display # VNC server for X display
# openbox # openbox
@@ -44,6 +30,13 @@ WORKDIR /root
# net-tools # net-tools
# Netstat # Netstat
#------------------ #------------------
# Video Recording
#------------------
# ffmpeg
# Video recorder
# jq
# Sed for JSON data
#------------------
# KVM Package # KVM Package
# for emulator x86 # for emulator x86
# https://help.ubuntu.com/community/KVM/Installation # https://help.ubuntu.com/community/KVM/Installation
@@ -54,21 +47,16 @@ WORKDIR /root
# bridge-utils # bridge-utils
#================== #==================
RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \ RUN apt-get -qqy update && apt-get -qqy install --no-install-recommends \
wget \
unzip \
curl \
xterm \ xterm \
supervisor \ supervisor \
openjdk-8-jdk \
libqt5webkit5 \
socat \ socat \
libgconf-2-4 \
xvfb \
x11vnc \ x11vnc \
openbox \ openbox \
menu \ menu \
python-numpy \ python-numpy \
net-tools \ net-tools \
ffmpeg \
jq \
qemu-kvm \ qemu-kvm \
libvirt-bin \ libvirt-bin \
ubuntu-vm-builder \ ubuntu-vm-builder \
@@ -92,52 +80,36 @@ RUN wget -nv -O noVNC.zip "https://github.com/kanaka/noVNC/archive/${NOVNC_SHA}
&& rm websockify.zip \ && rm websockify.zip \
&& ln noVNC/vnc_auto.html noVNC/index.html && ln noVNC/vnc_auto.html noVNC/index.html
#=====================
# Install Android SDK
#=====================
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/jre
ENV PATH ${PATH}:${JAVA_HOME}/bin
ENV SDK_VERSION=25.2.3 \
ANDROID_HOME=/root
RUN wget -nv -O android.zip https://dl.google.com/android/repository/tools_r${SDK_VERSION}-linux.zip \
&& unzip android.zip && rm android.zip
ENV PATH ${PATH}:${ANDROID_HOME}/tools
RUN echo y | android update sdk --no-ui -a --filter platform-tools
ENV PATH ${PATH}:${ANDROID_HOME}/platform-tools
#====================================
# Install latest nodejs, npm, appium
#====================================
RUN curl -sL https://deb.nodesource.com/setup_7.x | bash - \
&& apt-get -qqy update && apt-get -qqy install nodejs && rm -rf /var/lib/apt/lists/*
ENV APPIUM_VERSION 1.6.3
RUN npm install -g appium@$APPIUM_VERSION && npm cache clean
#====================== #======================
# Install SDK packages # Install SDK packages
#====================== #======================
ARG ANDROID_VERSION=5.0.1 ARG ANDROID_VERSION=5.0.1
ARG BUILD_TOOL=25.0.3
ARG API_LEVEL=21 ARG API_LEVEL=21
ARG PROCESSOR=x86 ARG PROCESSOR=x86
ARG SYS_IMG=x86_64 ARG SYS_IMG=x86_64
ARG IMG_TYPE=google_apis ARG IMG_TYPE=google_apis
ARG BROWSER=android ARG BROWSER=android
ENV ANDROID_VERSION=$ANDROID_VERSION \ ENV ANDROID_VERSION=$ANDROID_VERSION \
BUILD_TOOL=$BUILD_TOOL \
API_LEVEL=$API_LEVEL \ API_LEVEL=$API_LEVEL \
PROCESSOR=$PROCESSOR \ PROCESSOR=$PROCESSOR \
SYS_IMG=$SYS_IMG \ SYS_IMG=$SYS_IMG \
IMG_TYPE=$IMG_TYPE \ IMG_TYPE=$IMG_TYPE \
BROWSER=$BROWSER BROWSER=$BROWSER
RUN echo y | android update sdk --no-ui -a --filter build-tools-${BUILD_TOOL}
ENV PATH ${PATH}:${ANDROID_HOME}/build-tools ENV PATH ${PATH}:${ANDROID_HOME}/build-tools
RUN rm ${ANDROID_HOME}/tools/emulator \ RUN rm ${ANDROID_HOME}/tools/emulator \
&& ln -s ${ANDROID_HOME}/tools/emulator64-${PROCESSOR} ${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} RUN echo y | android update sdk --no-ui -a -t android-${API_LEVEL},sys-img-${SYS_IMG}-${IMG_TYPE}-${API_LEVEL}
#==============================================
# Download chrome driver v2.26
# to be able to use chrome browser in emulator
# Issue: https://github.com/butomo1989/docker-android/commit/6406504f944dae73d0a0c5d8e71a17a47dff9b33
#==============================================
RUN wget -nv -O chrome.zip "https://chromedriver.storage.googleapis.com/2.26/chromedriver_linux64.zip" \
&& unzip -x chrome.zip \
&& rm chrome.zip
#================================================ #================================================
# noVNC Default Configurations # noVNC Default Configurations
# These Configurations can be changed through -e # These Configurations can be changed through -e
@@ -150,6 +122,7 @@ ENV DISPLAY=:0 \
LOCAL_PORT=5900 \ LOCAL_PORT=5900 \
TARGET_PORT=6080 \ TARGET_PORT=6080 \
TIMEOUT=1 \ TIMEOUT=1 \
VIDEO_PATH=/tmp/video \
LOG_PATH=/var/log/supervisor 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
+16 -3
View File
@@ -1,5 +1,7 @@
import unittest import unittest
from time import sleep
from appium import webdriver from appium import webdriver
@@ -13,13 +15,24 @@ class MSiteChromeAndroidUITests(unittest.TestCase):
'deviceName': 'Android Emulator', 'deviceName': 'Android Emulator',
'appPackage': 'com.android.chrome', 'appPackage': 'com.android.chrome',
'appActivity': 'com.google.android.apps.chrome.Main', 'appActivity': 'com.google.android.apps.chrome.Main',
'browserName': 'chrome', 'browserName': 'chrome'
'ignore-certificate-errors': True
} }
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps) self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
def test_open_url(self): def test_open_url(self):
self.driver.get('http://targeturl.com') self.driver.get('http://google.com')
# Handle Welcome Home
self.driver.switch_to.context('NATIVE_APP')
self.driver.find_element_by_id('terms_accept').click()
self.driver.find_element_by_id('negative_button').click()
# Search for Github
self.driver.switch_to.context('CHROMIUM')
search = self.driver.find_element_by_name('q')
search.send_keys('butomo1989 docker-android')
search.submit()
sleep(2)
def tearDown(self): def tearDown(self):
self.driver.quit() self.driver.quit()
@@ -1,5 +1,7 @@
import unittest import unittest
from time import sleep
from appium import webdriver from appium import webdriver
@@ -18,7 +20,12 @@ class MSiteDefaultBrowserAndroidUITests(unittest.TestCase):
self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps) self.driver = webdriver.Remote('http://127.0.0.1:4444/wd/hub', desired_caps)
def test_open_url(self): def test_open_url(self):
self.driver.get('http://targeturl.com') self.driver.get('http://google.com')
search = self.driver.find_element_by_name('q')
search.send_keys('butomo1989 docker-android')
search.submit()
sleep(2)
def tearDown(self): def tearDown(self):
self.driver.quit() self.driver.quit()
+63 -10
View File
@@ -2,7 +2,6 @@
# Bash version should >= 4 to be able to run this script. # Bash version should >= 4 to be able to run this script.
IMAGE="butomo1989/docker-android" IMAGE="butomo1989/docker-android"
LATEST_BUILD_TOOL=25.0.2
if [ -z "$1" ]; then if [ -z "$1" ]; then
read -p "Task (test|build|push|all) : " TASK read -p "Task (test|build|push|all) : " TASK
@@ -93,8 +92,60 @@ get_android_versions
get_processors get_processors
function test() { function test() {
(export ANDROID_HOME=/root && export ANDROID_VERSION=5.0.1 && export API_LEVEL=21 \ # Prepare needed parameter to run tests
&& export PROCESSOR=x86 && export SYS_IMG=x86_64 && export IMG_TYPE=google_apis && nosetests -v) test_android_version=7.1.1
test_api_level=25
test_processor=x86
test_sys_img=x86_64
test_img_type=google_apis
test_browser=chrome
test_image=test_img
test_container=test_con
# Run e2e tests
# E2E tests must be run only for linux OS / x86 image to reduce duration of test execution
if [ "$(uname -s)" == 'Linux' ] && [ "$E2E" = true ]; then
echo "----BUILD TEST IMAGE----"
docker build -t $test_image --build-arg ANDROID_VERSION=$test_android_version \
--build-arg API_LEVEL=$test_api_level --build-arg PROCESSOR=$test_processor --build-arg SYS_IMG=$test_sys_img \
--build-arg IMG_TYPE=$test_img_type --build-arg BROWSER=$test_browser -f docker/Emulator_x86 .
echo "----REMOVE OLD TEST CONTAINER----"
docker kill $test_container && docker rm $test_container
echo "----PREPARE CONTAINER----"
docker run --privileged -d -p 4723:4723 -p 6080:6080 -e APPIUM=True -e DEVICE="Samsung Galaxy S6" --name $test_container $test_image
docker cp example/sample_apk $test_container:/root/tmp
attempt=0
while [ ${attempt} -le 10 ]; do
attempt=$(($attempt + 1))
output=$(docker ps | grep healthy | grep test_con | wc -l)
if [[ "$output" == 1 ]]; then
echo "Emulator is ready."
break
else
echo "Waiting 10 seconds for emulator to be ready (attempt: $attempt)"
sleep 10
fi
if [[ $attempt == 10 ]]; then
echo "Failed!"
exit 1
fi
done
echo "----RUN E2E TESTS----"
nosetests src/tests/e2e -v
echo "----REMOVE TEST CONTAINER----"
docker kill $test_container && docker rm $test_container
fi
# Run unit tests (After e2e test to get coverage result)
echo "----UNIT TESTS----"
(export ANDROID_HOME=/root && export ANDROID_VERSION=$test_android_version && export API_LEVEL=$test_api_level \
&& export PROCESSOR=$test_processor && export SYS_IMG=$test_sys_img && export IMG_TYPE=$test_img_type \
&& nosetests src/tests/unit -v)
} }
function build() { function build() {
@@ -111,9 +162,13 @@ function build() {
for v in "${versions[@]}"; do for v in "${versions[@]}"; do
# Find image type and default web browser # Find image type and default web browser
if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ] || [ "$v" == "6.0" ]; then if [ "$v" == "5.0.1" ] || [ "$v" == "5.1.1" ]; then
IMG_TYPE=android IMG_TYPE=android
BROWSER=browser BROWSER=browser
elif [ "$v" == "6.0" ]; then
# It is because there is no ARM EABI v7a System Image for 6.0
IMG_TYPE=google_apis
BROWSER=browser
else else
IMG_TYPE=google_apis IMG_TYPE=google_apis
BROWSER=chrome BROWSER=chrome
@@ -127,12 +182,10 @@ function build() {
image_latest="$IMAGE-$p-$v:latest" image_latest="$IMAGE-$p-$v:latest"
echo "[BUILD] Image name: $image_version and $image_latest" echo "[BUILD] Image name: $image_version and $image_latest"
echo "[BUILD] Dockerfile: $FILE_NAME" echo "[BUILD] Dockerfile: $FILE_NAME"
docker build -t $image_version --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \ docker build -t $image_version --build-arg ANDROID_VERSION=$v --build-arg API_LEVEL=$level \
--build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \ --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img --build-arg IMG_TYPE=$IMG_TYPE \
--build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME . --build-arg BROWSER=$BROWSER -f $FILE_NAME .
docker build -t $image_latest --build-arg ANDROID_VERSION=$v --build-arg BUILD_TOOL=$LATEST_BUILD_TOOL \ docker tag $image_version $image_latest
--build-arg API_LEVEL=$level --build-arg PROCESSOR=$p --build-arg SYS_IMG=$sys_img \
--build-arg IMG_TYPE=$IMG_TYPE --build-arg BROWSER=$BROWSER -f $FILE_NAME .
done done
done done
} }
+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
+2
View File
@@ -1,3 +1,5 @@
selenium==3.3.1
Appium-Python-Client==0.24
coverage==4.2 coverage==4.2
mock==2.0.0 mock==2.0.0
nose==1.3.7 nose==1.3.7
+1
View File
@@ -2,5 +2,6 @@ import os
ROOT = '/root' ROOT = '/root'
WORKDIR = os.path.dirname(__file__) WORKDIR = os.path.dirname(__file__)
CHROME_DRIVER = os.path.join(ROOT, 'chromedriver')
CONFIG_FILE = os.path.join(WORKDIR, 'nodeconfig.json') CONFIG_FILE = os.path.join(WORKDIR, 'nodeconfig.json')
LOGGING_FILE = os.path.join(WORKDIR, 'logging.conf') LOGGING_FILE = os.path.join(WORKDIR, 'logging.conf')
+18 -6
View File
@@ -4,13 +4,21 @@ import json
import logging import logging
import os import os
import subprocess import subprocess
import errno
from src import CONFIG_FILE, ROOT from src import CONFIG_FILE, ROOT, CHROME_DRIVER
from src import log from src import log
log.init() log.init()
logger = logging.getLogger('app') 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: 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') 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)) logger.info('Skin destination path: {dst}'.format(dst=skin_dst_path))
for s in os.listdir(skin_rsc_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 # Hardware and its skin
device_name_bash = device.replace(' ', '\ ') 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)) 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 resource path: {rsc}'.format(rsc=profile_src_path))
logger.info('Hardware profile destination path: {dst}'.format(dst=profile_dst_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 # Append command
cmd += ' -d {device} -s {skin}'.format(device=device_name_bash, skin=skin_name) cmd += ' -d {device} -s {skin}'.format(device=device_name_bash, skin=skin_name)
@@ -100,14 +108,17 @@ def appium_run(avd_name: str):
:param avd_name: Name of android virtual device / emulator :param avd_name: Name of android virtual device / emulator
""" """
cmd = 'appium' cmd = 'appium'
local_ip = os.popen('ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\'').read().strip()
default_web_browser = os.getenv('BROWSER')
if default_web_browser == 'chrome':
cmd += ' --chromedriver-executable {driver}'.format(driver=CHROME_DRIVER)
grid_connect = convert_str_to_bool(str(os.getenv('CONNECT_TO_GRID', False))) grid_connect = convert_str_to_bool(str(os.getenv('CONNECT_TO_GRID', False)))
logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect)) logger.info('Connect to selenium grid? {connect}'.format(connect=grid_connect))
if grid_connect: if grid_connect:
local_ip = os.popen('ifconfig eth0 | grep \'inet addr:\' | cut -d: -f2 | awk \'{ print $1}\'').read().strip()
try: try:
mobile_web_test = convert_str_to_bool(str(os.getenv('MOBILE_WEB_TEST', False))) mobile_web_test = convert_str_to_bool(str(os.getenv('MOBILE_WEB_TEST', False)))
default_web_browser = os.getenv('BROWSER')
appium_host = os.getenv('APPIUM_HOST', local_ip) appium_host = os.getenv('APPIUM_HOST', local_ip)
appium_port = int(os.getenv('APPIUM_PORT', 4723)) appium_port = int(os.getenv('APPIUM_PORT', 4723))
selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1') selenium_host = os.getenv('SELENIUM_HOST', '172.17.0.1')
@@ -121,7 +132,8 @@ def appium_run(avd_name: str):
subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True) subprocess.check_call('xterm -T "{title}" -n "{title}" -e \"{cmd}\"'.format(title=title, cmd=cmd), shell=True)
def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str, selenium_port: int): def create_node_config(avd_name: str, browser_name: str, appium_host: str, appium_port: int, selenium_host: str,
selenium_port: int):
""" """
Create custom node config file in json format to be able to connect with selenium server. Create custom node config file in json format to be able to connect with selenium server.
+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!"
}
$@
-54
View File
@@ -1,54 +0,0 @@
"""Unit test to test app."""
import os
from unittest import TestCase
import mock
from src import app
class TestApp(TestCase):
"""Unit test class to test other methods in the app."""
def test_valid_env(self):
key = 'ENV_1'
os.environ[key] = 'test'
app.get_or_raise(key)
del os.environ[key]
def test_invalid_env(self):
with self.assertRaises(RuntimeError):
app.get_or_raise('ENV_2')
def test_valid_bool(self):
self.assertEqual(app.convert_str_to_bool('True'), True)
self.assertEqual(app.convert_str_to_bool('t'), True)
self.assertEqual(app.convert_str_to_bool('1'), True)
self.assertEqual(app.convert_str_to_bool('YES'), True)
def test_invalid_bool(self):
self.assertEqual(app.convert_str_to_bool(''), False)
self.assertEqual(app.convert_str_to_bool('test'), False)
def test_invalid_format(self):
self.assertEqual(app.convert_str_to_bool(True), None)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_with_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(True)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertTrue(mocked_appium.called)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_withhout_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(False)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertFalse(mocked_appium.called)
View File
+29
View File
@@ -0,0 +1,29 @@
"""e2e test to test sample android application inside docker-android"""
from unittest import TestCase
from appium import webdriver
class TestE2EAndroidApk(TestCase):
def setUp(self):
desired_caps = {
'platformName': 'Android',
'deviceName': 'Android Emulator',
'automationName': 'UIAutomator2',
'app': '/root/tmp/sample_apk_debug.apk'
}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_calculation(self):
text_fields = self.driver.find_elements_by_class_name('android.widget.EditText')
text_fields[0].send_keys(4)
text_fields[1].send_keys(6)
btn_calculate = self.driver.find_element_by_class_name('android.widget.Button')
btn_calculate.click()
self.assertEqual('10', text_fields[2].text)
def tearDown(self):
self.driver.quit()
+34
View File
@@ -0,0 +1,34 @@
"""e2e test to test chrome application inside docker-android"""
from unittest import TestCase
from appium import webdriver
class TestE2EChrome(TestCase):
def setUp(self):
desired_caps = {
'platformName': 'Android',
'deviceName': 'Android Emulator',
'appPackage': 'com.android.chrome',
'appActivity': 'com.google.android.apps.chrome.Main',
'browserName': 'chrome'
}
self.driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
def test_open_url(self):
self.driver.get('http://google.com')
# Handle Welcome Home
self.driver.switch_to.context('NATIVE_APP')
self.driver.find_element_by_id('terms_accept').click()
self.driver.find_element_by_id('negative_button').click()
# Search for Github
self.driver.switch_to.context('CHROMIUM')
search = self.driver.find_element_by_name('q')
search.send_keys('butomo1989 docker-android')
search.submit()
def tearDown(self):
self.driver.quit()
View File
+71
View File
@@ -0,0 +1,71 @@
"""Unit test to test app."""
import os
from unittest import TestCase
import mock
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'
app.get_or_raise(key)
del os.environ[key]
def test_invalid_env(self):
with self.assertRaises(RuntimeError):
app.get_or_raise('ENV_2')
def test_valid_bool(self):
self.assertEqual(app.convert_str_to_bool('True'), True)
self.assertEqual(app.convert_str_to_bool('t'), True)
self.assertEqual(app.convert_str_to_bool('1'), True)
self.assertEqual(app.convert_str_to_bool('YES'), True)
def test_invalid_bool(self):
self.assertEqual(app.convert_str_to_bool(''), False)
self.assertEqual(app.convert_str_to_bool('test'), False)
def test_invalid_format(self):
self.assertEqual(app.convert_str_to_bool(True), None)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_with_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(True)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertTrue(mocked_appium.called)
@mock.patch('src.app.prepare_avd')
@mock.patch('subprocess.Popen')
def test_run_withhout_appium(self, mocked_avd, mocked_subprocess):
with mock.patch('src.app.appium_run') as mocked_appium:
os.environ['APPIUM'] = str(False)
app.run()
self.assertTrue(mocked_avd.called)
self.assertTrue(mocked_subprocess.called)
self.assertFalse(mocked_appium.called)
@@ -14,6 +14,14 @@ class TestAppium(TestCase):
os.environ['CONNECT_TO_GRID'] = str(True) os.environ['CONNECT_TO_GRID'] = str(True)
self.avd_name = 'test_avd' self.avd_name = 'test_avd'
@mock.patch('subprocess.check_call')
def test_chrome_driver(self, mocked_subprocess):
os.environ['CONNECT_TO_GRID'] = str(False)
os.environ['BROWSER'] = 'chrome'
self.assertFalse(mocked_subprocess.called)
app.appium_run(self.avd_name)
self.assertTrue(mocked_subprocess.called)
@mock.patch('subprocess.check_call') @mock.patch('subprocess.check_call')
def test_without_selenium_grid(self, mocked_subprocess): def test_without_selenium_grid(self, mocked_subprocess):
os.environ['CONNECT_TO_GRID'] = str(False) os.environ['CONNECT_TO_GRID'] = str(False)
@@ -21,23 +29,29 @@ class TestAppium(TestCase):
app.appium_run(self.avd_name) app.appium_run(self.avd_name)
self.assertTrue(mocked_subprocess.called) self.assertTrue(mocked_subprocess.called)
@mock.patch('os.popen')
@mock.patch('subprocess.check_call') @mock.patch('subprocess.check_call')
def test_with_selenium_grid(self, mocked_subprocess): def test_with_selenium_grid(self, mocked_os, mocked_subprocess):
with mock.patch('src.app.create_node_config') as mocked_config: with mock.patch('src.app.create_node_config') as mocked_config:
self.assertFalse(mocked_config.called) self.assertFalse(mocked_config.called)
self.assertFalse(mocked_os.called)
self.assertFalse(mocked_subprocess.called) self.assertFalse(mocked_subprocess.called)
app.appium_run(self.avd_name) app.appium_run(self.avd_name)
self.assertTrue(mocked_config.called) self.assertTrue(mocked_config.called)
self.assertTrue(mocked_os.called)
self.assertTrue(mocked_subprocess.called) self.assertTrue(mocked_subprocess.called)
@mock.patch('os.popen')
@mock.patch('subprocess.check_call') @mock.patch('subprocess.check_call')
def test_invalid_integer(self, mocked_subprocess): def test_invalid_integer(self, mocked_os, mocked_subprocess):
os.environ['APPIUM_PORT'] = 'test' os.environ['APPIUM_PORT'] = 'test'
with mock.patch('src.app.create_node_config') as mocked_config: with mock.patch('src.app.create_node_config') as mocked_config:
self.assertFalse(mocked_config.called) self.assertFalse(mocked_config.called)
self.assertFalse(mocked_os.called)
self.assertFalse(mocked_subprocess.called) self.assertFalse(mocked_subprocess.called)
app.appium_run(self.avd_name) app.appium_run(self.avd_name)
self.assertFalse(mocked_config.called) self.assertFalse(mocked_config.called)
self.assertTrue(mocked_os.called)
self.assertTrue(mocked_subprocess.called) self.assertTrue(mocked_subprocess.called)
self.assertRaises(ValueError) self.assertRaises(ValueError)
@@ -52,3 +66,5 @@ class TestAppium(TestCase):
del os.environ['CONNECT_TO_GRID'] del os.environ['CONNECT_TO_GRID']
if os.getenv('APPIUM_PORT'): if os.getenv('APPIUM_PORT'):
del os.environ['APPIUM_PORT'] del os.environ['APPIUM_PORT']
if os.getenv('BROWSER'):
del os.environ['BROWSER']
+24 -1
View File
@@ -2,33 +2,56 @@
nodaemon=true nodaemon=true
logfile=%(ENV_LOG_PATH)s/supervisord.log logfile=%(ENV_LOG_PATH)s/supervisord.log
childlogdir=%(ENV_LOG_PATH)s childlogdir=%(ENV_LOG_PATH)s
priority=1
[program:xvfb] [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 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 stdout_logfile=%(ENV_LOG_PATH)s/xvfb.stdout.log
stderr_logfile=%(ENV_LOG_PATH)s/xvfb.stderr.log stderr_logfile=%(ENV_LOG_PATH)s/xvfb.stderr.log
priority=1
[program:openbox] [program:openbox]
command=/usr/bin/openbox-session command=/usr/bin/openbox-session
stdout_logfile=%(ENV_LOG_PATH)s/openbox.stdout.log stdout_logfile=%(ENV_LOG_PATH)s/openbox.stdout.log
stderr_logfile=%(ENV_LOG_PATH)s/openbox.stderr.log stderr_logfile=%(ENV_LOG_PATH)s/openbox.stderr.log
priority=2
[program:x11vnc] [program:x11vnc]
command=/usr/bin/x11vnc -display %(ENV_DISPLAY)s -nopw -forever -shared command=/usr/bin/x11vnc -display %(ENV_DISPLAY)s -nopw -forever -shared
stdout_logfile=%(ENV_LOG_PATH)s/x11vnc.stdout.log stdout_logfile=%(ENV_LOG_PATH)s/x11vnc.stdout.log
stderr_logfile=%(ENV_LOG_PATH)s/x11vnc.stderr.log stderr_logfile=%(ENV_LOG_PATH)s/x11vnc.stderr.log
priority=2
[program:novnc] [program:novnc]
command=./noVNC/utils/launch.sh --vnc localhost:%(ENV_LOCAL_PORT)s --listen %(ENV_TARGET_PORT)s 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 stdout_logfile=%(ENV_LOG_PATH)s/novnc.stdout.log
stderr_logfile=%(ENV_LOG_PATH)s/novnc.stderr.log stderr_logfile=%(ENV_LOG_PATH)s/novnc.stderr.log
priority=2
[program:port-forward] [program:port-forward]
command=./src/port_forward.sh command=./src/port_forward.sh
autorestart=false 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] [program:docker-appium]
command=python3 -m src.app command=./src/appium.sh
autorestart=false autorestart=false
stdout_logfile=%(ENV_LOG_PATH)s/docker-android.stdout.log stdout_logfile=%(ENV_LOG_PATH)s/docker-android.stdout.log
stderr_logfile=%(ENV_LOG_PATH)s/docker-android.stderr.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" echo "UNIT TEST ONLY"
bash release.sh test all all 0.1 bash release.sh test all all 0.1
else else
echo "Log in to docker hub" if [ ! -z "$ANDROID_VERSION" ]; then
docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD" echo "Log in to docker hub"
echo "[Version: $ANDROID_VERSION] RUN UNIT TEST, BUILD DOCKER IMAGES AND PUSH THOSE TO DOCKER HUB" docker login -u="$DOCKER_USERNAME" -p="$DOCKER_PASSWORD"
bash release.sh all $ANDROID_VERSION all $TRAVIS_TAG 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" echo "Log out of docker hub"
docker logout docker logout
fi fi