2 # Copyright 2020 The Pigweed Authors
4 # Licensed under the Apache License, Version 2.0 (the "License"); you may not
5 # use this file except in compliance with the License. You may obtain a copy of
8 # https://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
12 # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
13 # License for the specific language governing permissions and limitations under
15 """Tests service and method ID calculation for Python and C++."""
17 from typing import Iterator
20 from pw_build.generated_tests import Context, TestGenerator
21 from pw_build import generated_tests
22 from pw_rpc import ids
24 _TESTS = TestGenerator([
27 'Single character strings',
31 'Non-printable strings',
32 (0xD3556087, '\0\0\0\1\1\1\1'),
34 (0x63D43D8C, 'Pigweed?'),
35 (0x79AB6494, 'Pigweed!Pigweed!Pigweed!Pigweed!Pigweed!Pigweed!'),
39 def _define_py_test(ctx: Context):
40 expected_id, name = ctx.test_case
41 return lambda self: self.assertEqual(expected_id, ids.calculate(name))
44 IdsTest = _TESTS.python_tests('IdsTest', _define_py_test)
47 #include <string_view>
49 #include "gtest/gtest.h"
50 #include "pw_rpc/internal/hash.h"
52 namespace pw::rpc::internal {
54 using namespace std::string_view_literals;
57 _CC_FOOTER = '} // namespace pw::rpc::internal'
60 def _cc_test(ctx: Context) -> Iterator[str]:
61 expected_id, name = ctx.test_case
63 yield f'TEST(RpcIds, {ctx.cc_name()}) {{'
64 yield f' EXPECT_EQ(0x{expected_id:08x}u,'
65 yield f' Hash({generated_tests.cc_string(name)}sv));'
69 if __name__ == '__main__':
70 args = generated_tests.parse_test_generation_args()
71 if args.generate_cc_test:
72 _TESTS.cc_tests(args.generate_cc_test, _cc_test, _CC_HEADER,