internal/bench/feed_bench_test.go

package bench

import (
	"bytes"
	"fmt"
	"testing"
	"time"

	"mercemay.top/src/tilstream/internal/feed"
	"mercemay.top/src/tilstream/internal/feed/writer/atom10"
	"mercemay.top/src/tilstream/internal/feed/writer/jsonfeed"
	"mercemay.top/src/tilstream/internal/feed/writer/rss20"
)

func makeItems(n int) []feed.Item {
	items := make([]feed.Item, n)
	start := time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)
	for i := 0; i < n; i++ {
		items[i] = feed.Item{
			Title:     fmt.Sprintf("Post %d", i),
			Link:      fmt.Sprintf("https://example.com/%d", i),
			GUID:      fmt.Sprintf("https://example.com/%d", i),
			Summary:   "summary text for benchmarking feed writers",
			Content:   "<p>body content</p>",
			Published: start.Add(time.Duration(i) * time.Hour),
			Categories: []string{"bench", "go"},
		}
	}
	return items
}

func BenchmarkRSS20(b *testing.B) {
	items := makeItems(500)
	ch := rss20.Channel{Title: "T", Link: "L", Description: "D"}
	wr := rss20.NewWriter()
	b.ReportAllocs()
	for i := 0; i < b.N; i++ {
		var buf bytes.Buffer
		if err := wr.Write(&buf, ch, items); err != nil {
			b.Fatal(err)
		}
	}
}

func BenchmarkAtom10(b *testing.B) {
	items := makeItems(500)
	wr := atom10.NewWriter()
	f := atom10.Feed{Title: "T", ID: "id"}
	b.ReportAllocs()
	for i := 0; i < b.N; i++ {
		var buf bytes.Buffer
		if err := wr.Write(&buf, f, items); err != nil {
			b.Fatal(err)
		}
	}
}

func BenchmarkJSONFeed(b *testing.B) {
	items := makeItems(500)
	wr := jsonfeed.NewWriter()
	f := jsonfeed.Feed{Title: "T"}
	b.ReportAllocs()
	for i := 0; i < b.N; i++ {
		var buf bytes.Buffer
		if err := wr.Write(&buf, f, items); err != nil {
			b.Fatal(err)
		}
	}
}