1de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===- unittests/Support/StreamingMemoryObjectTest.cpp --------------------===//
2de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
3de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//                     The LLVM Compiler Infrastructure
4de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
5de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// This file is distributed under the University of Illinois Open Source
6de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar// License. See LICENSE.TXT for details.
7de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//
8de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar//===----------------------------------------------------------------------===//
9de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
10de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/STLExtras.h"
11de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/ADT/StringRef.h"
12de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "llvm/Support/StreamingMemoryObject.h"
13de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include "gtest/gtest.h"
14de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar#include <string.h>
15de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
16de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarusing namespace llvm;
17de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
18de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarnamespace {
19de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
20de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass NullDataStreamer : public DataStreamer {
21de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  size_t GetBytes(unsigned char *Buffer, size_t Length) override {
22de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    memset(Buffer, 0, Length);
23de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Length;
24de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
25de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
26de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
27de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarclass BufferStreamer : public DataStreamer {
28de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StringRef Buffer;
29de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
30de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainarpublic:
31de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  BufferStreamer(StringRef Buffer) : Buffer(Buffer) {}
32de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  size_t GetBytes(unsigned char *OutBuffer, size_t Length) override {
33de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    if (Length >= Buffer.size())
34de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      Length = Buffer.size();
35de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
36de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    std::copy(Buffer.begin(), Buffer.begin() + Length, OutBuffer);
37de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    Buffer = Buffer.drop_front(Length);
38de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar    return Length;
39de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  }
40de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar};
41de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
42de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarTEST(StreamingMemoryObjectTest, isValidAddress) {
43de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto DS = make_unique<NullDataStreamer>();
44de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StreamingMemoryObject O(std::move(DS));
45de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EXPECT_TRUE(O.isValidAddress(32 * 1024));
46de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
47de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
48de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarTEST(StreamingMemoryObjectTest, setKnownObjectSize) {
49de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  auto DS = make_unique<NullDataStreamer>();
50de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StreamingMemoryObject O(std::move(DS));
51de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint8_t Buf[32];
52de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EXPECT_EQ(16u, O.readBytes(Buf, 16, 0));
53de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  O.setKnownObjectSize(24);
54de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EXPECT_EQ(8u, O.readBytes(Buf, 16, 16));
55de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
56de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
57de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga NainarTEST(StreamingMemoryObjectTest, getPointer) {
58de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  uint8_t InputBuffer[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07};
59de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  StreamingMemoryObject O(make_unique<BufferStreamer>(StringRef(
60de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar      reinterpret_cast<const char *>(InputBuffer), sizeof(InputBuffer))));
61de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
62de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EXPECT_TRUE(std::equal(InputBuffer + 1, InputBuffer + 2, O.getPointer(1, 2)));
63de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EXPECT_TRUE(std::equal(InputBuffer + 3, InputBuffer + 7, O.getPointer(3, 4)));
64de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EXPECT_TRUE(std::equal(InputBuffer + 4, InputBuffer + 8, O.getPointer(4, 5)));
65de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar  EXPECT_TRUE(std::equal(InputBuffer, InputBuffer + 8, O.getPointer(0, 20)));
66de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar}
67de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar
68de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar} // end namespace
69