-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
/
Copy pathfile_test.go
166 lines (156 loc) · 4.75 KB
/
file_test.go
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
package excelize
import (
"bufio"
"bytes"
"encoding/binary"
"math"
"os"
"path/filepath"
"strings"
"sync"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func BenchmarkWrite(b *testing.B) {
const s = "This is test data"
for i := 0; i < b.N; i++ {
f := NewFile()
for row := 1; row <= 10000; row++ {
for col := 1; col <= 20; col++ {
val, err := CoordinatesToCellName(col, row)
if err != nil {
b.Error(err)
}
if err := f.SetCellValue("Sheet1", val, s); err != nil {
b.Error(err)
}
}
}
// Save spreadsheet by the given path.
err := f.SaveAs("./test.xlsx")
if err != nil {
b.Error(err)
}
}
}
func TestWriteTo(t *testing.T) {
// Test WriteToBuffer err
{
f, buf := File{Pkg: sync.Map{}}, bytes.Buffer{}
f.Pkg.Store("/d/", []byte("s"))
_, err := f.WriteTo(bufio.NewWriter(&buf))
assert.EqualError(t, err, "zip: write to directory")
f.Pkg.Delete("/d/")
}
// Test file path overflow
{
f, buf := File{Pkg: sync.Map{}}, bytes.Buffer{}
const maxUint16 = 1<<16 - 1
f.Pkg.Store(strings.Repeat("s", maxUint16+1), nil)
_, err := f.WriteTo(bufio.NewWriter(&buf))
assert.EqualError(t, err, "zip: FileHeader.Name too long")
}
// Test StreamsWriter err
{
f, buf := File{Pkg: sync.Map{}}, bytes.Buffer{}
f.Pkg.Store("s", nil)
f.streams = make(map[string]*StreamWriter)
file, _ := os.Open("123")
f.streams["s"] = &StreamWriter{rawData: bufferedWriter{tmp: file}}
_, err := f.WriteTo(bufio.NewWriter(&buf))
assert.Nil(t, err)
}
// Test write with temporary file
{
f, buf := File{tempFiles: sync.Map{}}, bytes.Buffer{}
const maxUint16 = 1<<16 - 1
f.tempFiles.Store("s", "")
f.tempFiles.Store(strings.Repeat("s", maxUint16+1), "")
_, err := f.WriteTo(bufio.NewWriter(&buf))
assert.EqualError(t, err, "zip: FileHeader.Name too long")
}
// Test write with unsupported workbook file format
{
f, buf := File{Pkg: sync.Map{}}, bytes.Buffer{}
f.Pkg.Store("/d", []byte("s"))
f.Path = "Book1.xls"
_, err := f.WriteTo(bufio.NewWriter(&buf))
assert.EqualError(t, err, ErrWorkbookFileFormat.Error())
}
// Test write with unsupported charset content types.
{
f, buf := NewFile(), bytes.Buffer{}
f.ContentTypes, f.Path = nil, filepath.Join("test", "TestWriteTo.xlsx")
f.Pkg.Store(defaultXMLPathContentTypes, MacintoshCyrillicCharset)
_, err := f.WriteTo(bufio.NewWriter(&buf))
assert.EqualError(t, err, "XML syntax error on line 1: invalid UTF-8")
}
}
func TestClose(t *testing.T) {
f := NewFile()
f.tempFiles.Store("/d/", "/d/")
require.Error(t, f.Close())
}
func TestZip64(t *testing.T) {
f := NewFile()
_, err := f.NewSheet("Sheet2")
assert.NoError(t, err)
sw, err := f.NewStreamWriter("Sheet1")
assert.NoError(t, err)
for r := range 131 {
rowData := make([]interface{}, 1000)
for c := range 1000 {
rowData[c] = strings.Repeat("c", TotalCellChars)
}
cell, err := CoordinatesToCellName(1, r+1)
assert.NoError(t, err)
assert.NoError(t, sw.SetRow(cell, rowData))
}
assert.NoError(t, sw.Flush())
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestZip64.xlsx")))
assert.NoError(t, f.Close())
// Test with filename length overflow
f = NewFile()
f.zip64Entries = append(f.zip64Entries, defaultXMLPathSharedStrings)
buf := new(bytes.Buffer)
buf.Write([]byte{0x50, 0x4b, 0x03, 0x04})
buf.Write(make([]byte, 20))
assert.NoError(t, f.writeZip64LFH(buf))
// Test with file header less than the required 30 for the fixed header part
f = NewFile()
f.zip64Entries = append(f.zip64Entries, defaultXMLPathSharedStrings)
buf.Reset()
buf.Write([]byte{0x50, 0x4b, 0x03, 0x04})
buf.Write(make([]byte, 22))
binary.Write(buf, binary.LittleEndian, uint16(10))
buf.Write(make([]byte, 2))
buf.WriteString("test")
assert.NoError(t, f.writeZip64LFH(buf))
t.Run("for_save_zip64_with_in_memory_file_over_4GB", func(t *testing.T) {
// Test save workbook in ZIP64 format with in memory file with size over 4GB.
f := NewFile()
f.Sheet.Delete("xl/worksheets/sheet1.xml")
f.Pkg.Store("xl/worksheets/sheet1.xml", make([]byte, math.MaxUint32+1))
_, err := f.WriteToBuffer()
assert.NoError(t, err)
assert.NoError(t, f.Close())
})
t.Run("for_save_zip64_with_in_temporary_file_over_4GB", func(t *testing.T) {
// Test save workbook in ZIP64 format with temporary file with size over 4GB.
if os.Getenv("GITHUB_ACTIONS") == "true" {
t.Skip()
}
f := NewFile()
f.Pkg.Delete("xl/worksheets/sheet1.xml")
f.Sheet.Delete("xl/worksheets/sheet1.xml")
tmp, err := os.CreateTemp(os.TempDir(), "excelize-")
assert.NoError(t, err)
assert.NoError(t, tmp.Truncate(math.MaxUint32+1))
f.tempFiles.Store("xl/worksheets/sheet1.xml", tmp.Name())
assert.NoError(t, tmp.Close())
_, err = f.WriteToBuffer()
assert.NoError(t, err)
assert.NoError(t, f.Close())
})
}