diff options
| author | Scott Linder <scott@scottlinder.com> | 2018-11-15 18:50:01 +0000 |
|---|---|---|
| committer | Scott Linder <scott@scottlinder.com> | 2018-11-15 18:50:01 +0000 |
| commit | 919fbbbcca6a6c137b2319aecf70cfb0f48136a0 (patch) | |
| tree | 60ddbab178d0fbdb895335d91ac13ec8ecabff5b /llvm/unittests/BinaryFormat | |
| parent | 6cda87463fbb32c310d43e840684133a210963dd (diff) | |
| download | bcm5719-llvm-919fbbbcca6a6c137b2319aecf70cfb0f48136a0.tar.gz bcm5719-llvm-919fbbbcca6a6c137b2319aecf70cfb0f48136a0.zip | |
[BinaryFormat] Add MsgPackTypes
Add data structure to represent MessagePack "documents" and convert
to/from both MessagePack and YAML encodings.
Differential Revision: https://reviews.llvm.org/D48175
llvm-svn: 346978
Diffstat (limited to 'llvm/unittests/BinaryFormat')
| -rw-r--r-- | llvm/unittests/BinaryFormat/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/unittests/BinaryFormat/MsgPackTypesTest.cpp | 188 |
2 files changed, 189 insertions, 0 deletions
diff --git a/llvm/unittests/BinaryFormat/CMakeLists.txt b/llvm/unittests/BinaryFormat/CMakeLists.txt index c0aac4db9c1..82d76ecf64a 100644 --- a/llvm/unittests/BinaryFormat/CMakeLists.txt +++ b/llvm/unittests/BinaryFormat/CMakeLists.txt @@ -6,6 +6,7 @@ add_llvm_unittest(BinaryFormatTests DwarfTest.cpp MachOTest.cpp MsgPackReaderTest.cpp + MsgPackTypesTest.cpp MsgPackWriterTest.cpp TestFileMagic.cpp ) diff --git a/llvm/unittests/BinaryFormat/MsgPackTypesTest.cpp b/llvm/unittests/BinaryFormat/MsgPackTypesTest.cpp new file mode 100644 index 00000000000..87bb6fa7e4d --- /dev/null +++ b/llvm/unittests/BinaryFormat/MsgPackTypesTest.cpp @@ -0,0 +1,188 @@ +//===- MsgPackTypesTest.cpp -------------------------------------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/BinaryFormat/MsgPackTypes.h" +#include "gtest/gtest.h" + +using namespace llvm; +using namespace msgpack; + +TEST(MsgPackTypes, TestReadInt) { + Reader MPReader(StringRef("\xd0\x00", 2)); + auto OptNodeOrErr = Node::read(MPReader); + ASSERT_TRUE(static_cast<bool>(OptNodeOrErr)); + ASSERT_TRUE(*OptNodeOrErr); + auto *S = dyn_cast<ScalarNode>((*OptNodeOrErr)->get()); + ASSERT_TRUE(S); + ASSERT_EQ(S->getScalarKind(), ScalarNode::SK_Int); + ASSERT_EQ(S->getInt(), 0); +} + +TEST(MsgPackTypes, TestReadArray) { + Reader MPReader(StringRef("\x92\xd0\x01\xc0")); + auto OptNodeOrErr = Node::read(MPReader); + ASSERT_TRUE(static_cast<bool>(OptNodeOrErr)); + ASSERT_TRUE(*OptNodeOrErr); + auto *A = dyn_cast<ArrayNode>((*OptNodeOrErr)->get()); + ASSERT_TRUE(A); + ASSERT_EQ(A->size(), 2u); + auto *SI = dyn_cast<ScalarNode>((*A)[0].get()); + ASSERT_TRUE(SI); + ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_Int); + ASSERT_EQ(SI->getInt(), 1); + auto *SN = dyn_cast<ScalarNode>((*A)[1].get()); + ASSERT_TRUE(SN); + ASSERT_EQ(SN->getScalarKind(), ScalarNode::SK_Nil); +} + +TEST(MsgPackTypes, TestReadMap) { + Reader MPReader(StringRef("\x82\xa3" + "foo" + "\xd0\x01\xa3" + "bar" + "\xd0\x02")); + auto OptNodeOrErr = Node::read(MPReader); + ASSERT_TRUE(static_cast<bool>(OptNodeOrErr)); + ASSERT_TRUE(*OptNodeOrErr); + auto *A = dyn_cast<MapNode>((*OptNodeOrErr)->get()); + ASSERT_TRUE(A); + ASSERT_EQ(A->size(), 2u); + auto *FooS = dyn_cast<ScalarNode>((*A)["foo"].get()); + ASSERT_TRUE(FooS); + ASSERT_EQ(FooS->getScalarKind(), ScalarNode::SK_Int); + ASSERT_EQ(FooS->getInt(), 1); + auto *BarS = dyn_cast<ScalarNode>((*A)["bar"].get()); + ASSERT_TRUE(BarS); + ASSERT_EQ(BarS->getScalarKind(), ScalarNode::SK_Int); + ASSERT_EQ(BarS->getInt(), 2); +} + +TEST(MsgPackTypes, TestWriteInt) { + std::string Buffer; + raw_string_ostream OStream(Buffer); + Writer MPWriter(OStream); + ScalarNode I(int64_t(1)); + I.write(MPWriter); + ASSERT_EQ(OStream.str(), "\x01"); +} + +TEST(MsgPackTypes, TestWriteArray) { + std::string Buffer; + raw_string_ostream OStream(Buffer); + Writer MPWriter(OStream); + ArrayNode A; + A.push_back(std::make_shared<ScalarNode>(int64_t(1))); + A.push_back(std::make_shared<ScalarNode>()); + A.write(MPWriter); + ASSERT_EQ(OStream.str(), "\x92\x01\xc0"); +} + +TEST(MsgPackTypes, TestWriteMap) { + std::string Buffer; + raw_string_ostream OStream(Buffer); + Writer MPWriter(OStream); + MapNode M; + M["foo"] = std::make_shared<ScalarNode>(int64_t(1)); + M["bar"] = std::make_shared<ScalarNode>(int64_t(2)); + M.write(MPWriter); + ASSERT_EQ(OStream.str(), "\x82\xa3" + "foo" + "\x01\xa3" + "bar" + "\x02"); +} + +TEST(MsgPackTypes, TestOutputYAMLArray) { + std::string Buffer; + raw_string_ostream OStream(Buffer); + yaml::Output yout(OStream); + ArrayNode A; + A.push_back(std::make_shared<ScalarNode>(int64_t(1))); + A.push_back(std::make_shared<ScalarNode>(int64_t(2))); + yout << A; + ASSERT_EQ(OStream.str(), "---\n- !int 1\n- !int 2\n...\n"); +} + +TEST(MsgPackTypes, TestInputYAMLArray) { + NodePtr RootNode; + yaml::Input yin("---\n- !int 1\n- !str 2\n...\n"); + yin >> RootNode; + auto *A = dyn_cast<ArrayNode>(RootNode.get()); + ASSERT_TRUE(A); + ASSERT_EQ(A->size(), 2u); + auto *SI = dyn_cast<ScalarNode>((*A)[0].get()); + ASSERT_TRUE(SI); + ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt); + ASSERT_EQ(SI->getUInt(), 1u); + auto *SS = dyn_cast<ScalarNode>((*A)[1].get()); + ASSERT_TRUE(SS); + ASSERT_EQ(SS->getScalarKind(), ScalarNode::SK_String); + ASSERT_EQ(SS->getString(), "2"); +} + +TEST(MsgPackTypes, TestOutputYAMLMap) { + std::string Buffer; + raw_string_ostream OStream(Buffer); + yaml::Output yout(OStream); + MapNode M; + M["foo"] = std::make_shared<ScalarNode>(int64_t(1)); + M["bar"] = std::make_shared<ScalarNode>(uint64_t(2)); + auto N = std::make_shared<MapNode>(); + (*N)["baz"] = std::make_shared<ScalarNode>(true); + M["qux"] = std::move(N); + yout << M; + ASSERT_EQ(OStream.str(), "---\nfoo: !int 1\nbar: " + "!int 2\nqux: \n baz: " + "!bool true\n...\n"); +} + +TEST(MsgPackTypes, TestInputYAMLMap) { + NodePtr RootNode; + yaml::Input yin("---\nfoo: !int 1\nbaz: !str 2\n...\n"); + yin >> RootNode; + auto *M = dyn_cast<MapNode>(RootNode.get()); + ASSERT_TRUE(M); + ASSERT_EQ(M->size(), 2u); + auto *SI = dyn_cast<ScalarNode>((*M)["foo"].get()); + ASSERT_TRUE(SI); + ASSERT_EQ(SI->getScalarKind(), ScalarNode::SK_UInt); + ASSERT_EQ(SI->getUInt(), 1u); + auto *SS = dyn_cast<ScalarNode>((*M)["baz"].get()); + ASSERT_TRUE(SS); + ASSERT_EQ(SS->getScalarKind(), ScalarNode::SK_String); + ASSERT_EQ(SS->getString(), "2"); +} + +// Test that the document is parsed into a tree of shared_ptr where each node +// can have multiple owners. +TEST(MsgPackTypes, TestInputShared) { + yaml::Input yin("---\nfoo:\n bar: !int 1\n...\n"); + NodePtr InnerMap; + NodePtr IntNode; + { + { + { + NodePtr RootNode; + yin >> RootNode; + auto *M = dyn_cast<MapNode>(RootNode.get()); + ASSERT_TRUE(M); + ASSERT_EQ(M->size(), 1u); + InnerMap = (*M)["foo"]; + } + auto *N = dyn_cast<MapNode>(InnerMap.get()); + ASSERT_TRUE(N); + ASSERT_EQ(N->size(), 1u); + IntNode = (*N)["bar"]; + } + auto *S = dyn_cast<ScalarNode>(IntNode.get()); + ASSERT_TRUE(S); + ASSERT_EQ(S->getScalarKind(), ScalarNode::SK_UInt); + ASSERT_EQ(S->getUInt(), 1u); + } +} |

