| // Copyright (c) HashiCorp, Inc. |
| // SPDX-License-Identifier: MPL-2.0 |
| |
| package jsonutil |
| |
| import ( |
| "bytes" |
| "compress/gzip" |
| "fmt" |
| "reflect" |
| "strings" |
| "testing" |
| |
| "github.com/hashicorp/vault/sdk/helper/compressutil" |
| ) |
| |
| func TestJSONUtil_CompressDecompressJSON(t *testing.T) { |
| expected := map[string]interface{}{ |
| "test": "data", |
| "validation": "process", |
| } |
| |
| // Compress an object |
| compressedBytes, err := EncodeJSONAndCompress(expected, nil) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if len(compressedBytes) == 0 { |
| t.Fatal("expected compressed data") |
| } |
| |
| // Check if canary is present in the compressed data |
| if compressedBytes[0] != compressutil.CompressionCanaryGzip { |
| t.Fatalf("canary missing in compressed data") |
| } |
| |
| // Decompress and decode the compressed information and verify the functional |
| // behavior |
| var actual map[string]interface{} |
| if err = DecodeJSON(compressedBytes, &actual); err != nil { |
| t.Fatal(err) |
| } |
| if !reflect.DeepEqual(expected, actual) { |
| t.Fatalf("bad: expected: %#v\nactual: %#v", expected, actual) |
| } |
| for key := range actual { |
| delete(actual, key) |
| } |
| |
| // Test invalid data |
| if err = DecodeJSON([]byte{}, &actual); err == nil { |
| t.Fatalf("expected a failure") |
| } |
| |
| // Test invalid data after the canary byte |
| var buf bytes.Buffer |
| buf.Write([]byte{compressutil.CompressionCanaryGzip}) |
| if err = DecodeJSON(buf.Bytes(), &actual); err == nil { |
| t.Fatalf("expected a failure") |
| } |
| |
| // Compress an object |
| compressedBytes, err = EncodeJSONAndCompress(expected, &compressutil.CompressionConfig{ |
| Type: compressutil.CompressionTypeGzip, |
| GzipCompressionLevel: gzip.BestSpeed, |
| }) |
| if err != nil { |
| t.Fatal(err) |
| } |
| if len(compressedBytes) == 0 { |
| t.Fatal("expected compressed data") |
| } |
| |
| // Check if canary is present in the compressed data |
| if compressedBytes[0] != compressutil.CompressionCanaryGzip { |
| t.Fatalf("canary missing in compressed data") |
| } |
| |
| // Decompress and decode the compressed information and verify the functional |
| // behavior |
| if err = DecodeJSON(compressedBytes, &actual); err != nil { |
| t.Fatal(err) |
| } |
| if !reflect.DeepEqual(expected, actual) { |
| t.Fatalf("bad: expected: %#v\nactual: %#v", expected, actual) |
| } |
| } |
| |
| func TestJSONUtil_EncodeJSON(t *testing.T) { |
| input := map[string]interface{}{ |
| "test": "data", |
| "validation": "process", |
| } |
| |
| actualBytes, err := EncodeJSON(input) |
| if err != nil { |
| t.Fatalf("failed to encode JSON: %v", err) |
| } |
| |
| actual := strings.TrimSpace(string(actualBytes)) |
| expected := `{"test":"data","validation":"process"}` |
| |
| if actual != expected { |
| t.Fatalf("bad: encoded JSON: expected:%s\nactual:%s\n", expected, string(actualBytes)) |
| } |
| } |
| |
| func TestJSONUtil_DecodeJSON(t *testing.T) { |
| input := `{"test":"data","validation":"process"}` |
| |
| var actual map[string]interface{} |
| |
| err := DecodeJSON([]byte(input), &actual) |
| if err != nil { |
| fmt.Printf("decoding err: %v\n", err) |
| } |
| |
| expected := map[string]interface{}{ |
| "test": "data", |
| "validation": "process", |
| } |
| if !reflect.DeepEqual(actual, expected) { |
| t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual) |
| } |
| } |
| |
| func TestJSONUtil_DecodeJSONFromReader(t *testing.T) { |
| input := `{"test":"data","validation":"process"}` |
| |
| var actual map[string]interface{} |
| |
| err := DecodeJSONFromReader(bytes.NewReader([]byte(input)), &actual) |
| if err != nil { |
| fmt.Printf("decoding err: %v\n", err) |
| } |
| |
| expected := map[string]interface{}{ |
| "test": "data", |
| "validation": "process", |
| } |
| if !reflect.DeepEqual(actual, expected) { |
| t.Fatalf("bad: expected:%#v\nactual:%#v", expected, actual) |
| } |
| } |