Skip to content

Commit f2b912c

Browse files
committed
Adding tests to extract thumbnail with real files
1 parent 3d2b89a commit f2b912c

File tree

7 files changed

+137
-9
lines changed

7 files changed

+137
-9
lines changed

testdata/_Test.azw3

730 KB
Binary file not shown.

testdata/_Test.azw8

1.01 MB
Binary file not shown.

thumbs/kfx/ion.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import (
1010
)
1111

1212
const (
13-
largestKnownSymbol = 834
13+
largestKnownSymbol = 851
1414
)
1515

1616
var (

thumbs/kfx/kfx.go

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ type indexTableEntry struct {
7575
Offset, Size uint64
7676
}
7777

78-
func (e *indexTableEntry) readFrom(r io.Reader, start uint32, limit int, st ion.SymbolTable) error {
78+
func (e *indexTableEntry) readFrom(r io.Reader, start uint32, limit int) error {
7979
*e = indexTableEntry{}
8080

8181
if err := readDataFrom(r, e); err != nil {
@@ -84,12 +84,6 @@ func (e *indexTableEntry) readFrom(r io.Reader, start uint32, limit int, st ion.
8484
if uint64(start)+e.Offset > uint64(limit) {
8585
return fmt.Errorf("entity is out of bounds: %d + %d > %d", uint64(start)+e.Offset, e.Size, limit)
8686
}
87-
if _, ok := st.FindByID(uint64(e.NumID)); !ok {
88-
return fmt.Errorf("entity ID not found in the symbol table: %d", e.NumID)
89-
}
90-
if _, ok := st.FindByID(uint64(e.NumType)); !ok {
91-
return fmt.Errorf("entity type not found in the symbol table: %d", e.NumType)
92-
}
9387
return nil
9488
}
9589

thumbs/kfx/reader.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ func (r *Reader) extractThumbnail(data []byte) error {
9797
var tableEntry indexTableEntry
9898
indexTableReader := bytes.NewReader(data[contInfo.IndexTabOffset : contInfo.IndexTabOffset+contInfo.IndexTabLength])
9999
for {
100-
if err := tableEntry.readFrom(indexTableReader, contHeader.Size, len(data), docSymbols); err != nil {
100+
if err := tableEntry.readFrom(indexTableReader, contHeader.Size, len(data)); err != nil {
101101
if errors.Is(err, io.EOF) {
102102
break
103103
}

thumbs/kfx/reader_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package kfx_test
2+
3+
import (
4+
"bytes"
5+
"image/jpeg"
6+
"os"
7+
"path/filepath"
8+
"testing"
9+
10+
"go.uber.org/zap/zaptest"
11+
12+
"s2k/thumbs/kfx"
13+
)
14+
15+
const testFile = "../../testdata/_Test.azw8"
16+
17+
func TestNewReader(t *testing.T) {
18+
if _, err := os.Stat(testFile); err != nil {
19+
t.Skipf("test fixture not available: %v", err)
20+
}
21+
22+
log := zaptest.NewLogger(t)
23+
24+
const thumbW, thumbH = 330, 470
25+
26+
r, err := kfx.NewReader(testFile, thumbW, thumbH, log)
27+
if err != nil {
28+
t.Fatalf("NewReader failed: %v", err)
29+
}
30+
31+
dir := t.TempDir()
32+
name, err := r.SaveResult(dir)
33+
if err != nil {
34+
t.Fatalf("SaveResult failed: %v", err)
35+
}
36+
if name == "" {
37+
t.Fatal("SaveResult returned empty filename — no thumbnail was extracted")
38+
}
39+
40+
t.Logf("saved thumbnail: %s", name)
41+
42+
// Verify the file is a valid JPEG with expected dimensions.
43+
data, err := os.ReadFile(filepath.Join(dir, name))
44+
if err != nil {
45+
t.Fatalf("unable to read saved thumbnail: %v", err)
46+
}
47+
48+
// SOI marker.
49+
if len(data) < 2 || data[0] != 0xFF || data[1] != 0xD8 {
50+
t.Fatal("saved file does not start with JPEG SOI marker")
51+
}
52+
53+
// JFIF APP0 segment must be present (Kindle requirement).
54+
if len(data) < 4 || data[2] != 0xFF || data[3] != 0xE0 {
55+
t.Fatal("saved file does not contain JFIF APP0 segment")
56+
}
57+
58+
img, err := jpeg.Decode(bytes.NewReader(data))
59+
if err != nil {
60+
t.Fatalf("saved file is not valid JPEG: %v", err)
61+
}
62+
63+
gotW, gotH := img.Bounds().Dx(), img.Bounds().Dy()
64+
if gotW != thumbW || gotH != thumbH {
65+
t.Errorf("thumbnail dimensions %dx%d, want %dx%d", gotW, gotH, thumbW, thumbH)
66+
}
67+
}

thumbs/mobi/reader_test.go

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
package mobi_test
2+
3+
import (
4+
"bytes"
5+
"image/jpeg"
6+
"os"
7+
"path/filepath"
8+
"testing"
9+
10+
"go.uber.org/zap/zaptest"
11+
12+
"s2k/thumbs/mobi"
13+
)
14+
15+
const testFile = "../../testdata/_Test.azw3"
16+
17+
func TestNewReader(t *testing.T) {
18+
if _, err := os.Stat(testFile); err != nil {
19+
t.Skipf("test fixture not available: %v", err)
20+
}
21+
22+
log := zaptest.NewLogger(t)
23+
24+
const thumbW, thumbH = 330, 470
25+
26+
r, err := mobi.NewReader(testFile, thumbW, thumbH, log)
27+
if err != nil {
28+
t.Fatalf("NewReader failed: %v", err)
29+
}
30+
31+
dir := t.TempDir()
32+
name, err := r.SaveResult(dir)
33+
if err != nil {
34+
t.Fatalf("SaveResult failed: %v", err)
35+
}
36+
if name == "" {
37+
t.Fatal("SaveResult returned empty filename — no thumbnail was extracted")
38+
}
39+
40+
t.Logf("saved thumbnail: %s", name)
41+
42+
// Verify the file is a valid JPEG with expected dimensions.
43+
data, err := os.ReadFile(filepath.Join(dir, name))
44+
if err != nil {
45+
t.Fatalf("unable to read saved thumbnail: %v", err)
46+
}
47+
48+
// SOI marker.
49+
if len(data) < 2 || data[0] != 0xFF || data[1] != 0xD8 {
50+
t.Fatal("saved file does not start with JPEG SOI marker")
51+
}
52+
53+
// JFIF APP0 segment must be present (Kindle requirement).
54+
if len(data) < 4 || data[2] != 0xFF || data[3] != 0xE0 {
55+
t.Fatal("saved file does not contain JFIF APP0 segment")
56+
}
57+
58+
img, err := jpeg.Decode(bytes.NewReader(data))
59+
if err != nil {
60+
t.Fatalf("saved file is not valid JPEG: %v", err)
61+
}
62+
63+
gotW, gotH := img.Bounds().Dx(), img.Bounds().Dy()
64+
if gotW != thumbW || gotH != thumbH {
65+
t.Errorf("thumbnail dimensions %dx%d, want %dx%d", gotW, gotH, thumbW, thumbH)
66+
}
67+
}

0 commit comments

Comments
 (0)