assistd / go-ios

MIT License
2 stars 0 forks source link

usbmuxd 协议转发 #37

Open prife opened 1 year ago

prife commented 1 year ago
  1. 功能完整性测试

    • 支持xctest拉起,包括wda拉起、scrcpy-Runner拉起
    • 支持xcode调试
    • 支持perfdog性能采集
    • imazing工具测试图片推送
  2. 压力测试

    • 长时间运行检查是否存在内存泄漏、fd泄漏
    • 性能损失测试:长链路转发,比如从上海到深圳的服务器进行测试
    • 最大并发链接数测试
    • 多设备测试
  3. 异常测试

    • 设备掉线、上线
    • 杀掉Haproxy,程序的行为该是什么样的、打印的日志是否方便定位问题
    • 信任问题:清除设备信任
  4. 兼容性测试

    • 不同macOS系统
    • 不同的iOS手机
    • windows测试
    • Linux测试
prife commented 1 year ago

功能完整性测试

方法

sudo mv /var/run/usbmuxd  /var/run/usbmuxd.bk

修改haproxy.cfg,haproxy,27015 <--> /var/run/usbmuxd.bk

sudo ./wdb

使用tidevice、go-ios等工具测试功能完整性

  1. xctest拉起wda、scrcpy
  2. xcode编译、拉起、调试app
  3. imazing 图片传输
  4. perfdog IDE性能采集
  5. device support 挂载测试

iperf测试

$ iperf3 -c 127.0.0.1 -p 5201 -t 60
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-60.00  sec  2.47 GBytes   353 Mbits/sec                  sender
[  5]   0.00-60.00  sec  2.46 GBytes   353 Mbits/sec                  receiver

tidevice测试

^CTraceback (most recent call last):
  File "/Users/wetest/.pyenv/versions/3.10.3/bin/tidevice", line 8, in <module>
    sys.exit(main())
  File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/__main__.py", line 951, in main
    actions[args.subparser](args)
  File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/__main__.py", line 504, in cmd_dump_fps
    for data in d.connect_instruments().iter_opengl_data():
  File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_instruments.py", line 823, in iter_opengl_data
    for m in iter(que.get, None):
  File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/queue.py", line 171, in get
    self.not_empty.wait()
  File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/threading.py", line 320, in wait
    waiter.acquire()
KeyboardInterrupt
$ tidevice battery
当前电量      91%
充电次数      16次
当前电量      3008mAh
实际容量      3228mAh
设计容量      3208mAh
电池寿命      101%
序列号       F8Y145413KP18FLAH
电池温度      2479/100℃
当前电压      4418mV
开机电压      3328mV
充电器功率     3W
Traceback (most recent call last):
  File "/Users/wetest/.pyenv/versions/3.10.3/bin/tidevice", line 8, in <module>
    sys.exit(main())
  File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/__main__.py", line 951, in main
    actions[args.subparser](args)
  File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/__main__.py", line 412, in cmd_battery
    value = value[key]
KeyError: 'Voltage'

不使用wdb转发,测试该问题同样存在。以为该问题为tidevice原生bug

reboot测试

  1. tidevice reboot,提示Success,但无法重启,必现
  2. idevicediagnostics restart,成功
  3. go-ios reboot,成功

测试device-support mount功能

  1. idevicediagnostics restart,重启设备,成功
  2. tidevice launch com.teapotapps.iperf
    
    [I 221228 14:55:20 _device:602] ProductVersion: 16.0
    [I 221228 14:55:20 _imagemounter:24] Download https://tool.appetizer.io/JinjunHan/iOSDeviceSupport/raw/master/DeviceSupport/16.0.zip -> /Users/wetest/.tidevice/device-support/16.0.zip
    [I 221228 14:55:26 _imagemounter:35] '/Users/wetest/.tidevice/device-support/16.0.zip' download successfully
    ^[[CWARNING:root:The read operation timed out, retrying in 10 seconds...
    WARNING:root:The read operation timed out, retrying in 11 seconds...
    Traceback (most recent call last):
    File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_device.py", line 484, in start_service
    return self._unsafe_start_service(name)
    File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_device.py", line 503, in _unsafe_start_service
    raise MuxServiceError(error)
    tidevice.exceptions.MuxServiceError: InvalidService

During handling of the above exception, another exception occurred:

Traceback (most recent call last): File "/Users/wetest/.pyenv/versions/3.10.3/bin/tidevice", line 8, in sys.exit(main()) File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/main.py", line 951, in main actionsargs.subparser File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/main.py", line 346, in cmd_launch with d.connect_instruments() as ts: File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/decorator.py", line 232, in fun return caller(func, *(extras + args), *kw) File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/retry/api.py", line 73, in retry_decorator return __retry_internal(partial(f, args, **kwargs), exceptions, tries, delay, max_delay, backoff, jitter, File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/retry/api.py", line 33, in __retry_internal return f() File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_device.py", line 796, in connect_instruments conn = self.start_service( File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_device.py", line 486, in start_service self.mount_developer_image() File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_device.py", line 650, in mount_developer_image if self.imagemounter.is_developer_mounted(): File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_imagemounter.py", line 119, in is_developer_mounted return len(self.lookup()) > 0 File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_imagemounter.py", line 104, in lookup ret = self.send_recv_packet({ File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_safe_socket.py", line 255, in send_recv_packet return self.recv_packet() File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_safe_socket.py", line 250, in recv_packet return self.psock.recv_packet(header_size) File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_safe_socket.py", line 200, in recv_packet header = self.recvall(4) File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/site-packages/tidevice/_safe_socket.py", line 111, in recvall chunk = self._sock.recv(size - len(buf)) File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/ssl.py", line 1258, in recv return self.read(buflen) File "/Users/wetest/.pyenv/versions/3.10.3/lib/python3.10/ssl.py", line 1131, in read return self._sslobj.read(len) TimeoutError: The read operation timed out


- ./go-ios image auto,失败,卡住

INFO[0000]utils.go:80 no udid specified using first device in list udid=00008110-000A210C1411801E


- ideviceimagemounter -u 00008110-000A210C1411801E 16.0/DeveloperDiskImage.dmg  16.0/DeveloperDiskImage.dmg.signature

Uploading 16.0/DeveloperDiskImage.dmg ERROR: Unknown error occurred, can't mount. 卡在这里,无法返回



- tidevice  developer,测试mount功能,【待测试】

重启设备后,再次执行mount,似乎能成功

- idevicediagnostics restart后,立刻执行ideviceimagemounter -u 00008110-000A210C1411801E 16.0/DeveloperDiskImage.dmg  16.0/DeveloperDiskImage.dmg.signature,成功。
mutu1213 commented 1 year ago

功能完整性测试

环境:macbook pro (x86) 13.0.1 手机

UDID                       SerialNumber    NAME        MarketName           ProductVersion  ConnType
00008101-000548223A99001E  F2LFP2FZ0D5F    胡继的 iPhone  iPhone 12 Pro Max              16.1  usb

tidevice 测试

perfordog 测试

性能数据采集正常

image

使用gocat转发https://github.com/sumup-oss/gocat

mutu1213 commented 1 year ago

tidevice battery 命令问题

直接在macmini上执行(中间没有任何转发程序) 两台iphone,执行都必现报错

wetest@ct-eb-node-201:~$ tidevice list
UDID                       SerialNumber    NAME    MarketName    ProductVersion    ConnType
00008110-000A31503401401E  QKX7VV9CWW      iPhone  -             16.2              usb
00008120-0010554E3E44C01E  JPHQ7XDKVM      iPhone  -             16.0.3            usb
wetest@ct-eb-node-201:~$ tidevice -u 00008110-000A31503401401E battery

当前电量 100% 充电次数 2次 当前电量 2955mAh 实际容量 3032mAh 设计容量 3259mAh 电池寿命 93% 序列号 F8Y235109LW231L7Q 电池温度 2939/100℃ 当前电压 4336mV 开机电压 4359mV 充电器功率 8W Traceback (most recent call last): File "/Users/wetest/Library/Python/3.8/bin/tidevice", line 8, in sys.exit(main()) File "/Users/wetest/Library/Python/3.8/lib/python/site-packages/tidevice/main.py", line 965, in main actionsargs.subparser File "/Users/wetest/Library/Python/3.8/lib/python/site-packages/tidevice/main.py", line 408, in cmd_battery value = value[key] KeyError: 'Voltage'

wetest@ct-eb-node-201:~$ tidevice -u 00008120-0010554E3E44C01E battery

当前电量 100% 充电次数 1次 当前电量 3048mAh 实际容量 3116mAh 设计容量 3181mAh 电池寿命 98% 序列号 F5D2403L8SP21PK7Z 电池温度 2829/100℃ 当前电压 4349mV 开机电压 3362mV 充电器功率 8W Traceback (most recent call last): File "/Users/wetest/Library/Python/3.8/bin/tidevice", line 8, in sys.exit(main()) File "/Users/wetest/Library/Python/3.8/lib/python/site-packages/tidevice/main.py", line 965, in main actionsargs.subparser File "/Users/wetest/Library/Python/3.8/lib/python/site-packages/tidevice/main.py", line 408, in cmd_battery value = value[key] KeyError: 'Voltage'

prife commented 1 year ago

mount功能测试

目前已知的几个现象如下:

  1. wdb[/var/run/usbmuxd] <--> haproxy (:27015 <-> /var/run/usbmuxd.system)

    1. tidevice reboot异常,必现
    2. tidevice developer失败,必现
    3. go-ios image auto失败,必现
    4. ideviceimagemounter成功
  2. haproxy (/var/run/usbmuxd <-> /var/run/usbmuxd.system)

    1. tidevice reboot成功
    2. tidevice developer成功,几乎总能成功
    3. go-ios image auto,失败,高概率,使用ctrl-c终止后,重试1~5次差不多总能成功
  3. gocat <--> haproxy

    1. tidevice reboot成功
    2. tidevice developer成功,共测试五组,全部成功
    3. go-ios image auto失败
      • [1] ctrl-c尝试第二次成功
      • [2] ctrl-c尝试第四次成功
# 启动haproxy,(:27015 <-> /var/run/usbmuxd.bk)

# 启动gocat
sudo ./gocat tcp-to-unix --src 0.0.0.0:27015 --dst /var/run/usbmuxd
sudo chmod 777 /var/run/usbmuxd
prife commented 1 year ago

windows测试

  1. 首先下载windows版本itunes,也可以微盘获取:udt版本发布-ios resources目录下
  2. 测试环境,个人开发机windows server2019

27015端口监听ip确认

测试目标:启动Apple usbmuxd服务后,检测其监听27015端口的网址是127.0.0.1还是0:0:0:0。确认当用户使用windows接入iOS设备时,是否需要Haproxy

macOS/Linux上检测端口可使用 lsof -i tcp:27015,windows上对等方法

PS C:\Users\Administrator> NETSTAT.EXE -ant | findstr 27015
  TCP    127.0.0.1:27015        0.0.0.0:0              LISTENING       InHost

使用go-nc测试全局27016端口,然后使用上述命令检查端口状态,可见监听ip为0.0.0.0

PS C:\Users\Administrator> NETSTAT.EXE -ant | findstr 27016
  TCP    0.0.0.0:27016          0.0.0.0:0              LISTENING       InHost
  TCP    [::]:27016             [::]:0                 LISTENING       InHost

参考:https://stackoverflow.com/questions/15708/how-can-i-determine-whether-a-specific-file-is-open-in-windows

总结:

mac <--> windows serevr局域网联合测试

由于HAproxy没有提供windows版本,手动编译需要mingw或者cygwin,较为麻烦;而realm(使用rust编写)提供了多个平台的windows包,因此在windows上使用realm替代Haproxy。

./realm -l 0.0.0.0:27016 -r 127.0.0.1:27015

然后在同一个局域网的mac电脑上启动wdb,并在其中测试各项功能

昨天的初步测试,macOS上出现的现象是:

  1. 几乎所有命令执行时间很长,如tidevice info,可达30S~1分钟

但奇怪的是,今天重启了几次电脑后该现象消失。后续仍需要留意

网络测试

$ ping 192.168.0.192                                                                                                                                                       [10:58:47]
PING 192.168.0.192 (192.168.0.192): 56 data bytes
64 bytes from 192.168.0.192: icmp_seq=0 ttl=128 time=6.762 ms
....
64 bytes from 192.168.0.192: icmp_seq=14 ttl=128 time=10.213 ms
64 bytes from 192.168.0.192: icmp_seq=15 ttl=128 time=6.005 ms
^C
--- 192.168.0.192 ping statistics ---
16 packets transmitted, 16 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 3.959/6.945/14.545/2.760 ms

ping指标:round-trip min/avg/max/stddev = 3.959/6.945/14.545/2.760 ms0

iperf性能测试

$ ./iperf3 -c 127.0.0.1 -p 5201 -t 10
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-10.01  sec   314 MBytes   263 Mbits/sec                  sender
[  4]   0.00-10.01  sec   302 MBytes   253 Mbits/sec                  receiver

平均速度为263/253Mbps

$ iperf3 -c 127.0.0.1 -p 5201 -t 10
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec   185 MBytes   155 Mbits/sec                  sender
[  5]   0.00-10.04  sec   182 MBytes   152 Mbits/sec                  receiver

局域网转发以后,性能损失大约在40%, 155/263=58.93%, 152/253=60.07%


下午windows系统升级到win 10 22H2版本后,重新测试

windows原生效果

局域网转发一次后

这次的损失在47~45%左右。

专业弱网络测试工具