1/*
2Copyright 2014 The Kubernetes Authors.
3
4Licensed under the Apache License, Version 2.0 (the "License");
5you may not use this file except in compliance with the License.
6You may obtain a copy of the License at
7
8    http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15*/
16
17package v1
18
19import (
20	"encoding/json"
21	"testing"
22	"time"
23
24	"sigs.k8s.io/yaml"
25)
26
27type DurationHolder struct {
28	D Duration `json:"d"`
29}
30
31func TestDurationMarshalYAML(t *testing.T) {
32	cases := []struct {
33		input  Duration
34		result string
35	}{
36		{Duration{5 * time.Second}, "d: 5s\n"},
37		{Duration{2 * time.Minute}, "d: 2m0s\n"},
38		{Duration{time.Hour + 3*time.Millisecond}, "d: 1h0m0.003s\n"},
39	}
40
41	for _, c := range cases {
42		input := DurationHolder{c.input}
43		result, err := yaml.Marshal(&input)
44		if err != nil {
45			t.Errorf("Failed to marshal input: %q: %v", input, err)
46		}
47		if string(result) != c.result {
48			t.Errorf("Failed to marshal input: %q: expected %q, got %q", input, c.result, string(result))
49		}
50	}
51}
52
53func TestDurationUnmarshalYAML(t *testing.T) {
54	cases := []struct {
55		input  string
56		result Duration
57	}{
58		{"d: 0s\n", Duration{}},
59		{"d: 5s\n", Duration{5 * time.Second}},
60		{"d: 2m0s\n", Duration{2 * time.Minute}},
61		{"d: 1h0m0.003s\n", Duration{time.Hour + 3*time.Millisecond}},
62
63		// Units with zero values can optionally be dropped
64		{"d: 2m\n", Duration{2 * time.Minute}},
65		{"d: 1h0.003s\n", Duration{time.Hour + 3*time.Millisecond}},
66	}
67
68	for _, c := range cases {
69		var result DurationHolder
70		if err := yaml.Unmarshal([]byte(c.input), &result); err != nil {
71			t.Errorf("Failed to unmarshal input %q: %v", c.input, err)
72		}
73		if result.D != c.result {
74			t.Errorf("Failed to unmarshal input %q: expected %q, got %q", c.input, c.result, result)
75		}
76	}
77}
78
79func TestDurationMarshalJSON(t *testing.T) {
80	cases := []struct {
81		input  Duration
82		result string
83	}{
84		{Duration{5 * time.Second}, `{"d":"5s"}`},
85		{Duration{2 * time.Minute}, `{"d":"2m0s"}`},
86		{Duration{time.Hour + 3*time.Millisecond}, `{"d":"1h0m0.003s"}`},
87	}
88
89	for _, c := range cases {
90		input := DurationHolder{c.input}
91		result, err := json.Marshal(&input)
92		if err != nil {
93			t.Errorf("Failed to marshal input: %q: %v", input, err)
94		}
95		if string(result) != c.result {
96			t.Errorf("Failed to marshal input: %q: expected %q, got %q", input, c.result, string(result))
97		}
98	}
99}
100
101func TestDurationUnmarshalJSON(t *testing.T) {
102	cases := []struct {
103		input  string
104		result Duration
105	}{
106		{`{"d":"0s"}`, Duration{}},
107		{`{"d":"5s"}`, Duration{5 * time.Second}},
108		{`{"d":"2m0s"}`, Duration{2 * time.Minute}},
109		{`{"d":"1h0m0.003s"}`, Duration{time.Hour + 3*time.Millisecond}},
110
111		// Units with zero values can optionally be dropped
112		{`{"d":"2m"}`, Duration{2 * time.Minute}},
113		{`{"d":"1h0.003s"}`, Duration{time.Hour + 3*time.Millisecond}},
114	}
115
116	for _, c := range cases {
117		var result DurationHolder
118		if err := json.Unmarshal([]byte(c.input), &result); err != nil {
119			t.Errorf("Failed to unmarshal input %q: %v", c.input, err)
120		}
121		if result.D != c.result {
122			t.Errorf("Failed to unmarshal input %q: expected %q, got %q", c.input, c.result, result)
123		}
124	}
125}
126
127func TestDurationMarshalJSONUnmarshalYAML(t *testing.T) {
128	cases := []struct {
129		input Duration
130	}{
131		{Duration{}},
132		{Duration{5 * time.Second}},
133		{Duration{2 * time.Minute}},
134		{Duration{time.Hour + 3*time.Millisecond}},
135	}
136
137	for i, c := range cases {
138		input := DurationHolder{c.input}
139		jsonMarshalled, err := json.Marshal(&input)
140		if err != nil {
141			t.Errorf("%d-1: Failed to marshal input: '%v': %v", i, input, err)
142		}
143
144		var result DurationHolder
145		if err := yaml.Unmarshal(jsonMarshalled, &result); err != nil {
146			t.Errorf("%d-2: Failed to unmarshal '%+v': %v", i, string(jsonMarshalled), err)
147		}
148
149		if input.D != result.D {
150			t.Errorf("%d-4: Failed to marshal input '%#v': got %#v", i, input, result)
151		}
152	}
153}
154