

在非GAE环境尝试使用VTS Dashboard
source link: https://note.qidong.name/2017/12/vts-dashboard-without-gae/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

在非GAE环境尝试使用VTS Dashboard
2017-12-19 18:17:39 +08 字数:2312 标签: Android
虽然VTS Dashboard是专为GAE而开发的,但是仍然有办法在非GAE环境下进行开发与运行。 本文介绍如何在普通的Linux环境下运行一个VTS Dashboard,并且进行数据上传。 这只是一次评估性质的尝试,结果以失败而告终。
test/vts库简介 ¶
这个Git库是一个复合库,包含了Java、C++、Python等代码,主要有三种内容。
- 编译出
vts-tradefed
,主要是Java,包含C++。 - vts的runner,在
vts-tradefed
中通过run vts
的执行逻辑,主要是Python。 web/dashboard/
目录下的GAE项目,即本文关注的VTS Dashboard网站。
主要有两类分支。
一是像master这样的开发分支,里面没有web
这个目录,更不用说web/dashboard/
目录了。
二是像oreo-release这样的分支,里面有web/dashboard/
。
所以,取用VTS Dashboard时,需要切换到第二类分支。
根据Git库中的README进行配置,就是一个大坑,因为这些描述都太陈旧了。 codelabs/android-vts#10上的说明,才可以作为有效参考。
由于国内访问android.googlesource.com有一个总所周知的问题,孤特地在Gitee建立了一个镜像库yanqd0/vts。
运行VTS Dashboard ¶
在任何一个安装了JDK 8(以上)与Maven的环境中,下载AOSP的一个Git库test/vts/,即可运行一个VTS Dashboard。
git clone https://android.googlesource.com/platform/test/vts/ -b oreo-release
# or
# git clone https://gitee.com/yanqd0/vts.git -b oreo-release
cd vts/web/dashboard
mvn appengine:devserver
官方文档中说,还需要安装GAE的SDK。 然而,如果不需要部署到GAE环境,这是没有必要的,Maven会安装运行需要的jar。
如果需要跑在后台,在执行完mvn appengine:devserver
编译后,
可以用mvn appengine:devserver_start
来启动,用mvn appengine:devserver_stop
来停止。
在8080端口,已经可以访问网页了,只是没有数据。
删除鉴权代码 ¶
上传时会用到唯一的一个API——api/datastore
,它在web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java
文件。
这里有一段鉴权的代码,需要删除,否则无法成功上传测试数据。
diff --git a/web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java b/web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java
index e73f270f..f8e0b775 100644
--- a/web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java
+++ b/web/dashboard/src/main/java/com/android/vts/api/DatastoreRestServlet.java
@@ -58,25 +58,6 @@ public class DatastoreRestServlet extends HttpServlet {
return;
}
- // Verify service account access token.
- boolean authorized = false;
- if (postMessage.hasAccessToken()) {
- String accessToken = postMessage.getAccessToken();
- GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);
- Oauth2 oauth2 =
- new Oauth2.Builder(new NetHttpTransport(), new JacksonFactory(), credential)
- .build();
- Tokeninfo tokenInfo = oauth2.tokeninfo().setAccessToken(accessToken).execute();
- if (tokenInfo.getIssuedTo().equals(SERVICE_CLIENT_ID)) {
- authorized = true;
- }
- }
-
- if (!authorized) {
- response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
- return;
- }
-
for (TestReportMessage testReportMessage : postMessage.getTestReportList()) {
DatastoreHelper.insertData(testReportMessage);
}
在GAE上正式运行时,当然是不需要这么干的。
上传数据 ¶
在一个可以成功执行VTS测试的环境下,只需要修改默认的TestCase配置,即可实现上传。
Git库中的tools/vts-tradefed/res/default/DefaultTestCase.config
,这其实是一个JSON文件。
新增或修改以下三个字段:
{
"enable_web": true,
"service_key_json_path": "service_key.json",
"dashboard_post_command": "wget --post-file=\'{path}\' <url>/api/datastore"
}
其中,<url>
需要换成VTS Dashboard架设的位置。
如果在本机,可以填http://localhost:8080
。
service_key.json ¶
service_key.json
需要是一个从GAE的设置中获取的鉴权信息文件。
在调试情况下,只能伪造一个。 在编译好的android-vts测试套件中,新增一个空文件即可。
touch testcases/service_key.json
修改鉴权文件解析代码 ¶
空的鉴权文件,当然是不能成功执行的。 还需要修改相关的检查代码。
diff --git a/utils/python/web/dashboard_rest_client.py b/utils/python/web/dashboard_rest_client.py
index 8f2be9dc..fbf66b91 100644
--- a/utils/python/web/dashboard_rest_client.py
+++ b/utils/python/web/dashboard_rest_client.py
@@ -46,16 +46,6 @@ class DashboardRestClient(object):
Returns:
True if the client is initialized successfully, False otherwise.
"""
- try:
- self.auth_token = service_account.ServiceAccountCredentials.from_json_keyfile_name(
- self.service_json_path, [_OPENID_SCOPE])
- self.auth_token.get_access_token()
- except IOError as e:
- logging.error("Error reading service json keyfile: %s", e)
- return False
- except (ValueError, KeyError) as e:
- logging.error("Invalid service json keyfile: %s", e)
- return False
return True
@@ -69,7 +59,7 @@ class DashboardRestClient(object):
String, an OAuth2 token using the service account credentials.
None if authentication fails.
"""
- return str(self.auth_token.get_access_token().access_token)
+ return 'faked_token'
def PostData(self, post_message):
"""Post data to the dashboard database.
以上diff代码块,以及前面那一段Java的,都可以保存为patch文件,通过git apply
打到这个库中。
也可以直接修改编译好的android-vts中的对应内容。
java.lang.StackOverflowError ¶
在Dashboard网站运行一段时间后,会出现以下问题:
HTTP ERROR 500
Problem accessing /. Reason:
INTERNAL_SERVER_ERROR
Caused by:
java.lang.StackOverflowError
at java.security.AccessController.doPrivileged(Native Method)
at java.io.FilePermission.init(FilePermission.java:203)
...
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at com.google.appengine.tools.development.DevAppServerFactory$CustomSecurityManager.checkPermission(DevAppServerFactory.java:442)
at java.lang.SecurityManager.checkRead(SecurityManager.java:888)
Powered by Jetty://
一个超过千行的调用栈,溢出了也属正常。 不过,网站挂了就是挂了,修改JVM参数也调不好。
总结 ¶
在摧毁了鉴权相关逻辑以后,数据终于可以上传了。 然而,只在后台可以看到,在网页界面上仍然没有任何内容,也许与鉴权部分有关吧。 此外,网站会因为java.lang.StackOverflowError而挂掉,也是一个无解的问题。
通过VTS测试,可以产生一些数据,包括时间、测试手机设备信息、测试case名称、是否成功、测试覆盖率等信息。
这些信息默认会打包成一个zip文件,放在results
目录下。
在有了VTS Dashboard以后,这些数据会被统一上传到网站后台的数据库,并且用漂亮的界面进行展示。
做了相关配置后,run vts
过程中会额外插入一个过程,把数据打包成protobuf,进行上传。
然而,VTS Dashboard本质上就是一个GAE项目,无法在非GAE环境下正常使用(孤前面的尝试完全失败了)。 对中国开发者来说,这就是一个不存在的项目。
不过,如果只是集成到CI中,或者展示测试覆盖率,这些功能可以通过既有的手段自行实现,倒是不用依赖Google。
存储、处理大规模的测试数据,这个麻烦一些,但问题也不大。
只需要实现一个api/datastore
,即可最小地改动VTS测试套件的代码(即删除或修改准备鉴权json文件的相关处理),收取测试数据。
所以,VTS Dashboard对中国来说,需要一个替代,但也并非必须。
Recommend
-
89
PaaS调研:GAE与AWS(上) Original 韩大...
-
20
BurpSuite在非Web应用测试中的应用 路人甲
-
13
Responses It’s often said that programmers quit their jobs due to disorganization, lack of support and vision, and no stimulation. Would you agree?Think about the brief period when yo...
-
21
What It’s Like to Be an Engineering Intern at VTSHow Company Values Can Make an Intern Feel at Home
-
7
GAE писали идиоты# К сожалению, этот пост не изменит ничего, но тем не менее я не могу не поделиться наблюдением о том, что авторы питоновской части...
-
18
Android Oreo VTS的环境、编译与运行 2017-10-17 17:50:58 +08 字数:2437 标签: Android 简介
-
10
这篇文章内容可能已经过时。 引言¶ Across the Great Wall, we can reach every corner in the world.
-
43
在非 4K 的螢幕上跑 HiDPI 前幾天看到 BetterDummy 這個專案,作者在 M1 上面外接 24" 1440p 的螢幕,但沒辦法啟用 HiDPI,於是就寫了一個軟體來解: M1 macs tend...
-
9
Google App Engine (GAE) 初体验 初体验”) 在很久以前就听说过大名...
-
7
GAE urlfetch 登陆人人 Jan 19, 2010 其实 Python 中一般都是直接用 urllib.urlopen() 来抓取网页内容或者模拟登陆等操作,但是 GAE 出于安全考虑不可以用 urlopen 操作,取而代之的就是 urlfetch.fetch()。f...
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK