blob: b1f841892c31668946c710ed4326bd5d01bbe854 [file] [log] [blame]
// Licensed to the Apache Software Foundation(ASF) under one
// or more contributor license agreements.See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership.The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
using System;
using System.IO;
using System.Text;
using System.Threading.Tasks;
using KellermanSoftware.CompareNetObjects;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Thrift.Protocol;
using Thrift.Protocol.Entities;
using Thrift.Transport.Client;
namespace Thrift.IntegrationTests.Protocols
{
[TestClass]
public class ProtocolsOperationsTests
{
private readonly CompareLogic _compareLogic = new CompareLogic();
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol), TMessageType.Call)]
[DataRow(typeof(TBinaryProtocol), TMessageType.Exception)]
[DataRow(typeof(TBinaryProtocol), TMessageType.Oneway)]
[DataRow(typeof(TBinaryProtocol), TMessageType.Reply)]
[DataRow(typeof(TCompactProtocol), TMessageType.Call)]
[DataRow(typeof(TCompactProtocol), TMessageType.Exception)]
[DataRow(typeof(TCompactProtocol), TMessageType.Oneway)]
[DataRow(typeof(TCompactProtocol), TMessageType.Reply)]
[DataRow(typeof(TJsonProtocol), TMessageType.Call)]
[DataRow(typeof(TJsonProtocol), TMessageType.Exception)]
[DataRow(typeof(TJsonProtocol), TMessageType.Oneway)]
[DataRow(typeof(TJsonProtocol), TMessageType.Reply)]
public async Task WriteReadMessage_Test(Type protocolType, TMessageType messageType)
{
var expected = new TMessage(nameof(TMessage), messageType, 1);
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteMessageBeginAsync(expected);
await protocol.WriteMessageEndAsync();
stream.Seek(0, SeekOrigin.Begin);
var actualMessage = await protocol.ReadMessageBeginAsync();
await protocol.ReadMessageEndAsync();
var result = _compareLogic.Compare(expected, actualMessage);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
[ExpectedException(typeof(Exception))]
public async Task WriteReadStruct_Test(Type protocolType)
{
var expected = new TStruct(nameof(TStruct));
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteStructBeginAsync(expected);
await protocol.WriteStructEndAsync();
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadStructBeginAsync();
await protocol.ReadStructEndAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
[ExpectedException(typeof(Exception))]
public async Task WriteReadField_Test(Type protocolType)
{
var expected = new TField(nameof(TField), TType.String, 1);
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteFieldBeginAsync(expected);
await protocol.WriteFieldEndAsync();
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadFieldBeginAsync();
await protocol.ReadFieldEndAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadMap_Test(Type protocolType)
{
var expected = new TMap(TType.String, TType.String, 1);
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteMapBeginAsync(expected);
await protocol.WriteMapEndAsync();
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadMapBeginAsync();
await protocol.ReadMapEndAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadList_Test(Type protocolType)
{
var expected = new TList(TType.String, 1);
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteListBeginAsync(expected);
await protocol.WriteListEndAsync();
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadListBeginAsync();
await protocol.ReadListEndAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadSet_Test(Type protocolType)
{
var expected = new TSet(TType.String, 1);
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteSetBeginAsync(expected);
await protocol.WriteSetEndAsync();
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadSetBeginAsync();
await protocol.ReadSetEndAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadBool_Test(Type protocolType)
{
var expected = true;
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteBoolAsync(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadBoolAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadByte_Test(Type protocolType)
{
var expected = sbyte.MaxValue;
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteByteAsync(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadByteAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadI16_Test(Type protocolType)
{
var expected = short.MaxValue;
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteI16Async(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadI16Async();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadI32_Test(Type protocolType)
{
var expected = int.MaxValue;
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteI32Async(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadI32Async();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadI64_Test(Type protocolType)
{
var expected = long.MaxValue;
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteI64Async(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadI64Async();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadDouble_Test(Type protocolType)
{
var expected = double.MaxValue;
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteDoubleAsync(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadDoubleAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadString_Test(Type protocolType)
{
var expected = nameof(String);
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteStringAsync(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadStringAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
[DataTestMethod]
[DataRow(typeof(TBinaryProtocol))]
[DataRow(typeof(TCompactProtocol))]
[DataRow(typeof(TJsonProtocol))]
public async Task WriteReadBinary_Test(Type protocolType)
{
var expected = Encoding.UTF8.GetBytes(nameof(String));
try
{
var tuple = GetProtocolInstance(protocolType);
using (var stream = tuple.Item1)
{
var protocol = tuple.Item2;
await protocol.WriteBinaryAsync(expected);
stream?.Seek(0, SeekOrigin.Begin);
var actual = await protocol.ReadBinaryAsync();
var result = _compareLogic.Compare(expected, actual);
Assert.IsTrue(result.AreEqual, result.DifferencesString);
}
}
catch (Exception e)
{
throw new Exception($"Exception during testing of protocol: {protocolType.FullName}", e);
}
}
private static Tuple<Stream, TProtocol> GetProtocolInstance(Type protocolType)
{
var memoryStream = new MemoryStream();
var streamClientTransport = new TStreamTransport(memoryStream, memoryStream);
var protocol = (TProtocol) Activator.CreateInstance(protocolType, streamClientTransport);
return new Tuple<Stream, TProtocol>(memoryStream, protocol);
}
}
}