From 79cad1342dbc9fa557ceadf6bfeea64cfe111de2 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Tue, 18 Jan 2022 13:20:21 +0900 Subject: [PATCH] =?UTF-8?q?glb=20=E3=81=AE=20parse=20=E3=82=92=E5=8E=B3?= =?UTF-8?q?=E6=A0=BC=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UniGLTF/Tests/UniGLTF/GlbParserTests.cs | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs b/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs index 3acbc4a65..02de02b20 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/GlbParserTests.cs @@ -1,4 +1,6 @@ using System; +using System.IO; +using System.Linq; using NUnit.Framework; namespace UniGLTF @@ -37,5 +39,40 @@ namespace UniGLTF // NOTE: 大文字小文字が違うだけの名前は、同一としてみなされ、Suffix が付く。 Assert.AreEqual("foobar__UNIGLTF__DUPLICATED__2", parsed.GLTF.textures[1].name); } + + /// + /// ヘッダが正しいが、後ろが切れている場合に throw する + /// + [Test] + public void GlbLengthTest() + { + var env = System.Environment.GetEnvironmentVariable("GLTF_SAMPLE_MODELS"); + if (string.IsNullOrEmpty(env)) + { + return; + } + var root = new DirectoryInfo($"{env}/2.0"); + if (!root.Exists) + { + return; + } + + var path = Path.Combine(root.ToString(), "DamagedHelmet\\glTF-Binary\\DamagedHelmet.glb"); + Assert.True(File.Exists(path)); + + var bytes = File.ReadAllBytes(path); + var data = new GlbBinaryParser(bytes, Path.GetFileNameWithoutExtension(path)).Parse(); + + // 2個目のチャンクを削る + var mod = bytes.Take(12 + 8 + data.Chunks[0].Bytes.Count).ToArray(); + // 再パース + + Assert.Throws(() => + { + var data2 = new GlbBinaryParser(mod, Path.GetFileNameWithoutExtension(path)).Parse(); + }); + + var a = 0; + } } -} \ No newline at end of file +}