|  | // Copyright lowRISC contributors. | 
|  | // Licensed under the Apache License, Version 2.0, see LICENSE for details. | 
|  | // SPDX-License-Identifier: Apache-2.0 | 
|  |  | 
|  | #ifndef OPENTITAN_SW_DEVICE_LIB_UJSON_TEST_HELPERS_H_ | 
|  | #define OPENTITAN_SW_DEVICE_LIB_UJSON_TEST_HELPERS_H_ | 
|  |  | 
|  | #include <string> | 
|  |  | 
|  | #include "sw/device/lib/base/status.h" | 
|  | #include "sw/device/lib/ujson/ujson.h" | 
|  |  | 
|  | namespace test_helpers { | 
|  | class SourceSink { | 
|  | public: | 
|  | SourceSink() {} | 
|  | SourceSink(const std::string &source) : source_(source) {} | 
|  |  | 
|  | const std::string &Sink() { return sink_; } | 
|  |  | 
|  | ujson_t UJson() { | 
|  | return ujson_init((void *)this, &SourceSink::getc, &SourceSink::putbuf); | 
|  | } | 
|  |  | 
|  | void Reset() { | 
|  | pos_ = 0; | 
|  | sink_.clear(); | 
|  | } | 
|  |  | 
|  | void Reset(const std::string &source) { | 
|  | Reset(); | 
|  | source_ = source; | 
|  | } | 
|  |  | 
|  | status_t GetChar() { | 
|  | if (pos_ < source_.size()) { | 
|  | return OK_STATUS(static_cast<uint8_t>(source_[pos_++])); | 
|  | } else { | 
|  | return RESOURCE_EXHAUSTED(); | 
|  | } | 
|  | } | 
|  |  | 
|  | status_t PutBuf(const char *buf, size_t len) { | 
|  | sink_.append(buf, len); | 
|  | return OK_STATUS(); | 
|  | } | 
|  |  | 
|  | private: | 
|  | static status_t getc(void *self) { | 
|  | return static_cast<SourceSink *>(self)->GetChar(); | 
|  | } | 
|  |  | 
|  | static status_t putbuf(void *self, const char *buf, size_t len) { | 
|  | return static_cast<SourceSink *>(self)->PutBuf(buf, len); | 
|  | } | 
|  |  | 
|  | size_t pos_ = 0; | 
|  | std::string source_; | 
|  | std::string sink_; | 
|  | }; | 
|  | }  // namespace test_helpers | 
|  | #endif  // OPENTITAN_SW_DEVICE_LIB_UJSON_TEST_HELPERS_H_ |