OCT
REM: 1. 增加接口超时检测相关配置和功能 2. 更新接口请求参数校验组类名 3. 增加单元测试Base类返回协议头校验功能 4. 增加登录、注销功能单元测试
This commit is contained in:
parent
f3369d8cee
commit
4216d24a12
|
@ -58,6 +58,7 @@ dispose.debug-model=true
|
|||
dispose.check-protocol-timeout=false
|
||||
dispose.check-request-token=true
|
||||
dispose.split_char=,
|
||||
dispose.request-timeout-second=5
|
||||
|
||||
# 迪普设备配置
|
||||
# 发送超时时间(ms)
|
||||
|
|
|
@ -14,7 +14,7 @@ public class AuthConfigValue {
|
|||
/**
|
||||
* The constant TOKEN_EXPIRED_TIME_MS.
|
||||
*/
|
||||
public static long TOKEN_EXPIRED_TIME_MS = 30 * 60 * 1000;
|
||||
public static volatile long TOKEN_EXPIRED_TIME_MS = 30 * 60 * 1000;
|
||||
|
||||
/**
|
||||
* The constant MYSQL_REGEX.
|
||||
|
|
|
@ -0,0 +1,19 @@
|
|||
package com.dispose.common;
|
||||
|
||||
/**
|
||||
* The type Dispose config value.
|
||||
*
|
||||
* @author <huangxin@cmhi.chinamoblie.com>
|
||||
*/
|
||||
public class DisposeConfigValue {
|
||||
|
||||
/**
|
||||
* The constant CHECK_PROTO_REQUEST_TIMEOUT.
|
||||
*/
|
||||
public static volatile boolean CHECK_PROTO_REQUEST_TIMEOUT = false;
|
||||
|
||||
/**
|
||||
* The constant REQUEST_TIMEOUT_MS.
|
||||
*/
|
||||
public static volatile long REQUEST_TIMEOUT_MS = 5 * 1000;
|
||||
}
|
|
@ -53,4 +53,8 @@ public enum ProtoCryptoType {
|
|||
public String getReadme() {
|
||||
return this.readme;
|
||||
}
|
||||
|
||||
public static boolean verifyCryptoValuable(int code) {
|
||||
return code >= CRYPTO_NONE.getCode() && code <= CRYPTO_DES.getCode();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -27,4 +27,9 @@ public class DisposeConfigure {
|
|||
* The Split char.
|
||||
*/
|
||||
private String splitChar;
|
||||
|
||||
/**
|
||||
* The Request timeout second.
|
||||
*/
|
||||
private String requestTimeoutSecond;
|
||||
}
|
||||
|
|
|
@ -55,7 +55,7 @@ public class AuthController {
|
|||
@ResponseBody
|
||||
@ApiOperation("登录")
|
||||
public ProtocolRespDTO<? extends BaseRespStatus> userLogin(
|
||||
@Validated(ValidGroups.LoginReq.class)
|
||||
@Validated(ValidGroups.LoginReqValid.class)
|
||||
@RequestBody ProtocolReqDTO<LoginReq> mr)
|
||||
throws NoSuchAlgorithmException {
|
||||
|
||||
|
@ -95,7 +95,7 @@ public class AuthController {
|
|||
@PostMapping("/logout")
|
||||
@ResponseBody
|
||||
@ApiOperation("注销")
|
||||
public ProtocolRespDTO<? extends BaseRespStatus> userLogout(@Validated(ValidGroups.LogoutReq.class)
|
||||
public ProtocolRespDTO<? extends BaseRespStatus> userLogout(@Validated(ValidGroups.LogoutReqValid.class)
|
||||
@RequestBody ProtocolReqDTO<LoginReq> mr,
|
||||
@RequestHeader HttpHeaders headers) {
|
||||
// 注销用户登录
|
||||
|
|
|
@ -35,13 +35,13 @@ public class LoginReq {
|
|||
/**
|
||||
* The Password.
|
||||
*/
|
||||
@NotBlank(message = "password 密码不能为空", groups = ValidGroups.LoginReq.class)
|
||||
@NotBlank(message = "password 密码不能为空", groups = ValidGroups.LoginReqValid.class)
|
||||
@Length(min = 64, max = 64,
|
||||
message = "password 密码长度必须为SHA256编码后的长度",
|
||||
groups = ValidGroups.LoginReq.class)
|
||||
groups = ValidGroups.LoginReqValid.class)
|
||||
@Pattern(regexp = AuthConfigValue.MYSQL_REGEX_CHARS,
|
||||
flags = Pattern.Flag.CASE_INSENSITIVE,
|
||||
message = "password 密码存在非法字符串",
|
||||
groups = ValidGroups.LoginReq.class)
|
||||
groups = ValidGroups.LoginReqValid.class)
|
||||
private String password;
|
||||
}
|
||||
|
|
|
@ -26,8 +26,8 @@ public class BaseProtocolDTO<T> {
|
|||
* 当前协议版本号
|
||||
*/
|
||||
@ApiModelProperty(value = "协议版本号", required = true, example = "1")
|
||||
@NotNull(message = "ver 字段不能为空", groups = ValidGroups.ProtocolCommon.class)
|
||||
@Range(min = 3, max = 9999, message = "ver 字段最小值为 3", groups = ValidGroups.ProtocolCommon.class)
|
||||
@NotNull(message = "ver 字段不能为空", groups = ValidGroups.ProtocolCommonValid.class)
|
||||
@Range(min = 3, max = 9999, message = "ver 字段最小值为 3", groups = ValidGroups.ProtocolCommonValid.class)
|
||||
private Integer ver;
|
||||
|
||||
/**
|
||||
|
@ -39,20 +39,20 @@ public class BaseProtocolDTO<T> {
|
|||
"2:采用AES加密后的base64编码格式\n", required = true,
|
||||
allowableValues = "0, 1, 2",
|
||||
example = "0")
|
||||
@NotNull(message = "cryptoType 字段不能为空", groups = ValidGroups.ProtocolCommon.class)
|
||||
@NotNull(message = "cryptoType 字段不能为空", groups = ValidGroups.ProtocolCommonValid.class)
|
||||
@Range(min = 0, max = 2,
|
||||
message = "cryptoType 字段取值为 [0, 2]"
|
||||
, groups = ValidGroups.ProtocolCommon.class)
|
||||
, groups = ValidGroups.ProtocolCommonValid.class)
|
||||
private Integer cryptoType;
|
||||
|
||||
/**
|
||||
* 当前UTC时间戳(ms)
|
||||
*/
|
||||
@ApiModelProperty(value = "当前UTC时间戳", required = true, example = "1526625689000")
|
||||
@NotNull(message = "timeStamp 字段不能为空", groups = ValidGroups.ProtocolCommon.class)
|
||||
@NotNull(message = "timeStamp 字段不能为空", groups = ValidGroups.ProtocolCommonValid.class)
|
||||
@DecimalMin(value = "1595494343000",
|
||||
message = "timeStamp 字段值不能为过去时间"
|
||||
, groups = ValidGroups.ProtocolCommon.class)
|
||||
, groups = ValidGroups.ProtocolCommonValid.class)
|
||||
private Long timeStamp;
|
||||
|
||||
/**
|
||||
|
|
|
@ -11,7 +11,7 @@ public class ValidGroups {
|
|||
*
|
||||
* @author <huangxin@cmhi.chinamoblie.com>
|
||||
*/
|
||||
public interface ProtocolCommon {
|
||||
public interface ProtocolCommonValid {
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -19,7 +19,7 @@ public class ValidGroups {
|
|||
*
|
||||
* @author <huangxin@cmhi.chinamoblie.com>
|
||||
*/
|
||||
public interface LoginReq extends ProtocolCommon {
|
||||
public interface LoginReqValid extends ProtocolCommonValid {
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -27,6 +27,6 @@ public class ValidGroups {
|
|||
*
|
||||
* @author <huangxin@cmhi.chinamoblie.com>
|
||||
*/
|
||||
public interface LogoutReq extends ProtocolCommon {
|
||||
public interface LogoutReqValid extends ProtocolCommonValid {
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
package com.dispose.setup;
|
||||
|
||||
import com.dispose.common.AuthConfigValue;
|
||||
import com.dispose.common.DisposeConfigValue;
|
||||
import com.dispose.common.DpTechConfigValue;
|
||||
import com.dispose.config.AuthConfigure;
|
||||
import com.dispose.config.DisposeConfigure;
|
||||
|
@ -59,12 +60,18 @@ public class SystemInitial implements CommandLineRunner {
|
|||
} catch(Exception ex) {
|
||||
log.error("load SOAP_RECEIVE_TIMEOUT_SECOND configure error: {}", ex.getMessage());
|
||||
}
|
||||
//
|
||||
// try {
|
||||
// GlobalVar.IS_CHECK_REQUEST_TIMEOUT = Boolean.parseBoolean(disposeConfigure.getCheckProtocolTimeout());
|
||||
// } catch(Exception ex) {
|
||||
// log.error("load IS_CHECK_REQUEST_TIMEOUT configure error: {}", ex.getMessage());
|
||||
// }
|
||||
|
||||
try {
|
||||
DisposeConfigValue.REQUEST_TIMEOUT_MS = Integer.parseInt(disposeConfigure.getRequestTimeoutSecond()) * 1000;
|
||||
} catch(Exception ex) {
|
||||
log.error("load REQUEST_TIMEOUT_MS configure error: {}", ex.getMessage());
|
||||
}
|
||||
|
||||
try {
|
||||
DisposeConfigValue.CHECK_PROTO_REQUEST_TIMEOUT = Boolean.parseBoolean(disposeConfigure.getCheckProtocolTimeout());
|
||||
} catch(Exception ex) {
|
||||
log.error("load CHECK_PROTO_REQUEST_TIMEOUT configure error: {}", ex.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,6 +1,10 @@
|
|||
package com.dispose.test.Global;
|
||||
|
||||
import com.dispose.common.ConstValue;
|
||||
import com.dispose.common.DisposeConfigValue;
|
||||
import com.dispose.common.ErrorCode;
|
||||
import com.dispose.common.ProtoCryptoType;
|
||||
import com.dispose.pojo.dto.protocol.base.ProtocolRespDTO;
|
||||
import com.dispose.pojo.po.MulReturnType;
|
||||
import com.dispose.service.UserAccountService;
|
||||
import lombok.Getter;
|
||||
|
@ -14,13 +18,15 @@ import javax.annotation.Resource;
|
|||
|
||||
/**
|
||||
* The type Init test environment.
|
||||
*
|
||||
* @author <huangxin@cmhi.chinamoblie.com>
|
||||
*/
|
||||
@Slf4j
|
||||
@Getter
|
||||
@ActiveProfiles("local")
|
||||
public class InitTestEnvironment {
|
||||
/**
|
||||
* The connect timeout.
|
||||
* The constant HTTP_CONNECT_TIMEOUT.
|
||||
*/
|
||||
public static final int HTTP_CONNECT_TIMEOUT = 10000;
|
||||
/**
|
||||
|
@ -64,4 +70,43 @@ public class InitTestEnvironment {
|
|||
Assert.assertNotNull(logToken);
|
||||
Assert.assertNotEquals(logToken.length(), 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Verify resp protocol.
|
||||
*
|
||||
* @param <T> the type parameter
|
||||
* @param proObject the pro object
|
||||
*/
|
||||
public <T> void verifyRespProtocol(ProtocolRespDTO<T> proObject) {
|
||||
try {
|
||||
|
||||
// 检查协议版本
|
||||
if (proObject.getVer() < ConstValue.Protocol.VERSION) {
|
||||
log.error("Protocol version: {} need {}", proObject.getVer(), ConstValue.Protocol.VERSION);
|
||||
Assert.fail();
|
||||
}
|
||||
|
||||
// 检查请求是否超时
|
||||
if (DisposeConfigValue.CHECK_PROTO_REQUEST_TIMEOUT) {
|
||||
Assert.assertFalse(Math.abs(System.currentTimeMillis() - proObject.getTimeStamp())
|
||||
>= DisposeConfigValue.REQUEST_TIMEOUT_MS);
|
||||
}
|
||||
|
||||
// 检查加密方式
|
||||
Assert.assertTrue(ProtoCryptoType.verifyCryptoValuable(proObject.getCryptoType()));
|
||||
|
||||
} catch (Exception ex) {
|
||||
log.error("Protocol Exception: {}", ex.getMessage());
|
||||
Assert.fail();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets login token.
|
||||
*
|
||||
* @return the login token
|
||||
*/
|
||||
public String getLoginToken() {
|
||||
return logToken;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue