parent
f5667fa45a
commit
dc4a800a2d
6 changed files with 44 additions and 115 deletions
@ -1,82 +0,0 @@ |
|||||||
// Protocol Buffers - Google's data interchange format
|
|
||||||
// Copyright 2008 Google Inc. All rights reserved.
|
|
||||||
//
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file or at
|
|
||||||
// https://developers.google.com/open-source/licenses/bsd
|
|
||||||
|
|
||||||
#ifndef GOOGLE_PROTOBUF_UTIL_TEST_INPUT_STREAM_H__ |
|
||||||
#define GOOGLE_PROTOBUF_UTIL_TEST_INPUT_STREAM_H__ |
|
||||||
|
|
||||||
#include <initializer_list> |
|
||||||
#include <string> |
|
||||||
#include <utility> |
|
||||||
#include <vector> |
|
||||||
|
|
||||||
#include "absl/log/absl_check.h" |
|
||||||
#include "absl/strings/string_view.h" |
|
||||||
#include "google/protobuf/io/zero_copy_stream.h" |
|
||||||
#include "google/protobuf/stubs/status_macros.h" |
|
||||||
|
|
||||||
namespace google { |
|
||||||
namespace protobuf { |
|
||||||
namespace json_internal { |
|
||||||
// A ZeroCopyInputStream for writing unit tests.
|
|
||||||
class TestInputStream final : public io::ZeroCopyInputStream { |
|
||||||
public: |
|
||||||
TestInputStream(std::initializer_list<std::string> strings) |
|
||||||
: strings_(strings) {} |
|
||||||
explicit TestInputStream(std::vector<std::string> strings) |
|
||||||
: strings_(std::move(strings)) {} |
|
||||||
~TestInputStream() override = default; |
|
||||||
|
|
||||||
size_t Consumed() const { return next_; } |
|
||||||
|
|
||||||
bool Next(const void** data, int* size) override { |
|
||||||
if (next_ == strings_.size()) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
if (next_ > 0) { |
|
||||||
// Destroy the previous string so that ASAN can catch misbehavior
|
|
||||||
// correctly.
|
|
||||||
ReconstructAt(&strings_[next_ - 1]); |
|
||||||
} |
|
||||||
|
|
||||||
absl::string_view next = strings_[next_++]; |
|
||||||
*data = next.data(); |
|
||||||
*size = static_cast<int>(next.size()); |
|
||||||
return true; |
|
||||||
} |
|
||||||
|
|
||||||
// TestInputStream currently does not support these members.
|
|
||||||
void BackUp(int) override { ABSL_CHECK(false); } |
|
||||||
bool Skip(int) override { |
|
||||||
ABSL_CHECK(false); |
|
||||||
return false; |
|
||||||
} |
|
||||||
int64_t ByteCount() const override { |
|
||||||
ABSL_CHECK(false); |
|
||||||
return 0; |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
// Some versions of Clang can't figure out that
|
|
||||||
// x.std::string::~string()
|
|
||||||
// is valid syntax, so we indirect through a type param, instead.
|
|
||||||
//
|
|
||||||
// Of course, our luck has it that std::destroy_at is a C++17 feature. :)
|
|
||||||
template <typename T> |
|
||||||
static void ReconstructAt(T* p) { |
|
||||||
p->~T(); |
|
||||||
new (p) T; |
|
||||||
} |
|
||||||
|
|
||||||
std::vector<std::string> strings_; |
|
||||||
size_t next_ = 0; |
|
||||||
}; |
|
||||||
} // namespace json_internal
|
|
||||||
} // namespace protobuf
|
|
||||||
} // namespace google
|
|
||||||
|
|
||||||
#endif // GOOGLE_PROTOBUF_UTIL_TEST_INPUT_STREAM_H__
|
|
Loading…
Reference in new issue