1   /* Copyright 2002-2025 CS GROUP
2    * Licensed to CS GROUP (CS) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * CS licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *   http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.orekit.data;
18  
19  import org.junit.jupiter.api.Assertions;
20  import org.junit.jupiter.api.Test;
21  
22  import java.io.BufferedReader;
23  import java.io.File;
24  import java.io.IOException;
25  import java.io.InputStream;
26  import java.io.InputStreamReader;
27  import java.io.Reader;
28  import java.net.URISyntaxException;
29  import java.net.URL;
30  import java.nio.charset.StandardCharsets;
31  import java.nio.file.Path;
32  import java.nio.file.Paths;
33  
34  public class DataSourceTest {
35  
36      @Test
37      public void testNullStream() throws IOException {
38          DataSource ds = new DataSource("non-existent", () -> (InputStream) null);
39          Assertions.assertEquals("non-existent", ds.getName());
40          Assertions.assertNull(ds.getOpener().openStreamOnce());
41          Assertions.assertNull(ds.getOpener().openReaderOnce());
42      }
43  
44      @Test
45      public void testNullReader() throws IOException {
46          DataSource ds = new DataSource("non-existent", () -> (Reader) null);
47          Assertions.assertEquals("non-existent", ds.getName());
48          Assertions.assertNull(ds.getOpener().openStreamOnce());
49          Assertions.assertNull(ds.getOpener().openReaderOnce());
50      }
51  
52      @Test
53      public void testFileName() throws IOException, URISyntaxException {
54          URL url = DirectoryCrawlerTest.class.getClassLoader().getResource("regular-data/UTC-TAI.history");
55          Path nameWithPath = Paths.get(url.toURI());
56          Assertions.assertTrue(nameWithPath.endsWith("regular-data/UTC-TAI.history"));
57          DataSource ds = new DataSource(nameWithPath.toString());
58          Assertions.assertEquals("UTC-TAI.history", ds.getName());
59          Assertions.assertTrue(ds.getOpener().rawDataIsBinary());
60          try (InputStream       is  = ds.getOpener().openStreamOnce();
61               InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
62               BufferedReader    br  = new BufferedReader(isr)) {
63              checkHistory(br);
64          }
65      }
66  
67      @Test
68      public void testFile() throws IOException, URISyntaxException {
69          URL url = DirectoryCrawlerTest.class.getClassLoader().getResource("regular-data/UTC-TAI.history");
70          DataSource ds = new DataSource(new File(url.toURI().getPath()));
71          Assertions.assertTrue(ds.getName().endsWith("UTC-TAI.history"));
72          Assertions.assertTrue(ds.getOpener().rawDataIsBinary());
73          try (InputStream       is  = ds.getOpener().openStreamOnce();
74               InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
75               BufferedReader    br  = new BufferedReader(isr)) {
76              checkHistory(br);
77          }
78      }
79  
80      @Test
81      public void testUri() throws IOException, URISyntaxException {
82          URL url = DirectoryCrawlerTest.class.getClassLoader().getResource("regular-data/UTC-TAI.history");
83          DataSource ds = new DataSource(url.toURI());
84          Assertions.assertTrue(ds.getName().endsWith("UTC-TAI.history"));
85          Assertions.assertTrue(ds.getOpener().rawDataIsBinary());
86          try (InputStream       is  = ds.getOpener().openStreamOnce();
87               InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
88               BufferedReader    br  = new BufferedReader(isr)) {
89              checkHistory(br);
90          }
91      }
92  
93      @Test
94      public void testDirectInputStream() throws IOException {
95          DataSource ds = new DataSource("UTC-TAI.history",
96                                         () -> DataSourceTest.class.
97                                               getClassLoader().
98                                               getResourceAsStream("regular-data/UTC-TAI.history"));
99          Assertions.assertEquals("UTC-TAI.history", ds.getName());
100         Assertions.assertTrue(ds.getOpener().rawDataIsBinary());
101         try (InputStream       is  = ds.getOpener().openStreamOnce();
102              InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
103              BufferedReader    br  = new BufferedReader(isr)) {
104             checkHistory(br);
105         }
106     }
107 
108     @Test
109     public void testInputStreamToReader() throws IOException {
110         DataSource ds = new DataSource("UTC-TAI.history",
111                                        () -> DataSourceTest.class.
112                                              getClassLoader().
113                                              getResourceAsStream("regular-data/UTC-TAI.history"));
114         Assertions.assertEquals("UTC-TAI.history", ds.getName());
115         Assertions.assertTrue(ds.getOpener().rawDataIsBinary());
116         try (Reader         r  = ds.getOpener().openReaderOnce();
117              BufferedReader br = new BufferedReader(r)) {
118             checkHistory(br);
119         }
120     }
121 
122     @Test
123     public void testDirectReader() throws IOException {
124         DataSource ds = new DataSource("UTC-TAI.history",
125                                        () -> new InputStreamReader(DataSourceTest.class.
126                                                                    getClassLoader().
127                                                                    getResourceAsStream("regular-data/UTC-TAI.history"),
128                                                                    StandardCharsets.UTF_8));
129         Assertions.assertEquals("UTC-TAI.history", ds.getName());
130         Assertions.assertFalse(ds.getOpener().rawDataIsBinary());
131         try (Reader         r  = ds.getOpener().openReaderOnce();
132              BufferedReader br = new BufferedReader(r)) {
133             checkHistory(br);
134         }
135     }
136 
137     @Test
138     public void testReaderToInputStream() throws IOException {
139         DataSource ds = new DataSource("UTC-TAI.history",
140                                        () -> new InputStreamReader(DataSourceTest.class.
141                                                                    getClassLoader().
142                                                                    getResourceAsStream("regular-data/UTC-TAI.history"),
143                                                                    StandardCharsets.UTF_8));
144         Assertions.assertEquals("UTC-TAI.history", ds.getName());
145         Assertions.assertFalse(ds.getOpener().rawDataIsBinary());
146         try (InputStream       is  = ds.getOpener().openStreamOnce();
147              InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
148              BufferedReader    br  = new BufferedReader(isr)) {
149             checkHistory(br);
150         }
151     }
152 
153     private void checkHistory(final BufferedReader br) throws IOException {
154         Assertions.assertEquals("", br.readLine());
155         Assertions.assertEquals(" ---------------", br.readLine());
156         Assertions.assertEquals(" UTC-TAI.history", br.readLine());
157         Assertions.assertEquals(" ---------------", br.readLine());
158         Assertions.assertEquals(" RELATIONSHIP BETWEEN TAI AND UTC", br.readLine());
159         for (int lineNumber = 6; lineNumber < 48; ++lineNumber) {
160             br.readLine();
161         }
162         Assertions.assertEquals(" 2015  Jul   1 - 2017  Jan   1    36s", br.readLine());
163         Assertions.assertEquals(" 2017  Jan   1 -                  37s", br.readLine());
164         Assertions.assertEquals(" ----------------------------------------------------------------------", br.readLine());
165         Assertions.assertNull(br.readLine());
166     }
167 
168 }