Skip to content

Commit 07193d9

Browse files
committed
ADD: Improve testing around TimeseriesGetRange
1 parent 58d774d commit 07193d9

20 files changed

+347
-153
lines changed

CHANGELOG.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
# Changelog
22

3+
## 0.38.0 - TBD
4+
5+
### Enhancements
6+
- Added log level prefix to `ConsoleLogReceiver` output
7+
8+
### Breaking changes
9+
- Added new optional `ShouldLog` virtual method to `ILogReceiver` to
10+
filter the levels of log messages that will be sent to the receiver
11+
312
## 0.37.1 - 2025-06-03
413

514
### Bug fixes

include/databento/detail/buffer.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ class Buffer : public IReadable, public IWritable {
8080

8181
UniqueBufPtr buf_;
8282
std::byte* end_;
83-
std::byte* read_pos_{};
84-
std::byte* write_pos_{};
83+
std::byte* read_pos_;
84+
std::byte* write_pos_;
8585
};
8686
} // namespace databento::detail

include/databento/log.hpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,13 @@ class ILogReceiver {
1919
virtual ~ILogReceiver() = default;
2020

2121
virtual void Receive(databento::LogLevel level, const std::string& msg) = 0;
22+
virtual bool ShouldLog(databento::LogLevel) const { return true; }
2223
};
2324

2425
class NullLogReceiver : public ILogReceiver {
2526
public:
2627
void Receive(databento::LogLevel, const std::string&) override {}
28+
bool ShouldLog(databento::LogLevel) const override { return false; }
2729
};
2830

2931
class ConsoleLogReceiver : public ILogReceiver {
@@ -34,9 +36,15 @@ class ConsoleLogReceiver : public ILogReceiver {
3436
ConsoleLogReceiver(LogLevel min_level, std::ostream& stream);
3537

3638
void Receive(LogLevel level, const std::string& msg) override;
39+
bool ShouldLog(databento::LogLevel level) const override {
40+
return level > min_level_;
41+
}
3742

3843
private:
3944
std::ostream& stream_;
4045
const databento::LogLevel min_level_;
4146
};
47+
48+
std::ostream& operator<<(std::ostream& out, LogLevel level);
49+
const char* ToString(LogLevel level);
4250
} // namespace databento

src/detail/buffer.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ void Buffer::Reserve(std::size_t capacity) {
6767
void Buffer::Shift() {
6868
const auto unread_bytes = ReadCapacity();
6969
if (unread_bytes) {
70-
std::copy(read_pos_, write_pos_, buf_.get());
70+
std::copy(ReadBegin(), ReadEnd(), buf_.get());
7171
}
7272
read_pos_ = buf_.get();
7373
write_pos_ = read_pos_ + unread_bytes;

src/live_blocking.cpp

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,11 @@ const databento::Record* LiveBlocking::NextRecord(
194194
void LiveBlocking::Stop() { client_.Close(); }
195195

196196
void LiveBlocking::Reconnect() {
197-
log_receiver_->Receive(LogLevel::Info, "Reconnecting");
197+
if (log_receiver_->ShouldLog(LogLevel::Info)) {
198+
std::ostringstream log_msg;
199+
log_msg << "Reconnecting to " << gateway_ << ':' << port_;
200+
log_receiver_->Receive(LogLevel::Info, log_msg.str());
201+
}
198202
client_ = detail::TcpClient{gateway_, port_};
199203
sub_counter_ = 0;
200204
session_id_ = this->Authenticate();
@@ -227,7 +231,7 @@ std::string LiveBlocking::DecodeChallenge() {
227231
// first line is version
228232
std::string response{reinterpret_cast<const char*>(buffer_.ReadBegin()),
229233
buffer_.ReadCapacity()};
230-
{
234+
if (log_receiver_->ShouldLog(LogLevel::Debug)) {
231235
std::ostringstream log_ss;
232236
log_ss << "[LiveBlocking::DecodeChallenge] Challenge: " << response;
233237
log_receiver_->Receive(LogLevel::Debug, log_ss.str());
@@ -283,12 +287,13 @@ std::uint64_t LiveBlocking::Authenticate() {
283287
client_.WriteAll(req);
284288
const std::uint64_t session_id = DecodeAuthResp();
285289

286-
std::ostringstream log_ss;
287-
log_ss << "[LiveBlocking::Authenticate] Successfully authenticated with "
288-
"session_id "
289-
<< session_id;
290-
log_receiver_->Receive(LogLevel::Info, log_ss.str());
291-
290+
if (log_receiver_->ShouldLog(LogLevel::Info)) {
291+
std::ostringstream log_ss;
292+
log_ss << "[LiveBlocking::Authenticate] Successfully authenticated with "
293+
"session_id "
294+
<< session_id;
295+
log_receiver_->Receive(LogLevel::Info, log_ss.str());
296+
}
292297
return session_id;
293298
}
294299

src/log.cpp

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,33 @@ ConsoleLogReceiver::ConsoleLogReceiver(LogLevel min_level, std::ostream& stream)
2121
: stream_{stream}, min_level_{min_level} {}
2222

2323
void ConsoleLogReceiver::Receive(LogLevel level, const std::string& msg) {
24-
if (level >= min_level_) {
25-
stream_ << msg << '\n';
24+
if (ShouldLog(level)) {
25+
stream_ << level << ": " << msg << '\n';
2626
}
2727
}
28+
29+
namespace databento {
30+
std::ostream& operator<<(std::ostream& out, LogLevel level) {
31+
out << ToString(level);
32+
return out;
33+
}
34+
const char* ToString(LogLevel level) {
35+
switch (level) {
36+
case LogLevel::Debug: {
37+
return "DEBUG";
38+
}
39+
case LogLevel::Info: {
40+
return "INFO";
41+
}
42+
case LogLevel::Warning: {
43+
return "WARN";
44+
}
45+
case LogLevel::Error: {
46+
return "ERROR";
47+
}
48+
default: {
49+
return "UNKNOWN";
50+
};
51+
}
52+
}
53+
} // namespace databento

tests/CMakeLists.txt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ verbose_message("Adding tests under ${CMAKE_PROJECT_NAME}Tests...")
1818
set(
1919
test_headers
2020
include/mock/mock_http_server.hpp
21-
include/mock/mock_io.hpp
21+
include/mock/mock_log_receiver.hpp
2222
include/mock/mock_lsg_server.hpp
2323
include/mock/mock_tcp_server.hpp
2424
include/temp_file.hpp
@@ -42,7 +42,6 @@ set(
4242
src/log_tests.cpp
4343
src/metadata_tests.cpp
4444
src/mock_http_server.cpp
45-
src/mock_io.cpp
4645
src/mock_lsg_server.cpp
4746
src/mock_tcp_server.cpp
4847
src/record_tests.cpp

tests/include/mock/mock_http_server.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
#include <httplib.h>
44
#include <nlohmann/json.hpp>
55

6+
#include <cstddef>
67
#include <map>
78
#include <string>
89

910
#include "databento/detail/scoped_thread.hpp"
11+
#include "databento/record.hpp"
1012

1113
namespace databento::tests::mock {
1214
class MockHttpServer {
@@ -35,6 +37,13 @@ class MockHttpServer {
3537
void MockStreamDbn(const std::string& path,
3638
const std::map<std::string, std::string>& params,
3739
const std::string& dbn_path);
40+
void MockStreamDbn(const std::string& path,
41+
const std::map<std::string, std::string>& params,
42+
Record record, std::size_t count, std::size_t chunk_size);
43+
void MockStreamDbn(const std::string& path,
44+
const std::map<std::string, std::string>& params,
45+
Record record, std::size_t count, std::size_t extra_bytes,
46+
std::size_t chunk_size);
3847

3948
private:
4049
static void CheckParams(const std::map<std::string, std::string>& params,

tests/include/mock/mock_io.hpp

Lines changed: 0 additions & 24 deletions
This file was deleted.
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
#pragma once
2+
3+
#include <gtest/gtest.h>
4+
5+
#include <cstddef>
6+
#include <functional>
7+
#include <utility>
8+
9+
#include "databento/log.hpp"
10+
11+
namespace databento::tests::mock {
12+
class MockLogReceiver : public databento::ILogReceiver {
13+
public:
14+
using LogCallback =
15+
std::function<void(std::size_t, databento::LogLevel, const std::string&)>;
16+
17+
explicit MockLogReceiver(LogCallback callback)
18+
: MockLogReceiver{LogLevel::Info, std::move(callback)} {}
19+
MockLogReceiver(LogLevel min_level, LogCallback callback)
20+
: callback_{std::move(callback)}, min_level_{min_level} {}
21+
22+
static MockLogReceiver AssertNoLogs(databento::LogLevel min_level) {
23+
return MockLogReceiver{
24+
min_level,
25+
[min_level](auto, databento::LogLevel level, const std::string& msg) {
26+
FAIL() << "Received unexpected log message with level " << level
27+
<< ": " << msg;
28+
}};
29+
}
30+
31+
void Receive(databento::LogLevel level, const std::string& msg) override {
32+
if (level >= min_level_) {
33+
callback_(call_count_, level, msg);
34+
++call_count_;
35+
}
36+
}
37+
38+
bool ShouldLog(databento::LogLevel level) const override {
39+
return level >= min_level_;
40+
}
41+
42+
std::size_t CallCount() const { return call_count_; }
43+
44+
private:
45+
LogCallback callback_;
46+
LogLevel min_level_{};
47+
std::size_t call_count_{};
48+
};
49+
} // namespace databento::tests::mock

0 commit comments

Comments
 (0)