OSDN Git Service

green: 出力されたファイルのEXIF日時が書き換わっていることを確認しました
[importpicture/importpicture.git] / importPicture / test / osm / jp / gpx / ImportPictureTest.java
1 package osm.jp.gpx;
2
3 import static org.hamcrest.CoreMatchers.is;
4 import static org.junit.Assert.*;
5
6 import java.io.BufferedInputStream;
7 import java.io.BufferedOutputStream;
8 import java.io.File;
9 import java.io.FileInputStream;
10 import java.io.FileOutputStream;
11 import java.io.IOException;
12 import java.nio.channels.FileChannel;
13
14 import org.apache.commons.compress.archivers.tar.TarArchiveEntry;
15 import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
16 import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream;
17 import org.apache.commons.imaging.Imaging;
18 import org.apache.commons.imaging.common.ImageMetadata;
19 import org.apache.commons.imaging.formats.jpeg.JpegImageMetadata;
20 import org.apache.commons.imaging.formats.tiff.TiffImageMetadata;
21 import org.apache.commons.imaging.formats.tiff.constants.ExifTagConstants;
22 import org.junit.runner.*;
23 import org.junit.experimental.theories.DataPoints;
24 import org.junit.experimental.theories.Theories;
25 import org.junit.experimental.theories.Theory;
26
27 @RunWith(Theories.class)
28 public class ImportPictureTest {
29         static class Expecter {
30                 String value;
31                 boolean expect;
32                 String timeStr;
33                 boolean magver;
34                 
35                 public Expecter(String value, boolean expect, String timeStr, boolean magver){
36                         this.value = value;
37                         this.expect = expect;
38                         this.timeStr = timeStr;
39                         this.magver = magver;
40                 }
41         }
42
43         static class Fixture {
44                 String comment;                         // テスト概要(コメント)
45                 String tarFilePath;                     // TARデータ
46                 String gpxSourcePath;           // GPXファイル(オリジナル)
47                 String gpxDestinationPath;      // GPXファイル(配置先)
48                 String iniFilePath;                     // iniファイル
49                 Expecter[] expecters;
50                 
51                 public Fixture(
52                                 String comment,
53                                 String tarFilePath,
54                                 String gpxSourcePath,
55                                 String gpxDestinationPath,
56                                 String iniFilePath,
57                                 Expecter[] expecters
58                 ) {
59                         this.comment = comment;
60                         this.tarFilePath = tarFilePath;
61                         this.gpxSourcePath = gpxSourcePath;
62                         this.gpxDestinationPath = gpxDestinationPath;
63                         this.iniFilePath = iniFilePath;
64                         this.expecters = expecters;
65                 }
66                 
67                 public String toString() {
68                         String msg = "テストパターン : "+ comment + "\n";
69                         msg += "\ttarFilePath = "+ tarFilePath +"\n";
70                         msg += "\tgpxSourcePath = "+ gpxSourcePath +"\n";
71                         msg += "\tgpxDestinationPath = "+ gpxDestinationPath +"\n";
72                         msg += "\tiniFilePath = "+ iniFilePath;
73                         return msg;
74                 }
75         }
76
77         @DataPoints
78         public static Fixture[] datas = {
79                         new Fixture(
80                                         "[A1].SONYカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルはコピー対象外の時",
81                                         "testdata/Sony20170518.tar.gz", 
82                                         "testdata/20170518.gpx",
83                                         "testdata/cameradata/20170518.gpx",
84                                         "testdata/AdjustTime.20170518.A1.ini",
85                                         new Expecter[] {
86                                                 new Expecter("10170518/20170518_.gpx", true, null, true),
87                                                 new Expecter("10170518/DSC05183.JPG", false, null, false),
88                                                 new Expecter("10170518/DSC05184.JPG", true, "2017:05:18 00:34:44", true),
89                                                 new Expecter("10170518/DSC05196.JPG", true, "2017:05:18 00:37:32", true),
90                                                 new Expecter("10170518/DSC05204.JPG", true, "2017:05:18 00:46:48", true),
91                                                 new Expecter("10170518/DSC05205.JPG", false, null, false),
92                                         }),
93                         new Fixture(
94                                         "[A2].SONYカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルもコピーする時",
95                                         "testdata/Sony20170518.tar.gz", 
96                                         "testdata/20170518.gpx",
97                                         "testdata/cameradata/20170518.gpx",
98                                         "testdata/AdjustTime.20170518.A2.ini",
99                                         new Expecter[] {
100                                                 new Expecter("10170518/20170518_.gpx", true, null, true),
101                                                 new Expecter("10170518/DSC05183.JPG", true, "2017:05:18 00:16:48", true),
102                                                 new Expecter("10170518/DSC05184.JPG", true, "2017:05:18 00:34:44", true),
103                                                 new Expecter("10170518/DSC05196.JPG", true, "2017:05:18 00:37:32", true),
104                                                 new Expecter("10170518/DSC05204.JPG", true, "2017:05:18 00:46:48", true),
105                                                 new Expecter("10170518/DSC05205.JPG", true, "2017:05:18 00:48:04", true),
106                                         }),
107                         
108                         new Fixture(
109                                         "[B1].WiMiUSカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルはコピー対象外の時",
110                                         "testdata/WiMiUS20170518.tar.gz", 
111                                         "testdata/20170518.gpx",
112                                         "testdata/cameradata/20170518.gpx",
113                                         "testdata/AdjustTime.20170518.B1.ini",
114                                         new Expecter[] {
115                                                 new Expecter("cameradata/20170518_.gpx", true, null, true),
116                                                 new Expecter("cameradata/20170518_092031A.jpg", false, null, false),
117                                                 new Expecter("cameradata/20170518_094226A_snap.jpg", true, "2017:05:18 00:42:26", true),
118                                                 new Expecter("cameradata/20170518_094737A.jpg", true, "2017:05:18 00:47:36", true),
119                                                 new Expecter("cameradata/20170518_094827A.jpg", false, null, false),
120                                         }),
121
122                         new Fixture(
123                                         "[B2].WiMiUSカメラの場合.FILE_UPDATE時間を基準にして時間外のファイルもコピーする時",
124                                         "testdata/WiMiUS20170518.tar.gz", 
125                                         "testdata/20170518.gpx",
126                                         "testdata/cameradata/20170518.gpx",
127                                         "testdata/AdjustTime.20170518.B2.ini",
128                                         new Expecter[] {
129                                                 new Expecter("cameradata/20170518_.gpx", true, null, true),
130                                                 new Expecter("cameradata/20170518_092031A.jpg", true, "2017:05:18 00:20:30", true),
131                                                 new Expecter("cameradata/20170518_094226A_snap.jpg", true, "2017:05:18 00:42:26", true),
132                                                 new Expecter("cameradata/20170518_094737A.jpg", true, "2017:05:18 00:47:36", true),
133                                                 new Expecter("cameradata/20170518_094827A.jpg", true, "2017:05:18 00:48:26", true),
134                                         }),
135                         
136                         new Fixture(
137                                         "[M1a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.GarminColorado",
138                                         "testdata/separate.tar.gz",
139                                         "testdata/muiltiTRK.GarminColorado.gpx.xml",
140                                         "testdata/cameradata/separate.gpx",
141                                         "testdata/AdjustTime.M1a.separate.ini",
142                                         new Expecter[] {
143                                         // GPX file
144                                                 new Expecter("separate/separate_.gpx", true, null, true),
145                                     
146                                     // out of time ( - 2017-05-29T01:23:18)
147                                                 new Expecter("separate/20170529_102305A.jpg", false, null, false),
148                                                 new Expecter("separate/20170529_102314A.jpg", false, null, false),
149                                     
150                                     // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
151                                                 new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
152                                                 new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
153                                                 new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
154
155                                     // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
156                                                 new Expecter("separate/20170529_102409A.jpg", false, null, false),
157                                                 new Expecter("separate/20170529_102418A.jpg", false, null, false),
158
159                                     // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
160                                                 new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
161                                                 new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
162
163                                     // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
164                                                 new Expecter("separate/20170529_103315A.jpg", false, null, false),
165                                                 new Expecter("separate/20170529_103545A.jpg", false, null, false),
166
167                                     // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
168                                                 new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
169                                                 new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
170                                         }),
171
172                         new Fixture(
173                                         "[M1b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.GarminColorado",
174                                         "testdata/separate.tar.gz", 
175                                         "testdata/muiltiTRK.GarminColorado.gpx.xml",
176                                         "testdata/cameradata/separate.gpx",
177                                         "testdata/AdjustTime.M1b.separate.ini",
178                                         new Expecter[] {
179                                                 // GPX file
180                                                         new Expecter("separate/separate_.gpx", true, null, true),
181                                             
182                                             // out of time ( - 2017-05-29T01:23:18)
183                                                         new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
184                                                         new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
185                                             
186                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
187                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
188                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
189                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
190
191                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
192                                                         new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
193                                                         new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
194
195                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
196                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
197                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
198
199                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
200                                                         new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
201                                                         new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
202
203                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
204                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
205                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
206                                         }),
207
208                         new Fixture(
209                                         "[M1c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.GarminColorado",
210                                         "testdata/separate.tar.gz", 
211                                         "testdata/muiltiTRK.GarminColorado.gpx.xml",
212                                         "testdata/cameradata/separate.gpx",
213                                         "testdata/AdjustTime.M1c.separate.ini",
214                                         new Expecter[] {
215                                                 // GPX file
216                                                         new Expecter("separate/separate_.gpx", true, null, true),
217                                             
218                                             // out of time ( - 2017-05-29T01:23:18)
219                                                         new Expecter("separate/20170529_102305A.jpg", false, null, false),
220                                                         new Expecter("separate/20170529_102314A.jpg", false, null, false),
221                                             
222                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
223                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
224                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
225                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
226
227                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
228                                                         new Expecter("separate/20170529_102409A.jpg", false, null, false),
229                                                         new Expecter("separate/20170529_102418A.jpg", false, null, false),
230
231                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
232                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
233                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
234
235                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
236                                                         new Expecter("separate/20170529_103315A.jpg", false, null, false),
237                                                         new Expecter("separate/20170529_103545A.jpg", false, null, false),
238
239                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
240                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
241                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
242                                         }),
243
244                         new Fixture(
245                                         "[M1d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.GarminColorado",
246                                         "testdata/separate.tar.gz", 
247                                         "testdata/muiltiTRK.GarminColorado.gpx.xml",
248                                         "testdata/cameradata/separate.gpx",
249                                         "testdata/AdjustTime.M1d.separate.ini",
250                                         new Expecter[] {
251                                                 // GPX file
252                                                         new Expecter("separate/separate_.gpx", true, null, true),
253                                             
254                                             // out of time ( - 2017-05-29T01:23:18)
255                                                         new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
256                                                         new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
257                                             
258                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
259                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
260                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
261                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
262
263                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
264                                                         new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
265                                                         new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
266
267                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
268                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
269                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
270
271                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
272                                                         new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
273                                                         new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
274
275                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
276                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
277                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
278                                         }),
279
280                         
281                         new Fixture(
282                                         "[M2a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20J",
283                                         "testdata/separate.tar.gz", 
284                                         "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
285                                         "testdata/cameradata/separate.gpx",
286                                         "testdata/AdjustTime.M2a.separate.ini",
287                                         new Expecter[] {
288                                                 // GPX file
289                                                         new Expecter("separate/separate_.gpx", true, null, true),
290                                             
291                                             // out of time ( - 2017-05-29T01:23:18)
292                                                         new Expecter("separate/20170529_102305A.jpg", false, null, false),
293                                                         new Expecter("separate/20170529_102314A.jpg", false, null, false),
294                                             
295                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
296                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
297                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
298                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
299
300                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
301                                                         new Expecter("separate/20170529_102409A.jpg", false, null, false),
302                                                         new Expecter("separate/20170529_102418A.jpg", false, null, false),
303
304                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
305                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
306                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
307
308                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
309                                                         new Expecter("separate/20170529_103315A.jpg", false, null, false),
310                                                         new Expecter("separate/20170529_103545A.jpg", false, null, false),
311
312                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
313                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
314                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
315                                         }),
316
317                         new Fixture(
318                                         "[M2b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20J",
319                                         "testdata/separate.tar.gz", 
320                                         "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
321                                         "testdata/cameradata/separate.gpx",
322                                         "testdata/AdjustTime.M2b.separate.ini",
323                                         new Expecter[] {
324                                                 // GPX file
325                                                         new Expecter("separate/separate_.gpx", true, null, true),
326                                             
327                                             // out of time ( - 2017-05-29T01:23:18)
328                                                         new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
329                                                         new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
330                                             
331                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
332                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
333                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
334                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
335
336                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
337                                                         new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
338                                                         new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
339
340                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
341                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
342                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
343
344                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
345                                                         new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
346                                                         new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
347
348                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
349                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
350                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
351                                         }),
352
353                         new Fixture(
354                                         "[M2c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20J",
355                                         "testdata/separate.tar.gz", 
356                                         "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
357                                         "testdata/cameradata/separate.gpx",
358                                         "testdata/AdjustTime.M2c.separate.ini",
359                                         new Expecter[] {
360                                                 // GPX file
361                                                         new Expecter("separate/separate_.gpx", true, null, true),
362                                             
363                                             // out of time ( - 2017-05-29T01:23:18)
364                                                         new Expecter("separate/20170529_102305A.jpg", false, null, false),
365                                                         new Expecter("separate/20170529_102314A.jpg", false, null, false),
366                                             
367                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
368                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
369                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
370                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
371
372                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
373                                                         new Expecter("separate/20170529_102409A.jpg", false, null, false),
374                                                         new Expecter("separate/20170529_102418A.jpg", false, null, false),
375
376                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
377                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
378                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
379
380                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
381                                                         new Expecter("separate/20170529_103315A.jpg", false, null, false),
382                                                         new Expecter("separate/20170529_103545A.jpg", false, null, false),
383
384                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
385                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
386                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
387                                         }),
388
389                         new Fixture(
390                                         "[M2d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20J",
391                                         "testdata/separate.tar.gz", 
392                                         "testdata/multiTRKSEG.eTrex_20J.gpx.xml",
393                                         "testdata/cameradata/separate.gpx",
394                                         "testdata/AdjustTime.M2d.separate.ini",
395                                         new Expecter[] {
396                                                 // GPX file
397                                                         new Expecter("separate/separate_.gpx", true, null, true),
398                                             
399                                             // out of time ( - 2017-05-29T01:23:18)
400                                                         new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
401                                                         new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
402                                             
403                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
404                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
405                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
406                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
407
408                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
409                                                         new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
410                                                         new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
411
412                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
413                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
414                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
415
416                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
417                                                         new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
418                                                         new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
419
420                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
421                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
422                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
423                                         }),
424                         
425                         new Fixture(
426                                         "[M3a].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20Jreverse",
427                                         "testdata/separate.tar.gz", 
428                                         "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
429                                         "testdata/cameradata/separate.gpx",
430                                         "testdata/AdjustTime.M2a.separate.ini",
431                                         new Expecter[] {
432                                                 // GPX file
433                                                         new Expecter("separate/separate_.gpx", true, null, true),
434                                             
435                                             // out of time ( - 2017-05-29T01:23:18)
436                                                         new Expecter("separate/20170529_102305A.jpg", false, null, false),
437                                                         new Expecter("separate/20170529_102314A.jpg", false, null, false),
438                                             
439                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
440                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
441                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
442                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
443
444                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
445                                                         new Expecter("separate/20170529_102409A.jpg", false, null, false),
446                                                         new Expecter("separate/20170529_102418A.jpg", false, null, false),
447
448                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
449                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
450                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
451
452                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
453                                                         new Expecter("separate/20170529_103315A.jpg", false, null, false),
454                                                         new Expecter("separate/20170529_103545A.jpg", false, null, false),
455
456                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
457                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
458                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
459                                         }),
460
461                         new Fixture(
462                                         "[M3b].GPXが複数のTRKSEGに分割している場合.FILE_UPDATE時間を基準.eTrex_20Jreverse",
463                                         "testdata/separate.tar.gz", 
464                                         "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
465                                         "testdata/cameradata/separate.gpx",
466                                         "testdata/AdjustTime.M2b.separate.ini",
467                                         new Expecter[] {
468                                                 // GPX file
469                                                         new Expecter("separate/separate_.gpx", true, null, true),
470
471                                             // out of time ( - 2017-05-29T01:23:18)
472                                                         new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:06", true),
473                                                         new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
474                                             
475                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
476                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
477                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
478                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:04",true),
479
480                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
481                                                         new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:10",true),
482                                                         new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
483
484                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
485                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
486                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
487
488                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
489                                                         new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:14",true),
490                                                         new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:44",true),
491
492                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
493                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
494                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:18",true),
495                                         }),
496
497                         new Fixture(
498                                         "[M3c].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20Jreverse",
499                                         "testdata/separate.tar.gz", 
500                                         "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
501                                         "testdata/cameradata/separate.gpx",
502                                         "testdata/AdjustTime.M2c.separate.ini",
503                                         new Expecter[] {
504                                                 // GPX file
505                                                         new Expecter("separate/separate_.gpx", true, null, true),
506                                             
507                                             // out of time ( - 2017-05-29T01:23:18)
508                                                         new Expecter("separate/20170529_102305A.jpg", false, null, false),
509                                                         new Expecter("separate/20170529_102314A.jpg", false, null, false),
510                                             
511                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
512                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
513                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
514                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
515
516                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
517                                                         new Expecter("separate/20170529_102409A.jpg", false, null, false),
518                                                         new Expecter("separate/20170529_102418A.jpg", false, null, false),
519
520                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
521                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
522                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
523
524                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
525                                                         new Expecter("separate/20170529_103315A.jpg", false, null, false),
526                                                         new Expecter("separate/20170529_103545A.jpg", false, null, false),
527
528                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
529                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
530                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
531                                         }),
532
533                         new Fixture(
534                                         "[M3d].GPXが複数のTRKSEGに分割している場合.EXIF時間を基準.eTrex_20Jreverse",
535                                         "testdata/separate.tar.gz", 
536                                         "testdata/multiTRKSEGreverse.eTrex_20J.gpx.xml",
537                                         "testdata/cameradata/separate.gpx",
538                                         "testdata/AdjustTime.M2d.separate.ini",
539                                         new Expecter[] {
540                                                 // GPX file
541                                                         new Expecter("separate/separate_.gpx", true, null, true),
542                                             
543                                             // out of time ( - 2017-05-29T01:23:18)
544                                                         new Expecter("separate/20170529_102305A.jpg", true, "2017:05:29 01:23:05", true),
545                                                         new Expecter("separate/20170529_102314A.jpg", true, "2017:05:29 01:23:14", true),
546                                             
547                                             // in TRKSEG(1) (2017-05-29T01:23:18 - 2017-05-29T01:24:05)
548                                                         new Expecter("separate/20170529_102318A.jpg", true, "2017:05:29 01:23:18",true),
549                                                         new Expecter("separate/20170529_102322A.jpg", true, "2017:05:29 01:23:22",true),
550                                                         new Expecter("separate/20170529_102405A.jpg", true, "2017:05:29 01:24:05",true),
551
552                                             // out of time (2017-05-29T01:24:05 - 2017-05-29T01:24:37)
553                                                         new Expecter("separate/20170529_102409A.jpg", true, "2017:05:29 01:24:09",true),
554                                                         new Expecter("separate/20170529_102418A.jpg", true, "2017:05:29 01:24:18",true),
555
556                                             // in TRKSEG(2) (2017-05-29T01:24:37 - 2017-05-29T01:33:03)
557                                                         new Expecter("separate/20170529_102448A.jpg", true, "2017:05:29 01:24:48",true),
558                                                         new Expecter("separate/20170529_103246A.jpg", true, "2017:05:29 01:32:46",true),
559
560                                             // out of time (2017-05-29T01:33:03 - 2017-05-29T01:35:53)
561                                                         new Expecter("separate/20170529_103315A.jpg", true, "2017:05:29 01:33:15",true),
562                                                         new Expecter("separate/20170529_103545A.jpg", true, "2017:05:29 01:35:45",true),
563
564                                             // in TRKSEG(3) (2017-05-29T01:35:53 - 2017-05-29T01:47:35)
565                                                         new Expecter("separate/20170529_103615A.jpg", true, "2017:05:29 01:36:14",true),
566                                                         new Expecter("separate/20170529_104119A.jpg", true, "2017:05:29 01:41:19",true),
567                                         }),
568         };
569
570
571         @Theory
572         public void パラメータテスト(Fixture dataset) throws Exception {
573                 ImportPictureTest.setup(dataset);
574                 ImportPictureTest.testdo(dataset.iniFilePath);
575                 //SimpleDateFormat format = new SimpleDateFormat("yyyy:MM:dd HH:mm:ss", Locale.UK);
576                 
577                 Expecter[] es = dataset.expecters;
578                 AppParameters params = new AppParameters(dataset.iniFilePath);
579                 File outDir = new File(params.getProperty(AppParameters.IMG_OUTPUT_FOLDER));
580                 for (int i = 0; i < es.length; i++) {
581                 File file = new File(outDir, es[i].value);
582                 System.out.println("[JUnit.debug] assert file='"+ file.getAbsolutePath() +"'");
583                 assertThat(file.exists(), is(es[i].expect));
584                 if (es[i].timeStr != null) {
585                         // JPEG メタデータが存在すること
586                 ImageMetadata meta = Imaging.getMetadata(file);
587                 
588                 // メタデータは インスタンスJpegImageMetadata であること
589                 assertThat((meta instanceof JpegImageMetadata), is(true));
590                 
591                 JpegImageMetadata jpegMetadata = (JpegImageMetadata)meta;
592                 assertNotNull(jpegMetadata);
593                 
594                 // EXIFデータが存在すること
595                 TiffImageMetadata exif = jpegMetadata.getExif();
596                 assertNotNull(exif);
597                 
598                 // EXIF-TIME が正しく設定されていること
599                 String exifTime = ImportPicture.toEXIFString(ImportPicture.toEXIFDate(exif.getFieldValue(ExifTagConstants.EXIF_TAG_DATE_TIME_ORIGINAL)[0]));
600                 System.out.println("[debug] exifTime = '"+ exifTime +"' <--> '"+ es[i].timeStr +"'");
601                 assertThat(exifTime, is(es[i].timeStr));
602                 }
603                 }
604         }
605
606         static void setup(Fixture dataset) throws IOException {
607                 System.out.println(dataset.toString());
608                 
609                 // カメラディレクトリを削除する
610                 File dir = new File("testdata/cameradata");
611                 if (dir.exists()) {
612                         ImportPictureTest.delete(dir);
613                 }
614                 File outDir = new File("testdata/output");
615                 if (outDir.exists()) {
616                         ImportPictureTest.delete(outDir);
617                 }
618                 outDir.mkdir();
619
620                 // カメラディレクトリを作成する
621                 ImportPictureTest.uncompress(new File(dataset.tarFilePath), new File("testdata/cameradata"));
622                 
623                 // GPXファイルをセット
624         try (   FileInputStream inStream = new FileInputStream(new File(dataset.gpxSourcePath));
625                         FileOutputStream outStream = new FileOutputStream(new File(dataset.gpxDestinationPath));
626                 FileChannel inChannel = inStream.getChannel();
627                 FileChannel outChannel = outStream.getChannel();        )
628         {
629             inChannel.transferTo(0, inChannel.size(), outChannel);
630         }
631         }
632         
633         /**
634          * 実行する
635          * @throws Exception
636          */
637         static void testdo(String iniFilePath) {
638         try {
639                 String[] argv = new String[1];
640                 argv[0] = new String(iniFilePath);
641                 ImportPicture.main(argv);
642                 }
643                 catch (Exception e) {
644                         e.printStackTrace();
645                         fail("Exceptionが発生した。");
646                 }
647         }
648
649         /**
650      * *.tar.gz解凍
651      * ファイル更新日時をオリジナルと同じにします。
652      * @param tazFile 解凍する*.tar.gzファイル
653      * @param dest 解凍先フォルダ
654      * @throws IOException 
655      */
656     public static void uncompress(File tazFile, File dest) throws IOException {
657         dest.mkdir();
658         
659         TarArchiveInputStream tarIn = null;
660         tarIn = new TarArchiveInputStream(new GzipCompressorInputStream(new BufferedInputStream(new FileInputStream(tazFile))));
661
662         TarArchiveEntry tarEntry = tarIn.getNextTarEntry();
663         while (tarEntry != null) {
664             File destPath = new File(dest, tarEntry.getName());
665             //System.out.println("uncompress: " + destPath.getCanonicalPath());
666             if (tarEntry.isDirectory()) {
667                 destPath.mkdirs();
668             }
669             else {
670                 File dir = new File(destPath.getParent());
671                 if (!dir.exists()) {
672                         dir.mkdirs();
673                 }
674                 destPath.createNewFile();
675                 byte[] btoRead = new byte[1024];
676                 BufferedOutputStream bout = new BufferedOutputStream(new FileOutputStream(destPath));
677                 int len = 0;
678
679                 while ((len = tarIn.read(btoRead)) != -1) {
680                     bout.write(btoRead, 0, len);
681                 }
682
683                 bout.close();
684                 destPath.setLastModified(tarEntry.getLastModifiedDate().getTime());
685                 btoRead = null;
686             }
687             tarEntry = tarIn.getNextTarEntry();
688         }
689         tarIn.close();
690     }
691
692     public static void delete(File file) throws IOException {
693         if (!file.exists()) {
694             System.out.println("ERROR: ファイルまたはディレクトリが見つかりませんでした。");
695             throw new IOException("File not found.");
696         }
697         
698         if (file.isDirectory()) {
699             File files[] = file.listFiles();
700             if (files != null) {
701                 for (int i=0; i < files.length; i++) {
702                     delete(files[i]);    // 再帰呼び出し
703                 }
704             }
705         }
706         if (!file.delete()) {
707                         System.out.println("ERROR: ファイルは削除できませんでした。 '" + file.getAbsolutePath() +"'");
708         }
709         return;
710     }
711 }