/* * * Copyright (c) 2022 Project CHIP Authors * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include namespace testing { /// Convenience class for testing. /// /// Allows defining of constants for tests for FullQName and SerializedQNameIterator. /// Usage: /// /// const auto kTestHostName = testing::TestQName<2>({ "abcd", "local" }); /// /// kTestHostName.Serialized(); // SerializedQNameIterator: abcd.local /// kTestHostName.Full(); // FullQName: abcd.local template class TestQName { public: TestQName(const std::array & data) { size_t neededSize = 1; // for end terminator for (size_t i = 0; i < N; i++) { VerifyOrDie(strlen(data[i]) <= UINT8_MAX); neededSize += strlen(data[i]) + 1; // lenght + data mStrings[i] = strdup(data[i]); } mSerializedQNameBuffer = new (std::nothrow) uint8_t[neededSize]; VerifyOrDie(mSerializedQNameBuffer != nullptr); chip::Encoding::BigEndian::BufferWriter writer(mSerializedQNameBuffer, neededSize); for (size_t i = 0; i < N; i++) { writer.Put(static_cast(strlen(data[i]))); writer.Put(data[i]); } writer.Put(static_cast(0)); VerifyOrDie(writer.Fit()); mSerializedBufferSize = neededSize; } ~TestQName() { delete[] mSerializedQNameBuffer; for (size_t i = 0; i < N; i++) { free(mStrings[i]); } } mdns::Minimal::SerializedQNameIterator Serialized() const { return mdns::Minimal::SerializedQNameIterator( mdns::Minimal::BytesRange(mSerializedQNameBuffer, mSerializedQNameBuffer + mSerializedBufferSize), mSerializedQNameBuffer); } mdns::Minimal::FullQName Full() const { mdns::Minimal::FullQName result; result.names = mStrings; result.nameCount = N; return result; } private: char * mStrings[N]; uint8_t * mSerializedQNameBuffer; size_t mSerializedBufferSize; }; } // namespace testing