246 lines
9.0 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|