diff --git a/skyscraper8.Tests/AstraBarkerTransponderTests.cs b/skyscraper8.Tests/AstraBarkerTransponderTests.cs index 9f12657..f0ed3fc 100644 --- a/skyscraper8.Tests/AstraBarkerTransponderTests.cs +++ b/skyscraper8.Tests/AstraBarkerTransponderTests.cs @@ -30,8 +30,7 @@ namespace skyscraper8.Tests public void TestAstraSdt() { Stream stream = GetBarkerTransponder(); - if (stream == null) - return; + Skip.If(stream == null, "Barker Transponder stream not available."); SdtContestant contestant = new SdtContestant(0x002d); @@ -62,8 +61,7 @@ namespace skyscraper8.Tests public void TestAstraLcn() { Stream stream = GetBarkerTransponder(); - if (stream == null) - return; + Skip.If(stream == null, "Barker Transponder stream not available."); SgtCandidate contestant = new SgtCandidate(0x0777); SgtCandidate contestant2 = new SgtCandidate(0x0776); diff --git a/skyscraper8.Tests/GsType1SanityTest.cs b/skyscraper8.Tests/GsType1SanityTest.cs index 77086ab..fbc2889 100644 --- a/skyscraper8.Tests/GsType1SanityTest.cs +++ b/skyscraper8.Tests/GsType1SanityTest.cs @@ -1,3 +1,4 @@ +using System.Reflection; using skyscraper5.Mpeg2; using skyscraper8.Tests.Properties; @@ -18,4 +19,13 @@ public class GsType1SanityTest result = DvbCrc32.ValidateCrc(ms, 0, (int)ms.Length); Assert.True(result); } + + [Fact] + public void CheckBfbsCrcSpan() + { + byte[] blob = Resources.Frame00000012_TSGS1_MIS000_SYNC001; + ReadOnlySpan span = new ReadOnlySpan(blob); + bool result = DvbCrc32.ValidateCrc(span); + Assert.True(result); + } } \ No newline at end of file diff --git a/skyscraper8.Tests/Properties/Resources.Designer.cs b/skyscraper8.Tests/Properties/Resources.Designer.cs index 72d011c..f385bb9 100644 --- a/skyscraper8.Tests/Properties/Resources.Designer.cs +++ b/skyscraper8.Tests/Properties/Resources.Designer.cs @@ -128,5 +128,12 @@ namespace skyscraper8.Tests.Properties { return ((byte[])(obj)); } } + + internal static byte[] Frame00000012_TSGS1_MIS000_SYNC001 { + get { + object obj = ResourceManager.GetObject("Frame00000012_TSGS1_MIS000_SYNC001", resourceCulture); + return ((byte[])(obj)); + } + } } } diff --git a/skyscraper8.Tests/Properties/Resources.resx b/skyscraper8.Tests/Properties/Resources.resx index 8bdd6b7..33cfa0a 100644 --- a/skyscraper8.Tests/Properties/Resources.resx +++ b/skyscraper8.Tests/Properties/Resources.resx @@ -154,4 +154,7 @@ ..\Resources\Frame00000008_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + ..\Resources\Frame00000012_TSGS1_MIS000_SYNC001.bbf;System.Byte[], mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + \ No newline at end of file diff --git a/skyscraper8.Tests/Resources/Frame00000012_TSGS1_MIS000_SYNC001.bbf b/skyscraper8.Tests/Resources/Frame00000012_TSGS1_MIS000_SYNC001.bbf new file mode 100644 index 0000000..eb5ee33 Binary files /dev/null and b/skyscraper8.Tests/Resources/Frame00000012_TSGS1_MIS000_SYNC001.bbf differ diff --git a/skyscraper8.Tests/SanityTests.cs b/skyscraper8.Tests/SanityTests.cs index 4072ada..e5ce016 100644 --- a/skyscraper8.Tests/SanityTests.cs +++ b/skyscraper8.Tests/SanityTests.cs @@ -19,6 +19,8 @@ namespace skyscraper8.Tests bool msbSet = (readUInt8 & 0x80) != 0; Assert.True(msbSet); + readUInt8 &= 0b01111111; + int result = ms.ReadUInt8(); result <<= 8; result += readUInt8; diff --git a/skyscraper8.Tests/TsDuckTestPatterns.cs b/skyscraper8.Tests/TsDuckTestPatterns.cs index 8b27163..e2a9d2b 100644 --- a/skyscraper8.Tests/TsDuckTestPatterns.cs +++ b/skyscraper8.Tests/TsDuckTestPatterns.cs @@ -7,6 +7,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using skyscraper8.Skyscraper.Scraper.Storage; namespace skyscraper8.Tests { @@ -22,7 +23,10 @@ namespace skyscraper8.Tests foreach (byte[] buffer in buffers) { TsContext mpeg2 = new TsContext(); - SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, null, null); + DataStorage ds = new InMemoryScraperStorageFactory().CreateDataStorage(); + ObjectStorage os = new NullObjectStorage(); + + SkyscraperContext skyscraper = new SkyscraperContext(mpeg2, ds, os); MemoryStream ms = new MemoryStream(buffer, false); skyscraper.InitalizeFilterChain(); diff --git a/skyscraper8.Tests/UselessCodeCoverageTests.cs b/skyscraper8.Tests/UselessCodeCoverageTests.cs new file mode 100644 index 0000000..406488b --- /dev/null +++ b/skyscraper8.Tests/UselessCodeCoverageTests.cs @@ -0,0 +1,13 @@ +using skyscraper5.Mpeg2; + +namespace skyscraper8.Tests; + +public class UselessCodeCoverageTests +{ + [Fact] + void PsiSectionTest() + { + PsiSection section = new PsiSection(); + section.Append(new byte[] { 3 }); + } +} \ No newline at end of file diff --git a/skyscraper8.sln.DotSettings.user b/skyscraper8.sln.DotSettings.user index ebe4749..c34a7c8 100644 --- a/skyscraper8.sln.DotSettings.user +++ b/skyscraper8.sln.DotSettings.user @@ -10,10 +10,9 @@ ForceIncluded ForceIncluded ForceIncluded + /home/schiemas/.cache/JetBrains/Rider2025.1/resharper-host/temp/Rider/vAny/CoverageData/_skyscraper8.1808907683/Snapshot/snapshot.utdcvr <SessionState ContinuousTestingMode="0" IsActive="True" Name="CheckBfbsCrc #2" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> - <TestAncestor> - <TestId>xUnit::84EE9FCD-2C7F-DF84-C1BA-99D018CE9412::net8.0::skyscraper8.Tests.GsType1SanityTest.CheckBfbsCrc</TestId> - </TestAncestor> + <Solution /> </SessionState> <SessionState ContinuousTestingMode="0" Name="CheckBfbsCrc" xmlns="urn:schemas-jetbrains-com:jetbrains-ut-session"> <TestAncestor> diff --git a/skyscraper8/Mpeg2/Crc32.cs b/skyscraper8/Mpeg2/Crc32.cs index 4e8bd75..b2fb901 100644 --- a/skyscraper8/Mpeg2/Crc32.cs +++ b/skyscraper8/Mpeg2/Crc32.cs @@ -112,6 +112,20 @@ namespace skyscraper5.Mpeg2 return crc == 0; } + public static bool ValidateCrc(ReadOnlySpan data) + { + uint crc = 0xffffffff; + + for (int i = 0; i < data.Length; i++) + { + uint b = (crc >> 24) & 0xff; + int c = (data[i]) & 0xff; + crc = (crc << 8) ^ table[b ^ c]; + } + + return crc == 0; + } + public static uint CreateCrc(MemoryStream ms, int offset, int end) { long restorePosition = ms.Position; diff --git a/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs b/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs index bad78b9..d8106af 100644 --- a/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs +++ b/skyscraper8/Skyscraper/Scraper/Storage/NullObjectStorage.cs @@ -13,7 +13,7 @@ using skyscraper8.Skyscraper.Drawing; namespace skyscraper8.Skyscraper.Scraper.Storage { - internal class NullObjectStorage : ObjectStorage + public class NullObjectStorage : ObjectStorage { public bool ObjectCarouselFileArrival(VfsFile vfsFile, int transportStreamId, int networkId) {