exif_test.go (3316B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package exif 15 16 import ( 17 "encoding/json" 18 "math/big" 19 "os" 20 "path/filepath" 21 "testing" 22 "time" 23 24 "github.com/gohugoio/hugo/htesting/hqt" 25 "github.com/google/go-cmp/cmp" 26 27 qt "github.com/frankban/quicktest" 28 ) 29 30 func TestExif(t *testing.T) { 31 c := qt.New(t) 32 f, err := os.Open(filepath.FromSlash("../../testdata/sunset.jpg")) 33 c.Assert(err, qt.IsNil) 34 defer f.Close() 35 36 d, err := NewDecoder(IncludeFields("Lens|Date")) 37 c.Assert(err, qt.IsNil) 38 x, err := d.Decode(f) 39 c.Assert(err, qt.IsNil) 40 c.Assert(x.Date.Format("2006-01-02"), qt.Equals, "2017-10-27") 41 42 // Malaga: https://goo.gl/taazZy 43 c.Assert(x.Lat, qt.Equals, float64(36.59744166666667)) 44 c.Assert(x.Long, qt.Equals, float64(-4.50846)) 45 46 v, found := x.Tags["LensModel"] 47 c.Assert(found, qt.Equals, true) 48 lensModel, ok := v.(string) 49 c.Assert(ok, qt.Equals, true) 50 c.Assert(lensModel, qt.Equals, "smc PENTAX-DA* 16-50mm F2.8 ED AL [IF] SDM") 51 52 v, found = x.Tags["DateTime"] 53 c.Assert(found, qt.Equals, true) 54 c.Assert(v, hqt.IsSameType, time.Time{}) 55 56 // Verify that it survives a round-trip to JSON and back. 57 data, err := json.Marshal(x) 58 c.Assert(err, qt.IsNil) 59 x2 := &ExifInfo{} 60 err = json.Unmarshal(data, x2) 61 62 c.Assert(x2, eq, x) 63 } 64 65 func TestExifPNG(t *testing.T) { 66 c := qt.New(t) 67 68 f, err := os.Open(filepath.FromSlash("../../testdata/gohugoio.png")) 69 c.Assert(err, qt.IsNil) 70 defer f.Close() 71 72 d, err := NewDecoder() 73 c.Assert(err, qt.IsNil) 74 _, err = d.Decode(f) 75 c.Assert(err, qt.Not(qt.IsNil)) 76 } 77 78 func TestIssue8079(t *testing.T) { 79 c := qt.New(t) 80 81 f, err := os.Open(filepath.FromSlash("../../testdata/iss8079.jpg")) 82 c.Assert(err, qt.IsNil) 83 defer f.Close() 84 85 d, err := NewDecoder() 86 c.Assert(err, qt.IsNil) 87 x, err := d.Decode(f) 88 c.Assert(err, qt.IsNil) 89 c.Assert(x.Tags["ImageDescription"], qt.Equals, "Città del Vaticano #nanoblock #vatican #vaticancity") 90 } 91 92 func TestNullString(t *testing.T) { 93 c := qt.New(t) 94 95 for _, test := range []struct { 96 in string 97 expect string 98 }{ 99 {"foo", "foo"}, 100 {"\x20", "\x20"}, 101 {"\xc4\x81", "\xc4\x81"}, // \u0101 102 {"\u0160", "\u0160"}, // non-breaking space 103 } { 104 res := nullString([]byte(test.in)) 105 c.Assert(res, qt.Equals, test.expect) 106 } 107 } 108 109 func BenchmarkDecodeExif(b *testing.B) { 110 c := qt.New(b) 111 f, err := os.Open(filepath.FromSlash("../../testdata/sunset.jpg")) 112 c.Assert(err, qt.IsNil) 113 defer f.Close() 114 115 d, err := NewDecoder() 116 c.Assert(err, qt.IsNil) 117 118 b.ResetTimer() 119 for i := 0; i < b.N; i++ { 120 _, err = d.Decode(f) 121 c.Assert(err, qt.IsNil) 122 f.Seek(0, 0) 123 } 124 } 125 126 var eq = qt.CmpEquals( 127 cmp.Comparer( 128 func(v1, v2 *big.Rat) bool { 129 return v1.RatString() == v2.RatString() 130 }, 131 ), 132 cmp.Comparer(func(v1, v2 time.Time) bool { 133 return v1.Unix() == v2.Unix() 134 }), 135 )