github.com/hechain20/hechain@v0.0.0-20220316014945-b544036ba106/internal/ccmetadata/validators_test.go (about) 1 /* 2 Copyright hechain. All Rights Reserved. 3 4 SPDX-License-Identifier: Apache-2.0 5 */ 6 7 package ccmetadata 8 9 import ( 10 "fmt" 11 "os" 12 "path/filepath" 13 "testing" 14 15 "github.com/stretchr/testify/require" 16 ) 17 18 var packageTestDir = filepath.Join(os.TempDir(), "ccmetadata-validator-test") 19 20 func TestGoodIndexJSON(t *testing.T) { 21 testDir := filepath.Join(packageTestDir, "GoodIndexJSON") 22 cleanupDir(testDir) 23 defer cleanupDir(testDir) 24 25 fileName := "META-INF/statedb/couchdb/indexes/myIndex.json" 26 fileBytes := []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 27 28 err := ValidateMetadataFile(fileName, fileBytes) 29 require.NoError(t, err, "Error validating a good index") 30 } 31 32 func TestBadIndexJSON(t *testing.T) { 33 testDir := filepath.Join(packageTestDir, "BadIndexJSON") 34 cleanupDir(testDir) 35 defer cleanupDir(testDir) 36 37 fileName := "META-INF/statedb/couchdb/indexes/myIndex.json" 38 fileBytes := []byte("invalid json") 39 40 err := ValidateMetadataFile(fileName, fileBytes) 41 42 require.Error(t, err, "Should have received an InvalidIndexContentError") 43 44 // Type assertion on InvalidIndexContentError 45 _, ok := err.(*InvalidIndexContentError) 46 require.True(t, ok, "Should have received an InvalidIndexContentError") 47 48 t.Log("SAMPLE ERROR STRING:", err.Error()) 49 } 50 51 func TestIndexWrongLocation(t *testing.T) { 52 testDir := filepath.Join(packageTestDir, "IndexWrongLocation") 53 cleanupDir(testDir) 54 defer cleanupDir(testDir) 55 56 fileName := "META-INF/statedb/couchdb/myIndex.json" 57 fileBytes := []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 58 59 err := ValidateMetadataFile(fileName, fileBytes) 60 require.Error(t, err, "Should have received an UnhandledDirectoryError") 61 62 // Type assertion on UnhandledDirectoryError 63 _, ok := err.(*UnhandledDirectoryError) 64 require.True(t, ok, "Should have received an UnhandledDirectoryError") 65 66 t.Log("SAMPLE ERROR STRING:", err.Error()) 67 } 68 69 func TestInvalidMetadataType(t *testing.T) { 70 testDir := filepath.Join(packageTestDir, "InvalidMetadataType") 71 cleanupDir(testDir) 72 defer cleanupDir(testDir) 73 74 fileName := "myIndex.json" 75 fileBytes := []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 76 77 err := ValidateMetadataFile(fileName, fileBytes) 78 require.Error(t, err, "Should have received an UnhandledDirectoryError") 79 80 // Type assertion on UnhandledDirectoryError 81 _, ok := err.(*UnhandledDirectoryError) 82 require.True(t, ok, "Should have received an UnhandledDirectoryError") 83 } 84 85 func TestBadMetadataExtension(t *testing.T) { 86 testDir := filepath.Join(packageTestDir, "BadMetadataExtension") 87 cleanupDir(testDir) 88 defer cleanupDir(testDir) 89 90 fileName := "myIndex.go" 91 fileBytes := []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 92 93 err := ValidateMetadataFile(fileName, fileBytes) 94 require.Error(t, err, "Should have received an error") 95 } 96 97 func TestBadFilePaths(t *testing.T) { 98 testDir := filepath.Join(packageTestDir, "BadMetadataExtension") 99 cleanupDir(testDir) 100 defer cleanupDir(testDir) 101 102 // Test bad META-INF 103 fileName := "META-INF1/statedb/couchdb/indexes/test1.json" 104 fileBytes := []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 105 106 err := ValidateMetadataFile(fileName, fileBytes) 107 fmt.Println(err) 108 require.Error(t, err, "Should have received an error for bad META-INF directory") 109 110 // Test bad path length 111 fileName = "META-INF/statedb/test1.json" 112 fileBytes = []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 113 114 err = ValidateMetadataFile(fileName, fileBytes) 115 fmt.Println(err) 116 require.Error(t, err, "Should have received an error for bad length") 117 118 // Test invalid database name 119 fileName = "META-INF/statedb/goleveldb/indexes/test1.json" 120 fileBytes = []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 121 122 err = ValidateMetadataFile(fileName, fileBytes) 123 fmt.Println(err) 124 require.Error(t, err, "Should have received an error for invalid database") 125 126 // Test invalid indexes directory name 127 fileName = "META-INF/statedb/couchdb/index/test1.json" 128 fileBytes = []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 129 130 err = ValidateMetadataFile(fileName, fileBytes) 131 fmt.Println(err) 132 require.Error(t, err, "Should have received an error for invalid indexes directory") 133 134 // Test invalid collections directory name 135 fileName = "META-INF/statedb/couchdb/collection/testcoll/indexes/test1.json" 136 fileBytes = []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 137 138 err = ValidateMetadataFile(fileName, fileBytes) 139 fmt.Println(err) 140 require.Error(t, err, "Should have received an error for invalid collections directory") 141 142 // Test valid collections name 143 fileName = "META-INF/statedb/couchdb/collections/testcoll/indexes/test1.json" 144 fileBytes = []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 145 146 err = ValidateMetadataFile(fileName, fileBytes) 147 fmt.Println(err) 148 require.NoError(t, err, "Error should not have been thrown for a valid collection name") 149 150 // Test invalid collections name 151 fileName = "META-INF/statedb/couchdb/collections/#testcoll/indexes/test1.json" 152 fileBytes = []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 153 154 err = ValidateMetadataFile(fileName, fileBytes) 155 fmt.Println(err) 156 require.Error(t, err, "Should have received an error for an invalid collection name") 157 158 // Test invalid collections name 159 fileName = "META-INF/statedb/couchdb/collections/testcoll/indexes/test1.txt" 160 fileBytes = []byte(`{"index":{"fields":["data.docType","data.owner"]},"name":"indexOwner","type":"json"}`) 161 162 err = ValidateMetadataFile(fileName, fileBytes) 163 fmt.Println(err) 164 require.Error(t, err, "Should have received an error for an invalid file name") 165 } 166 167 func TestIndexValidation(t *testing.T) { 168 // Test valid index with field sorts 169 indexDef := []byte(`{"index":{"fields":[{"size":"desc"}, {"color":"desc"}]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 170 _, indexDefinition := isJSON(indexDef) 171 err := validateIndexJSON(indexDefinition) 172 require.NoError(t, err) 173 174 // Test valid index without field sorts 175 indexDef = []byte(`{"index":{"fields":["size","color"]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 176 _, indexDefinition = isJSON(indexDef) 177 err = validateIndexJSON(indexDefinition) 178 require.NoError(t, err) 179 180 // Test valid index without design doc, name and type 181 indexDef = []byte(`{"index":{"fields":["size","color"]}}`) 182 _, indexDefinition = isJSON(indexDef) 183 err = validateIndexJSON(indexDefinition) 184 require.NoError(t, err) 185 186 // Test valid index with partial filter selector (only tests that it will not return error if included) 187 indexDef = []byte(`{ 188 "index": { 189 "partial_filter_selector": { 190 "status": { 191 "$ne": "archived" 192 } 193 }, 194 "fields": ["type"] 195 }, 196 "ddoc" : "type-not-archived", 197 "type" : "json" 198 }`) 199 _, indexDefinition = isJSON(indexDef) 200 err = validateIndexJSON(indexDefinition) 201 require.NoError(t, err) 202 } 203 204 func TestIndexValidationInvalidParameters(t *testing.T) { 205 // Test numeric values passed in for parameters 206 indexDef := []byte(`{"index":{"fields":[{"size":"desc"}, {"color":"desc"}]},"ddoc":1, "name":"indexSizeSortName","type":"json"}`) 207 _, indexDefinition := isJSON(indexDef) 208 err := validateIndexJSON(indexDefinition) 209 require.Error(t, err, "Error should have been thrown for numeric design doc") 210 211 // Test invalid design doc parameter 212 indexDef = []byte(`{"index":{"fields":["size","color"]},"ddoc1":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 213 _, indexDefinition = isJSON(indexDef) 214 err = validateIndexJSON(indexDefinition) 215 require.Error(t, err, "Error should have been thrown for invalid design doc parameter") 216 217 // Test invalid name parameter 218 indexDef = []byte(`{"index":{"fields":["size","color"]},"ddoc":"indexSizeSortName", "name1":"indexSizeSortName","type":"json"}`) 219 _, indexDefinition = isJSON(indexDef) 220 err = validateIndexJSON(indexDefinition) 221 require.Error(t, err, "Error should have been thrown for invalid name parameter") 222 223 // Test invalid type parameter, numeric 224 indexDef = []byte(`{"index":{"fields":["size","color"]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":1}`) 225 _, indexDefinition = isJSON(indexDef) 226 err = validateIndexJSON(indexDefinition) 227 require.Error(t, err, "Error should have been thrown for numeric type parameter") 228 229 // Test invalid type parameter 230 indexDef = []byte(`{"index":{"fields":["size","color"]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"text"}`) 231 _, indexDefinition = isJSON(indexDef) 232 err = validateIndexJSON(indexDefinition) 233 require.Error(t, err, "Error should have been thrown for invalid type parameter") 234 235 // Test invalid index parameter 236 indexDef = []byte(`{"index1":{"fields":["size","color"]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 237 _, indexDefinition = isJSON(indexDef) 238 err = validateIndexJSON(indexDefinition) 239 require.Error(t, err, "Error should have been thrown for invalid index parameter") 240 241 // Test missing index parameter 242 indexDef = []byte(`{"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 243 _, indexDefinition = isJSON(indexDef) 244 err = validateIndexJSON(indexDefinition) 245 require.Error(t, err, "Error should have been thrown for missing index parameter") 246 } 247 248 func TestIndexValidationInvalidFields(t *testing.T) { 249 // Test invalid fields parameter 250 indexDef := []byte(`{"index":{"fields1":[{"size":"desc"}, {"color":"desc"}]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 251 _, indexDefinition := isJSON(indexDef) 252 err := validateIndexJSON(indexDefinition) 253 require.Error(t, err, "Error should have been thrown for invalid fields parameter") 254 255 // Test invalid field name (numeric) 256 indexDef = []byte(`{"index":{"fields":["size", 1]},"ddoc1":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 257 _, indexDefinition = isJSON(indexDef) 258 err = validateIndexJSON(indexDefinition) 259 require.Error(t, err, "Error should have been thrown for field name defined as numeric") 260 261 // Test invalid field sort 262 indexDef = []byte(`{"index":{"fields":[{"size":"desc1"}, {"color":"desc"}]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 263 _, indexDefinition = isJSON(indexDef) 264 err = validateIndexJSON(indexDefinition) 265 require.Error(t, err, "Error should have been thrown for invalid field sort") 266 267 // Test numeric in sort 268 indexDef = []byte(`{"index":{"fields":[{"size":1}, {"color":"desc"}]},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 269 _, indexDefinition = isJSON(indexDef) 270 err = validateIndexJSON(indexDefinition) 271 require.Error(t, err, "Error should have been thrown for a numeric in field sort") 272 273 // Test invalid json for fields 274 indexDef = []byte(`{"index":{"fields":"size"},"ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 275 _, indexDefinition = isJSON(indexDef) 276 err = validateIndexJSON(indexDefinition) 277 require.Error(t, err, "Error should have been thrown for invalid field json") 278 279 // Test missing JSON for fields 280 indexDef = []byte(`{"index":"fields","ddoc":"indexSizeSortName", "name":"indexSizeSortName","type":"json"}`) 281 _, indexDefinition = isJSON(indexDef) 282 err = validateIndexJSON(indexDefinition) 283 require.Error(t, err, "Error should have been thrown for missing JSON for fields") 284 } 285 286 func cleanupDir(dir string) error { 287 // clean up any previous files 288 err := os.RemoveAll(dir) 289 if err != nil { 290 return nil 291 } 292 return os.Mkdir(dir, os.ModePerm) 293 }