brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.2 KiB · 933965a Raw
139 lines · cpp
1//===- BitstreamWriterTest.cpp - Tests for BitstreamWriter ----------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "llvm/Bitstream/BitstreamWriter.h"10#include "llvm/ADT/STLExtras.h"11#include "llvm/ADT/SmallString.h"12#include "llvm/Bitstream/BitCodeEnums.h"13#include "llvm/Bitstream/BitstreamReader.h"14#include "llvm/Support/Error.h"15#include "llvm/Support/MemoryBuffer.h"16#include "llvm/Testing/Support/SupportHelpers.h"17#include "gmock/gmock.h"18#include "gtest/gtest.h"19 20using namespace llvm;21 22namespace {23 24TEST(BitstreamWriterTest, emitBlob) {25  SmallString<64> Buffer;26  BitstreamWriter W(Buffer);27  W.emitBlob("str", /* ShouldEmitSize */ false);28  EXPECT_EQ(StringRef("str\0", 4), Buffer);29}30 31TEST(BitstreamWriterTest, emitBlobWithSize) {32  SmallString<64> Buffer;33  {34    BitstreamWriter W(Buffer);35    W.emitBlob("str");36  }37  SmallString<64> Expected;38  {39    BitstreamWriter W(Expected);40    W.EmitVBR(3, 6);41    W.FlushToWord();42    W.Emit('s', 8);43    W.Emit('t', 8);44    W.Emit('r', 8);45    W.Emit(0, 8);46  }47  EXPECT_EQ(Expected.str(), Buffer);48}49 50TEST(BitstreamWriterTest, emitBlobEmpty) {51  SmallString<64> Buffer;52  BitstreamWriter W(Buffer);53  W.emitBlob("", /* ShouldEmitSize */ false);54  EXPECT_EQ(StringRef(""), Buffer);55}56 57TEST(BitstreamWriterTest, emitBlob4ByteAligned) {58  SmallString<64> Buffer;59  BitstreamWriter W(Buffer);60  W.emitBlob("str0", /* ShouldEmitSize */ false);61  EXPECT_EQ(StringRef("str0"), Buffer);62}63 64class BitstreamWriterFlushTest : public ::testing::TestWithParam<int> {65protected:66  // Any value after bitc::FIRST_APPLICATION_BLOCKID is good, but let's pick a67  // distinctive one.68  const unsigned BlkID = bitc::FIRST_APPLICATION_BLOCKID + 17;69 70  void write(StringRef TestFilePath, int FlushThreshold,71             llvm::function_ref<void(BitstreamWriter &)> Action) {72    std::error_code EC;73    raw_fd_stream Out(TestFilePath, EC);74    ASSERT_FALSE(EC);75    BitstreamWriter W(Out, FlushThreshold);76    Action(W);77  }78};79 80TEST_P(BitstreamWriterFlushTest, simpleExample) {81  llvm::unittest::TempFile TestFile("bitstream", "", "",82                                    /*Unique*/ true);83  write(TestFile.path(), GetParam(),84        [&](BitstreamWriter &W) { W.EmitVBR(42, 2); });85 86  ErrorOr<std::unique_ptr<MemoryBuffer>> MB =87      MemoryBuffer::getFile(TestFile.path());88  ASSERT_TRUE(!!MB);89  ASSERT_NE(*MB, nullptr);90  BitstreamCursor Cursor((*MB)->getBuffer());91  auto V = Cursor.ReadVBR(2);92  EXPECT_TRUE(!!V);93  EXPECT_EQ(*V, 42U);94}95 96TEST_P(BitstreamWriterFlushTest, subBlock) {97  llvm::unittest::TempFile TestFile("bitstream", "", "",98                                    /*Unique*/ true);99  write(TestFile.path(), GetParam(), [&](BitstreamWriter &W) {100    W.EnterSubblock(BlkID, 2);101    W.EmitVBR(42, 2);102    W.ExitBlock();103  });104  ErrorOr<std::unique_ptr<MemoryBuffer>> MB =105      MemoryBuffer::getFile(TestFile.path());106  ASSERT_TRUE(!!MB);107  ASSERT_NE(*MB, nullptr);108  BitstreamCursor Cursor((*MB)->getBuffer());109  auto Blk = Cursor.advance(BitstreamCursor::AF_DontAutoprocessAbbrevs);110  ASSERT_TRUE(!!Blk);111  EXPECT_EQ(Blk->Kind, BitstreamEntry::SubBlock);112  EXPECT_EQ(Blk->ID, BlkID);113  EXPECT_FALSE(Cursor.EnterSubBlock(BlkID));114  auto V = Cursor.ReadVBR(2);115  EXPECT_TRUE(!!V);116  EXPECT_EQ(*V, 42U);117  // ReadBlockEnd() returns false if it actually read the block end.118  EXPECT_FALSE(Cursor.ReadBlockEnd());119  EXPECT_TRUE(Cursor.AtEndOfStream());120}121 122TEST_P(BitstreamWriterFlushTest, blobRawRead) {123  llvm::unittest::TempFile TestFile("bitstream", "", "",124                                    /*Unique*/ true);125  write(TestFile.path(), GetParam(), [&](BitstreamWriter &W) {126    W.emitBlob("str", /* ShouldEmitSize */ false);127  });128 129  ErrorOr<std::unique_ptr<MemoryBuffer>> MB =130      MemoryBuffer::getFile(TestFile.path());131  ASSERT_TRUE(!!MB);132  ASSERT_NE(*MB, nullptr);133  EXPECT_EQ(StringRef("str\0", 4), (*MB)->getBuffer());134}135 136INSTANTIATE_TEST_SUITE_P(BitstreamWriterFlushCases, BitstreamWriterFlushTest,137                         ::testing::Values(0, 1 /*MB*/));138} // end namespace139