Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

dp2Capo SIP 服务器功能与测试计划 #199

Open
DigitalPlatform opened this issue Jul 29, 2018 · 24 comments
Open

dp2Capo SIP 服务器功能与测试计划 #199

DigitalPlatform opened this issue Jul 29, 2018 · 24 comments

Comments

@DigitalPlatform
Copy link
Owner

DigitalPlatform commented Jul 29, 2018

需求和功能概述

dp2 中原有的 SIP Server 不能支持多租户情形。这次改造和迁移主要是解决这个问题,允许 SIP Server 多个实例并存。那么计划采用的方法实际上是只使用一个 SIP 监听端口,然后根据 SIP 请求中 Login 请求里面携带的用户名,析出用户名中 '@' 以后的部分,定位到具体的实例,解决多租户应用问题。

鉴于前不久刚在 dp2Capo 中实现了 Z39.50 服务器功能,顺便也抽出一个 TcpServer 类,重载以后实现 SIP 服务器功能,复用代码。好处很多,其中一个是可以享用为 Z39.50 服务器所开发的根据前端 IP 地址限定同一个 IP 能使用的最大通道数的功能。

@DigitalPlatform
Copy link
Owner Author

DigitalPlatform commented Jul 29, 2018

测试计划

通讯包发送接收

  1. 要制造一种场景,前端发出的通讯包,故意切割为几个部分,顺次间隔一定时间发出。目的是验证服务器接收这种碎片通讯包可以正确组合处理;

  2. 多个请求一次性发出。那么响应会是和请求包的顺序对应的。目的是测试验证服务器可以处理此种 Pipeline 请求,通讯包分界机制正确。

  3. 请求包尺寸大于 4096 bytes,会引起默认配置情况下 TCP 通讯被服务器切断。这是服务器的一种保护措施,防范前端用巨大的通讯包进行攻击。(注意检查这个极限尺寸参数应该可以在 dp2Installer 中配置)

  4. 前端使用的通讯包结束符可以是 '\r' 或者 '\n'。服务器会自动按照前端请求时候所使用的结束符,来决定响应包的结束符。注意测试时候,可以同时启动多个通道进行请求,而且请求之间使用了不同的结束符,要求服务器可以自动针对性地使用响应结束符。同一个通道的不同请求之间其实也可以使用不同的结束符,服务器能适应。

(以上对应测试用例TC-SIP-14)

编码方式

  1. 当 SIP Client 用 GB2312 编码方式、并且 SIP Server 为该实例配置的编码方式为 UTF-8 的时候,如果 Login 请求里面的用户名里面包含汉字,是识别不了的。SIP Client 可以用 UrlEncode() 为用户名转义,这样 SIP Server 就可以识别了。LocationCode 也可以使用转义方式。不过需要注意的是,用户名和 LocationCode 里面就不允许直白使用 ‘%’ 字符了(如果确实存在,可以用其转义方式)。
    (对应测试用例 TC-SIP-09,TC-SIP-10)

登录,多租户应用

  1. 没有包含 '@' 符号的用户名,会对第一个实例起作用。(对应测试用例TC-SIP-11)

  2. 包含 '@' 符号的用户名,对指定的实例起作用。当实例不存在的时候要明确报错。(对应测试用例TC-SIP-11)

  3. 一般来说,SIP Client 中,在没有调用 Login() 的情况下,调用了 Login() 以外的 API 应该明确返回出错,最好出错提示文字准确指明这个原因。但 dp2Capo 做了一些变通。具体如下:

  • 如果当前只有一个实例,并且这个实例的 SIP Servie 参数里面配置了匿名登录账户,那么允许 SIP Client 在 Login() 以前使用 ScStatus()。ScStatus() 请求过程中,SIP Service 会登录和访问这个实例关联的 dp2library 服务器,所用的 dp2library 账户正是这个匿名登录账户。(注意配置匿名登录账户会有安全性风险,一般要结合 SIP Service 的 ipList 参数一起使用) (对应测试用例TC-SIP-05)

  • 如果当前有多个实例,那么不允许 SIP Client 在 Login() 以前使用任何其他请求。这些请求都会失败。 (对应测试用例TC-SIP-08)

通道资源控制

  1. 每个前端 IP 最多允许同时使用 100 个 TCP 连接;

  2. 短时间内(10秒钟) Connect 动作超过 1000 次,IP 自动被列入黑名单;

  3. IP 表内最多允许同时存在 10000 个事项。超过了则不允许更多前端进行 Connect。

(以上1)2)3)对应测试用例TC-SIP-12)

  1. TCP 通道休眠时自动清理特性。
  • 每个 TCP 通道,在 Login() 或者其他请求之前,可以存活 10 秒钟。超过 10 秒钟就有可能被 SIP Service 自动关闭和清理。也就是说,SIP Client 在 Connect 成功以后,10 秒以内要进行实质性的请求操作,否则 TCP 通道会被 Server 一端自动清除。

  • TCP 通道在 Login() 或者其他请求之后,是否被自动清理,以及多少休眠时间以后才被自动清理,是由 (各个实例的)SIP Service 参数中的自动清理秒数参数决定的。休眠超过这个参数值以后会被自动从服务器端关闭和清理。为此 SIP Client 要有所准备,当通讯过程中发现 close by remote peer 时,要重新 Connect,(如果必要,)并且重新 Login()。对于不适应自动清理机制的 SIP Client,可以为它访问的实例的 SIP Service 参数里面定义这个自动清理秒数为 0 或空,这样就禁用了这个特性。但 TCP 通道 Login() 或其他请求之前的 10 秒休眠以后就自动清理的特性不允许禁用。

(以上对应测试用例TC-SIP-13)

@DigitalPlatform
Copy link
Owner Author

DigitalPlatform commented Jul 31, 2018

SIP Server 自动清理休眠 TCP 连接的算法考虑

就是一般 SIP Client 可能会假定 TCP 连接一直存在。如果休眠两分钟以后 SIP Server 自动 Close TCP 连接,那么后面 SIP Client 再次进行请求的时候就会报错 (closed by remote peer),为此,SIP Client 需要有所准备,要专门增加遇到这种情况重试的代码。而且重新 Connect TCP 连接以后,还要补一次 Login 才行。这里需要专门提醒一下 SIP Client 的开发商增强一下这个功能,方能适应 Server 这个做法。

如果利用 TcpServer 的现有代码,统一对所有 TCP 连接进行一次检查和清理,并没有区分是哪些实例的 TCP 连接,可能还无法满足实际需求。因为实际场景中,可能会出现某个单位的 SIP Client 支持这种自动恢复 TCP 连接,另外一个单位的 SIP Client 不支持的情况。所以这个参数不应该是一个全局参数,而是应该每个实例单独配置,可以启用可以不启用。那还涉及到修改配置界面和参数体系。另外基础的清理扫描函数,可能从技术上来说要给增加一个回调函数参数,在回调函数里面具体判断哪些实例是需要清理,哪些不需要清理,然后区别动作。

(以上对应测试用例TC-SIP-15)

@paopaofeng
Copy link
Contributor

paopaofeng commented Aug 6, 2018

SIP 服务功能,SIP Client 密集获得 ItemInfo ,过程中未重新连接 SIP 服务,也未重新登录, 出现获得信息过程被中断。启用控制台模式调试运行 dp2Capo,跟踪发现出现问题的原因:
在安装 dp2Capo 时未启用 ZServer 功能,在“每个 TCP 通道休眠 2 分钟以后会被自动从服务器端 Close”过程中, 因为 ZServer 为 Null 而引起的。
image

@DigitalPlatform
Copy link
Owner Author

DigitalPlatform commented Aug 10, 2018

关于 SIP Login 和 ScStatus 请求顺序问题

SIP 2 协议里面规定,如果 SIP Server 要启用 Login 功能,那么 Login 必须是一个 TCP 连接的第一个请求。有一些 SIP Client 实现中,会在 Login 以前先调用 ScStatus,这是不符合 SIP 2 协议规定的。

dp2Capo 中的 SIP Server 功能,因为要实现多租户模式,所以 SIP Client 在 ScStatus 以前,必须通过 Login 先告知 SIP Server 自己关注的是那个实例(登录的用户名字符串中包含了实例名),然后 ScStatus 才能根据实例里面配置的 dp2library 服务器信息,加上 Login 请求传递来的 用户名,去登录 dp2library 获得 dp2library 的活跃信息。所以这种时候 dp2Capo 强烈在意 Login 和 ScStatus 的先后顺序。当然 SIP 2 协议的规定本身是满足多租户的这种场景要求的。
(以上对应测试用例TC-SIP-08)

上面说的是一般多实例情况。如果 dp2Capo 安装后,只配置了一个实例,那么上述要求有所降低。即便 ScStatus 先于 Login 调用,那么 SIP Server 也能假定当前一定是访问唯一的这个实例,应该是可以允许这种用法(即 ScStatus 先于 Login 调用)。但因为 ScStatus 调用时需要访问 dp2library 服务器,所以这里要求这个唯一的实例的 SIP 参数里面,定义了匿名访问账户名和密码。如果没有定义这个匿名访问账户,则 ScStatus 请求先于 Login 的情况将返回错误。(对应测试用例TC-SIP-05)

@DigitalPlatform
Copy link
Owner Author

DigitalPlatform commented Aug 15, 2018

实例中 SIP 参数配置的改进

稍早版本中,一个实例的 SIP 参数,只有一组。为了适应一个 dp2library 中多个分馆的场景,最新版本改进为一个实例的 SIP 参数,是一个对照表,由若干 dp2library 用户名各对应一组 SIP 参数。

注意 dp2library 用户名尽量用英文形态。各个分馆的用于 SIP 的 dp2library 用户名最好包含分馆的名字或者标识部分,以方便配置时识别。

对照表中,应该至少有一个用户名事项。如果一个也没有,则实际上这个实例的 SIP 服务无法访问。配置完成时程序会检查并警告这种情况。

一般是有多少个 dp2library 用户可以访问 SIP Service,就给这个对照表配置多少个事项。这样就限定了,配置了的用户才能访问 SIP Service。
(对应测试用例TC-SIP-06)

还可以在对照表中增添一个名为 * 的用户名事项。表示任意匹配用户名。当配置了这一事项以后,SIP Client 访问 SIP Service 的时候,会首先尝试匹配请求中包含的用户名,如果匹配上了则用匹配上的那个事项参数;如果没有匹配上,则采用 * 这个事项的 SIP 参数。
如果要允许所有 dp2library 用户都能访问 SIP Service,可以只配置唯一的一个用户名事项,名为 *
(对应测试用例TC-SIP-07)

匿名账户

如果配置了匿名账户,若 SIP Client 没有 Login() 就 ScStatus(),则 SIP Service 会用这个匿名账户去完成 ScStatus() 功能。(对应测试用例TC-SIP-05)
对照表中必须配置一个名字为匿名账户名的事项;或者有一个名字为 '*' 的事项。
配置界面会自动检查这种要求是否满足。(对应测试用例TC-SIP-01中的部分段落)

@paopaofeng
Copy link
Contributor

paopaofeng commented Aug 16, 2018

测试用例 TC-SIP-10

测试目的

测试账号名中含有汉字的情况

既然这里提到了汉字的账户名,需要测试一下使用汉字账户名的情况。如果 SIP Client 和 SIP Server 的编码方式不同,或者说某方误用了编码方式,那 Login() 里面的汉字账户名可能就无法识别。在这里面提到,前端此时可以把账户名转义以后放入通讯包内以保证汉字能被服务器识别。但这个转义的用法是本软件自定义的扩充规定。

升级 chordinstaller (版本号:1.3.6802.6603),使用该版本 chordinstaller 升级 dp2Capo,在“用户名和 SIP 参数对照表”中添加以下项目内容:

用户名:自助机
编码方式:GB2312
时间格式:yyyy-MM-dd

使用 SIP Client 使用“自助机”账户进行登录测试。
总结: SIP Client 连接 SIP Server 时使用 GB2312 编码方式登录失败,使用 UTF-8 登录成功。
编码方式,登录时发出消息与返回信息对照表
image

@DigitalPlatform
Copy link
Owner Author

DigitalPlatform commented Aug 16, 2018

@paopaofeng

SIP Client 发出带有转义字符串的账户名的 Login 请求包,应该是需要通过专门的 SIP Client 程序来验证。也就是说测试的时候也是要写代码的。这些测试代码形成的功能,最好正规管理和保留,以便可以反复测试。(对应测试用例TC-SIP-10)

@paopaofeng
Copy link
Contributor

paopaofeng commented Aug 17, 2018

测试用例 TC-SIP-09

测试目的

验证 dp2Capo 中 SIP 服务功能 用户名和 SIP 参数对照表用户名编码方式 是否可以正确对应。

测试环境

dp2Library服务器:dp2LibraryXE,版本号:3.0.6801.26543

SIP 服务器:dp2Capo,采用 ChordInstaller 安装部署,版本号:1.3.6802.39730

dp2Library账户

账户1:

账户名:gb2312
无密码
权限代码:borrow,getbibliosummary,getiteminfo,getreaderinfo,renew,return,getsystemparameter

账户2:

账户名:utf8
无密码
权限代码:borrow,getbibliosummary,getiteminfo,getreaderinfo,renew,return,getsystemparameter

dp2Capo部署情况

全局参数

不启用 Z39.50 服务

启用 SIP 服务
监听端口号:8100

实例数量:1
实例名:instance1

实例 instance1 详细情况

dp2Library服务器

url=net.pipe://localhost/dp2library/xe
userName=capo
defaultQueue=
webURL=

dp2MServer服务器

未启用

Z39.50服务

未启用

SIP服务

anonymousUserName=
userCount=2
SIP服务参数

dp2Library服务器属性页配置
所访问的 dp2Library 服务器 URL:net.pipe://localhost/dp2library/xe
不启用匿名登录
勾选“启用本实例的 SIP 服务”选项

SIP属性页配置
用户名和 SIP 参数对照表

用户1 utf8:
用户名:utf8
编码方式:UTF-8
前端 IP 地址白名单:(空)
时间格式:yyyy-MM-dd
通道自动清理秒数:120

用户2 gb2312:
用户名:gb2312
编码方式:GB2312
前端 IP 地址白名单:(空)
时间格式:yyyy-MM-dd
通道自动清理秒数:120

使用 SIP 客户端测试情况

用户名 编码方式 登录 获得册 获得读者 借书 还书 接收消息中文是否乱码
utf8 UTF-8 正常 正常 正常 正常 正常
gb2312 UTF-8 正常 正常 正常 正常 正常
utf8 GB2312 正常 正常 正常 正常 正常
gb2312 GB2313 正常 正常 正常 正常 正常

总结

用户名和 SIP 参数对照表用户名编码方式 可以正确匹配对应,并且发送和接收命令中中文不会出现乱码。
如果客户端采用的编码方式与服务器端配置的编码方式不一致,发送和接收命令正常,但是为出现中文乱码的情况,不过这是正常现象。

@paopaofeng
Copy link
Contributor

paopaofeng commented Aug 24, 2018

测试计划

  1. 在 chordInstaller 里面重新配置了实例和参数,还是需要重新启动一次 dp2Capo 才能完全正确,这个部分也需要测试。
    (对应测试用例TC-SIP-03)

  2. dp2Capo 安装多实例,多实例中有的实例启用 SIP 服务,有的不启用,进行测试。
    (对应测试用例TC-SIP-04)

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试计划

dp2capo内部模块层次架构图

2018-8-24 19:31:15谢老师留言:更新了 chordInstaller。

第一个,是配置 SIP 参数的时候,从启用 SIP 到不启用 SIP,原来是要删除相关元素,这个会导致后面再次启用的时候,原先 SIP 参数中的用户映射数据被删除丢失了,只好重新配置。新版本改了一下,这里启用也好不启用也好,不会删除这些配置信息,而是给有关元素加了一个 enable 属性。

另外,有个小改动,就是这个对话框原来在 SIP 没有启用的时候,tabcontrol 整个被 diabled 了,属性页翻页也不行。这样不是很利于用户看配置信息(是的,即便没有启用 SIP,也是可以看的哟,本来应该)。新版本改为单独 disabled 一个一个 tabpage,这样点 tabcontrol 的耳朵可以翻页。

第二个,是我看到截图,可能是刚进入 SIP 参数配置对话框的时候,对话框里面主要界面元素的 enabled 状态和“启用 SIP” 的 checkbox 之间的锁定关系不是太正确,可能会导致配置者在没有启用 SIP 的时候可以编辑账户映射配置(应该是不允许的,这时主要界面元素应该是 disabled 状态,目的是提醒配置者明白此时还没有启用),然后点“确定”关闭对话框重新进来,却发现刚配置的账户映射信息丢失了。新版本改掉了这个 bug,需要测试一下看看是不是真改掉了

(以上对应测试用例TC-SIP-01)

那么 dp2capo 本身的功能,每个 SIP 实例是否启用了还是没有启用,需要用 SIP Client 简单测试一下。
(对应测试用例TC-SIP-02)

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例 TC-SIP-01

一、测试目的

该用例主要是测试配置信息是否保存正确,未涉及SIP服务是否能被前端访问。

1)测试SIP全局参数的配置。启用的话,config配置文件中的sipServer节点的port属性有值;禁用的话,port属性值为空。
2)测试单独实例SIP参数配置,启用的话,capo.xml配置文件中的sipServer节点的enable属性为true;禁用的话,enable属性为false。测试匿名参数,测试用户名与SIP参数对照表。
3)单独实例SIP启动与禁用,不能丢失其它的配置信息,比如user对照关系。从capo.xml配置文件 和 界面两方面检查。
4)单独实例SIP禁用,capo的SIP里的两个属性页dp2Library服务器 与 SIP 都是可以点开的,可以查看原来的配置,但里面的控件禁用,禁用时不能修改配置信息。
5)测试全局SIP Serivce启用参数 与 单独实例的SIP参数配置 的关系。

二、测试环境

ChordInstaller 升级到最新版本,同时带动dp2capo升级到最新版本

三、测试步骤


先测全局参数

1)先打开dp2capo全局配置文件,可以通过chordinstaller先打开某capo实例的数据目录,再向上一层目录到dp2capo数据目录,打开config.xml配置文件,未启动全局配置时,sipServer节点的port属性为空,如下配置:

<root>
  <zServer port="" />
  <sipServer port="" />
</root>

2)在chordInstaller里,通过菜单 dp2capo/配置实例,打开 配置dp2capo的实例 对话框。点右上侧的 全局参数 按钮,打开 全局参数 对话框,点开 SIP服务 属性页,勾中启用SIP服务Checkbox,同时端口默认为8100。关闭对话框,回到 dp2capo实例管理 界面。

3)查看config.xml配置文件,发现sipServer节点的port属性有值了,为8100。

<root>
  <zServer port="" />
  <sipServer port="8100" />
</root>

4)再次打开全局参数对话框,不勾选 启用SIP服务,关闭对话框,回到 dp2capo实例管理 界面。
5)查看config.xml配置文件,sipServer节点的port属性应为空。


测试单独实例的 启用SIP服务 checkbox

6)一个capo实例,从来没有配置过SIP服务时,打开其数据目录,其中的capo.xml配置文件中应该没有sipServer节点。

7)双击此capo实例,进入 一个实例 配置界面,点SIP服务最右边...按钮,开SIP服务对话框,最下方的 启用本实例的SIP服务应该是未勾中状态,分别点 dp2Library服务器属性页 与 SIP 属性页 耳朵,都能点开,里面的控制应是发灰disabled状态。
只是看一看,不做任何修改,关闭对话框,直到回到 配置dp2capo的实例 的界面。然后查看此capo实例的capo.xml配置文件,应保持原样,不增加sipServer节点。

8)再次双击打开此capo实例的配置界面,在SIP服务对话框中,勾中 启用本实例的SIP服务。
点 确定 关闭 SIP服务参数 对话框,弹出 警告:虽然启用了SIP Service,但因为没有配置任何用户名映射参数,所以该实例的SIP Service实际上无法访问,点确定,回到 一个实例 配置对话框,看到SIP服务 信息框中显示
anonymousUserName=
userCount=0。

9)再关闭 一个实例 对话框,回到 配置dp2capo的实例 的界面。
然后查看此capo实例的capo.xml配置文件,应增加sipServer节点,且enable属性为true,同时在下级增加了dp2library节点,如下。

  <sipServer enable="true">
    <dp2library anonymousUserName="" anonymousPassword="UpmHeWlIUVw=" />
  </sipServer>

10)再次双击打开此capo实例的配置界面,在SIP服务对话框中,不勾选 启用本实例的SIP服务。
关闭 SIP服务参数 对话框,回到 一个实例 配置对话框,看到SIP服务 信息框中显示
anonymousUserName=
userCount=0。

11)再关闭 一个实例 对话框,回到 配置dp2capo的实例 的界面。
然后查看此capo实例的capo.xml配置文件,sipServer节点应保持存在,enable属性应为false,下级dp2library节点不变,如下。

  <sipServer enable="false">
    <dp2library anonymousUserName="" anonymousPassword="UpmHeWlIUVw=" />
  </sipServer>

测试单独实例的 匿名帐户配置,其间必须配置匿名帐户对应的SIP参数

12)再次双击打开此capo实例的配置界面,在 SIP服务参数 对话框中,勾中 启用本实例的SIP服务。然后在dp2library服务器 属性页,在匿名账户区域,输入用户名zizhu和密码,点 确定 ,弹出提示 匿名帐户名***在'SIP'属性页的用户名列表中尚未定义,此时点 确定 不能关闭 SIP服务 对话框。点 取消 关闭 SIP服务参数对话框,回到 一个实例 配置界面,在SIP服务信息框中依然是
anonymousUserName=
userCount=0

然后点 确定 关闭 一个实例 对话框,查看capo.xml配置文件,dp2library节点的anonymousUserName属性应为空。

再打开此capo实例的 SIP服务参数 对话框,看到 启用本实例的SIP服务 是勾中状态,dp2Library匿名用户信息是空的。

13)在匿名账户区域,输入用户名和密码,然后再在 SIP 属性页,点 新增 出现 创建新用户事项 小对话框,不输入任何内容,点 确定,弹出提示:用户名不能为空。

然后随便输入一个用户名,只要与匿名不同就行,例如a,右边出现一些具体事项的默认配置,点确定关闭小对话框。再在SIP服务参数界面上点 确定 按钮,弹出提示 匿名帐户名***在'SIP'属性页的用户名列表中尚未定义,此时点 确定 不能关闭 SIP服务 对话框。(注:点 取消 不会保存本次的任何修改,这里就不重复步骤了,个人测试时可以试一下)

输入用户名zizhu,右边出现一些具体事项的配置,通道自动清理秒数设为10,其它按默认值就行。

然后点 确定 按钮,关闭 SIP服务参数 对话框,回到 一个实例 配置界面,看到 SIP服务 信息框中的信息显示为
anonymousUserName=zizhu
userCount=2

14)再关闭 一个实例 对话框,回到 配置dp2capo的实例 的界面。
然后查看此capo实例的capo.xml配置文件,sipServer节点应保持存在,enable属性应为false,下级dp2library节点不变,如下。

  <sipServer enable="true">
    <dp2library anonymousUserName="zizhu" anonymousPassword="MQ0nafTqthg=" />
    <user userName="a" dateFormat="yyyy-MM-dd" encoding="UTF-8" ipList="" autoClearSeconds="" />
    <user userName="zizhu" dateFormat="yyyy-MM-dd" encoding="UTF-8" ipList="" autoClearSeconds="10" />
  </sipServer>

15)再打开此capo实例的 SIP服务参数 对话框,删除匿名用户名,回到 一个实例 界面,SIP服务 信息框里应显示为
anonymousUserName=
userCount=2

capo.xml配置文件中匿名用户名为空,其中信息不变。

16)再打开此capo实例的 SIP服务参数 对话框,匿名用户名应为空,定义的用户名与SIP参数对照表信息不变。


测试单独实例的启用或不启用SIP服务,对SIP其它参数不要影响

17)打开此capo实例的 SIP服务参数 对话框,不勾选 启用本实例SIP服务,界面里各个属性页可以点开,但里面的控件变成发灰不可用状态,但信息不应丢失,关闭对话框,直到回到 配置dp2capo实例 界面。打开capo.xml配置文件,sipServer节点的enable属性应为false,其它信息不丢失。

18)再次打开此capo实例的 SIP服务参数 对话框,查看 启用本实例SIP服务 应是不勾选状态,点开两个属性页,信息在,控件发灰。勾中 启用本实例SIP服务,信息在,控件变成可用状态,修改zizhu帐户的通道自动清理秒数为15。点 确定 配置dp2capo实例 界面。打开capo.xml配置文件,sipServer节点的enable属性应为true,zizhu帐户参数有修改,如下图。

  <sipServer enable="true">
    <dp2library anonymousUserName="" anonymousPassword="UpmHeWlIUVw=" />
    <user userName="a" dateFormat="yyyy-MM-dd" encoding="UTF-8" ipList="" autoClearSeconds="" />
    <user userName="zizhu" dateFormat="yyyy-MM-dd" encoding="UTF-8" ipList="" autoClearSeconds="15" />
  </sipServer>

测试全局SIP参数 与 单独实例的SIP参数关系
19)全局参数,启用SIP服务;单独实例 SIP服务参数,可以启用或禁用。
20)全局参数,禁用SIP服务;单独实例 SIP服务参数,可以启用或禁用,不受全局禁用设置影响。但实际单独实例设置了启用,如果全局禁用的话,前端是不能访问的。

四、测试结果

20180826-ryh:测试结果与期望一致
这里对19)20)结果总结一下:全局SIP服务禁用,目前不影响单独实例的配置,也就是说全局实例禁用,依然可以修改单独实例的配置(包括单独实例启用SIP的checkbox也是可以勾的),但实际上全局禁用,单独实例再怎么配置也不会起作用。【建议】如果全局SIP服务禁用的话,在单独实例SIP配置参数 界面有明显的提醒。

全局参数 里的 启动SIP服务 与 单个实例里的启用SIP服务是什么关系?比如全局是禁用的,发现单个实例处还是可以启用。我理解下,全局禁用了,那个单个实例也应该是禁用的,因为端口号是在全局配置的。

光光 2018/8/26 22:02:05
是有这个问题。从程序员角度这个不难理解,全局里面没有启用,那么实例里面配置了 SIP 参数也没用。但要考虑这种情况,因为配置是交互的,可能过一会儿,操作者又去全局里面启用了 SIP。所以各个配置界面的参数要保持单独稳定,独立。

为了避免操作者出现疑问,可以考虑在每个实例的配置 SIP 参数的画面,比如确定的时候,警告一下全局里面并没有启用 SIP。或者在实例里面配置 SIP 参数的画面出现一个固定的 comment 或者 tips 文字表示提醒

而如果改为全局不启用,单独实例这里 SIP 参数配置界面就禁用(disabled) 的话,就不那么灵活了

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例 TC-SIP-02

一、测试目的

该用例主要检查全局参数的SIP服务启用与禁用,和单独实例的SIP服务启用与禁用,是否真正发挥作用。
1)检查全局参数启用或禁用,前端是否能连通SIP服务器。
2)注意“全局设置”那个按钮前面有个加号或者减号。加号表示全局 service 是启动的,减号表示全局 service 是停止的状态。即便全局对话框出现后,你移动开这个对话框看看它后面的“全局设置”按钮,上面的加号减号也是实时反映启动停止状态的。注意 全局 service 启动不等于 dp2capo 的启动状态,二者是有区别的
dp2capo 是否启动,看每个实例浏览行左侧的图标。按钮的加减号,只表示“全局 Service 是否启动”。全局 Service 主要就是指 Z39.50 和 SIP 两个 Service
很显然,dp2capo 启动的状态下,这两个全局 Service 可以不启动
3)检查在全局SIP服务禁用的情况下,单独SIP 实例参数启用和禁用,前端应不能连通。

二、测试环境

1)ChordInstaller 升级到最新版本,带动dp2capo升级到最新版本
2)dp2Library标准版服务器,版本为3.4
3)用SIP Client前端工具来连接SIP 服务,进行访问测试。

三、测试步骤:

说明:因为在TC-SIP-01中详细写了dp2capo的SIP服务配置操作,这里关于步骤操作就简写了。


全局参数启用或禁用,前端是否能连通。
1)全局参数,启用SIP服务,端口为8100。不配置任何实例的SIP参数。
2)SIP Client连接SIP服务器,应连接成功。
3)SIP Client,用登录命令访问一个SIP服务实例,应不成功。
4)全局参数,不启用SIP服务。不配置任何实例的SIP参数。
5)SIP Client连接SIP服务器,应连接不成功。
6)全局参数,再启用SIP服务。
7)SIP Client连接SIP服务器,应连接成功。


检查在全局SIP服务禁用的情况下,单独SIP 实例参数启用和禁用,前端应不能连通。
1)dp2Capo全局参数,禁用SIP服务

2)dp2Capo实例A,启用SIP服务,配置用户zizhu
3)SIP Client连接SIP服务器,应连接不成功。

4)dp2Capo实例A,禁用SIP服务。
5)SIP Client连接SIP服务器,应连接不成功。

四、测试结果

20180827-ryh:测试结果与预期一致

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-03

一、测试目的

测试为一个dp2capo实例配置SIP服务,并增/删/改 用户名是否立即生效。

三、测试步骤

前提:配置全局参数 启用SIP服务。
1)在dp2capo里为一个实例配置SIP服务,未配置用户对照表,前端应可以连接,但不能登录。
2)为该实例的SIP服务的用户对照表,新增一个用户,应立即生效,前端可登录。
3)修改该实例的SIP服务的用户名,应立即生效,前端用原来的名称不能登录,用新帐号才能登录。
4)删除该实例的SIP服务的用户,应立即生效,前端用被删除的帐号不能登录。

注:如果该实例是dp2capo宿主里的第1个实例,前端登录帐号可能不带前缀。

四、测试结果

20180827-ryh:测试结果与预期一致

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-04(todo)

dp2Capo 安装多实例,多实例中有的实例启用 SIP 服务,有的不启用,进行测试。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-05(todo)

如果配置了匿名账户,若 SIP Client 没有 Login() 就 ScStatus(),则 SIP Service 会用这个匿名账户去完成 ScStatus() 功能。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-06(todo)

一个 dp2library 中多个分馆的场景,一个实例的 SIP 参数,是一个对照表,由若干 dp2library 用户名各对应一组 SIP 参数。

dp2library帐户名 英文形态,包含分馆的名字或者标识部分。

一般是有多少个 dp2library 用户可以访问 SIP Service,就给这个对照表配置多少个事项。这样就限定了,配置了的用户才能访问 SIP Service。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-07(todo)

还可以在对照表中增添一个名为 * 的用户名事项。表示任意匹配用户名。当配置了这一事项以后,SIP Client 访问 SIP Service 的时候,会首先尝试匹配请求中包含的用户名,如果匹配上了则用匹配上的那个事项参数;如果没有匹配上,则采用 * 这个事项的 SIP 参数。
如果要允许所有 dp2library 用户都能访问 SIP Service,可以只配置唯一的一个用户名事项,名为 *。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-08(todo)

dp2Capo 中的 SIP Server 功能,因为要实现多租户模式,所以 SIP Client 在 ScStatus 以前,必须通过 Login 先告知 SIP Server 自己关注的是那个实例(登录的用户名字符串中包含了实例名),然后 ScStatus 才能根据实例里面配置的 dp2library 服务器信息,加上 Login 请求传递来的 用户名,去登录 dp2library 获得 dp2library 的活跃信息。所以这种时候 dp2Capo 强烈在意 Login 和 ScStatus 的先后顺序。当然 SIP 2 协议的规定本身是满足多租户的这种场景要求的。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-11(todo)

登录,多租户应用
没有包含 '@' 符号的用户名,会对第一个实例起作用。

包含 '@' 符号的用户名,对指定的实例起作用。当实例不存在的时候要明确报错。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-12(todo)

通道资源控制
每个前端 IP 最多允许同时使用 100 个 TCP 连接;

短时间内(10秒钟) Connect 动作超过 1000 次,IP 自动被列入黑名单;

IP 表内最多允许同时存在 10000 个事项。超过了则不允许更多前端进行 Connect。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-13(todo)

TCP 通道休眠时自动清理特性。
每个 TCP 通道,在 Login() 或者其他请求之前,可以存活 10 秒钟。超过 10 秒钟就有可能被 SIP Service 自动关闭和清理。也就是说,SIP Client 在 Connect 成功以后,10 秒以内要进行实质性的请求操作,否则 TCP 通道会被 Server 一端自动清除。

TCP 通道在 Login() 或者其他请求之后,是否被自动清理,以及多少休眠时间以后才被自动清理,是由 (各个实例的)SIP Service 参数中的自动清理秒数参数决定的。休眠超过这个参数值以后会被自动从服务器端关闭和清理。为此 SIP Client 要有所准备,当通讯过程中发现 close by remote peer 时,要重新 Connect,(如果必要,)并且重新 Login()。对于不适应自动清理机制的 SIP Client,可以为它访问的实例的 SIP Service 参数里面定义这个自动清理秒数为 0 或空,这样就禁用了这个特性。但 TCP 通道 Login() 或其他请求之前的 10 秒休眠以后就自动清理的特性不允许禁用。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-14(todo)

通讯包发送接收
要制造一种场景,前端发出的通讯包,故意切割为几个部分,顺次间隔一定时间发出。目的是验证服务器接收这种碎片通讯包可以正确组合处理;

多个请求一次性发出。那么响应会是和请求包的顺序对应的。目的是测试验证服务器可以处理此种 Pipeline 请求,通讯包分界机制正确。

请求包尺寸大于 4096 bytes,会引起默认配置情况下 TCP 通讯被服务器切断。这是服务器的一种保护措施,防范前端用巨大的通讯包进行攻击。(注意检查这个极限尺寸参数应该可以在 dp2Installer 中配置)

前端使用的通讯包结束符可以是 '\r' 或者 '\n'。服务器会自动按照前端请求时候所使用的结束符,来决定响应包的结束符。注意测试时候,可以同时启动多个通道进行请求,而且请求之间使用了不同的结束符,要求服务器可以自动针对性地使用响应结束符。同一个通道的不同请求之间其实也可以使用不同的结束符,服务器能适应。

@renyh
Copy link
Collaborator

renyh commented Aug 26, 2018

测试用例TC-SIP-15(todo)

SIP Server 自动清理休眠 TCP 连接的算法考虑
就是一般 SIP Client 可能会假定 TCP 连接一直存在。如果休眠两分钟以后 SIP Server 自动 Close TCP 连接,那么后面 SIP Client 再次进行请求的时候就会报错 (closed by remote peer),为此,SIP Client 需要有所准备,要专门增加遇到这种情况重试的代码。而且重新 Connect TCP 连接以后,还要补一次 Login 才行。这里需要专门提醒一下 SIP Client 的开发商增强一下这个功能,方能适应 Server 这个做法。

如果利用 TcpServer 的现有代码,统一对所有 TCP 连接进行一次检查和清理,并没有区分是哪些实例的 TCP 连接,可能还无法满足实际需求。因为实际场景中,可能会出现某个单位的 SIP Client 支持这种自动恢复 TCP 连接,另外一个单位的 SIP Client 不支持的情况。所以这个参数不应该是一个全局参数,而是应该每个实例单独配置,可以启用可以不启用。那还涉及到修改配置界面和参数体系。另外基础的清理扫描函数,可能从技术上来说要给增加一个回调函数参数,在回调函数里面具体判断哪些实例是需要清理,哪些不需要清理,然后区别动作。

@renyh
Copy link
Collaborator

renyh commented Aug 27, 2018

测试用例 TC-SIP-16

一、测试目的

检查在全局SIP服务启用的情况下,单独实例 SIP服务参数启用和禁用,前端是否能够连通和登录。

二、测试环境

1)dp2Capo assembly version: 1.27.6813.17365
2)dp2Library标准版服务器,版本为3.4
3)用SIP Client前端工具来连接SIP 服务,进行访问测试。

三、测试步骤:

1)在ChordInstaller,设置dp2Capo 全局参数,启用SIP服务。

2)在ChordInstaller,对dp2Capo实例instance1,启用SIP服务,在用户名与SIP参数对照表中 配置用户zizhu及对应SIP参数。点 确定 关闭 SIP服务参数 对话框,再点 确定 关闭 一个实例 对话框,回到 配置dp2capo的实例 对话框,实例instance1前面是绿色启动状态。最后点确定按钮关闭 配置dp2capo的实例
对话框,回到dp2capo主面板。

3)在SIP Client,配置 SIP服务器IP地址和端口,自动连接SIP服务器成功。

4)在SIP Client,用zizhu@instance1帐号登录,登录成功。

5)在ChordInstaller,修改dp2Capo实例instance1配置,不启用SIP服务,点 确定 关闭 SIP服务参数 对话框,再点 确定 关闭 一个实例 对话框,回到 配置dp2capo的实例 对话框,实例instance1前面是绿色启动状态。

最后点确定按钮关闭 配置dp2capo的实例 对话框,回到dp2capo主面板。
查看capo.xml配置文件,<sipServer enable="false">

6)在SIP Client,先点Disconnect按钮断开SIP服务器连接,再点Connect按钮重新连接,连接成功。

7)在SIP Client,用zizhu@instance1帐号登录,应该登录不成功。

四、测试结果

【已修复】【BUG】20180827-ryh:第7)与预期结果不一致,目前能登录成功。发现需要把dp2capo服务停止再重启一下,就正确了,就是说单独实例由启动到禁用SIP服务没有立即兑现。

20180828-ryh:升级到dp2Capo assembly version: 1.27.6813.37251 版本,测试结果与预期一致,修复了上面问题。

@renyh renyh changed the title dp2Capo 增添 SIP 服务器功能 dp2Capo SIP 服务器功能与测试计划 May 7, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants