blob: c9ab4f222ef6f0f4a595f5f837d6687acb265359 [file] [log] [blame]
/*
*
* Copyright (c) 2020 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.
*/
#include <gtest/gtest.h>
#include <lib/dnssd/minimal_mdns/core/FlatAllocatedQName.h>
namespace {
using namespace mdns::Minimal;
class AutoFreeBuffer
{
public:
AutoFreeBuffer(size_t n) { mBuffer = malloc(n); }
~AutoFreeBuffer() { free(mBuffer); }
AutoFreeBuffer(const AutoFreeBuffer &) = delete;
AutoFreeBuffer & operator=(const AutoFreeBuffer &) = delete;
void * Buffer() { return mBuffer; }
private:
void * mBuffer;
};
TEST(TestFlatAllocatedQName, TestFlatAllocatedQName)
{
AutoFreeBuffer buffer(128);
EXPECT_EQ(FlatAllocatedQName::RequiredStorageSize("some", "test"), (sizeof(char * [2]) + 5 + 5));
{
FullQName built = FlatAllocatedQName::Build(buffer.Buffer(), "some", "test");
const QNamePart expected[] = { "some", "test" };
EXPECT_EQ(FullQName(expected), built);
}
{
FullQName built = FlatAllocatedQName::Build(buffer.Buffer(), "1", "2", "3");
const QNamePart expected[] = { "1", "2", "3" };
EXPECT_EQ(FullQName(expected), built);
}
}
TEST(TestFlatAllocatedQName, SizeCompare)
{
static const char kThis[] = "this";
static const char kIs[] = "is";
static const char kA[] = "a";
static const char kTest[] = "test";
static const char kVest[] = "vest";
static const char kBee[] = "bee";
static const char kRobbery[] = "robbery";
static const char kExtra[] = "extra";
const char * kSameArraySameSize[4] = { kThis, kIs, kA, kTest };
const char * kDifferentArraySameSize[4] = { kThis, kIs, kA, kVest };
const char * kDifferenArrayLongerWord[4] = { kThis, kIs, kA, kRobbery };
const char * kDifferenArrayShorterWord[4] = { kThis, kIs, kA, kBee };
const char * kSameArrayExtraWord[5] = { kThis, kIs, kA, kTest, kExtra };
const char * kShorterArray[3] = { kThis, kIs, kA };
const size_t kTestStorageSize = FlatAllocatedQName::RequiredStorageSize(kThis, kIs, kA, kTest);
EXPECT_EQ(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArraySameSize, 4));
EXPECT_EQ(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferentArraySameSize, 4));
EXPECT_LT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferenArrayLongerWord, 4));
EXPECT_GT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kDifferenArrayShorterWord, 4));
// Although the size of the array is larger, if we tell the function there are only 4 words, it should still work.
EXPECT_EQ(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArrayExtraWord, 4));
// If we add the extra word, the sizes should not match
EXPECT_LT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArrayExtraWord, 5));
EXPECT_GT(kTestStorageSize, FlatAllocatedQName::RequiredStorageSizeFromArray(kShorterArray, 3));
EXPECT_EQ(FlatAllocatedQName::RequiredStorageSizeFromArray(kSameArraySameSize, 3),
FlatAllocatedQName::RequiredStorageSizeFromArray(kShorterArray, 3));
}
TEST(TestFlatAllocatedQName, BuildCompare)
{
static const char kThis[] = "this";
static const char kIs[] = "is";
static const char kA[] = "a";
static const char kTest[] = "test";
static const char kExtra[] = "extra";
const char * kSameArraySameSize[4] = { kThis, kIs, kA, kTest };
const char * kSameArrayExtraWord[5] = { kThis, kIs, kA, kTest, kExtra };
const char * kShorterArray[3] = { kThis, kIs, kA };
uint8_t storage[256];
const FullQName kTestQName = FlatAllocatedQName::Build(storage, kThis, kIs, kA, kTest);
EXPECT_EQ(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kSameArraySameSize, 4));
// Although the size of the array is larger, if we tell the function there are only 4 words, it should still work.
EXPECT_EQ(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kSameArrayExtraWord, 4));
// If we add the extra word, the names
EXPECT_NE(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kSameArrayExtraWord, 5));
EXPECT_NE(kTestQName, FlatAllocatedQName::BuildFromArray(storage, kShorterArray, 3));
EXPECT_EQ(FlatAllocatedQName::BuildFromArray(storage, kSameArraySameSize, 3),
FlatAllocatedQName::BuildFromArray(storage, kShorterArray, 3));
}
} // namespace