File: rfc_test.go

package info (click to toggle)
mmark 2.2.25%2Bdfsg1-2
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, forky, sid, trixie
  • size: 996 kB
  • sloc: xml: 228; makefile: 81; ansic: 3
file content (118 lines) | stat: -rw-r--r-- 2,951 bytes parent folder | download
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
package main

import (
	"fmt"
	"io/ioutil"
	"os"
	"os/exec"
	"path/filepath"
	"testing"

	"github.com/mmarkdown/mmark/v2/lang"
	"github.com/mmarkdown/mmark/v2/mast"
	"github.com/mmarkdown/mmark/v2/mparser"
	"github.com/mmarkdown/mmark/v2/render/mhtml"
	"github.com/mmarkdown/mmark/v2/render/xml"

	"github.com/gomarkdown/markdown"
	"github.com/gomarkdown/markdown/ast"
	"github.com/gomarkdown/markdown/html"
	"github.com/gomarkdown/markdown/parser"
)

var (
	testFiles = []string{
		"2100.md",
		"3514.md",
		"5841.md",
		"7511.md",
		"8341.md",
	}
)

// TestRFC3 parses the RFC in the rfc/ directory and runs xml2rfc on them to see if they parse OK.
func TestRFC3(t *testing.T) {
	t.Skip("RFC test files were removed from Debian source package for DFSG compliance.")
	for _, f := range testFiles {
		base := f[:len(f)-3]

		opts := xml.RendererOptions{
			Flags: xml.CommonFlags | xml.XMLFragment,
		}
		renderer := xml.NewRenderer(opts)
		t.Run("rfc3/"+base, func(t *testing.T) {
			err := doRenderTest(base, renderer)
			if err != nil {
				t.Error(err)
			}
		})
	}
}

// TestHTML parses the RFC in the rfc/ directory to HTMl.
func TestHTML(t *testing.T) {
	t.Skip("RFC test files were removed from Debian source package for DFSG compliance.")
	for _, f := range testFiles {
		base := f[:len(f)-3]

		mhtmlOpts := mhtml.RendererOptions{Language: lang.New("en")}
		opts := html.RendererOptions{
			RenderNodeHook: mhtmlOpts.RenderHook,
		}
		renderer := html.NewRenderer(opts)
		t.Run("html/"+base, func(t *testing.T) {
			err := doRenderTest(base, renderer)
			if err != nil {
				t.Error(err)
			}
		})
	}
}

func doRenderTest(basename string, renderer markdown.Renderer) error {
	filename := filepath.Join("rfc", basename+".md")
	input, err := ioutil.ReadFile(filename)
	if err != nil {
		return fmt.Errorf("couldn't open '%s', error: %v\n", filename, err)
	}

	init := mparser.NewInitial(filename)

	p := parser.NewWithExtensions(mparser.Extensions)
	p.Opts = parser.Options{
		ParserHook: func(data []byte) (ast.Node, []byte, int) {
			node, data, consumed := mparser.Hook(data)
			if t, ok := node.(*mast.Title); ok {
				_ = t.TitleData.Title
			}
			return node, data, consumed
		},
		ReadIncludeFn: init.ReadInclude,
	}

	doc := markdown.Parse(input, p)
	mparser.AddBibliography(doc)
	mparser.AddIndex(doc)

	rfcdata := markdown.Render(doc, renderer)

	switch renderer.(type) {
	case *xml.Renderer:
		out, err := runXML2RFC([]string{"--v3"}, rfcdata)
		if err != nil {
			return fmt.Errorf("failed to parse XML3 output for %q: %s\n%s", filename, err, out)
		}
	}
	return nil
}

func runXML2RFC(options []string, rfc []byte) ([]byte, error) {
	if _, err := exec.LookPath("xml2rfc"); err != nil {
		return nil, nil
	}
	ioutil.WriteFile("x.xml", rfc, 0600)
	defer os.Remove("x.xml")
	defer os.Remove("x.txt") // if we are lucky.
	xml2rfc := exec.Command("xml2rfc", append([]string{"x.xml"}, options...)...)
	return xml2rfc.CombinedOutput()
}