1/*
2 * Copyright (C) 2017 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package libcore.android.system;
18
19import android.system.StructTimespec;
20
21import junit.framework.TestCase;
22
23/**
24 * Unit test for {@link StructTimespec}
25 */
26public class StructTimespecTest extends TestCase {
27    public void testConstructor() {
28        StructTimespec val = new StructTimespec(Long.MIN_VALUE, 0);
29        assertEquals(Long.MIN_VALUE, val.tv_sec);
30        assertEquals(0, val.tv_nsec);
31
32        val = new StructTimespec(-23, 23);
33        assertEquals(-23, val.tv_sec);
34        assertEquals(23, val.tv_nsec);
35
36        val = new StructTimespec(0, 42);
37        assertEquals(0, val.tv_sec);
38        assertEquals(42, val.tv_nsec);
39
40        val = new StructTimespec(23, 91);
41        assertEquals(23, val.tv_sec);
42        assertEquals(91, val.tv_nsec);
43
44        val = new StructTimespec(Long.MAX_VALUE, 999_999_999);
45        assertEquals(Long.MAX_VALUE, val.tv_sec);
46        assertEquals(999_999_999, val.tv_nsec);
47    }
48
49    public void testConstructorInvalidNsec() {
50        try {
51            new StructTimespec(0, 1_000_000_000);
52            fail();
53        } catch (IllegalArgumentException e) {
54            // expected
55        }
56
57        try {
58            new StructTimespec(0, -1);
59            fail();
60        } catch (IllegalArgumentException e) {
61            // expected
62        }
63    }
64
65    public void testCompare() {
66        StructTimespec[] specs = new StructTimespec[]{new StructTimespec(Long.MIN_VALUE, 0),
67                new StructTimespec(-24, 91),
68                new StructTimespec(-23, 23),
69                new StructTimespec(0, 41),
70                new StructTimespec(0, 42),
71                new StructTimespec(22, 91),
72                new StructTimespec(23, 23),
73                new StructTimespec(24, 91),
74                new StructTimespec(Long.MAX_VALUE, 999_999_999)};
75
76        for (int a = 0; a < specs.length; a++) {
77            for (int b = 0; b < specs.length; b++) {
78                if (a < b) {
79                    assertTrue(a + "<" + b, specs[a].compareTo(specs[b]) < 0);
80                } else if (a == b) {
81                    assertTrue(a + "==" + b, specs[a].compareTo(specs[b]) == 0);
82                } else {
83                    assertTrue(a + ">" + b,  specs[a].compareTo(specs[b]) > 0);
84                }
85            }
86        }
87    }
88
89    public void testEquals() {
90        StructTimespec allZero1 = new StructTimespec(0, 0);
91        StructTimespec allZero2 = new StructTimespec(0, 0);
92
93        StructTimespec val1 = new StructTimespec(23, 42);
94        StructTimespec val2 = new StructTimespec(23, 42);
95
96        StructTimespec secZero1 = new StructTimespec(0, 42);
97        StructTimespec secZero2 = new StructTimespec(0, 42);
98
99        StructTimespec nsecZero1 = new StructTimespec(23, 0);
100        StructTimespec nsecZero2 = new StructTimespec(23, 0);
101
102        assertTrue(allZero1.equals(allZero2));
103        assertTrue(val1.equals(val2));
104        assertTrue(secZero1.equals(secZero2));
105        assertTrue(nsecZero1.equals(nsecZero2));
106
107        // Compare equals in both directions
108        assertFalse(allZero1.equals(val1));
109        assertFalse(allZero1.equals(secZero1));
110        assertFalse(allZero1.equals(nsecZero1));
111
112        assertFalse(val1.equals(secZero1));
113        assertFalse(val1.equals(nsecZero1));
114        assertFalse(val1.equals(allZero1));
115
116        assertFalse(secZero1.equals(nsecZero1));
117        assertFalse(secZero1.equals(allZero1));
118        assertFalse(secZero1.equals(val1));
119
120        assertFalse(nsecZero1.equals(allZero1));
121        assertFalse(nsecZero1.equals(val1));
122        assertFalse(nsecZero1.equals(secZero1));
123    }
124
125    public void testHashcode() {
126        StructTimespec allZero1 = new StructTimespec(0, 0);
127        StructTimespec allZero2 = new StructTimespec(0, 0);
128
129        StructTimespec val1 = new StructTimespec(23, 42);
130        StructTimespec val2 = new StructTimespec(23, 42);
131
132        StructTimespec secZero1 = new StructTimespec(0, 42);
133        StructTimespec secZero2 = new StructTimespec(0, 42);
134
135        StructTimespec nsecZero1 = new StructTimespec(23, 0);
136        StructTimespec nsecZero2 = new StructTimespec(23, 0);
137
138        // Equal objects should have same hash code
139        assertEquals(allZero1.hashCode(), allZero2.hashCode());
140        assertEquals(val1.hashCode(), val2.hashCode());
141        assertEquals(secZero1.hashCode(), secZero2.hashCode());
142        assertEquals(nsecZero1.hashCode(), nsecZero2.hashCode());
143    }
144}
145