2025-05-13 17:49:44 -03:00

122 lines
4.1 KiB
Go

package emergencykit
import (
"encoding/hex"
"io/ioutil"
"os"
"path/filepath"
"reflect"
"strings"
"testing"
)
var someMetadata = Metadata{
Version: 1,
BirthdayBlock: 12345,
EncryptedKeys: []*MetadataKey{
&MetadataKey{
DhPubKey: "0338c52ecbb886ab45de31120c76888da73437e3d6e81510f56d3746399f0fef52",
EncryptedPrivKey: "d0a801c1923663295892e9a9a0bfc770abcb00c20e7cef28e2d743c96b441e677c875e8d6495afb8362aba886ae9ee346c62e82758f5b5ba9a70f61957529255",
Salt: "d579c14c61365bc0",
},
},
OutputDescriptors: []string{
"sh(wsh(multi(2, 89a1749c/1'/1'/0/*, 77e21d45/1'/1'/0/*)))#0wp4hp36",
},
}
func TestReadWriteMetadata(t *testing.T) {
// Create a temporary directory and pick some suitable paths for our input/output files:
tmpDir := createTmpDir(t)
srcFile := filepath.Join(tmpDir, "src.pdf")
dstFile := filepath.Join(tmpDir, "src.pdf")
defer os.RemoveAll(tmpDir)
// Save the sample PDF (included at the end of this file, for readability):
createPdfFile(t, srcFile)
// Write metadata:
mw := MetadataWriter{
SrcFile: srcFile,
DstFile: dstFile,
}
mw.WriteMetadata(&someMetadata)
// Read metadata:
mr := MetadataReader{
SrcFile: dstFile,
}
metadata, err := mr.ReadMetadata()
if err != nil {
t.Fatalf("Failed to read metadata from %s: %v", dstFile, err)
}
// Verify that we got the original metadata back:
if !reflect.DeepEqual(&someMetadata, metadata) {
t.Fatalf("Metadata objects don't match: %v (%v vs %v)", err, someMetadata, metadata)
}
}
func createTmpDir(t *testing.T) string {
tmpDir, err := ioutil.TempDir("", "pdf")
if err != nil {
t.Fatalf("Failed to create temporary directory %s: %v", tmpDir, err)
}
return tmpDir
}
func createPdfFile(t *testing.T, path string) {
content, err := hex.DecodeString(strings.Join(strings.Fields(verySmallPdf), ""))
if err != nil {
t.Fatalf("Failed to hex-decode the sample PDF data: %v", err)
}
err = ioutil.WriteFile(path, content, os.FileMode(0600))
if err != nil {
t.Fatalf("Failed to write PDF to %s: %v", path, err)
}
}
// A very small valid PDF obtained by printing `<html></html>` with Chromium:
const verySmallPdf = `
255044462d312e340a25d3ebe9e10a312030206f626a0a3c3c2f43726561
746f7220284d6f7a696c6c612f352e30205c284d6163696e746f73683b20
496e74656c204d6163204f5320582031305f31345f365c29204170706c65
5765624b69742f3533372e3336205c284b48544d4c2c206c696b65204765
636b6f5c29204368726f6d652f38372e302e343238302e38382053616661
72692f3533372e3336290a2f50726f64756365722028536b69612f504446
206d3837290a2f4372656174696f6e446174652028443a32303230313231
313136333033332b303027303027290a2f4d6f64446174652028443a3230
3230313231313136333033332b303027303027293e3e0a656e646f626a0a
332030206f626a0a3c3c2f636120310a2f424d202f4e6f726d616c3e3e0a
656e646f626a0a342030206f626a0a3c3c2f46696c746572202f466c6174
654465636f64650a2f4c656e6774682039353e3e2073747265616d0a789c
d33332b60403050320d4d543e29a5b1a2924e772157281648c4c4d0d148c
8d0d0c148a52b9c2b514f280e2c67a8646a6607d08165083a1020806b92b
401845e95cfaeec60ae9c560732c0ccd140c0d4ccd40c6a471050221009d
2a19fb0a656e6473747265616d0a656e646f626a0a322030206f626a0a3c
3c2f54797065202f506167650a2f5265736f7572636573203c3c2f50726f
63536574205b2f504446202f54657874202f496d61676542202f496d6167
6543202f496d616765495d0a2f457874475374617465203c3c2f47332033
203020523e3e3e3e0a2f4d65646961426f78205b30203020363132203739
325d0a2f436f6e74656e74732034203020520a2f53747275637450617265
6e747320300a2f506172656e742035203020523e3e0a656e646f626a0a35
2030206f626a0a3c3c2f54797065202f50616765730a2f436f756e742031
0a2f4b696473205b32203020525d3e3e0a656e646f626a0a362030206f62
6a0a3c3c2f54797065202f436174616c6f670a2f50616765732035203020
523e3e0a656e646f626a0a787265660a3020370a30303030303030303030
2036353533352066200a30303030303030303135203030303030206e200a
30303030303030343731203030303030206e200a30303030303030323730
203030303030206e200a30303030303030333037203030303030206e200a
30303030303030363539203030303030206e200a30303030303030373134
203030303030206e200a747261696c65720a3c3c2f53697a6520370a2f52
6f6f742036203020520a2f496e666f2031203020523e3e0a737461727478
7265660a3736310a2525454f46
`