Live video on the AT Protocol
1package media
2
3import (
4 "context"
5 "os"
6 "path/filepath"
7 "runtime"
8 "testing"
9
10 "git.stream.place/streamplace/c2pa-go/pkg/c2pa"
11 "github.com/stretchr/testify/require"
12 "stream.place/streamplace/pkg/atproto"
13 "stream.place/streamplace/pkg/bus"
14 "stream.place/streamplace/pkg/config"
15 ct "stream.place/streamplace/pkg/config/configtesting"
16 "stream.place/streamplace/pkg/crypto/signers/eip712/eip712test"
17 _ "stream.place/streamplace/pkg/media/mediatesting"
18 "stream.place/streamplace/pkg/model"
19 "stream.place/streamplace/pkg/replication/boring"
20)
21
22func getFixture(name string) string {
23 _, filename, _, _ := runtime.Caller(0)
24 dir := filepath.Dir(filename)
25 return filepath.Join(dir, "..", "..", "test", "fixtures", name)
26}
27
28func getStaticTestMediaManager(t *testing.T) (*MediaManager, MediaSigner) {
29 dir, err := os.MkdirTemp("", "atproto-test-*")
30 require.NoError(t, err)
31 // defer os.RemoveAll(dir)
32
33 fname := filepath.Join(dir, "db.sqlite")
34 mod, err := model.MakeDB(fname)
35 require.NoError(t, err)
36 signer, err := c2pa.MakeStaticSigner(eip712test.KeyBytes)
37 require.NoError(t, err)
38 if err != nil {
39 panic(err)
40 }
41 cli := ct.CLI(t, &config.CLI{
42 TAURL: "http://timestamp.digicert.com",
43 AllowedStreams: []string{"did:key:zQ3shhoPCrDZWE8CryCEHYCrb1x8mCkr2byTkF5EGJT7dgazC"},
44 })
45 atsync := &atproto.ATProtoSynchronizer{
46 CLI: cli,
47 Model: mod,
48 Bus: bus.NewBus(),
49 }
50 mm, err := MakeMediaManager(context.Background(), cli, signer, &boring.BoringReplicator{}, mod, bus.NewBus(), atsync)
51 require.NoError(t, err)
52 ms, err := MakeMediaSigner(context.Background(), cli, "test-person", signer)
53 require.NoError(t, err)
54 return mm, ms
55}
56
57// func mp4(t *testing.T) []byte {
58// f, err := os.Open(getFixture("video.mpegts"))
59// require.NoError(t, err)
60// defer f.Close()
61// buf := bytes.Buffer{}
62// w := bufio.NewWriter(&buf)
63// err = MuxToMP4(context.Background(), f, w)
64// require.NoError(t, err)
65// return buf.Bytes()
66// }
67
68// func TestMuxToMP4(t *testing.T) {
69// bs := mp4(t)
70// require.Greater(t, len(bs), 0)
71// }
72
73// func TestSignMP4(t *testing.T) {
74// mp4bs := mp4(t)
75// r := bytes.NewReader(mp4bs)
76// _, ms := getStaticTestMediaManager(t)
77// millis := time.Now().UnixMilli()
78// bs, err := ms.SignMP4(context.Background(), r, millis)
79// require.NoError(t, err)
80// require.Greater(t, len(bs), 0)
81// }
82
83// func TestSignMP4WithWallet(t *testing.T) {
84// eip712test.WithTestSigner(func(signer *eip712.EIP712Signer) {
85// cli := ct.CLI(t, &config.CLI{
86// TAURL: "http://timestamp.digicert.com",
87// AllowedStreams: []aqpub.Pub{},
88// })
89// ms, err := MakeMediaSigner(context.Background(), cli, "test person", signer)
90// require.NoError(t, err)
91// mp4bs := mp4(t)
92// r := bytes.NewReader(mp4bs)
93// millis := time.Now().UnixMilli()
94// bs, err := ms.SignMP4(context.Background(), r, millis)
95// require.NoError(t, err)
96// require.Greater(t, len(bs), 0)
97// })
98// }
99
100// TODO: Would be good to have this tested with SoftHSM
101// func TestSignMP4WithHSM(t *testing.T) {
102// one := 1
103// sc, err := crypto11.Configure(&crypto11.Config{
104// // TokenLabel: "C2PA Signer",
105// Path: "/usr/lib/x86_64-linux-gnu/opensc-pkcs11.so",
106// Pin: "123456",
107// SlotNumber: &one,
108// })
109// require.NoError(t, err)
110
111// allsigners, err := sc.FindAllKeyPairs()
112// require.NoError(t, err)
113// signer := allsigners[0]
114// certBs, err := signers.GenerateES256KCert(signer)
115// mm := MediaManager{
116// cli: &config.CLI{
117// TAURL: "http://timestamp.digicert.com",
118// },
119// signer: signer,
120// cert: certBs,
121// user: "testuser",
122// }
123// mp4bs := mp4(t)
124// r := bytes.NewReader(mp4bs)
125// f, err := os.CreateTemp("", "*.mp4")
126// require.NoError(t, err)
127// ms := time.Now().UnixMilli()
128// err = mm.SignMP4(context.Background(), r, f, ms)
129// require.NoError(t, err)
130// }
131
132func TestVerifyMP4(t *testing.T) {
133 f, err := os.Open(getFixture("sample-segment.mp4"))
134 require.NoError(t, err)
135 mm, _ := getStaticTestMediaManager(t)
136 err = mm.ValidateMP4(context.Background(), f)
137 require.NoError(t, err)
138}