Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Kernel Liteos M
提交
f2ddeaeb
K
Kernel Liteos M
项目概览
OpenHarmony
/
Kernel Liteos M
8 个月 前同步成功
通知
19
Star
28
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
K
Kernel Liteos M
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
f2ddeaeb
编写于
7月 21, 2023
作者:
Z
zwx1232718
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
test:net、time以及部分cmsis
Signed-off-by:
N
zwx1232718
<
zhenghui23@huawei.com
>
上级
0c3dbb4c
变更
16
展开全部
隐藏空白更改
内联
并排
Showing
16 changed file
with
1950 addition
and
0 deletion
+1950
-0
testsuites/unittest/xts/BUILD.gn
testsuites/unittest/xts/BUILD.gn
+3
-0
testsuites/unittest/xts/cmsis/BUILD.gn
testsuites/unittest/xts/cmsis/BUILD.gn
+42
-0
testsuites/unittest/xts/cmsis/cmsis_timer_func_test.c
testsuites/unittest/xts/cmsis/cmsis_timer_func_test.c
+755
-0
testsuites/unittest/xts/cmsis/xts_cmsis.c
testsuites/unittest/xts/cmsis/xts_cmsis.c
+36
-0
testsuites/unittest/xts/cmsis/xts_cmsis.h
testsuites/unittest/xts/cmsis/xts_cmsis.h
+48
-0
testsuites/unittest/xts/net/BUILD.gn
testsuites/unittest/xts/net/BUILD.gn
+40
-0
testsuites/unittest/xts/net/acts_net_test.c
testsuites/unittest/xts/net/acts_net_test.c
+419
-0
testsuites/unittest/xts/net/xts_net.h
testsuites/unittest/xts/net/xts_net.h
+58
-0
testsuites/unittest/xts/time/BUILD.gn
testsuites/unittest/xts/time/BUILD.gn
+44
-0
testsuites/unittest/xts/time/alarm_test.c
testsuites/unittest/xts/time/alarm_test.c
+75
-0
testsuites/unittest/xts/time/alarm_test.h
testsuites/unittest/xts/time/alarm_test.h
+65
-0
testsuites/unittest/xts/time/clock_time_test.c
testsuites/unittest/xts/time/clock_time_test.c
+148
-0
testsuites/unittest/xts/time/sleep_test.c
testsuites/unittest/xts/time/sleep_test.c
+128
-0
testsuites/unittest/xts/time/time_utils_test.c
testsuites/unittest/xts/time/time_utils_test.c
+80
-0
testsuites/unittest/xts/xts_test.c
testsuites/unittest/xts/xts_test.c
+3
-0
testsuites/unittest/xts/xts_test.h
testsuites/unittest/xts/xts_test.h
+6
-0
未找到文件。
testsuites/unittest/xts/BUILD.gn
浏览文件 @
f2ddeaeb
...
...
@@ -31,13 +31,16 @@ import("//kernel/liteos_m/liteos.gni")
static_library("xts_test") {
sources = [ "xts_test.c" ]
deps = [
"cmsis:cmsis_test",
"io:io_test",
"ipc:ipc_test",
"math:math_test",
"mem:mem_test",
"net:net_test",
"process:pthread_test",
"sched:sched_test",
"sys:system_test",
"time:time_test",
]
configs += [ "$LITEOSTOPDIR/testsuites:include" ]
}
testsuites/unittest/xts/cmsis/BUILD.gn
0 → 100644
浏览文件 @
f2ddeaeb
# Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import("//kernel/liteos_m/liteos.gni")
static_library("cmsis_test") {
sources = [
"cmsis_timer_func_test.c",
"xts_cmsis.c",
]
include_dirs = [
".",
"$LITEOSTOPDIR/testsuites/include",
"$LITEOSTOPDIR/testsuites/unittest/xts",
]
}
testsuites/unittest/xts/cmsis/cmsis_timer_func_test.c
0 → 100644
浏览文件 @
f2ddeaeb
此差异已折叠。
点击以展开。
testsuites/unittest/xts/cmsis/xts_cmsis.c
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "xts_test.h"
void
CmsisFuncTest
(
void
)
{
CmsisTimerFuncTest
();
}
\ No newline at end of file
testsuites/unittest/xts/cmsis/xts_cmsis.h
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef XTS_CMSID_H
#define XTS_CMSID_H
#include "xts_test.h"
#include <securec.h>
#include <limits.h>
#include "cmsis_os2.h"
#define MILLISEC_NUM_INT10 10U
#define MILLISEC_NUM_INT4 4U
#define INVALID_TIMER_TYPE 10
#define TIMER_PERIODIC_COUNT 2
#define DELAY_TICKS_1 1
#define DELAY_TICKS_5 5
#define DELAY_TICKS_10 10
#endif
\ No newline at end of file
testsuites/unittest/xts/net/BUILD.gn
0 → 100644
浏览文件 @
f2ddeaeb
# Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import("//kernel/liteos_m/liteos.gni")
static_library("net_test") {
sources = [ "acts_net_test.c" ]
include_dirs = [
".",
"$LITEOSTOPDIR/testsuites/include",
"$LITEOSTOPDIR/testsuites/unittest/xts",
"$THIRDPARTY_MUSL_DIR/include/net",
]
}
testsuites/unittest/xts/net/acts_net_test.c
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "xts_net.h"
LITE_TEST_SUIT
(
NET
,
ActsNet
,
ActsNetTestSuite
);
static
BOOL
ActsNetTestSuiteSetUp
(
void
)
{
return
TRUE
;
}
static
BOOL
ActsNetTestSuiteTearDown
(
void
)
{
return
TRUE
;
}
/**
* @tc.number : SUB_KERNEL_NET_0730
* @tc.name : test ioctl get and set IFHWADDR
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testIoctlIfhwAddr
,
Function
|
MediumTest
|
Level2
)
{
int
udpFd
=
socket
(
AF_INET
,
SOCK_DGRAM
,
0
);
ICUNIT_ASSERT_NOT_EQUAL
(
udpFd
,
-
1
,
udpFd
);
/* -1, common data for test, no special meaning */
struct
ifreq
ifre
[
5
];
/* 5, common data for test, no special meaning */
struct
ifconf
ifcf
=
{
0
};
(
void
)
memset_s
(
&
ifcf
,
sizeof
(
struct
ifconf
),
0
,
sizeof
(
struct
ifconf
));
ifcf
.
ifc_len
=
5
*
sizeof
(
struct
ifreq
);
/* 5, common data for test, no special meaning */
ifcf
.
ifc_buf
=
(
char
*
)
ifre
;
int
ret
=
ioctl
(
udpFd
,
SIOCGIFCONF
,
(
char
*
)
&
ifcf
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
char
rst1
[
18
];
/* 18, common data for test, no special meaning */
char
*
macPtr
=
NULL
;
struct
ifreq
ifrTmp
=
{
0
};
struct
sockaddr_in
*
addr
=
NULL
;
int
ifrCount
=
ifcf
.
ifc_len
/
sizeof
(
struct
ifreq
);
ICUNIT_GOTO_EQUAL
(
ifrCount
,
2
,
ifrCount
,
EXIT
);
/* 2, common data for test, no special meaning */
ICUNIT_ASSERT_WITHIN_EQUAL
(
ifrCount
,
2
,
INT_MAX
,
ifrCount
);
/* 2, common data for test, no special meaning */
EXIT:
for
(
int
i
=
0
;
i
<
ifrCount
;
i
++
)
{
addr
=
(
struct
sockaddr_in
*
)
&
ifre
[
i
].
ifr_addr
;
if
(
strcmp
(
"lo"
,
ifre
[
i
].
ifr_name
)
!=
0
)
{
(
void
)
memset_s
(
&
ifrTmp
,
sizeof
(
struct
ifreq
),
0
,
sizeof
(
struct
ifreq
));
ret
=
strcpy_s
(
ifrTmp
.
ifr_name
,
sizeof
(
ifrTmp
.
ifr_name
),
ifre
[
i
].
ifr_name
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
ret
=
ioctl
(
udpFd
,
SIOCGIFHWADDR
,
&
ifrTmp
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
macPtr
=
ifrTmp
.
ifr_hwaddr
.
sa_data
;
ret
=
sprintf_s
(
rst1
,
sizeof
(
rst1
),
"%.2x:%.2x:%.2x:%.2x:%.2x:%.2x"
,
*
macPtr
,
*
(
macPtr
+
1
),
*
(
macPtr
+
2
),
*
(
macPtr
+
3
),
*
(
macPtr
+
4
),
*
(
macPtr
+
5
));
/* 1, 2, 3, 4, 5, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
((
unsigned
int
)
ret
,
strlen
(
rst1
),
(
unsigned
int
)
ret
);
}
}
ret
=
close
(
udpFd
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_1000
* @tc.name : test socket operation
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testSocketOpt
,
Function
|
MediumTest
|
Level2
)
{
socklen_t
len
;
struct
timeval
timeout
=
{
0
};
int
fd
=
socket
(
AF_INET
,
SOCK_STREAM
,
0
);
ICUNIT_ASSERT_NOT_EQUAL
(
fd
,
-
1
,
fd
);
/* -1, common data for test, no special meaning */
int
error
=
-
1
;
/* -1, common data for test, no special meaning */
len
=
sizeof
(
error
);
int
ret
=
getsockopt
(
fd
,
SOL_SOCKET
,
SO_ERROR
,
&
error
,
&
len
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
ICUNIT_ASSERT_EQUAL
(
error
,
0
,
error
);
len
=
sizeof
(
timeout
);
ret
=
getsockopt
(
fd
,
SOL_SOCKET
,
SO_RCVTIMEO
,
&
timeout
,
&
len
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
timeout
.
tv_sec
=
1000
;
/* 1000, common data for test, no special meaning */
len
=
sizeof
(
timeout
);
ret
=
setsockopt
(
fd
,
SOL_SOCKET
,
SO_RCVTIMEO
,
&
timeout
,
len
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
(
void
)
memset_s
(
&
timeout
,
len
,
0
,
len
);
ret
=
getsockopt
(
fd
,
SOL_SOCKET
,
SO_RCVTIMEO
,
&
timeout
,
&
len
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
ICUNIT_ASSERT_EQUAL
(
timeout
.
tv_sec
,
1000
,
timeout
.
tv_sec
);
/* 1000, common data for test, no special meaning */
int
flag
=
1
;
/* 1, common data for test, no special meaning */
ret
=
setsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
flag
,
sizeof
(
flag
));
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
flag
=
0
;
len
=
sizeof
(
flag
);
ret
=
getsockopt
(
fd
,
IPPROTO_TCP
,
TCP_NODELAY
,
&
flag
,
&
len
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
ICUNIT_ASSERT_EQUAL
(
flag
,
1
,
flag
);
/* 1, common data for test, no special meaning */
error
=
-
1
;
/* -1, common data for test, no special meaning */
len
=
sizeof
(
error
);
ret
=
getsockopt
(
fd
,
SOL_SOCKET
,
SO_ERROR
,
&
error
,
&
len
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
ICUNIT_ASSERT_EQUAL
(
error
,
0
,
error
);
ret
=
close
(
fd
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_1100
* @tc.name : test getsockname and getpeername invalid input
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testGetSocketNameInvalidInput
,
Function
|
MediumTest
|
Level3
)
{
struct
sockaddr
addr
=
{
0
};
socklen_t
addrLen
=
sizeof
(
addr
);
int
ret
=
getsockname
(
-
1
,
&
addr
,
&
addrLen
);
/* -1, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getpeername
(
-
1
,
&
addr
,
&
addrLen
);
/* -1, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getsockname
(
0
,
&
addr
,
&
addrLen
);
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getpeername
(
0
,
&
addr
,
&
addrLen
);
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getsockname
(
1
,
&
addr
,
&
addrLen
);
/* 1, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getpeername
(
1
,
&
addr
,
&
addrLen
);
/* 1, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getsockname
(
130
,
&
addr
,
&
addrLen
);
/* 130, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getpeername
(
130
,
&
addr
,
&
addrLen
);
/* 130, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getsockname
(
10
,
NULL
,
&
addrLen
);
/* 10, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getpeername
(
10
,
NULL
,
&
addrLen
);
/* 10, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getsockname
(
10
,
&
addr
,
NULL
);
/* 10, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
getpeername
(
10
,
&
addr
,
NULL
);
/* 10, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_2400
* @tc.name : test convert value from host to network byte order
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testHostToNetwork
,
Function
|
MediumTest
|
Level2
)
{
uint32_t
intInput1
=
0
;
uint32_t
intRst01
=
htonl
(
intInput1
);
uint32_t
intInput2
=
65536
;
/* 65536, common data for test, no special meaning */
uint32_t
intRst02
=
htonl
(
intInput2
);
uint16_t
shortInput1
=
0
;
uint16_t
shortRst01
=
htons
(
shortInput1
);
uint16_t
shortInput2
=
255
;
/* 255, common data for test, no special meaning */
uint16_t
shortRst02
=
htons
(
shortInput2
);
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
uint32_t
expectZero
=
0
;
uint32_t
expectForIinput2
=
256
;
/* 255, common data for test, no special meaning */
uint32_t
expectForSinput2
=
65280
;
/* 65536, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
intRst01
,
expectZero
,
intRst01
);
ICUNIT_ASSERT_EQUAL
(
intRst02
,
expectForIinput2
,
intRst02
);
ICUNIT_ASSERT_EQUAL
(
shortRst01
,
expectZero
,
shortRst01
);
ICUNIT_ASSERT_EQUAL
(
shortRst02
,
expectForSinput2
,
shortRst02
);
#else
ICUNIT_ASSERT_EQUAL
(
intRst01
,
intInput1
,
intRst01
);
ICUNIT_ASSERT_EQUAL
(
intRst02
,
intInput2
,
intRst02
);
ICUNIT_ASSERT_EQUAL
(
shortRst01
,
shortInput1
,
shortRst01
);
ICUNIT_ASSERT_EQUAL
(
shortRst02
,
shortInput2
,
shortRst02
);
#endif
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_2500
* @tc.name : test convert value from network to host byte order
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testNetworkToHost
,
Function
|
MediumTest
|
Level2
)
{
uint32_t
intInput1
=
0
;
uint32_t
intRst1
=
ntohl
(
intInput1
);
uint32_t
intInput2
=
65536
;
/* 65536, common data for test, no special meaning */
uint32_t
intRst02
=
ntohl
(
intInput2
);
uint16_t
shortInput1
=
0
;
uint16_t
shortRst01
=
ntohs
(
shortInput1
);
uint16_t
shortInput2
=
255
;
/* 255, common data for test, no special meaning */
uint16_t
shortRst02
=
ntohs
(
shortInput2
);
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
uint32_t
expectZero
=
0
;
uint32_t
expectForIinput2
=
256
;
/* 255, common data for test, no special meaning */
uint32_t
expectForSinput2
=
65280
;
/* 65536, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
intRst1
,
expectZero
,
intRst1
);
ICUNIT_ASSERT_EQUAL
(
intRst02
,
expectForIinput2
,
intRst02
);
ICUNIT_ASSERT_EQUAL
(
shortRst01
,
expectZero
,
shortRst01
);
ICUNIT_ASSERT_EQUAL
(
shortRst02
,
expectForSinput2
,
shortRst02
);
#else
ICUNIT_ASSERT_EQUAL
(
intRst1
,
intInput1
,
intRst1
);
ICUNIT_ASSERT_EQUAL
(
intRst02
,
intInput2
,
intRst02
);
ICUNIT_ASSERT_EQUAL
(
shortRst01
,
shortInput1
,
shortRst01
);
ICUNIT_ASSERT_EQUAL
(
shortRst02
,
shortInput2
,
shortRst02
);
#endif
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_2600
* @tc.name : test inet_pton IPv4 normal
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testInetPtonIpv4Normal
,
Function
|
MediumTest
|
Level2
)
{
int
ret
;
struct
in_addr
rst
=
{
0
};
char
cpAddrs
[
4
][
16
]
=
{
"10.58.212.100"
,
"0.0.0.0"
,
"255.0.0.0"
,
"255.255.255.255"
};
/* 4, 16, common data for test, no special meaning */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
unsigned
int
expLittle
[
4
]
=
{
1691630090
,
0
,
255
,
4294967295
};
/* 4, common data for test, no special meaning */
#else
unsigned
int
expBig
[
4
]
=
{
171627620
,
0
,
4278190080
,
4294967295
};
/* 4, common data for test, no special meaning */
#endif
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
/* 4, common data for test, no special meaning */
ret
=
inet_pton
(
AF_INET
,
cpAddrs
[
i
],
&
rst
);
ICUNIT_ASSERT_EQUAL
(
ret
,
1
,
ret
);
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
ICUNIT_ASSERT_EQUAL
(
rst
.
s_addr
,
expLittle
[
i
],
rst
.
s_addr
);
#else
ICUNIT_ASSERT_EQUAL
(
rst
.
s_addr
,
expBig
[
i
],
rst
.
s_addr
);
#endif
}
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_2800
* @tc.name : test inet_pton IPv6 normal
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testInetPtonIpv6Normal
,
Function
|
MediumTest
|
Level2
)
{
int
ret
;
struct
in6_addr
rst
=
{
0
};
char
cpAddrs
[
6
][
40
]
=
{
"0101:0101:0101:0101:1010:1010:1010:1010"
,
"0:0:0:0:0:0:0:0"
,
/* 6, 40, common data for test, no special meaning */
"FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF:FFFF"
,
"::"
,
"1::"
,
"0011:0011:0011:0011:11:11:11:11"
};
for
(
int
i
=
0
;
i
<
6
;
i
++
)
{
/* 6, common data for test, no special meaning */
ret
=
inet_pton
(
AF_INET6
,
cpAddrs
[
i
],
&
rst
);
ICUNIT_ASSERT_EQUAL
(
ret
,
1
,
ret
);
/* 1, common data for test, no special meaning */
}
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_2900
* @tc.name : test inet_pton IPv6 abnormal
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testInetPtonIpv6Abnormal
,
Function
|
MediumTest
|
Level2
)
{
int
ret
;
struct
in6_addr
rst
=
{
0
};
char
cpAddrs
[
7
][
40
]
=
{
"127.0.0.1"
,
"f"
,
":"
,
"0:0"
,
"1:::"
,
":::::::"
,
/* 7, 40, common data for test, no special meaning */
"1111:1111:1111:1111:1111:1111:1111:111G"
};
for
(
int
i
=
0
;
i
<
7
;
i
++
)
{
/* 7, common data for test, no special meaning */
ret
=
inet_pton
(
AF_INET6
,
cpAddrs
[
i
],
&
rst
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
}
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_3000
* @tc.name : test inet_pton with invalid family
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testInetPtonInvalidFamily
,
Function
|
MediumTest
|
Level2
)
{
struct
in_addr
rst
=
{
0
};
int
ret
=
inet_pton
(
AF_IPX
,
"127.0.0.1"
,
&
rst
);
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ret
=
inet_pton
(
-
1
,
"127.0.0.1"
,
&
rst
);
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_3100
* @tc.name : test inet_ntop IPv4 normal
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testInetNtopIpv4Normal
,
Function
|
MediumTest
|
Level2
)
{
const
char
*
ret
=
NULL
;
struct
in_addr
inputAddr
=
{
0
};
char
rstBuff
[
INET_ADDRSTRLEN
];
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
unsigned
int
inpLittle
[
4
]
=
{
0x64d43a0a
,
0
,
255
,
4294967295
};
/* 4, common data for test, no special meaning */
#else
unsigned
int
inpBig
[
4
]
=
{
171627620
,
0
,
4278190080
,
4294967295
};
/* 4, common data for test, no special meaning */
#endif
char
expAddrs
[
4
][
16
]
=
{
"10.58.212.100"
,
"0.0.0.0"
,
"255.0.0.0"
,
"255.255.255.255"
};
/* 4, 16, common data for test, no special meaning */
for
(
int
i
=
0
;
i
<
4
;
i
++
)
{
/* 4, common data for test, no special meaning */
#if __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
inputAddr
.
s_addr
=
inpLittle
[
i
];
#else
inputAddr
.
s_addr
=
inpBig
[
i
];
#endif
ret
=
inet_ntop
(
AF_INET
,
&
inputAddr
,
rstBuff
,
sizeof
(
rstBuff
));
if
(
ret
==
NULL
)
{
ICUNIT_ASSERT_NOT_EQUAL
(
ret
,
NULL
,
ret
);
}
else
{
ICUNIT_ASSERT_STRING_EQUAL
(
ret
,
expAddrs
[
i
],
ret
);
ICUNIT_ASSERT_STRING_EQUAL
(
rstBuff
,
expAddrs
[
i
],
rstBuff
);
}
}
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_3200
* @tc.name : test inet_ntop IPv4 boundary input
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testInetNtopIpv4Abnormal
,
Function
|
MediumTest
|
Level2
)
{
const
char
*
ret
=
NULL
;
struct
in_addr
inputAddr
=
{
0
};
char
rstBuff
[
INET_ADDRSTRLEN
];
char
expStr
[
2
][
16
]
=
{
"255.255.255.255"
,
"0.0.0.0"
};
/* 2, 16, common data for test, no special meaning */
for
(
int
i
=
0
;
i
<
2
;
i
++
)
{
/* 2, common data for test, no special meaning */
inputAddr
.
s_addr
=
(
i
==
0
?
-
1
:
4294967296
);
/* -1, 4294967296, common data for test, no special meaning */
ret
=
inet_ntop
(
AF_INET
,
&
inputAddr
,
rstBuff
,
sizeof
(
rstBuff
));
ICUNIT_ASSERT_NOT_EQUAL
(
ret
,
NULL
,
ret
);
ICUNIT_ASSERT_STRING_EQUAL
(
ret
,
expStr
[
i
],
ret
);
ICUNIT_ASSERT_STRING_EQUAL
(
rstBuff
,
expStr
[
i
],
rstBuff
);
}
return
0
;
}
/**
* @tc.number : SUB_KERNEL_NET_3500
* @tc.name : test inet_ntop with invalid family
* @tc.desc : [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
ActsNetTestSuite
,
testInetNtopInvalidFamily
,
Function
|
MediumTest
|
Level2
)
{
int
iret
;
const
char
*
ret
=
NULL
;
struct
in6_addr
inputAddr
=
{
0
};
char
rstBuff
[
INET6_ADDRSTRLEN
];
iret
=
inet_pton
(
AF_INET6
,
"1::"
,
&
inputAddr
);
ICUNIT_ASSERT_EQUAL
(
iret
,
1
,
iret
);
/* 1, common data for test, no special meaning */
ret
=
inet_ntop
(
AF_IPX
,
&
inputAddr
,
rstBuff
,
sizeof
(
rstBuff
));
ICUNIT_ASSERT_EQUAL
(
ret
,
NULL
,
ret
);
ret
=
inet_ntop
(
-
1
,
&
inputAddr
,
rstBuff
,
sizeof
(
rstBuff
));
/* -1, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
ret
,
NULL
,
ret
);
return
0
;
}
RUN_TEST_SUITE
(
ActsNetTestSuite
);
void
ActsNetTest
(
void
)
{
RUN_ONE_TESTCASE
(
testIoctlIfhwAddr
);
RUN_ONE_TESTCASE
(
testSocketOpt
);
RUN_ONE_TESTCASE
(
testGetSocketNameInvalidInput
);
RUN_ONE_TESTCASE
(
testHostToNetwork
);
RUN_ONE_TESTCASE
(
testNetworkToHost
);
RUN_ONE_TESTCASE
(
testInetPtonIpv4Normal
);
RUN_ONE_TESTCASE
(
testInetPtonInvalidFamily
);
RUN_ONE_TESTCASE
(
testInetNtopIpv4Normal
);
RUN_ONE_TESTCASE
(
testInetNtopIpv4Abnormal
);
#if (LWIP_IPV6 == 1)
RUN_ONE_TESTCASE
(
testInetPtonIpv6Normal
);
RUN_ONE_TESTCASE
(
testInetPtonIpv6Abnormal
);
RUN_ONE_TESTCASE
(
testInetNtopInvalidFamily
);
#endif
}
testsuites/unittest/xts/net/xts_net.h
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef XTS_NET_H
#define XTS_NET_H
#define _GNU_SOURCE
#include "if.h"
#include "xts_test.h"
#include <unistd.h>
#include <stdio.h>
#include <securec.h>
#include <pthread.h>
#include <time.h>
#include <sys/resource.h>
#include <limits.h>
#include <sys/mman.h>
#include <fcntl.h>
#include <arpa/inet.h>
#include <poll.h>
#include <sys/ioctl.h>
#include <netinet/tcp.h>
#include <netinet/in.h>
#include <netinet/ether.h>
#include <net/if.h>
#include <netdb.h>
#include <arpa/nameser.h>
#include "lwip/sockets.h"
#include <sys/socket.h>
#endif
testsuites/unittest/xts/time/BUILD.gn
0 → 100644
浏览文件 @
f2ddeaeb
# Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without modification,
# are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice, this list of
# conditions and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright notice, this list
# of conditions and the following disclaimer in the documentation and/or other materials
# provided with the distribution.
#
# 3. Neither the name of the copyright holder nor the names of its contributors may be used
# to endorse or promote products derived from this software without specific prior written
# permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
import("//kernel/liteos_m/liteos.gni")
static_library("time_test") {
sources = [
"alarm_test.c",
"clock_time_test.c",
"sleep_test.c",
"time_utils_test.c",
]
include_dirs = [
".",
"$LITEOSTOPDIR/testsuites/include",
"$LITEOSTOPDIR/testsuites/unittest/xts",
]
}
testsuites/unittest/xts/time/alarm_test.c
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "xts_test.h"
#include "alarm_test.h"
LITE_TEST_SUIT
(
TIME
,
TimeAlarmTest
,
TimeAlarmTestSuite
);
static
BOOL
TimeAlarmTestSuiteSetUp
(
void
)
{
return
TRUE
;
}
static
BOOL
TimeAlarmTestSuiteTearDown
(
void
)
{
return
TRUE
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_TIMER_CREATE_0500
* @tc.name timer_create function errno for EINVAL test
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeAlarmTestSuite
,
testTimerCreateEINVAL
,
Function
|
MediumTest
|
Level4
)
{
int
ret
;
timer_t
tid
=
NULL
;
clockid_t
clockid
=
GetRandom
(
2048
);
/* 2048, common data for test, no special meaning */
ret
=
timer_create
(
clockid
,
NULL
,
&
tid
);
ICUNIT_ASSERT_EQUAL
(
ret
,
-
1
,
ret
);
/* -1, common data for test, no special meaning */
ICUNIT_ASSERT_EQUAL
(
errno
,
EINVAL
,
errno
);
return
0
;
}
RUN_TEST_SUITE
(
TimeAlarmTestSuite
);
void
AlarmTest
(
void
)
{
RUN_ONE_TESTCASE
(
testTimerCreateEINVAL
);
}
void
TimeFuncTest
(
void
)
{
AlarmTest
();
ClockTimeTest
();
SleepTest
();
TimeUtilsTest
();
}
\ No newline at end of file
testsuites/unittest/xts/time/alarm_test.h
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#ifndef TIME_ALARM_TEST_H
#define TIME_ALARM_TEST_H
#define _GNU_SOURCE
#include "xts_test.h"
#include <signal.h>
#include <signal.h>
#include <time.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/timeb.h>
#include <sys/times.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/time.h>
#include <unistd.h>
#define SECS_PER_MIN 60
#define INIT_TM(tmSt, year, mon, day, hour, min, sec, wday) do { \
(tmSt).tm_sec = (sec); \
(tmSt).tm_min = (min); \
(tmSt).tm_hour = (hour); \
(tmSt).tm_mday = (day); \
(tmSt).tm_mon = (mon); \
(tmSt).tm_year = (year) - 1900; \
(tmSt).tm_wday = wday; \
(tmSt).__tm_gmtoff = 0; \
(tmSt).__tm_zone = ""; \
} while (0)
#endif
\ No newline at end of file
testsuites/unittest/xts/time/clock_time_test.c
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "alarm_test.h"
LITE_TEST_SUIT
(
TIME
,
TimeClockTimeTest
,
TimeClockTimeTestSuite
);
static
BOOL
TimeClockTimeTestSuiteSetUp
(
void
)
{
return
TRUE
;
}
static
BOOL
TimeClockTimeTestSuiteTearDown
(
void
)
{
return
TRUE
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_CLOCK_GETTIME_0100
* @tc.name test all supported clockid of clock_gettime
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeClockTimeTestSuite
,
testClockGettimeAll
,
Function
|
MediumTest
|
Level1
)
{
clockid_t
cid
=
CLOCK_REALTIME
;
struct
timespec
time1
=
{
0
,
0
};
int
rt
=
clock_gettime
(
cid
,
&
time1
);
ICUNIT_ASSERT_EQUAL
(
rt
,
0
,
rt
);
return
0
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_CLOCK_SETTIME_0100
* @tc.name test clock_settime basic
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeClockTimeTestSuite
,
testClockSettime
,
Function
|
MediumTest
|
Level1
)
{
struct
timespec
time1
=
{
0
,
0
};
sleep
(
1
);
/* 1, common data for test, no special meaning */
int
rt
=
clock_gettime
(
CLOCK_REALTIME
,
&
time1
);
ICUNIT_ASSERT_EQUAL
(
rt
,
0
,
rt
);
time_t
sec
=
time1
.
tv_sec
;
time1
.
tv_sec
-=
1
;
/* 1, common data for test, no special meaning */
time1
.
tv_nsec
=
1
;
/* 1, common data for test, no special meaning */
rt
=
clock_settime
(
CLOCK_REALTIME
,
&
time1
);
ICUNIT_ASSERT_EQUAL
(
rt
,
0
,
rt
);
sleep
(
1
);
/* 1, common data for test, no special meaning */
rt
=
clock_gettime
(
CLOCK_REALTIME
,
&
time1
);
ICUNIT_ASSERT_EQUAL
(
rt
,
0
,
rt
);
ICUNIT_ASSERT_EQUAL
(
time1
.
tv_sec
,
sec
,
time1
.
tv_sec
);
return
0
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_GETTIMEOFDAY_0100
* @tc.name test gettimeofday api
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeClockTimeTestSuite
,
testGettimeofday
,
Function
|
MediumTest
|
Level1
)
{
int
ret
;
int
sleepSec
=
1
;
/* 1, common data for test, no special meaning */
struct
timeval
tValStart
=
{
0
};
struct
timeval
tValEnd
=
{
0
};
struct
timezone
tZone
;
int
ret1
=
gettimeofday
(
&
tValStart
,
&
tZone
);
sleep
(
sleepSec
);
int
ret2
=
gettimeofday
(
&
tValEnd
,
&
tZone
);
ICUNIT_ASSERT_EQUAL
(
ret1
,
0
,
ret1
);
ICUNIT_ASSERT_EQUAL
(
ret2
,
0
,
ret2
);
ret
=
(
int
)(
tValEnd
.
tv_sec
-
tValStart
.
tv_sec
);
ICUNIT_ASSERT_EQUAL
(
ret
,
sleepSec
,
ret
);
ICUNIT_ASSERT_WITHIN_EQUAL
(
ret
,
sleepSec
,
INT_MAX
,
ret
);
ret
=
(
int
)(
tValEnd
.
tv_sec
-
tValStart
.
tv_sec
);
ICUNIT_ASSERT_WITHIN_EQUAL
(
ret
,
INT_MIN
,
sleepSec
+
1
,
ret
);
/* 1, common data for test, no special meaning */
return
0
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_SETTIMEOFDAY_0100
* @tc.name test settimeofday api
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeClockTimeTestSuite
,
testSettimeofday
,
Function
|
MediumTest
|
Level1
)
{
int
ret
;
int
setSec
=
100
;
/* 100, common data for test, no special meaning */
int
sleepSec
=
2
;
/* 2, common data for test, no special meaning */
struct
timeval
tValStart
=
{
0
};
struct
timeval
tValEnd
=
{
0
};
struct
timeval
set
=
{.
tv_sec
=
setSec
,
.
tv_usec
=
0
};
int
ret1
=
settimeofday
(
&
set
,
NULL
);
int
ret2
=
gettimeofday
(
&
tValStart
,
NULL
);
sleep
(
sleepSec
);
int
ret3
=
gettimeofday
(
&
tValEnd
,
NULL
);
ICUNIT_ASSERT_EQUAL
(
ret1
,
0
,
ret1
);
ICUNIT_ASSERT_EQUAL
(
ret2
,
0
,
ret2
);
ICUNIT_ASSERT_EQUAL
(
ret3
,
0
,
ret3
);
ICUNIT_ASSERT_EQUAL
(
tValStart
.
tv_sec
,
setSec
,
tValStart
.
tv_sec
);
ret
=
(
int
)(
tValEnd
.
tv_sec
-
tValStart
.
tv_sec
);
ICUNIT_ASSERT_EQUAL
(
ret
,
sleepSec
,
ret
);
ICUNIT_ASSERT_WITHIN_EQUAL
(
ret
,
sleepSec
,
INT_MAX
,
ret
);
ret
=
(
int
)(
tValEnd
.
tv_sec
-
tValStart
.
tv_sec
);
ICUNIT_ASSERT_WITHIN_EQUAL
(
ret
,
INT_MIN
,
sleepSec
+
1
,
ret
);
/* 1, common data for test, no special meaning */
return
0
;
}
RUN_TEST_SUITE
(
TimeClockTimeTestSuite
);
void
ClockTimeTest
(
void
)
{
RUN_ONE_TESTCASE
(
testClockGettimeAll
);
RUN_ONE_TESTCASE
(
testClockSettime
);
RUN_ONE_TESTCASE
(
testGettimeofday
);
RUN_ONE_TESTCASE
(
testSettimeofday
);
}
testsuites/unittest/xts/time/sleep_test.c
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "alarm_test.h"
static
const
char
*
ALL_CLOCKS_NAME
[
CLOCK_TAI
+
1
]
=
{
"CLOCK_REALTIME"
,
"CLOCK_MONOTONIC"
,
"CLOCK_PROCESS_CPUTIME_ID"
,
"CLOCK_THREAD_CPUTIME_ID"
,
"CLOCK_MONOTONIC_RAW"
,
"CLOCK_REALTIME_COARSE"
,
"CLOCK_MONOTONIC_COARSE"
,
"CLOCK_BOOTTIME"
,
"CLOCK_REALTIME_ALARM"
,
"CLOCK_BOOTTIME_ALARM"
,
"CLOCK_SGI_CYCLE"
,
"CLOCK_TAI"
,
};
LITE_TEST_SUIT
(
TIME
,
TimeSleepTest
,
TimeSleepTestSuite
);
static
BOOL
TimeSleepTestSuiteSetUp
(
void
)
{
return
TRUE
;
}
static
BOOL
TimeSleepTestSuiteTearDown
(
void
)
{
return
TRUE
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_CLOCK_NANOSLEEP_0200
* @tc.name clock_nanosleep fail test - non-support clock_id
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeSleepTestSuite
,
testClockNanosleepInvalidID
,
Reliability
|
SmallTest
|
Level2
)
{
clockid_t
cid
=
1
;
/* 1, common data for test, no special meaning */
const
char
*
cname
=
ALL_CLOCKS_NAME
[
cid
];
struct
timespec
req
=
{
0
,
100
};
/* 100, common data for test, no special meaning */
struct
timespec
rem
=
{
0
};
int
rt
=
clock_nanosleep
(
cid
,
0
,
&
req
,
&
rem
);
if
(
cid
==
CLOCK_SGI_CYCLE
)
{
ICUNIT_ASSERT_EQUAL
(
rt
,
EINVAL
,
rt
);
}
return
0
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_CLOCK_NANOSLEEP_0300
* @tc.name clock_nanosleep fail test - invalid parameter
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeSleepTestSuite
,
testClockNanosleepInvalidPara
,
Reliability
|
SmallTest
|
Level2
)
{
struct
timespec
req
=
{
0
,
100
};
/* 100, common data for test, no special meaning */
struct
timespec
rem
=
{
0
};
int
rt
;
int
id
=
GetRandom
(
1000
)
+
12
;
/* 1000, 12, common data for test, no special meaning */
rt
=
clock_nanosleep
(
id
,
0
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
rt
,
EINVAL
,
rt
);
id
=
-
GetRandom
(
1000
)
-
12
;
/* 1000, 12, common data for test, no special meaning */
rt
=
clock_nanosleep
(
id
,
0
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
rt
,
EINVAL
,
rt
);
int
flag
=
TIMER_ABSTIME
;
rt
=
clock_nanosleep
(
CLOCK_REALTIME
,
flag
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
rt
,
ENOTSUP
,
rt
);
flag
=
GetRandom
(
100
)
+
1
;
/* 100, 1, common data for test, no special meaning */
rt
=
clock_nanosleep
(
CLOCK_REALTIME
,
flag
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
rt
,
EINVAL
,
rt
);
flag
=
-
GetRandom
(
100
)
-
1
;
/* 100, 1, common data for test, no special meaning */
rt
=
clock_nanosleep
(
CLOCK_REALTIME
,
flag
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
rt
,
EINVAL
,
rt
);
req
.
tv_sec
=
-
1
;
/* -1, common data for test, no special meaning */
req
.
tv_nsec
=
1
;
/* 1, common data for test, no special meaning */
rt
=
clock_nanosleep
(
CLOCK_REALTIME
,
0
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
errno
,
EINVAL
,
errno
);
req
.
tv_sec
=
1
;
/* 1, common data for test, no special meaning */
req
.
tv_nsec
=
-
1
;
/* -1, common data for test, no special meaning */
rt
=
clock_nanosleep
(
CLOCK_REALTIME
,
0
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
errno
,
EINVAL
,
errno
);
req
.
tv_sec
=
1
;
/* 1, common data for test, no special meaning */
req
.
tv_nsec
=
1000
*
1000
*
1000
+
1
;
/* 1000, 1, common data for test, no special meaning */
rt
=
clock_nanosleep
(
CLOCK_REALTIME
,
0
,
&
req
,
&
rem
);
ICUNIT_ASSERT_EQUAL
(
errno
,
EINVAL
,
errno
);
return
0
;
}
RUN_TEST_SUITE
(
TimeSleepTestSuite
);
void
SleepTest
(
void
)
{
RUN_ONE_TESTCASE
(
testClockNanosleepInvalidID
);
RUN_ONE_TESTCASE
(
testClockNanosleepInvalidPara
);
}
testsuites/unittest/xts/time/time_utils_test.c
0 → 100644
浏览文件 @
f2ddeaeb
/*
* Copyright (c) 2023-2023 Huawei Device Co., Ltd. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors may be used
* to endorse or promote products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#include "alarm_test.h"
time_t
g_time
=
18880
;
/* 18880, common data for test, no special meaning */
size_t
g_zero
=
0
;
LITE_TEST_SUIT
(
TIME
,
TimeUtilsTest
,
TimeUtilsTestSuite
);
static
BOOL
TimeUtilsTestSuiteSetUp
(
void
)
{
return
TRUE
;
}
static
BOOL
TimeUtilsTestSuiteTearDown
(
void
)
{
return
TRUE
;
}
/**
* @tc.number SUB_KERNEL_TIME_API_MKTIME_0100
* @tc.name test mktime api
* @tc.desc [C- SOFTWARE -0200]
*/
LITE_TEST_CASE
(
TimeUtilsTestSuite
,
testMktime
,
Function
|
MediumTest
|
Level2
)
{
struct
tm
*
localTime
=
NULL
;
struct
tm
timeptr
=
{
0
};
struct
timeval
tv
;
struct
timezone
tz
;
int
ret
=
gettimeofday
(
&
tv
,
&
tz
);
ICUNIT_ASSERT_EQUAL
(
ret
,
0
,
ret
);
long
sysTimezone
=
(
long
)(
-
tz
.
tz_minuteswest
)
*
SECS_PER_MIN
;
INIT_TM
(
timeptr
,
2000
,
6
,
9
,
10
,
10
,
0
,
7
);
/* 2000, 6, 9, 10, 7, common data for test, no special meaning */
time_t
timeRet
=
mktime
(
&
timeptr
);
ICUNIT_ASSERT_EQUAL
(
sysTimezone
,
timeptr
.
__tm_gmtoff
,
sysTimezone
);
ICUNIT_ASSERT_EQUAL
(
timeRet
,
963137400
-
timeptr
.
__tm_gmtoff
,
timeRet
);
/* 963137400, common data for test, no special meaning */
localTime
=
localtime
(
&
g_time
);
ICUNIT_ASSERT_NOT_EQUAL
(
localTime
,
NULL
,
localTime
);
time_t
timep
=
mktime
(
localTime
);
ICUNIT_ASSERT_EQUAL
(
timep
,
18880
,
timep
);
/* 18880, common data for test, no special meaning */
return
0
;
}
RUN_TEST_SUITE
(
TimeUtilsTestSuite
);
void
TimeUtilsTest
(
void
)
{
RUN_ONE_TESTCASE
(
testMktime
);
}
testsuites/unittest/xts/xts_test.c
浏览文件 @
f2ddeaeb
...
...
@@ -44,7 +44,10 @@ void XtsTestSuite(void)
IoFuncTest
();
MathFuncTest
();
MemFuncTest
();
ActsNetTest
();
PthreadFuncTest
();
SchedApiFuncTest
();
SysApiFuncTest
();
TimeFuncTest
();
CmsisFuncTest
();
}
\ No newline at end of file
testsuites/unittest/xts/xts_test.h
浏览文件 @
f2ddeaeb
...
...
@@ -63,10 +63,16 @@ extern void MathFuncTest(void);
extern
void
MemFuncTest
(
void
);
extern
void
ActsNetTest
(
void
);
extern
void
PthreadFuncTest
(
void
);
extern
void
SchedApiFuncTest
(
void
);
extern
void
SysApiFuncTest
(
void
);
extern
void
TimeFuncTest
(
void
);
extern
void
CmsisFuncTest
(
void
);
#endif
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录