RpcInvestigator/UnitTests/RpcLibraryTests.cs

246 lines
9.0 KiB
C#

//
// Copyright (c) 2022-present, Trail of Bits, Inc.
// All rights reserved.
//
// This source code is licensed in accordance with the terms specified in
// the LICENSE file found in the root directory of this source tree.
//
using Microsoft.VisualStudio.TestTools.UnitTesting;
using RpcInvestigator;
using System;
using System.Linq;
using System.Threading.Tasks;
namespace UnitTests
{
[TestClass]
public class RpcLibraryTests
{
public TestContext m_TestContext { get; set; }
private static int s_MaxServers = 25;
[TestMethod]
public void LoadLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
}
[TestMethod]
public async Task SaveLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
Assert.IsTrue(env.m_Library.GetServerCount() > 0);
try
{
env.m_Library.Save();
}
catch (Exception ex)
{
Assert.Fail("Save threw an exception: " + ex.Message);
}
}
[TestMethod]
public async Task BuildLibrary()
{
//
// This unit test covers building the library as well as adding
// individual RPC servers, since that class cannot be instantiated.
//
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
Assert.IsTrue(env.m_Library.GetServerCount() > 0);
}
[TestMethod]
public async Task ClearLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
Assert.IsTrue(env.m_Library.GetServerCount() > 0);
env.m_Library.Clear();
Assert.AreEqual(0, env.m_Library.GetServerCount());
}
[DataTestMethod]
public async Task GetSingleServerFromLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
//
// Pick a random server and get it from the library.
//
var servers = env.m_Library.GetAllServers();
Assert.IsTrue(servers.Count > 0);
Random r = new Random();
var server = servers[r.Next(servers.Count)];
Assert.IsNotNull(env.m_Library.Get(
server.InterfaceId, server.InterfaceVersion));
}
[DataTestMethod]
public async Task GetMultipleServersFromLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
//
// Pick a random server with multiple versions and get them from the library.
//
var servers = env.m_Library.GetServersWithMultipleVersions();
Assert.IsTrue(servers.Count > 0);
Random r = new Random();
var server = servers.ElementAt(r.Next(servers.Count));
Assert.IsNotNull(env.m_Library.Get(server.Key));
}
[DataTestMethod]
public async Task RemoveSingleServerFromLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
//
// Pick a random server and remove it from the library.
//
var servers = env.m_Library.GetAllServers();
Assert.IsTrue(servers.Count > 0);
Random r = new Random();
var server = servers[r.Next(servers.Count)];
Assert.IsTrue(env.m_Library.Remove(
server.InterfaceId, server.InterfaceVersion));
Assert.IsNull(env.m_Library.Get(
server.InterfaceId, server.InterfaceVersion));
}
[DataTestMethod]
public async Task RemoveMultipleServersFromLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
//
// Pick a random server with multiple versions and remove them from the library.
//
var servers = env.m_Library.GetServersWithMultipleVersions();
Assert.IsTrue(servers.Count > 0);
Random r = new Random();
var server = servers.ElementAt(r.Next(servers.Count));
Assert.IsTrue(env.m_Library.Remove(server.Key));
Assert.IsNull(env.m_Library.Get(server.Key));
}
[DataTestMethod]
public async Task RemoveServerFromLibraryExpectFailure()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
Assert.IsFalse(env.m_Library.Remove(Guid.Empty));
}
[DataTestMethod]
public async Task AddServerToLibraryExpectFailure()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
//
// Pick a random server and try to add it to the library.
//
var servers = env.m_Library.GetAllServers();
Assert.IsTrue(servers.Count > 0);
Random r = new Random();
var server = servers[r.Next(servers.Count)];
Assert.IsFalse(env.m_Library.Add(server));
}
[DataTestMethod]
public async Task MergeServersIntoLibraryExpectMultiple()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
//
// Pick a random range of servers, remove them from the library, then merge back.
//
var servers = env.m_Library.GetAllServers();
Assert.IsTrue(servers.Count > 0);
Random r = new Random();
int start = r.Next(servers.Count - 1);
int count = r.Next(servers.Count - start);
var subset = servers.Skip(start).Take(count).ToList();
subset.ForEach(server =>
{
Assert.IsTrue(env.m_Library.Remove(
server.InterfaceId, server.InterfaceVersion));
});
Assert.IsTrue(env.m_Library.Merge(subset));
subset.ForEach(server =>
{
Assert.IsNotNull(env.m_Library.Get(
server.InterfaceId, server.InterfaceVersion));
});
}
[DataTestMethod]
public async Task MergeServersIntoLibraryExpectNone()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
//
// Merging the current list should result in no new servers.
//
var servers = env.m_Library.GetAllServers();
Assert.IsTrue(servers.Count > 0);
int before = env.m_Library.GetServerCount();
Assert.IsTrue(env.m_Library.Merge(servers));
int after = env.m_Library.GetServerCount();
Assert.AreEqual(before, after);
}
[DataTestMethod]
public async Task FindServerByKeywordInLibrary()
{
var env = new Environment();
env.Initialize();
Assert.AreEqual(0, env.m_Library.GetServerCount());
_ = await env.m_Library.Refresh(
env.m_Settings, null, null, null, s_MaxServers);
var servers = env.m_Library.Find(new RpcLibraryFilter() { Keyword = "lsass" });
Assert.IsTrue(servers.Count > 0);
}
}
}