public void EqualTest() { var protocol01 = new AvroProtocol("SomeProtocol", "Some.Namespace"); var protocol02 = new AvroProtocol("Some.Namespace.SomeProtocol"); Assert.AreEqual(protocol01, protocol02); }
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"); }
public void AddProtocol(AvroProtocol protocol) { var memberDeclarationSyntax = CreateCode(protocol); _code.Add(protocol.FullName, memberDeclarationSyntax); AddSchemas(protocol.Types); }
private async Task <GenericServer> RunLocalServer(AvroProtocol protocol, LocalTranceiver tranceiver, CancellationToken token) { var server = new GenericServer(protocol, tranceiver); await RunGenericServer(server, token); return(server); }
public void DocTest() { var protocol = new AvroProtocol() { Doc = "Test Doc" }; Assert.AreEqual("Test Doc", protocol.Doc); }
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) ); }
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) ); }
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"]); }
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); } }
public GenericResponder(AvroProtocol local, AvroProtocol remote) { Local = local; Remote = remote; _protocolPair = GenericProtocolPair.Get(local, remote); }
private async Task <GenericClient> ConnectHttpClient(AvroProtocol protocol, CancellationToken token) { var tranceiver = await HttpClient.ConnectAsync($"http://localhost:8080/{protocol.Name}"); return(new GenericClient(protocol, tranceiver)); }
private async Task <GenericClient> ConnectTcpClient(AvroProtocol protocol, CancellationToken token) { var tranceiver = await SocketClient.ConnectAsync("127.0.0.1", 3456); return(new GenericClient(protocol, tranceiver)); }
private GenericClient ConnectLocalClient(AvroProtocol protocol, LocalTranceiver tranceiver, CancellationToken token) { return(new GenericClient(protocol, tranceiver)); }
protected Session(AvroProtocol protocol, ITranceiver tranceiver) { Protocol = protocol; _tranceiver = tranceiver; }
public GenericServer(AvroProtocol protocol, ITranceiver tranceiver) : base(protocol, tranceiver) { RemoteProtocol = protocol; _protocol = new GenericResponder(Protocol, RemoteProtocol); }
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" + @"}} }" }); }
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; }