Ejemplo n.º 1
0
        public void EqualTest()
        {
            var protocol01 = new AvroProtocol("SomeProtocol", "Some.Namespace");
            var protocol02 = new AvroProtocol("Some.Namespace.SomeProtocol");

            Assert.AreEqual(protocol01, protocol02);
        }
Ejemplo n.º 2
0
        public void ProtocolWrite(AvroProtocol protocol, string expectedCanonicalAvro, string expectedDefaultAvro, string expectedFullAvro)
        {
            var canonicalAvro = new StringBuilder();

            using (var writer = new StringWriter(canonicalAvro))
                AvroParser.WriteAvroCanonical(writer, protocol);
            var actualCanonicalAvro = canonicalAvro.ToString();

            var defaultAvro = new StringBuilder();

            using (var writer = new StringWriter(defaultAvro))
                AvroParser.WriteAvro(writer, protocol);
            var actualDefaultAvro = defaultAvro.ToString();

            var fullAvro = new StringBuilder();

            using (var writer = new StringWriter(fullAvro))
                AvroParser.WriteAvroFull(writer, protocol);
            var actualFullAvro = fullAvro.ToString();

            Assert.AreEqual(expectedCanonicalAvro, actualCanonicalAvro, "Canonical form mismatch");
            Assert.AreEqual(expectedDefaultAvro, actualDefaultAvro, "Default form mismatch");
            Assert.AreEqual(expectedFullAvro, actualFullAvro, "Full form mismatch");

            actualCanonicalAvro = protocol.ToAvroCanonical();
            actualDefaultAvro   = protocol.ToAvro();
            actualFullAvro      = protocol.ToAvroFull();

            Assert.AreEqual(expectedCanonicalAvro, actualCanonicalAvro, "Extension - Canonical form mismatch");
            Assert.AreEqual(expectedDefaultAvro, actualDefaultAvro, "Extension - Default form mismatch");
            Assert.AreEqual(expectedFullAvro, actualFullAvro, "Extension - Full form mismatch");
        }
Ejemplo n.º 3
0
        public void AddProtocol(AvroProtocol protocol)
        {
            var memberDeclarationSyntax = CreateCode(protocol);

            _code.Add(protocol.FullName, memberDeclarationSyntax);
            AddSchemas(protocol.Types);
        }
Ejemplo n.º 4
0
        private async Task <GenericServer> RunLocalServer(AvroProtocol protocol, LocalTranceiver tranceiver, CancellationToken token)
        {
            var server = new GenericServer(protocol, tranceiver);

            await RunGenericServer(server, token);

            return(server);
        }
Ejemplo n.º 5
0
        public void DocTest()
        {
            var protocol = new AvroProtocol()
            {
                Doc = "Test Doc"
            };

            Assert.AreEqual("Test Doc", protocol.Doc);
        }
Ejemplo n.º 6
0
        private async Task <GenericServer> RunHttpServer(AvroProtocol protocol, CancellationToken token)
        {
            var urls       = protocol.Messages.Select(r => $"http://localhost:8080/{protocol.Name}/{r.Name}/");
            var tranceiver = HttpServer.Create(urls.ToArray());
            var server     = new GenericServer(protocol, tranceiver);

            await RunGenericServer(server, token);

            return(server);
        }
        public void MissingMessageType()
        {
            var protocol = new AvroProtocol();
            var record   = new RecordSchema("Name");
            var message  = new MessageSchema("M");

            message.AddParameter(new ParameterSchema("par", record));

            Assert.Throws(
                typeof(AvroException),
                () => protocol.AddMessage(message)
                );
        }
Ejemplo n.º 8
0
        private async Task <GenericServer> RunTcpServer(AvroProtocol protocol, CancellationToken token)
        {
            var listener = new SocketListener("127.0.0.1", 3456);

            listener.Start();
            var tranceiver = await listener.ListenAsync();

            var server = new GenericServer(protocol, tranceiver);

            await RunGenericServer(server, token);

            listener.Stop();
            return(server);
        }
        public void DuplicateType()
        {
            var protocol = new AvroProtocol();
            var record   = new RecordSchema("Name");

            Assert.DoesNotThrow(
                () => protocol.AddType(record)
                );

            Assert.Throws(
                typeof(AvroException),
                () => protocol.AddType(record)
                );
        }
Ejemplo n.º 10
0
        public void TestAddProtocol()
        {
            var codeGen = new CodeGen();

            var recordSchema = new RecordSchema("TestRecord", null, new RecordSchema.Field[] { new RecordSchema.Field("A", new IntSchema()) });
            var protocol     = new AvroProtocol("TestProtocol", "Test.Namespace");

            protocol.AddType(recordSchema);

            codeGen.AddProtocol(protocol);

            Assert.AreEqual(2, codeGen.Count);
            Assert.IsNotNull(codeGen["Test.Namespace.TestProtocol"]);
            Assert.IsNotNull(codeGen["Test.Namespace.TestRecord"]);
        }
Ejemplo n.º 11
0
        private static MemberDeclarationSyntax CreateCode(AvroProtocol protocol)
        {
            var avro             = protocol.ToAvroCanonical();
            var classDeclaration =
                CreateProtocolClass(
                    protocol.Name,
                    avro,
                    protocol.Doc,
                    protocol.Messages
                    );

            return
                (QualifyMember(
                     classDeclaration,
                     protocol.Namespace
                     ));
        }
        public static GenericProtocolPair Get(AvroProtocol local, AvroProtocol remote)
        {
            lock (GUARD)
            {
                if (!CACHE.TryGetValue(local.MD5, out var genericProtocolPairs))
                {
                    genericProtocolPairs = new Dictionary <byte[], GenericProtocolPair>(COMPARE);
                    CACHE.Add(local.MD5, genericProtocolPairs);
                }

                if (!genericProtocolPairs.TryGetValue(remote.MD5, out var genericProtocolPair))
                {
                    genericProtocolPair = new GenericProtocolPair(local, remote);
                    genericProtocolPairs.Add(remote.MD5, genericProtocolPair);
                }
                return(genericProtocolPair);
            }
        }
Ejemplo n.º 13
0
 public GenericResponder(AvroProtocol local, AvroProtocol remote)
 {
     Local         = local;
     Remote        = remote;
     _protocolPair = GenericProtocolPair.Get(local, remote);
 }
Ejemplo n.º 14
0
        private async Task <GenericClient> ConnectHttpClient(AvroProtocol protocol, CancellationToken token)
        {
            var tranceiver = await HttpClient.ConnectAsync($"http://localhost:8080/{protocol.Name}");

            return(new GenericClient(protocol, tranceiver));
        }
Ejemplo n.º 15
0
        private async Task <GenericClient> ConnectTcpClient(AvroProtocol protocol, CancellationToken token)
        {
            var tranceiver = await SocketClient.ConnectAsync("127.0.0.1", 3456);

            return(new GenericClient(protocol, tranceiver));
        }
Ejemplo n.º 16
0
 private GenericClient ConnectLocalClient(AvroProtocol protocol, LocalTranceiver tranceiver, CancellationToken token)
 {
     return(new GenericClient(protocol, tranceiver));
 }
Ejemplo n.º 17
0
 protected Session(AvroProtocol protocol, ITranceiver tranceiver)
 {
     Protocol    = protocol;
     _tranceiver = tranceiver;
 }
Ejemplo n.º 18
0
 public GenericServer(AvroProtocol protocol, ITranceiver tranceiver)
     : base(protocol, tranceiver)
 {
     RemoteProtocol = protocol;
     _protocol      = new GenericResponder(Protocol, RemoteProtocol);
 }
Ejemplo n.º 19
0
            public IEnumerator GetEnumerator()
            {
                var record01 = new RecordSchema()
                {
                    Name = "TestRecord01"
                };
                var record02 = new RecordSchema()
                {
                    Name = "TestRecord02"
                };

                var errord01 = new ErrorSchema()
                {
                    Name = "TestError01"
                };
                var errord02 = new ErrorSchema()
                {
                    Name = "TestError02"
                };


                var protocol01 = new AvroProtocol
                {
                    Name = "ProtocolName"
                };

                yield return(new object[] {
                    protocol01,
                    @"{""protocol"":""ProtocolName""}",
                    @"{ ""protocol"": ""ProtocolName"" }",
                    @"{ ""namespace"": """", ""protocol"": ""ProtocolName"", ""doc"": """", ""types"": [], ""messages"": {} }"
                });

                var protocol02 = new AvroProtocol
                {
                    Name      = "ProtocolName",
                    Namespace = "Test.Namespace"
                };

                yield return(new object[] {
                    protocol02,
                    @"{""protocol"":""Test.Namespace.ProtocolName""}",
                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"" }",
                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"", ""doc"": """", ""types"": [], ""messages"": {} }"
                });

                var protocol03 = new AvroProtocol
                {
                    Name      = "ProtocolName",
                    Namespace = "Test.Namespace",
                    Doc       = "Test Documentation"
                };

                yield return(new object[] {
                    protocol03,
                    @"{""protocol"":""Test.Namespace.ProtocolName""}",
                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"", ""doc"": ""Test Documentation"" }",
                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"", ""doc"": ""Test Documentation"", ""types"": [], ""messages"": {} }"
                });

                var protocol04 = new AvroProtocol
                {
                    Name      = "ProtocolName",
                    Namespace = "Test.Namespace",
                    Doc       = "Test Documentation"
                };

                protocol04.AddType(record01);
                protocol04.AddType(record02);
                protocol04.AddType(errord01);
                protocol04.AddType(errord02);

                yield return(new object[] {
                    protocol04,
                    @"{""protocol"":""Test.Namespace.ProtocolName"",""types"":" +
                    @"[{""name"":""Test.Namespace.TestRecord01"",""type"":""record"",""fields"":[]}," +
                    @"{""name"":""Test.Namespace.TestRecord02"",""type"":""record"",""fields"":[]}," +
                    @"{""name"":""Test.Namespace.TestError01"",""type"":""error"",""fields"":[]}," +
                    @"{""name"":""Test.Namespace.TestError02"",""type"":""error"",""fields"":[]}" +
                    @"]}",

                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"", ""doc"": ""Test Documentation"", ""types"": " +
                    @"[{ ""type"": ""record"", ""name"": ""TestRecord01"", ""fields"": [] }, " +
                    @"{ ""type"": ""record"", ""name"": ""TestRecord02"", ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError01"", ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError02"", ""fields"": [] }" +
                    @"] }",

                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"", ""doc"": ""Test Documentation"", ""types"": " +
                    @"[{ ""type"": ""record"", ""name"": ""TestRecord01"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] }, " +
                    @"{ ""type"": ""record"", ""name"": ""TestRecord02"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError01"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError02"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] " +
                    @"}]," +
                    @" ""messages"": {} }"
                });

                var protocol05 = new AvroProtocol
                {
                    Name      = "ProtocolName",
                    Namespace = "Test.Namespace",
                    Doc       = "Test Documentation"
                };

                protocol05.AddType(record01);
                protocol05.AddType(record02);
                protocol05.AddType(errord01);
                protocol05.AddType(errord02);

                var message01 = new MessageSchema("M01")
                {
                    Doc = "Test Doc 01"
                };

                message01.AddParameter(new ParameterSchema("p01", record01));
                message01.AddParameter(new ParameterSchema("p02", record02));
                message01.AddError(errord01);
                message01.AddError(errord02);
                message01.Response = new DoubleSchema();

                var message02 = new MessageSchema("M02");

                message02.AddParameter(new ParameterSchema("p01", record01));
                message02.AddError(errord01);
                message02.Oneway = true;

                protocol05.AddMessage(message01);
                protocol05.AddMessage(message02);

                yield return(new object[] {
                    protocol05,
                    @"{""protocol"":""Test.Namespace.ProtocolName"",""types"":" +
                    @"[{""name"":""Test.Namespace.TestRecord01"",""type"":""record"",""fields"":[]}," +
                    @"{""name"":""Test.Namespace.TestRecord02"",""type"":""record"",""fields"":[]}," +
                    @"{""name"":""Test.Namespace.TestError01"",""type"":""error"",""fields"":[]}," +
                    @"{""name"":""Test.Namespace.TestError02"",""type"":""error"",""fields"":[]}" +
                    @"]," +
                    @"""messages"":{" +
                    @"""M01"":{" +
                    @"""request"":[{""name"":""p01"",""type"":""Test.Namespace.TestRecord01""},{""name"":""p02"",""type"":""Test.Namespace.TestRecord02""}]," +
                    @"""response"":""double""," +
                    @"""errors"":[""Test.Namespace.TestError01"",""Test.Namespace.TestError02""]" +
                    @"}," +
                    @"""M02"":{" +
                    @"""request"":[{""name"":""p01"",""type"":""Test.Namespace.TestRecord01""}]," +
                    @"""errors"":[""Test.Namespace.TestError01""]," +
                    @"""one-way"":true" +
                    @"}}}",

                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"", ""doc"": ""Test Documentation"", ""types"": " +
                    @"[{ ""type"": ""record"", ""name"": ""TestRecord01"", ""fields"": [] }, " +
                    @"{ ""type"": ""record"", ""name"": ""TestRecord02"", ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError01"", ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError02"", ""fields"": [] }" +
                    @"], " +
                    @"""messages"": {" +
                    @"""M01"": {" +
                    @"""doc"": ""Test Doc 01"", " +
                    @"""request"": [{ ""name"": ""p01"", ""type"": ""TestRecord01"" }, { ""name"": ""p02"", ""type"": ""TestRecord02"" }], " +
                    @"""response"": ""double"", " +
                    @"""errors"": [""TestError01"", ""TestError02""]" +
                    @"}, " +
                    @"""M02"": {" +
                    @"""request"": [{ ""name"": ""p01"", ""type"": ""TestRecord01"" }], " +
                    @"""errors"": [""TestError01""], " +
                    @"""one-way"": true" +
                    @"}} }",

                    @"{ ""namespace"": ""Test.Namespace"", ""protocol"": ""ProtocolName"", ""doc"": ""Test Documentation"", ""types"": " +
                    @"[{ ""type"": ""record"", ""name"": ""TestRecord01"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] }, " +
                    @"{ ""type"": ""record"", ""name"": ""TestRecord02"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError01"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] }, " +
                    @"{ ""type"": ""error"", ""name"": ""TestError02"", ""namespace"": ""Test.Namespace"", ""doc"": """", ""aliases"": [], ""fields"": [] }" +
                    @"], " +
                    @"""messages"": {" +
                    @"""M01"": {" +
                    @"""doc"": ""Test Doc 01"", " +
                    @"""request"": [{ ""name"": ""p01"", ""type"": ""Test.Namespace.TestRecord01"" }, { ""name"": ""p02"", ""type"": ""Test.Namespace.TestRecord02"" }], " +
                    @"""response"": { ""type"": ""double"" }, " +
                    @"""errors"": [""Test.Namespace.TestError01"", ""Test.Namespace.TestError02""], " +
                    @"""one-way"": false" +
                    @"}, " +
                    @"""M02"": {" +
                    @"""doc"": """", " +
                    @"""request"": [{ ""name"": ""p01"", ""type"": ""Test.Namespace.TestRecord01"" }], " +
                    @"""response"": null, " +
                    @"""errors"": [""Test.Namespace.TestError01""], " +
                    @"""one-way"": true" +
                    @"}} }"
                });
            }
Ejemplo n.º 20
0
 public GenericClient(AvroProtocol protocol, ITranceiver tranceiver)
     : base(protocol, tranceiver)
 {
     RemoteProtocol = protocol;
     _protocol      = new GenericRequestor(Protocol, RemoteProtocol);
 }
        private GenericProtocolPair(AvroProtocol local, AvroProtocol remote)
        {
            LocalHash  = local.MD5;
            RemoteHash = remote.MD5;

            var requestReaders  = new Dictionary <string, IAvroReader <IAvroRecord> >();
            var requestWriters  = new Dictionary <string, IAvroWriter <IAvroRecord> >();
            var responseReaders = new Dictionary <string, IAvroReader <object> >();
            var responseWriters = new Dictionary <string, IAvroWriter <object> >();
            var errorReaders    = new Dictionary <string, IAvroReader <object> >();
            var errorWriters    = new Dictionary <string, IAvroWriter <object> >();

            var messagePairs =
                from lm in local.Messages
                join rm in remote.Messages on lm.Name equals rm.Name
                select new
            {
                MessageName   = lm.Name,
                LocalMessage  = lm,
                RemoteMessage = rm
            };

            foreach (var messagePair in messagePairs)
            {
                var localRequestParameters =
                    from p in messagePair.LocalMessage.RequestParameters
                    join t in local.Types on p.Type.FullName equals t.FullName
                    select new RecordSchema.Field(p.Name, t)
                ;

                var remoteRequestParameters =
                    from p in messagePair.RemoteMessage.RequestParameters
                    join t in remote.Types on p.Type.FullName equals t.FullName
                    select new RecordSchema.Field(p.Name, t)
                ;

                var localRequest  = new RecordSchema($"{local.FullName}.messages.{messagePair.MessageName}", localRequestParameters);
                var remoteRequest = new RecordSchema($"{remote.FullName}.messages.{messagePair.MessageName}", remoteRequestParameters);

                var requestReader = new DatumReader <IAvroRecord>(localRequest, remoteRequest);
                var requestWriter = new DatumWriter <IAvroRecord>(localRequest);

                requestReaders.Add(messagePair.MessageName, requestReader);
                requestWriters.Add(messagePair.MessageName, requestWriter);

                var responseReader = new DatumReader <object>(messagePair.LocalMessage.Response, messagePair.RemoteMessage.Response);
                var responseWriter = new DatumWriter <object>(messagePair.LocalMessage.Response);

                responseReaders.Add(messagePair.MessageName, responseReader);
                responseWriters.Add(messagePair.MessageName, responseWriter);

                var errorReader = new DatumReader <object>(messagePair.LocalMessage.Error, messagePair.RemoteMessage.Error);
                var errorWriter = new DatumWriter <object>(messagePair.LocalMessage.Error);

                errorReaders.Add(messagePair.MessageName, errorReader);
                errorWriters.Add(messagePair.MessageName, errorWriter);
            }

            RequestReaders  = requestReaders;
            RequestWriters  = requestWriters;
            ResponseReaders = responseReaders;
            ResponseWriters = responseWriters;
            ErrorReaders    = errorReaders;
            ErrorWriters    = errorWriters;
        }