1/*
2 * Copyright (c) 2022 Huawei Device Co., Ltd. All rights reserved.
3 *
4 * Redistribution and use in source and binary forms, with or without modification,
5 * are permitted provided that the following conditions are met:
6 *
7 * 1. Redistributions of source code must retain the above copyright notice, this list of
8 * conditions and the following disclaimer.
9 *
10 * 2. Redistributions in binary form must reproduce the above copyright notice, this list
11 * of conditions and the following disclaimer in the documentation and/or other materials
12 * provided with the distribution.
13 *
14 * 3. Neither the name of the copyright holder nor the names of its contributors may be used
15 * to endorse or promote products derived from this software without specific prior written
16 * permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
22 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#ifndef IT_POSIX_QUEUE_H
32#define IT_POSIX_QUEUE_H
33#undef  _XOPEN_SOURCE
34#define _XOPEN_SOURCE 600
35
36#include <stdlib.h>
37#include <mqueue.h>
38#include <fcntl.h>
39#include <errno.h>
40#include <limits.h>
41#include <sched.h>
42#include <signal.h>
43#include <osTest.h>
44#include "pthread.h"
45#include "unistd.h"
46
47#define MAXMSG5 5
48#define MSGLEN 10
49#define MAXMSG 10
50
51#define MQUEUE_SEND_STRING_TEST "0123456789"
52#define MQUEUE_SHORT_ARRAY_LENGTH 10 // 10: strlen(MQUEUE_SEND_STRING_TEST)
53#define MQUEUE_STANDARD_NAME_LENGTH 50
54
55#define MQUEUE_PTHREAD_PRIORITY_TEST1 3
56#define MQUEUE_PTHREAD_PRIORITY_TEST2 4
57#define MQUEUE_PATH_MAX_TEST PATH_MAX
58#define MQUEUE_NAME_MAX_TEST NAME_MAX
59#define MQUEUE_PTHREAD_NUM_TEST 5
60#define MQUEUE_PRIORITY_TEST 0
61#define MQUEUE_TIMEOUT_TEST 7
62#define MQUEUE_PRIORITY_NUM_TEST 3
63#define MQ_MAX_MSG_NUM 16
64#define MQ_MAX_MSG_LEN 64
65#undef  HWI_NUM_TEST
66#define HWI_NUM_TEST 1
67#undef  HWI_NUM_TEST1
68#define HWI_NUM_TEST1 2
69
70#if (LOSCFG_LIBC_NEWLIB == 1)
71#define MQ_PRIO_MAX 1
72#endif
73
74#undef  LOSCFG_BASE_IPC_QUEUE_CONFIG
75#define LOSCFG_BASE_IPC_QUEUE_CONFIG 1024
76#define LOS_AtomicInc(a) (++*(a))
77#define MqueueTaskDelay(tick) (usleep((tick) * 10000))
78
79#ifdef __LP64__
80#define PER_ADDED_VALUE 8
81#else
82#define PER_ADDED_VALUE 4
83#endif
84
85#define ICUNIT_GOTO_WITHIN_EQUAL(param, value1, value2, retcode, label) \
86    do {                                                                \
87        if ((param) < (value1) || (param) > (value2)) {                 \
88            ICunitSaveErr(__LINE__, (iiUINT32)(retcode));               \
89            goto label;                                                 \
90        }                                                               \
91    } while (0)
92
93typedef UINT32 TSK_HANDLE_T;
94typedef UINT32 SEM_HANDLE_T ;
95
96extern SEM_HANDLE_T g_mqueueSem;
97
98extern TSK_HANDLE_T g_mqueueTaskPID;
99extern CHAR g_gqname[MQUEUE_STANDARD_NAME_LENGTH];
100extern CHAR g_mqueueName[LOSCFG_BASE_IPC_QUEUE_CONFIG + 1][MQUEUE_STANDARD_NAME_LENGTH];
101extern mqd_t g_mqueueId[LOSCFG_BASE_IPC_QUEUE_CONFIG + 1];
102
103extern CHAR *g_mqueueMsessage[MQUEUE_SHORT_ARRAY_LENGTH];
104extern mqd_t g_messageQId;
105extern mqd_t g_gqueue;
106
107extern VOID ItSuitePosixMqueue(VOID);
108extern UINT32 PosixPthreadInit(pthread_attr_t *attr, int pri);
109extern UINT32 PosixPthreadDestroy(pthread_attr_t *attr, pthread_t thread);
110extern VOID TestAssertWaitDelay(UINT32 *testCount, UINT32 flag);
111extern void TestExtraTaskDelay(UINT32 tick);
112
113VOID ItPosixQueue001(VOID);
114VOID ItPosixQueue002(VOID);
115VOID ItPosixQueue003(VOID);
116VOID ItPosixQueue004(VOID);
117VOID ItPosixQueue005(VOID);
118VOID ItPosixQueue006(VOID);
119VOID ItPosixQueue007(VOID);
120VOID ItPosixQueue008(VOID);
121VOID ItPosixQueue009(VOID);
122VOID ItPosixQueue010(VOID);
123VOID ItPosixQueue011(VOID);
124VOID ItPosixQueue012(VOID);
125VOID ItPosixQueue013(VOID);
126VOID ItPosixQueue014(VOID);
127VOID ItPosixQueue015(VOID);
128VOID ItPosixQueue016(VOID);
129VOID ItPosixQueue017(VOID);
130VOID ItPosixQueue018(VOID);
131VOID ItPosixQueue019(VOID);
132VOID ItPosixQueue020(VOID);
133VOID ItPosixQueue021(VOID);
134VOID ItPosixQueue022(VOID);
135VOID ItPosixQueue023(VOID);
136VOID ItPosixQueue024(VOID);
137VOID ItPosixQueue025(VOID);
138VOID ItPosixQueue026(VOID);
139VOID ItPosixQueue027(VOID);
140VOID ItPosixQueue028(VOID);
141VOID ItPosixQueue029(VOID);
142VOID ItPosixQueue030(VOID);
143VOID ItPosixQueue031(VOID);
144VOID ItPosixQueue032(VOID);
145VOID ItPosixQueue033(VOID);
146VOID ItPosixQueue034(VOID);
147VOID ItPosixQueue035(VOID);
148VOID ItPosixQueue036(VOID);
149VOID ItPosixQueue037(VOID);
150VOID ItPosixQueue038(VOID);
151VOID ItPosixQueue039(VOID);
152VOID ItPosixQueue040(VOID);
153VOID ItPosixQueue041(VOID);
154VOID ItPosixQueue042(VOID);
155VOID ItPosixQueue043(VOID);
156VOID ItPosixQueue044(VOID);
157VOID ItPosixQueue045(VOID);
158VOID ItPosixQueue046(VOID);
159VOID ItPosixQueue047(VOID);
160VOID ItPosixQueue048(VOID);
161VOID ItPosixQueue049(VOID);
162VOID ItPosixQueue050(VOID);
163VOID ItPosixQueue051(VOID);
164VOID ItPosixQueue052(VOID);
165#endif
166