aboutsummaryrefslogtreecommitdiff
path: root/fuzz/Emby.Server.Implementations.Fuzz/Program.cs
blob: 03b2964948d6bd2b620786ae19ccccecf85a9488 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
using System;
using AutoFixture;
using AutoFixture.AutoMoq;
using Emby.Server.Implementations.Data;
using Emby.Server.Implementations.Library;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Model.Entities;
using Moq;
using SharpFuzz;

namespace Emby.Server.Implementations.Fuzz
{
    public static class Program
    {
        public static void Main(string[] args)
        {
            switch (args[0])
            {
                case "PathExtensions.TryReplaceSubPath": Run(PathExtensions_TryReplaceSubPath); return;
                case "SqliteItemRepository.ItemImageInfoFromValueString": Run(SqliteItemRepository_ItemImageInfoFromValueString); return;
                default: throw new ArgumentException($"Unknown fuzzing function: {args[0]}");
            }
        }

        private static void Run(Action<string> action) => Fuzzer.OutOfProcess.Run(action);

        private static void PathExtensions_TryReplaceSubPath(string data)
        {
            // Stupid, but it worked
            var parts = data.Split(':');
            if (parts.Length != 3)
            {
                return;
            }

            _ = PathExtensions.TryReplaceSubPath(parts[0], parts[1], parts[2], out _);
        }

        private static void SqliteItemRepository_ItemImageInfoFromValueString(string data)
        {
            var sqliteItemRepository = MockSqliteItemRepository();
            sqliteItemRepository.ItemImageInfoFromValueString(data);
        }

        private static SqliteItemRepository MockSqliteItemRepository()
        {
            const string VirtualMetaDataPath = "%MetadataPath%";
            const string MetaDataPath = "/meta/data/path";

            var appHost = new Mock<IServerApplicationHost>();
            appHost.Setup(x => x.ExpandVirtualPath(It.IsAny<string>()))
                .Returns((string x) => x.Replace(VirtualMetaDataPath, MetaDataPath, StringComparison.Ordinal));
            appHost.Setup(x => x.ReverseVirtualPath(It.IsAny<string>()))
                .Returns((string x) => x.Replace(MetaDataPath, VirtualMetaDataPath, StringComparison.Ordinal));

            IFixture fixture = new Fixture().Customize(new AutoMoqCustomization { ConfigureMembers = true });
            fixture.Inject(appHost);
            return fixture.Create<SqliteItemRepository>();
        }
    }
}