Skip to content

Commit 674c26a

Browse files
pcman312hors
andauthored
Fix panic on JSON marshal if PITRestoreDateTime is not a pointer (#1368)
Co-authored-by: Viacheslav Sarzhan <[email protected]>
1 parent 81ff846 commit 674c26a

File tree

2 files changed

+70
-1
lines changed

2 files changed

+70
-1
lines changed

pkg/apis/pgv2.percona.com/v2/perconapgbackup_types.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ func (t *PITRestoreDateTime) UnmarshalJSON(b []byte) (err error) {
129129
return nil
130130
}
131131

132-
func (t *PITRestoreDateTime) MarshalJSON() ([]byte, error) {
132+
func (t PITRestoreDateTime) MarshalJSON() ([]byte, error) {
133133
if t.Time == nil {
134134
return []byte("null"), nil
135135
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package v2
2+
3+
import (
4+
"encoding/json"
5+
"testing"
6+
"time"
7+
8+
"github.com/stretchr/testify/require"
9+
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
10+
)
11+
12+
func TestPITRestoreDateTime_MarshalJSON(t *testing.T) {
13+
type testCase struct {
14+
data any
15+
expected string
16+
}
17+
tests := map[string]testCase{
18+
"default": {
19+
data: PITRestoreDateTime{},
20+
expected: `null`,
21+
},
22+
"pointer": {
23+
data: &PITRestoreDateTime{},
24+
expected: `null`,
25+
},
26+
"nil pointer": {
27+
data: (*PITRestoreDateTime)(nil),
28+
expected: `null`,
29+
},
30+
"non-pointer zero date time": {
31+
data: PITRestoreDateTime{
32+
Time: ptr(metav1.NewTime(time.Time{})),
33+
},
34+
expected: `"0001-01-01 00:00:00.000000+0000"`,
35+
},
36+
"pointer zero date time": {
37+
data: &PITRestoreDateTime{
38+
Time: ptr(metav1.NewTime(time.Time{})),
39+
},
40+
expected: `"0001-01-01 00:00:00.000000+0000"`,
41+
},
42+
"non-pointer with date time": {
43+
data: PITRestoreDateTime{
44+
Time: ptr(metav1.NewTime(time.Date(2025, time.November, 21, 13, 14, 15, 345600000, time.UTC))),
45+
},
46+
expected: `"2025-11-21 13:14:15.345600+0000"`,
47+
},
48+
"pointer with date time": {
49+
data: &PITRestoreDateTime{
50+
Time: ptr(metav1.NewTime(time.Date(2025, time.November, 21, 13, 14, 15, 345600000, time.UTC))),
51+
},
52+
expected: `"2025-11-21 13:14:15.345600+0000"`,
53+
},
54+
}
55+
56+
for name, test := range tests {
57+
t.Run(name, func(t *testing.T) {
58+
require.NotPanics(t, func() {
59+
b, err := json.Marshal(test.data)
60+
require.NoError(t, err)
61+
require.JSONEq(t, test.expected, string(b))
62+
})
63+
})
64+
}
65+
}
66+
67+
func ptr[T any](v T) *T {
68+
return &v
69+
}

0 commit comments

Comments
 (0)