1 /*
2  * Copyright (C) 2016 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef _GTS_NANOAPPS_SHARED_SEND_MESSAGE_H_
18 #define _GTS_NANOAPPS_SHARED_SEND_MESSAGE_H_
19 
20 #include <cstddef>
21 #include <cstdint>
22 
23 #include <shared/abort.h>
24 
25 /**
26  * NOTE: The MessageType values are manually synced in the GTS Java's
27  *     ContextHubTestConstants.java.  If you make a change here, be sure
28  *     to update ContextHubTestContants.java as well.
29  */
30 
31 namespace nanoapp_testing {
32 
33 /**
34  * Messages types which are sent between Nanoapps and the Java Host testing
35  * code.
36  */
37 enum class MessageType : uint32_t {
38   /**
39    * Value which should never be used.
40    *
41    * This value starts at CONTEXT_HUB_TYPE_PRIVATE_MSG_BASE.
42    *
43    * This type should never be sent by Host or Nanoapp code.
44    */
45   kInvalidMessageType = 0x0400,
46 
47   /**
48    * Test has completed in success.
49    *
50    * This type should only be sent by the Nanoapp code.
51    */
52   kSuccess = 0x0401,
53 
54   /**
55    * Indicates a failure in the CHRE implementation.
56    *
57    * This should be followed by null-terminated string
58    * giving details of failure.
59    *
60    * This type should only be sent by the Nanoapp code.
61    */
62   kFailure = 0x0402,
63 
64   /**
65    * Indicate a failure within the testing infrastructure.
66    *
67    * This should be followed by null-terminated string
68    * giving details of failure.
69    *
70    * This type should only be sent by the Nanoapp code.
71    */
72   kInternalFailure = 0x0403,
73 
74   /**
75    * Indicate a test is being skipped.
76    *
77    * This should be followed by null-terminated string
78    * giving an explanation of why this test was skipped.
79    *
80    * This type should only be sent by the Nanoapp code.
81    */
82   kSkipped = 0x0404,
83 
84   /**
85    * A generic message indicating that the test should continue.
86    *
87    * The meaning of this generic message depends on the specific test.
88    * In general, it means something along the lines of "The test is
89    * successful thus far, please proceed to the next stage."
90    *
91    * This type can be sent by the Host or Nanoapp code.
92    */
93   kContinue = 0x0405,
94 
95   // Tests wanting to add custom message types for their protocols should
96   // add them below.  Remember to update ContextHubTestConstants.java as
97   // well (see NOTE at the top of this header).
98 };
99 
100 /**
101  * Sends a message to the host with the given data.
102  *
103  * This method will make a copy of 'data', so there's no need for the
104  * caller to keep that alive after this call.
105  *
106  * Note it may often be more convenient to use one the other methods
107  * when sending a text string.
108  *
109  * @param messageType  The type of the message.
110  * @param data  The data to send.  This can be nullptr, but then 'dataSize'
111  *     must be 0.
112  * @param dataSize  The number of bytes of 'data' to send.  If 'data' is
113  *     not 'nullptr', then this must be non-zero.
114  */
115 void sendMessageToHost(MessageType messageType, const void *data = nullptr,
116                        size_t dataSize = 0);
117 
118 /**
119  * Sends a message to the host, optionally with the 'value' appended as in
120  * hex.
121  *
122  * This method will make a copy of 'message' and 'value', so there's no
123  * need for the caller to keep those alive after this call.
124  *
125  * Note it may often be more convenient to use one of the other methods
126  * below.
127  *
128  * @param messageType  The type of the message.
129  * @param message  The text of the message.  This cannot be nullptr.
130  * @param value  Optional, defaults to nullptr.  If non-null, this value will
131  *     be output as hexadecimal at the end of the message to the host.
132  */
133 void sendStringToHost(MessageType messageType, const char *message,
134                       const uint32_t *value = nullptr);
135 
136 /**
137  * Same as sendStringToHost(), but using MessageType::kFailure for the 'status'.
138  */
139 inline void sendFailureToHost(const char *message,
140                               const uint32_t *value = nullptr) {
141   sendStringToHost(MessageType::kFailure, message, value);
142 }
143 
144 /**
145  * Same as sendFailureToHost(), but aborts the test with the given 'reason',
146  * and never returns.
147  */
148 void sendFatalFailureToHost(const char *message,
149                             const uint32_t *value = nullptr,
150                             AbortBlame reason = AbortBlame::kChre);
151 
152 /**
153  * Helper function to invoke sendFatalFailureToHost() with uint8_t type.
154  * It is needed since sendFatalFailureToHost() only accepts uint32_t type.
155  *
156  * TODO: Deprecate this function and redesign sendFatalFailureToHost()
157  * so that a generic string message is accepted.
158  *
159  * @param message a text message to be sent to host.
160  * @param value a value output into the message.
161  */
162 void sendFatalFailureToHostUint8(const char *message, const uint8_t value);
163 
164 /**
165  * Same as sendStringToHost(), but uses MessageType::kInternalFailure for the
166  * 'status', and aborts the test with the given 'reason' and never returns.
167  */
168 void sendInternalFailureToHost(const char *message,
169                                const uint32_t *value = nullptr,
170                                AbortBlame reason = AbortBlame::kTestFramework);
171 
172 /**
173  * Invoke sendMessageToHost with MessageType::kSuccess and no other information.
174  */
sendSuccessToHost()175 inline void sendSuccessToHost() {
176   sendMessageToHost(MessageType::kSuccess);
177 }
178 
179 }  // namespace nanoapp_testing
180 
181 #endif  // _GTS_NANOAPPS_SHARED_SEND_MESSAGE_H_
182