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  }