#include <gtest/gtest.h>
#include <basictypes/String.h>
#include "streaming/api/operators/SourceOperator.h"
#include "connector/kafka/source/KafkaSource.h"
#include "streaming/runtime/tasks/SystemProcessingTimeService.h"
#include "streaming/runtime/io/OmniPushingAsyncDataInput.h"
class MockSourceOutput : public Output {
public:
std::vector<StreamRecord*> recordVector;
explicit MockSourceOutput()
{
}
void collect(void* record) override
{
auto* streamRecord = static_cast<StreamRecord*>(record);
auto* value = static_cast<String*>(streamRecord->getValue());
value->putRefCount();
};
void emitWatermark(Watermark* watermark) override
{
LOG(">>>> OmniStreamTaskNetworkOutput.emitWatermark");
}
void emitWatermarkStatus(WatermarkStatus* watermarkStatus) override
{
LOG(">>>> OmniStreamTaskNetworkOutput.emitWatermarkStatus");
}
void close() override
{
}
};
TEST(SourceOperatorTest, DISABLED_filterTest)
{
auto description =
R"({"batch":false,"format":"kafka","emitProgressiveWatermarks":true,"properties":{"auto.offset.reset":"earliest","bootstrap.servers":"localhost:9092","group.id":"test-group"},"watermarkStrategy":"no","outOfOrdernessMillis":1000,"deserializationSchema":"SimpleStringSchema","hasMetadata":false,"outputNames":[],"outputTypes":[]})";
nlohmann::json opDescriptionJSON = nlohmann::json::parse(description);
std::shared_ptr<KafkaSource> source = std::make_shared<KafkaSource>(opDescriptionJSON, false);
ProcessingTimeService* timeService = new SystemProcessingTimeService();
auto out = new MockSourceOutput();
auto emitOut = new omnistream::OmniAsyncDataOutputToOutput(out);
auto* op = new SourceOperator<>(nullptr, opDescriptionJSON, source, timeService);
std::vector<int> partitions = {0};
std::vector<int> offsets = {-2};
std::vector<KafkaPartitionSplit> splitsChange;
for (size_t i = 0; i < partitions.size(); ++i) {
auto tp = std::shared_ptr<RdKafka::TopicPartition>(
RdKafka::TopicPartition::create("datastream-source-topic", partitions[i]),
[](RdKafka::TopicPartition* ptr) { delete ptr; });
KafkaPartitionSplit split(tp, offsets[i]);
splitsChange.push_back(split);
}
op->open();
auto splitSerializer = source->getSplitSerializer();
AddSplitEvent event(splitsChange, splitSerializer);
op->handleOperatorEvent(event);
std::this_thread::sleep_for(std::chrono::seconds(5));
int index = 0;
while (index++ < 10) {
auto status = op->emitNext(emitOut);
if (status != DataInputStatus::MORE_AVAILABLE) {
std::cout << "Polling stopped with status." << std::endl;
std::this_thread::sleep_for(std::chrono::seconds(1));
}
}
delete splitSerializer;
}