Exemple #1
0
        public void TimeWindowingCountKeySerdesUnknow()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(TimeSpan.FromSeconds(10)))
            .Count(Materialized <string, long, WindowStore <Bytes, byte[]> > .Create("count-store"))
            .ToStream()
            .To("output");

            var topology = builder.Build();

            Assert.Throws <StreamsException>(() =>
            {
                using (var driver = new TopologyTestDriver(topology, config))
                {
                    var input = driver.CreateInputTopic <string, string>("topic");
                    input.PipeInput("test", "1");
                }
            });
        }
Exemple #2
0
        public void WorkflowWithInvalidConfiguration()
        {
            var config = new StreamConfig();

            config.ApplicationId      = "test-workflow-avroserdes";
            config.DefaultKeySerDes   = new StringSerDes();
            config.DefaultValueSerDes = new SchemaProtobufSerDes <Helpers.Proto.Person>();

            var builder = new StreamBuilder();

            builder
            .Stream <string, Helpers.Proto.Person>("person")
            .Filter((k, v) => v.Age >= 18)
            .To("person-major");

            var topo = builder.Build();

            Assert.Throws <System.ArgumentException>(() =>
            {
                using (var driver = new TopologyTestDriver(topo, config))
                {
                    var input = driver.CreateInputTopic <string, Helpers.Proto.Person>("person");
                    input.PipeInput("test1", new Helpers.Proto.Person {
                        Age = 23, FirstName = "f", LastName = "l"
                    });
                }
            });
        }
Exemple #3
0
        public void TestMockSchemaRegistryInputOutput()
        {
            var config = new StreamConfig <StringSerDes, SchemaProtobufSerDes <Order> >();

            config.ApplicationId     = "test-mock-registry";
            config.SchemaRegistryUrl = "mock://test";

            StreamBuilder builder = new StreamBuilder();

            builder.Stream <string, Order>("test")
            .Filter((k, v) => k.Contains("test"))
            .To("test-output");

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic  = driver.CreateInputTopic <string, Order>("test");
                var outputTopic = driver.CreateOuputTopic <string, Order>("test-output", TimeSpan.FromSeconds(5));
                inputTopic.PipeInput("test",
                                     new Order
                {
                    OrderId   = 12,
                    Price     = 150,
                    ProductId = 1
                });
                var r = outputTopic.ReadKeyValue();
                Assert.IsNotNull(r);
                Assert.AreEqual("test", r.Message.Key);
                Assert.AreEqual(12, r.Message.Value.OrderId);
            }
            MockSchemaRegistry.DropScope("test");
        }
        public void ShouldObserveStreamElements()
        {
            var builder        = new StreamBuilder();
            var peekObserved   = new List <KeyValuePair <string, string> >();
            var streamObserved = new List <KeyValuePair <string, string> >();

            builder.Stream <string, string>("topic")
            .Peek((k, v) => peekObserved.Add(KeyValuePair.Create(k, v)))
            .Foreach((k, v) => streamObserved.Add(KeyValuePair.Create(k, v)));

            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-peek";

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic = driver.CreateInputTopic <string, string>("topic");
                var expected   = new List <KeyValuePair <string, string> >();
                for (int i = 0; i < 32; i++)
                {
                    string key   = i.ToString();
                    string value = $"V{i}";
                    inputTopic.PipeInput(key, value);
                    expected.Add(KeyValuePair.Create(key, value));
                }

                Assert.AreEqual(expected, peekObserved);
                Assert.AreEqual(expected, streamObserved);
            }
        }
Exemple #5
0
        public void ShouldMatchIfTombstoneIsAfterKStreamEvent()
        {
            var topo = SimpleJoinTopology(new FailOnInvalidTimestamp());

            using var driver = new TopologyTestDriver(topo, BuildStreamConfig());
            var topic  = driver.CreateMultiInputTopic <string, string>(userClicksTopic, userRegionsTopic);
            var output = driver.CreateOuputTopic <string, string>(outputTopic);

            // publish event in ktable
            topic.PipeInputs(userRegionsTopic,
                             ("alice", "100|asia"));

            //publish event in kstream
            topic.PipeInputs(userClicksTopic,
                             ("alice", "200|click"));

            topic.PipeInputs(userRegionsTopic,
                             ("alice", null));

            topic.Flush();

            var items = output.ReadKeyValueList().ToList();

            Assert.AreEqual(1, items.Count);
            AssertExtensions.MessageEqual(("alice", "200|click --- 100|asia"), items[0]);
        }
        public void WithNullMaterialize()
        {
            // CERTIFIED THAT SAME IF Materialize is null, a state store exist for count processor with a generated namestore
            var config = new StreamConfig <StringSerDes, StringSerDes>();
            var serdes = new StringSerDes();

            config.ApplicationId = "test-reduce";

            var builder = new StreamBuilder();
            Materialized <string, int, IKeyValueStore <Bytes, byte[]> > m = null;

            builder
            .Table <string, string>("topic")
            .MapValues((v) => v.Length)
            .GroupBy((k, v) => KeyValuePair.Create(k.ToUpper(), v))
            .Reduce((v1, v2) => Math.Max(v1, v2), (v1, v2) => v2, m);

            var topology = builder.Build();

            Assert.Throws <StreamsException>(() =>
            {
                using (var driver = new TopologyTestDriver(topology, config))
                {
                    var input = driver.CreateInputTopic <string, string>("topic");
                    input.PipeInput("test", "1");
                }
            });
        }
        public void ForeachAction()
        {
            var builder         = new StreamBuilder();
            var foreachObserved = new List <KeyValuePair <string, string> >();
            var data            = new List <KeyValuePair <string, string> >();

            data.Add(KeyValuePair.Create("key1", "123456"));

            builder.Stream <string, string>("topic")
            .Foreach((k, v) => foreachObserved.Add(KeyValuePair.Create(k, v)));

            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-foreach";

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic = driver.CreateInputTopic <string, string>("topic");

                inputTopic.PipeInputs(data);

                Assert.AreEqual(data, foreachObserved);
            }
        }
Exemple #8
0
        public void TimeWindowingAggNothing()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(2000))
            .Aggregate(
                () => 0,
                (k, v, agg) => Math.Max(v.Length, agg),
                InMemoryWindows <string, int> .As("store").WithValueSerdes <Int32SerDes>())
            .ToStream()
            .To <StringTimeWindowedSerDes, Int32SerDes>("output");

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input    = driver.CreateInputTopic <string, string>("topic");
                var output   = driver.CreateOuputTopic("output", TimeSpan.FromSeconds(1), new StringTimeWindowedSerDes(), new Int64SerDes());
                var elements = output.ReadKeyValueList().ToList();
                Assert.AreEqual(0, elements.Count);
            }
        }
Exemple #9
0
        public void TimeWindowingQueryStoreAll()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(2000))
            .Aggregate(
                () => 0,
                (k, v, agg) => Math.Max(v.Length, agg),
                InMemoryWindows <string, int> .As("store").WithValueSerdes <Int32SerDes>());

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input = driver.CreateInputTopic <string, string>("topic");
                input.PipeInput("test", "1");
                input.PipeInput("test", "2567");
                input.PipeInput("test", "32");
                var store    = driver.GetWindowStore <string, int>("store");
                var elements = store.All().ToList();
                Assert.AreEqual(1, elements.Count);
                Assert.AreEqual("test", elements[0].Key.Key);
                Assert.AreEqual((long)TimeSpan.FromSeconds(2).TotalMilliseconds, elements[0].Key.Window.EndMs - elements[0].Key.Window.StartMs);
                Assert.AreEqual(4, elements[0].Value);
            }
        }
        public void CountWithName()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-count";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .Count("count-01")
            .ToStream()
            .To("output");

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input  = driver.CreateInputTopic <string, string>("topic");
                var output = driver.CreateOuputTopic <string, long, StringSerDes, Int64SerDes>("output");
                input.PipeInput("test", "1");
                var r = output.ReadKeyValue();
                Assert.AreEqual("test", r.Message.Key);
                Assert.AreEqual(1, r.Message.Value);
            }
        }
Exemple #11
0
        public void TimeWindowingAggKeySerdesUnknow()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(2000))
            .Aggregate(
                () => 0,
                (k, v, agg) => Math.Max(v.Length, agg),
                InMemoryWindows <string, int> .As("store").WithValueSerdes <Int32SerDes>())
            .ToStream()
            .To("output");

            var topology = builder.Build();

            Assert.Throws <StreamsException>(() =>
            {
                using (var driver = new TopologyTestDriver(topology, config))
                {
                    var input = driver.CreateInputTopic <string, string>("topic");
                    input.PipeInput("test", "1");
                }
            });
        }
        public void CountWithNullValue()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-count";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupBy((k, v) => k.ToCharArray()[0])
            .Count(InMemory <char, long> .As("count-store").WithKeySerdes(new CharSerDes()));

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input = driver.CreateInputTopic <string, string>("topic");
                input.PipeInput("test", "1");
                input.PipeInput("test", null);
                input.PipeInput("coucou", "120");
                var store = driver.GetKeyValueStore <char, long>("count-store");
                Assert.IsNotNull(store);
                Assert.AreEqual(2, store.ApproximateNumEntries());
                Assert.AreEqual(1, store.Get('t'));
                Assert.AreEqual(1, store.Get('c'));
            }
        }
Exemple #13
0
        public void KStreamGlobalLeftJoinNull()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>
            {
                ApplicationId = "test-stream-table-join"
            };

            StreamBuilder builder = new StreamBuilder();

            var global = builder.GlobalTable("global", InMemory <string, string> .As("global-store"));

            builder
            .Stream <string, string>("stream")
            .LeftJoin(global, (k, v) => k, (s, v) => $"{s}-{v}")
            .To("output");

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic  = driver.CreateInputTopic <string, string>("global");
                var inputTopic2 = driver.CreateInputTopic <string, string>("stream");
                var outputTopic = driver.CreateOuputTopic <string, string>("output");
                inputTopic2.PipeInput("test", "coucou");
                inputTopic.PipeInput("test", "test");
                var record = outputTopic.ReadKeyValue();
                Assert.IsNotNull(record);
                Assert.AreEqual("test", record.Message.Key);
                Assert.AreEqual("coucou-", record.Message.Value);
            }
        }
Exemple #14
0
        public void TimeWindowingQueryStore2Window()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(TimeSpan.FromSeconds(5)))
            .Count(InMemoryWindows <string, long> .As("count-store"));

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                DateTime dt    = DateTime.Now;
                var      input = driver.CreateInputTopic <string, string>("topic");
                input.PipeInput("test", "1", dt);
                input.PipeInput("test", "2", dt);
                input.PipeInput("test", "3", dt.AddMinutes(1));
                var store    = driver.GetWindowStore <string, long>("count-store");
                var elements = store.All().ToList();
                Assert.AreEqual(2, elements.Count);
                Assert.AreEqual("test", elements[0].Key.Key);
                Assert.AreEqual((long)TimeSpan.FromSeconds(5).TotalMilliseconds, elements[0].Key.Window.EndMs - elements[0].Key.Window.StartMs);
                Assert.AreEqual(2, elements[0].Value);
                Assert.AreEqual("test", elements[1].Key.Key);
                Assert.AreEqual((long)TimeSpan.FromSeconds(5).TotalMilliseconds, elements[1].Key.Window.EndMs - elements[1].Key.Window.StartMs);
                Assert.AreEqual(1, elements[1].Value);
            }
        }
        public void Reduce2()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-reduce";

            var builder = new StreamBuilder();

            builder
            .Table <string, string>("topic")
            .GroupBy((k, v) => KeyValuePair.Create(k.ToUpper(), v))
            .Reduce(
                (v1, v2) => v2.Length > v1.Length ? v2 : v1,
                (v1, v2) => v2,
                InMemory <string, string> .As("reduce-store"));

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input = driver.CreateInputTopic <string, string>("topic");
                input.PipeInput("test", "1");
                input.PipeInput("test", "12");

                var store = driver.GetKeyValueStore <string, string>("reduce-store");
                Assert.IsNotNull(store);
                Assert.AreEqual(1, store.ApproximateNumEntries());
                var el = store.Get("TEST");
                Assert.IsNotNull(el);
                Assert.AreEqual("12", el);
            }
        }
        public void TableTableJoinValueJoiner()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>
            {
                ApplicationId = "test-table-table-join"
            };

            StreamBuilder builder = new StreamBuilder();

            var table1 = builder.Table("table1", InMemory <string, string> .As("store1"));
            var table2 = builder.Table("table2", InMemory <string, string> .As("store2"));

            var tableJoin = table1.Join(table2, new ValueJoiner());

            tableJoin.ToStream().To("topic-output");

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic1 = driver.CreateInputTopic <string, string>("table1");
                var inputTopic2 = driver.CreateInputTopic <string, string>("table2");
                var outputTopic = driver.CreateOuputTopic <string, string>("topic-output");
                inputTopic1.PipeInput("test", "test");
                inputTopic2.PipeInput("test", "coucou");
                var record = outputTopic.ReadKeyValue();
                Assert.IsNotNull(record);
                Assert.AreEqual("test", record.Message.Key);
                Assert.AreEqual("test-coucou", record.Message.Value);
            }
        }
        public void Reduce4()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-count";

            var builder = new StreamBuilder();

            builder
            .Table <string, string>("topic")
            .GroupBy((k, v) => KeyValuePair.Create(k.ToUpper(), v))
            .Reduce(
                new MyAddReducer(), new MySubReducer(),
                InMemory <string, string> .As("reduce-store"),
                "reduce-processor");

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input = driver.CreateInputTopic <string, string>("topic");
                input.PipeInput("test", "1");
                input.PipeInput("test", null);
                input.PipeInput("test", "12");

                var store = driver.GetKeyValueStore <string, string>("reduce-store");
                Assert.IsNotNull(store);
                // null doesn't matter
                Assert.AreEqual(1, store.ApproximateNumEntries());
                var el = store.Get("TEST");
                Assert.IsNotNull(el);
                Assert.AreEqual("12", el);
            }
        }
        public void MapValuesSameType()
        {
            var builder = new StreamBuilder();
            var data    = new List <KeyValuePair <string, string> >();

            data.Add(KeyValuePair.Create("key1", "abc"));
            data.Add(KeyValuePair.Create("key2", "test"));

            builder.Stream <string, string>("topic")
            .MapValues((k, v) => v.ToUpper())
            .To("topic-mapvalues");

            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-mapvalues";

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic  = driver.CreateInputTopic <string, string>("topic");
                var outputTopic = driver.CreateOuputTopic <string, string>("topic-mapvalues");

                inputTopic.PipeInputs(data);
                var result = outputTopic.ReadKeyValueList().Select(r => KeyValuePair.Create(r.Message.Key, r.Message.Value)).ToList();

                var expected = new List <KeyValuePair <string, string> >();
                expected.Add(KeyValuePair.Create("key1", "ABC"));
                expected.Add(KeyValuePair.Create("key2", "TEST"));

                Assert.IsNotNull(result);
                Assert.AreEqual(expected, result);
            }
        }
        public void WithNullSerDes()
        {
            // WITH NULL SERDES, in running KeySerdes must be StringSerdes, and ValueSerdes Int64SerDes
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-reduce";

            var builder = new StreamBuilder();
            Materialized <string, int, IKeyValueStore <Bytes, byte[]> > m =
                Materialized <string, int, IKeyValueStore <Bytes, byte[]> >
                .Create("reduce-store")
                .With(null, null);

            builder
            .Table <string, string>("topic")
            .MapValues((v) => v.Length)
            .GroupBy((k, v) => KeyValuePair.Create(k.ToUpper(), v))
            .Reduce((v1, v2) => Math.Max(v1, v2), (v1, v2) => v2, m)
            .ToStream()
            .To("output-topic");

            var topology = builder.Build();

            Assert.Throws <StreamsException>(() =>
            {
                using (var driver = new TopologyTestDriver(topology, config))
                {
                    var input = driver.CreateInputTopic <string, string>("topic");
                    input.PipeInput("test", "1");
                }
            });
        }
        public void MapValuesOtherType()
        {
            var builder = new StreamBuilder();
            var data    = new List <KeyValuePair <string, string> >();

            data.Add(KeyValuePair.Create("key1", "123456"));

            builder.Stream <string, string>("topic")
            .MapValues((k, v) => v.Length)
            .To <StringSerDes, Int32SerDes>("topic-mapvalues");

            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-mapvalues";

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic  = driver.CreateInputTopic <string, string>("topic");
                var outputTopic = driver.CreateOuputTopic <string, int, StringSerDes, Int32SerDes>("topic-mapvalues");

                inputTopic.PipeInputs(data);
                var result = outputTopic.ReadKeyValue();

                Assert.IsNotNull(result);
                Assert.AreEqual(result.Message.Key, "key1");
                Assert.AreEqual(result.Message.Value, 6);
            }
        }
        public void MapSameValueType()
        {
            var builder = new StreamBuilder();
            var data    = new List <KeyValuePair <string, string> >();

            data.Add(KeyValuePair.Create("key1", "abc"));

            builder.Stream <string, string>("topic")
            .Map((k, v) => KeyValuePair.Create(k, v.ToUpper()))
            .To <StringSerDes, StringSerDes>("topic-map");

            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-map";

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic  = driver.CreateInputTopic <string, string>("topic");
                var outputTopic = driver.CreateOuputTopic <string, string, StringSerDes, StringSerDes>("topic-map");

                inputTopic.PipeInputs(data);
                var result = outputTopic.ReadKeyValue();

                Assert.IsNotNull(result);
                Assert.AreEqual(result.Message.Key, "key1");
                Assert.AreEqual(result.Message.Value, "ABC");
            }
        }
        public void TimeWindowingReduceKeySerdesUnknow()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(2000))
            .Reduce(
                (v1, v2) => v1.Length > v2.Length ? v1 : v2,
                InMemoryWindows <string, string> .As("store"))
            .ToStream()
            .To("output");

            var topology = builder.Build();

            Assert.Throws <StreamsException>(() =>
            {
                using (var driver = new TopologyTestDriver(topology, config))
                {
                    var input = driver.CreateInputTopic <string, string>("topic");
                    input.PipeInput("test", "1");
                }
            });
        }
Exemple #23
0
        public void MultiEvent()
        {
            var topo = SimpleJoinTopology(new MyTimestampExtractor());

            using var driver = new TopologyTestDriver(topo, BuildStreamConfig());
            var topic  = driver.CreateMultiInputTopic <string, string>(userClicksTopic, userRegionsTopic);
            var output = driver.CreateOuputTopic <string, string>(outputTopic);

            //publish event in kstream
            topic.PipeInputs(userClicksTopic,
                             ("alice", "200|user 1 click"),
                             ("bob", "201|click1"),
                             ("joe", "202|user 1 click"));

            // publish event in ktable
            topic.PipeInputs(userRegionsTopic,
                             ("alice", "100|asia"),
                             ("bob", "101|france"),
                             ("joe", "300|usa"));

            topic.Flush();

            var items = output.ReadKeyValueList().ToList();

            Assert.AreEqual(2, items.Count);
            AssertExtensions.MessageEqual(("alice", "200|user 1 click --- 100|asia"), items[0]);
            AssertExtensions.MessageEqual(("bob", "201|click1 --- 101|france"), items[1]);
        }
        public void TimeWindowingReduceNothing()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(2000))
            .Reduce(
                (v1, v2) => v1.Length > v2.Length ? v1 : v2,
                InMemoryWindows <string, string> .As("store"))
            .ToStream()
            .To <StringTimeWindowedSerDes, StringSerDes>("output");

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input    = driver.CreateInputTopic <string, string>("topic");
                var output   = driver.CreateOuputTopic("output", TimeSpan.FromSeconds(1), new StringTimeWindowedSerDes(), new Int64SerDes());
                var elements = output.ReadKeyValueList().ToList();
                Assert.AreEqual(0, elements.Count);
            }
        }
        public void TestGetWindowStoreIncorrectType()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(TimeSpan.FromSeconds(5)))
            .Count(InMemoryWindows <string, long> .As("count-store"));

            var topology = builder.Build();

            using var driver = new TopologyTestDriver(topology, config);
            DateTime dt    = DateTime.Now;
            var      input = driver.CreateInputTopic <string, string>("topic");

            input.PipeInput("test", "1", dt);
            var store = driver.GetWindowStore <int, long>("count-store");

            Assert.IsNull(store);
        }
        public void TimeWindowingQueryStoreAll()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-stream";

            var builder = new StreamBuilder();

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(2000))
            .Reduce(
                (v1, v2) => v1.Length > v2.Length ? v1 : v2,
                InMemoryWindows <string, string> .As("store"))
            .ToStream()
            .To <StringTimeWindowedSerDes, StringSerDes>("output");

            var topology = builder.Build();

            using (var driver = new TopologyTestDriver(topology, config))
            {
                var input = driver.CreateInputTopic <string, string>("topic");
                input.PipeInput("test", "1");
                input.PipeInput("test", "2567");
                input.PipeInput("test", "32");
                var store    = driver.GetWindowStore <string, string>("store");
                var elements = store.All().ToList();
                Assert.AreEqual(1, elements.Count);
                Assert.AreEqual("test", elements[0].Key.Key);
                Assert.AreEqual((long)TimeSpan.FromSeconds(2).TotalMilliseconds, elements[0].Key.Window.EndMs - elements[0].Key.Window.StartMs);
                Assert.AreEqual("2567", elements[0].Value);
            }
        }
Exemple #27
0
        public void DefautlValue()
        {
            var mockSchemaClient = new MockSchemaRegistryClient();
            var config           = new StreamConfig();
            var serdes           = new MockProtoSerDes(mockSchemaClient);

            config.ApplicationId                  = "test-workflow-avroserdes";
            config.DefaultKeySerDes               = new StringSerDes();
            config.DefaultValueSerDes             = serdes;
            config.SchemaRegistryMaxCachedSchemas = null;
            config.SchemaRegistryRequestTimeoutMs = null;

            var builder = new StreamBuilder();

            builder
            .Stream <string, Helpers.Proto.Person>("person")
            .Filter((k, v) => v.Age >= 18)
            .MapValues((v) => v.Age)
            .To <StringSerDes, Int32SerDes>("person-major");

            var topo = builder.Build();

            using (var driver = new TopologyTestDriver(topo, config))
            {
                var input  = driver.CreateInputTopic <string, Helpers.Proto.Person>("person");
                var output = driver.CreateOuputTopic <string, int, StringSerDes, Int32SerDes>("person-major");
                input.PipeInput("test1", new Helpers.Proto.Person {
                    Age = 23, FirstName = "f", LastName = "l"
                });
                var record = output.ReadKeyValue();
                Assert.IsNotNull(record);
                Assert.AreEqual("test1", record.Message.Key);
                Assert.AreEqual(23, record.Message.Value);
            }
        }
        public void WithNullValueSerDes()
        {
            // WITH VALUE NULL SERDES, in running KeySerdes must be StringSerdes, and ValueSerdes Int64SerDes
            var config = new StreamConfig <StringSerDes, StringSerDes>();

            config.ApplicationId = "test-window-count";

            var builder = new StreamBuilder();

            Materialized <string, string, IWindowStore <Bytes, byte[]> > m =
                Materialized <string, string, IWindowStore <Bytes, byte[]> >
                .Create("store")
                .With(null, null);

            builder
            .Stream <string, string>("topic")
            .GroupByKey()
            .WindowedBy(TumblingWindowOptions.Of(2000))
            .Reduce((v1, v2) => v1.Length > v2.Length ? v1 : v2, m)
            .ToStream()
            .To("output-topic");

            var topology = builder.Build();

            Assert.Throws <StreamsException>(() =>
            {
                using (var driver = new TopologyTestDriver(topology, config))
                {
                    var input  = driver.CreateInputTopic <string, string>("topic");
                    var output = driver.CreateOuputTopic("output-topic", TimeSpan.FromSeconds(1), new StringTimeWindowedSerDes(), new Int64SerDes());
                    input.PipeInput("test", "1");
                }
            });
        }
Exemple #29
0
        public void TestMockSchemaRegistryExceptionConfiguration2()
        {
            var config = new StreamConfig();

            config.ApplicationId     = "app-test";
            config.SchemaRegistryUrl = "mock://test1,http://localhost:8081";

            StreamBuilder builder = new StreamBuilder();

            var ss = builder.Stream <string, Order, StringSerDes, SchemaProtobufSerDes <Order> >("test-topic")
                     .Peek((k, v) =>
            {
                Console.WriteLine($"Order #  {v.OrderId }");
            });

            Topology t = builder.Build();

            Assert.Throws <ArgumentException>(() =>
            {
                using (var driver = new TopologyTestDriver(t, config))
                {
                    var inputTopic = driver.CreateInputTopic <string, Order, StringSerDes, SchemaProtobufSerDes <Order> >("test-topic");
                    inputTopic.PipeInput("test",
                                         new Order
                    {
                        OrderId   = 12,
                        Price     = 150,
                        ProductId = 1
                    });
                }
            });
        }
        public void TableTableOuterJoinNullKey()
        {
            var config = new StreamConfig <StringSerDes, StringSerDes>
            {
                ApplicationId = "test-table-table-outer-join"
            };

            StreamBuilder builder = new StreamBuilder();

            var table1 = builder.Table("table1", InMemory <string, string> .As("store1"));
            var table2 = builder.Table("table2", InMemory <string, string> .As("store2"));

            var tableJoin = table1.LeftJoin(table2, (v1, v2) => $"{v1}-{v2}");

            tableJoin.ToStream().To("topic-output");

            Topology t = builder.Build();

            using (var driver = new TopologyTestDriver(t, config))
            {
                var inputTopic1 = driver.CreateInputTopic <string, string>("table1");
                var inputTopic2 = driver.CreateInputTopic <string, string>("table2");
                var outputTopic = driver.CreateOuputTopic <string, string>("topic-output");
                inputTopic1.PipeInput("test", "test");
                inputTopic1.PipeInput(null, "test");
                var records = outputTopic.ReadKeyValuesToMap();
                Assert.IsNotNull(records);
                Assert.AreEqual(1, records.Count);
                Assert.AreEqual("test-", records["test"]);
            }
        }