15d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi/*
25d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * Copyright (C) 2014 The Android Open Source Project
35d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi *
45d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * Licensed under the Apache License, Version 2.0 (the "License");
55d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * you may not use this file except in compliance with the License.
65d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * You may obtain a copy of the License at
75d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi *
85d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi *      http://www.apache.org/licenses/LICENSE-2.0
95d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi *
105d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * Unless required by applicable law or agreed to in writing, software
115d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * distributed under the License is distributed on an "AS IS" BASIS,
125d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
135d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * See the License for the specific language governing permissions and
145d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi * limitations under the License.
155d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi */
165d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
1788bc312ad34321fb3e81be2dc939a889d065f4a7Keisuke Kuroyanagi#include "dictionary/utils/format_utils.h"
185d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
195d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi#include <gtest/gtest.h>
205d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
215d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi#include <vector>
225d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
235d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi#include "utils/byte_array_view.h"
245d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
255d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanaginamespace latinime {
265d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanaginamespace {
275d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
285d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke KuroyanagiTEST(FormatUtilsTest, TestMagicNumber) {
295d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    EXPECT_EQ(0x9BC13AFE, FormatUtils::MAGIC_NUMBER) << "Magic number must not be changed.";
305d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi}
315d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
325d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagiconst std::vector<uint8_t> getBuffer(const int magicNumber, const int version, const uint16_t flags,
335d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        const size_t headerSize) {
345d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    std::vector<uint8_t> buffer;
355d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(magicNumber >> 24);
365d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(magicNumber >> 16);
375d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(magicNumber >> 8);
385d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(magicNumber);
395d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
405d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(version >> 8);
415d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(version);
425d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
435d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(flags >> 8);
445d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(flags);
455d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
465d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(headerSize >> 24);
475d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(headerSize >> 16);
485d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(headerSize >> 8);
495d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    buffer.push_back(headerSize);
505d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    return buffer;
515d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi}
525d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
535d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke KuroyanagiTEST(FormatUtilsTest, TestDetectFormatVersion) {
545d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    EXPECT_EQ(FormatUtils::UNKNOWN_VERSION,
555d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi            FormatUtils::detectFormatVersion(ReadOnlyByteArrayView()));
565d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
575d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    {
585d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        const std::vector<uint8_t> buffer =
595d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                getBuffer(FormatUtils::MAGIC_NUMBER, FormatUtils::VERSION_2, 0, 0);
605d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        EXPECT_EQ(FormatUtils::VERSION_2, FormatUtils::detectFormatVersion(
615d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                ReadOnlyByteArrayView(buffer.data(), buffer.size())));
625d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    }
635d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    {
645d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        const std::vector<uint8_t> buffer =
65ea468cc9de468b6574f98b3a7614decfcb7e456eKeisuke Kuroyanagi                getBuffer(FormatUtils::MAGIC_NUMBER, FormatUtils::VERSION_402, 0, 0);
66ea468cc9de468b6574f98b3a7614decfcb7e456eKeisuke Kuroyanagi        EXPECT_EQ(FormatUtils::VERSION_402, FormatUtils::detectFormatVersion(
675d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                ReadOnlyByteArrayView(buffer.data(), buffer.size())));
685d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    }
695d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    {
705d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        const std::vector<uint8_t> buffer =
71ea468cc9de468b6574f98b3a7614decfcb7e456eKeisuke Kuroyanagi                getBuffer(FormatUtils::MAGIC_NUMBER, FormatUtils::VERSION_403, 0, 0);
72ea468cc9de468b6574f98b3a7614decfcb7e456eKeisuke Kuroyanagi        EXPECT_EQ(FormatUtils::VERSION_403, FormatUtils::detectFormatVersion(
735d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                ReadOnlyByteArrayView(buffer.data(), buffer.size())));
745d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    }
755d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
765d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    {
775d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        const std::vector<uint8_t> buffer =
785d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                getBuffer(FormatUtils::MAGIC_NUMBER - 1, FormatUtils::VERSION_2, 0, 0);
795d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        EXPECT_EQ(FormatUtils::UNKNOWN_VERSION, FormatUtils::detectFormatVersion(
805d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                ReadOnlyByteArrayView(buffer.data(), buffer.size())));
815d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    }
825d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    {
835d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        const std::vector<uint8_t> buffer =
845d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                getBuffer(FormatUtils::MAGIC_NUMBER, 100, 0, 0);
855d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        EXPECT_EQ(FormatUtils::UNKNOWN_VERSION, FormatUtils::detectFormatVersion(
865d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                ReadOnlyByteArrayView(buffer.data(), buffer.size())));
875d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    }
885d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    {
895d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        const std::vector<uint8_t> buffer =
905d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                getBuffer(FormatUtils::MAGIC_NUMBER, FormatUtils::VERSION_2, 0, 0);
915d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi        EXPECT_EQ(FormatUtils::UNKNOWN_VERSION, FormatUtils::detectFormatVersion(
925d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi                ReadOnlyByteArrayView(buffer.data(), buffer.size() - 1)));
935d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi    }
945d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi}
955d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi
965d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi}  // namespace
975d95e8d747bbf83268f0a1b5aab964f73e5b1bd7Keisuke Kuroyanagi}  // namespace latinime
98