MediaTests.cs 4.56 KB
Newer Older
Martin Finkel's avatar
Martin Finkel committed
1 2
using System;
using System.IO;
3
using System.Linq;
Martin Finkel's avatar
Martin Finkel committed
4
using System.Threading;
5
using System.Threading.Tasks;
Martin Finkel's avatar
Martin Finkel committed
6
using LibVLCSharp.Shared;
Martin Finkel's avatar
Martin Finkel committed
7 8
using NUnit.Framework;

9
namespace LibVLCSharp.Tests
Martin Finkel's avatar
Martin Finkel committed
10 11
{
    [TestFixture]
12
    public class MediaTests : BaseSetup
Martin Finkel's avatar
Martin Finkel committed
13 14 15 16
    {
        [Test]
        public void CreateMedia()
        {
Martin Finkel's avatar
Martin Finkel committed
17
            var libVLC = new LibVLC();
Martin Finkel's avatar
Martin Finkel committed
18

Martin Finkel's avatar
Martin Finkel committed
19
            var media = new Media(libVLC, Path.GetTempFileName());
Martin Finkel's avatar
Martin Finkel committed
20 21 22 23 24 25 26

            Assert.AreNotEqual(IntPtr.Zero, media.NativeReference);
        }

        [Test]
        public void CreateMediaFail()
        {
Martin Finkel's avatar
Martin Finkel committed
27
            Assert.Throws<ArgumentNullException>(() => new Media(null, Path.GetTempFileName()));
Martin Finkel's avatar
Martin Finkel committed
28
            Assert.Throws<ArgumentNullException>(() => new Media(new LibVLC(), string.Empty));
Martin Finkel's avatar
Martin Finkel committed
29 30 31 32 33
        }

        [Test]
        public void ReleaseMedia()
        {
Martin Finkel's avatar
Martin Finkel committed
34
            var media = new Media(new LibVLC(), Path.GetTempFileName());
Martin Finkel's avatar
Martin Finkel committed
35 36 37 38 39 40 41 42 43

            media.Dispose();

            Assert.AreEqual(IntPtr.Zero, media.NativeReference);
        }

        [Test]
        public void CreateMediaFromStream()
        {
Martin Finkel's avatar
Martin Finkel committed
44
            var media = new Media(new LibVLC(), new FileStream(Path.GetTempFileName(), FileMode.OpenOrCreate));
Martin Finkel's avatar
Martin Finkel committed
45 46 47 48 49 50
            Assert.AreNotEqual(IntPtr.Zero, media.NativeReference);
        }

        [Test]
        public void AddOption()
        {
Martin Finkel's avatar
Martin Finkel committed
51
            var media = new Media(new LibVLC(), new FileStream(Path.GetTempFileName(), FileMode.OpenOrCreate));
Martin Finkel's avatar
Martin Finkel committed
52 53
            media.AddOption("-sout-all");
        }
54 55

        [Test]
56
        public async Task CreateRealMedia()
57
        {
Martin Finkel's avatar
Martin Finkel committed
58
            using (var libVLC = new LibVLC())
59
            {
Martin Finkel's avatar
Martin Finkel committed
60
                using (var media = new Media(libVLC, RealStreamMediaPath, Media.FromType.FromLocation))
61 62 63 64 65
                {
                    Assert.False(media.IsParsed);
                    media.Parse();

                    Assert.True(media.IsParsed);
Martin Finkel's avatar
Martin Finkel committed
66
                    Assert.AreEqual(Media.MediaParsedStatus.Done, media.ParsedStatus);
67 68 69 70
                    Assert.NotZero(media.Duration);
                    using (var mp = new MediaPlayer(media))
                    {
                        Assert.True(mp.Play());
Martin Finkel's avatar
cleanup  
Martin Finkel committed
71
                        await Task.Delay(4000); // have to wait a bit for statistics to populate
72 73 74 75
                        Assert.Greater(media.Statistics.DemuxBitrate, 0);
                        mp.Stop();
                    }
                }
76 77
            }
        }
78
        
79 80 81
        [Test]
        public void Duplicate()
        {
Martin Finkel's avatar
Martin Finkel committed
82
            var media = new Media(new LibVLC(), new FileStream(Path.GetTempFileName(), FileMode.OpenOrCreate));
83 84 85 86 87 88 89
            var duplicate = media.Duplicate();
            Assert.AreNotEqual(duplicate.NativeReference, media.NativeReference);
        }

        [Test]
        public void CreateMediaFromFileStream()
        {
Martin Finkel's avatar
Martin Finkel committed
90
            var media = new Media(new LibVLC(), new FileStream(RealMp3Path, FileMode.Open, FileAccess.Read, FileShare.Read));
91 92
            media.Parse();
            Assert.NotZero(media.Tracks.First().Data.Audio.Channels);
93 94 95 96 97
        }

        [Test]
        public void SetMetadata()
        {
Martin Finkel's avatar
Martin Finkel committed
98
            var media = new Media(new LibVLC(), Path.GetTempFileName());
99 100 101 102 103
            const string test = "test";
            media.SetMeta(Media.MetadataType.ShowName, test);
            Assert.True(media.SaveMeta());
            Assert.AreEqual(test, media.Meta(Media.MetadataType.ShowName));
        }
Martin Finkel's avatar
Martin Finkel committed
104 105

        [Test]
Martin Finkel's avatar
Martin Finkel committed
106
        public void GetTracks()
Martin Finkel's avatar
Martin Finkel committed
107
        {
Martin Finkel's avatar
Martin Finkel committed
108
            var media = new Media(new LibVLC(), RealMp3Path);
Martin Finkel's avatar
Martin Finkel committed
109 110
            media.Parse();
            Assert.AreEqual(1, media.Tracks);
Martin Finkel's avatar
Martin Finkel committed
111
        }
Martin Finkel's avatar
Martin Finkel committed
112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141

        [Test]
        public async Task CreateRealMediaSpecialCharacters()
        {
            using (var libVLC = new LibVLC())
            {
                libVLC.Log += LibVLC_Log;
                using (var media = new Media(libVLC, RealMp3PathSpecialCharacter, Media.FromType.FromPath))
                {
                    Assert.False(media.IsParsed);
                    
                    media.Parse();
                    await Task.Delay(5000);
                    Assert.True(media.IsParsed);
                    Assert.AreEqual(Media.MediaParsedStatus.Done, media.ParsedStatus);
                    using (var mp = new MediaPlayer(media))
                    {
                        Assert.True(mp.Play());
                        await Task.Delay(10000); 
                        mp.Stop();
                    }
                }
                libVLC.Log -= LibVLC_Log;
            }
        }

        private void LibVLC_Log(object sender, LogEventArgs e)
        {
            System.Diagnostics.Debug.WriteLine(e.Message);
        }
Martin Finkel's avatar
Martin Finkel committed
142
    }
Martin Finkel's avatar
Martin Finkel committed
143
}