@@ -31,7 +31,7 @@ func applyPatch(doc, patch string) (string, error) {
31
31
obj , err := DecodePatch ([]byte (patch ))
32
32
33
33
if err != nil {
34
- panic ( err )
34
+ return "" , err
35
35
}
36
36
37
37
out , err := obj .Apply ([]byte (doc ))
@@ -47,7 +47,7 @@ func applyPatchIndented(doc, patch string) (string, error) {
47
47
obj , err := DecodePatch ([]byte (patch ))
48
48
49
49
if err != nil {
50
- panic ( err )
50
+ return "" , err
51
51
}
52
52
53
53
out , err := obj .ApplyIndent ([]byte (doc ), " " )
@@ -63,7 +63,7 @@ func applyPatchWithOptions(doc, patch string, options *ApplyOptions) (string, er
63
63
obj , err := DecodePatch ([]byte (patch ))
64
64
65
65
if err != nil {
66
- panic ( err )
66
+ return "" , err
67
67
}
68
68
69
69
out , err := obj .ApplyWithOptions ([]byte (doc ), options )
@@ -574,97 +574,125 @@ var Cases = []Case{
574
574
}
575
575
576
576
type BadCase struct {
577
- doc , patch string
577
+ doc , patch string
578
+ failOnDecode bool
578
579
}
579
580
580
581
var MutationTestCases = []BadCase {
581
582
{
582
583
`{ "foo": "bar", "qux": { "baz": 1, "bar": null } }` ,
583
584
`[ { "op": "remove", "path": "/qux/bar" } ]` ,
585
+ false ,
584
586
},
585
587
{
586
588
`{ "foo": "bar", "qux": { "baz": 1, "bar": null } }` ,
587
589
`[ { "op": "replace", "path": "/qux/baz", "value": null } ]` ,
590
+ true ,
591
+ },
592
+ // malformed value
593
+ {
594
+ `{ "foo": "bar" }` ,
595
+ `[ { "op": "add", "path": "/", "value": "{qux" } ]` ,
596
+ true ,
588
597
},
589
598
}
590
599
591
600
var BadCases = []BadCase {
592
601
{
593
602
`{ "foo": "bar" }` ,
594
603
`[ { "op": "add", "path": "/baz/bat", "value": "qux" } ]` ,
604
+ false ,
595
605
},
596
606
{
597
607
`{ "a": { "b": { "d": 1 } } }` ,
598
608
`[ { "op": "remove", "path": "/a/b/c" } ]` ,
609
+ false ,
599
610
},
600
611
{
601
612
`{ "a": { "b": { "d": 1 } } }` ,
602
613
`[ { "op": "move", "from": "/a/b/c", "path": "/a/b/e" } ]` ,
614
+ false ,
603
615
},
604
616
{
605
617
`{ "a": { "b": [1] } }` ,
606
618
`[ { "op": "remove", "path": "/a/b/1" } ]` ,
619
+ false ,
607
620
},
608
621
{
609
622
`{ "a": { "b": [1] } }` ,
610
623
`[ { "op": "move", "from": "/a/b/1", "path": "/a/b/2" } ]` ,
624
+ false ,
611
625
},
612
626
{
613
627
`{ "foo": "bar" }` ,
614
628
`[ { "op": "add", "pathz": "/baz", "value": "qux" } ]` ,
629
+ true ,
615
630
},
616
631
{
617
632
`{ "foo": "bar" }` ,
618
633
`[ { "op": "add", "path": "", "value": "qux" } ]` ,
634
+ false ,
619
635
},
620
636
{
621
637
`{ "foo": ["bar","baz"]}` ,
622
638
`[ { "op": "replace", "path": "/foo/2", "value": "bum"}]` ,
639
+ false ,
623
640
},
624
641
{
625
642
`{ "foo": ["bar","baz"]}` ,
626
643
`[ { "op": "add", "path": "/foo/-4", "value": "bum"}]` ,
644
+ false ,
627
645
},
628
646
{
629
647
`{ "name":{ "foo": "bat", "qux": "bum"}}` ,
630
648
`[ { "op": "replace", "path": "/foo/bar", "value":"baz"}]` ,
649
+ false ,
631
650
},
632
651
{
633
652
`{ "foo": ["bar"]}` ,
634
653
`[ {"op": "add", "path": "/foo/2", "value": "bum"}]` ,
654
+ false ,
635
655
},
636
656
{
637
657
`{ "foo": []}` ,
638
658
`[ {"op": "remove", "path": "/foo/-"}]` ,
659
+ false ,
639
660
},
640
661
{
641
662
`{ "foo": []}` ,
642
663
`[ {"op": "remove", "path": "/foo/-1"}]` ,
664
+ false ,
643
665
},
644
666
{
645
667
`{ "foo": ["bar"]}` ,
646
668
`[ {"op": "remove", "path": "/foo/-2"}]` ,
669
+ false ,
647
670
},
648
671
{
649
672
`{}` ,
650
673
`[ {"op":null,"path":""} ]` ,
674
+ true ,
651
675
},
652
676
{
653
677
`{}` ,
654
678
`[ {"op":"add","path":null} ]` ,
679
+ true ,
655
680
},
656
681
{
657
682
`{}` ,
658
683
`[ { "op": "copy", "from": null }]` ,
684
+ true ,
659
685
},
660
686
{
661
687
`{ "foo": ["bar"]}` ,
662
688
`[{"op": "copy", "path": "/foo/6666666666", "from": "/"}]` ,
689
+ false ,
663
690
},
664
691
// Can't copy into an index greater than the size of the array
665
692
{
666
693
`{ "foo": ["bar"]}` ,
667
694
`[{"op": "copy", "path": "/foo/2", "from": "/foo/0"}]` ,
695
+ false ,
668
696
},
669
697
// Accumulated copy size cannot exceed AccumulatedCopySizeLimit.
670
698
{
@@ -673,20 +701,24 @@ var BadCases = []BadCase{
673
701
// size, so each copy operation increases the size by 51 bytes.
674
702
`[ { "op": "copy", "path": "/foo/-", "from": "/foo/1" },
675
703
{ "op": "copy", "path": "/foo/-", "from": "/foo/1" }]` ,
704
+ false ,
676
705
},
677
706
// Can't move into an index greater than or equal to the size of the array
678
707
{
679
708
`{ "foo": [ "all", "grass", "cows", "eat" ] }` ,
680
709
`[ { "op": "move", "from": "/foo/1", "path": "/foo/4" } ]` ,
710
+ false ,
681
711
},
682
712
{
683
713
`{ "baz": "qux" }` ,
684
714
`[ { "op": "replace", "path": "/foo", "value": "bar" } ]` ,
715
+ false ,
685
716
},
686
717
// Can't copy from non-existent "from" key.
687
718
{
688
719
`{ "foo": "bar"}` ,
689
720
`[{"op": "copy", "path": "/qux", "from": "/baz"}]` ,
721
+ false ,
690
722
},
691
723
}
692
724
@@ -753,10 +785,22 @@ func TestAllCases(t *testing.T) {
753
785
}
754
786
755
787
for _ , c := range BadCases {
756
- _ , err := applyPatch (c .doc , c .patch )
788
+ p , err := DecodePatch ([]byte (c .patch ))
789
+ if err == nil && c .failOnDecode {
790
+ t .Errorf ("Patch %q should have failed decode but did not" , c .patch )
791
+ }
792
+
793
+ if err != nil && ! c .failOnDecode {
794
+ t .Errorf ("Patch %q should have passed decode but failed with %v" , c .patch , err )
795
+ }
796
+
797
+ if err == nil && ! c .failOnDecode {
798
+ _ , err = p .Apply ([]byte (c .doc ))
799
+
800
+ if err == nil {
801
+ t .Errorf ("Patch %q should have failed to apply but it did not" , c .patch )
802
+ }
757
803
758
- if err == nil {
759
- t .Errorf ("Patch %q should have failed to apply but it did not" , c .patch )
760
804
}
761
805
}
762
806
}
0 commit comments