-
Notifications
You must be signed in to change notification settings - Fork 333
Expand file tree
/
Copy pathFileItemContentReaderTest.groovy
More file actions
128 lines (100 loc) · 3.63 KB
/
FileItemContentReaderTest.groovy
File metadata and controls
128 lines (100 loc) · 3.63 KB
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
import datadog.trace.instrumentation.commons.fileupload.FileItemContentReader
import org.apache.commons.fileupload.FileItem
import spock.lang.Specification
class FileItemContentReaderTest extends Specification {
void 'readContent truncates at MAX_CONTENT_BYTES'() {
given:
def item = fileItem('X' * inputSize)
when:
def result = FileItemContentReader.readContent(item)
then:
result.length() == expectedSize
where:
inputSize | expectedSize
13 | 13
FileItemContentReader.MAX_CONTENT_BYTES - 1 | FileItemContentReader.MAX_CONTENT_BYTES - 1
FileItemContentReader.MAX_CONTENT_BYTES | FileItemContentReader.MAX_CONTENT_BYTES
FileItemContentReader.MAX_CONTENT_BYTES + 500 | FileItemContentReader.MAX_CONTENT_BYTES
}
void 'readContent returns empty string when getInputStream throws'() {
given:
FileItem item = Stub(FileItem)
item.getInputStream() >> { throw new IOException('simulated error') }
expect:
FileItemContentReader.readContent(item) == ''
}
void 'readContent returns empty string for empty content'() {
given:
def item = fileItem('')
expect:
FileItemContentReader.readContent(item) == ''
}
void 'readContent uses Content-Type from file item for charset decoding'() {
given:
def text = 'héllo wörld'
def item = fileItemFromBytes(text.getBytes('UTF-8'), 'file.txt', 'text/plain; charset=UTF-8')
expect:
FileItemContentReader.readContent(item) == text
}
void 'readContents returns content for each non-form file with a name'() {
given:
def items = [fileItem('content-a', 'file-a.txt'), fileItem('content-b', 'file-b.txt'),]
when:
def result = FileItemContentReader.readContents(items)
then:
result == ['content-a', 'content-b']
}
void 'readContents skips form fields'() {
given:
FileItem formField = Stub(FileItem)
formField.isFormField() >> true
def items = [formField, fileItem('content', 'real.txt')]
when:
def result = FileItemContentReader.readContents(items)
then:
result == ['content']
}
void 'readContents includes file parts with empty or null name'() {
given:
def items = [
fileItem('content-no-name', null),
fileItem('content-empty-name', ''),
fileItem('content-named', 'named.txt'),
]
when:
def result = FileItemContentReader.readContents(items)
then:
result == ['content-no-name', 'content-empty-name', 'content-named']
}
void 'readContents stops after MAX_FILES_TO_INSPECT files'() {
given:
def items = (1..FileItemContentReader.MAX_FILES_TO_INSPECT + 1).collect {
fileItem("content-${it}", "file-${it}.txt")
}
when:
def result = FileItemContentReader.readContents(items)
then:
result.size() == FileItemContentReader.MAX_FILES_TO_INSPECT
}
void 'readContents returns empty list for empty input'() {
expect:
FileItemContentReader.readContents([]) == []
}
private FileItem fileItem(String content) {
fileItem(content, 'file.txt')
}
private FileItem fileItem(String content, String name) {
fileItem(content, name, null)
}
private FileItem fileItem(String content, String name, String contentType) {
fileItemFromBytes((content ?: '').getBytes('ISO-8859-1'), name, contentType)
}
private FileItem fileItemFromBytes(byte[] bytes, String name, String contentType) {
FileItem item = Stub(FileItem)
item.isFormField() >> false
item.getName() >> name
item.getContentType() >> contentType
item.getInputStream() >> new ByteArrayInputStream(bytes)
return item
}
}