github.com/sirkon/goproxy@v1.4.8/internal/dirhash/hash_test.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package dirhash 6 7 import ( 8 "archive/zip" 9 "crypto/sha256" 10 "encoding/base64" 11 "fmt" 12 "io" 13 "io/ioutil" 14 "os" 15 "path/filepath" 16 "strings" 17 "testing" 18 ) 19 20 func h(s string) string { 21 return fmt.Sprintf("%x", sha256.Sum256([]byte(s))) 22 } 23 24 func htop(k string, s string) string { 25 sum := sha256.Sum256([]byte(s)) 26 return k + ":" + base64.StdEncoding.EncodeToString(sum[:]) 27 } 28 29 func TestHash1(t *testing.T) { 30 files := []string{"xyz", "abc"} 31 open := func(name string) (io.ReadCloser, error) { 32 return ioutil.NopCloser(strings.NewReader("data for " + name)), nil 33 } 34 want := htop("h1", fmt.Sprintf("%s %s\n%s %s\n", h("data for abc"), "abc", h("data for xyz"), "xyz")) 35 out, err := Hash1(files, open) 36 if err != nil { 37 t.Fatal(err) 38 } 39 if out != want { 40 t.Errorf("Hash1(...) = %s, want %s", out, want) 41 } 42 43 _, err = Hash1([]string{"xyz", "a\nbc"}, open) 44 if err == nil { 45 t.Error("Hash1: expected error on newline in filenames") 46 } 47 } 48 49 func TestHashDir(t *testing.T) { 50 dir, err := ioutil.TempDir("", "dirhash-test-") 51 if err != nil { 52 t.Fatal(err) 53 } 54 defer os.RemoveAll(dir) 55 if err := ioutil.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil { 56 t.Fatal(err) 57 } 58 if err := ioutil.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil { 59 t.Fatal(err) 60 } 61 want := htop("h1", fmt.Sprintf("%s %s\n%s %s\n", h("data for abc"), "prefix/abc", h("data for xyz"), "prefix/xyz")) 62 out, err := HashDir(dir, "prefix", Hash1) 63 if err != nil { 64 t.Fatalf("HashDir: %v", err) 65 } 66 if out != want { 67 t.Errorf("HashDir(...) = %s, want %s", out, want) 68 } 69 } 70 71 func TestHashZip(t *testing.T) { 72 f, err := ioutil.TempFile("", "dirhash-test-") 73 if err != nil { 74 t.Fatal(err) 75 } 76 defer os.Remove(f.Name()) 77 defer f.Close() 78 79 z := zip.NewWriter(f) 80 w, err := z.Create("prefix/xyz") 81 if err != nil { 82 t.Fatal(err) 83 } 84 w.Write([]byte("data for xyz")) 85 w, err = z.Create("prefix/abc") 86 if err != nil { 87 t.Fatal(err) 88 } 89 w.Write([]byte("data for abc")) 90 if err := z.Close(); err != nil { 91 t.Fatal(err) 92 } 93 if err := f.Close(); err != nil { 94 t.Fatal(err) 95 } 96 97 want := htop("h1", fmt.Sprintf("%s %s\n%s %s\n", h("data for abc"), "prefix/abc", h("data for xyz"), "prefix/xyz")) 98 out, err := HashZip(f.Name(), Hash1) 99 if err != nil { 100 t.Fatalf("HashDir: %v", err) 101 } 102 if out != want { 103 t.Errorf("HashDir(...) = %s, want %s", out, want) 104 } 105 } 106 107 func TestDirFiles(t *testing.T) { 108 dir, err := ioutil.TempDir("", "dirfiles-test-") 109 if err != nil { 110 t.Fatal(err) 111 } 112 defer os.RemoveAll(dir) 113 if err := ioutil.WriteFile(filepath.Join(dir, "xyz"), []byte("data for xyz"), 0666); err != nil { 114 t.Fatal(err) 115 } 116 if err := ioutil.WriteFile(filepath.Join(dir, "abc"), []byte("data for abc"), 0666); err != nil { 117 t.Fatal(err) 118 } 119 if err := os.Mkdir(filepath.Join(dir, "subdir"), 0777); err != nil { 120 t.Fatal(err) 121 } 122 if err := ioutil.WriteFile(filepath.Join(dir, "subdir", "xyz"), []byte("data for subdir xyz"), 0666); err != nil { 123 t.Fatal(err) 124 } 125 prefix := "foo/bar@v2.3.4" 126 out, err := DirFiles(dir, prefix) 127 if err != nil { 128 t.Fatalf("DirFiles: %v", err) 129 } 130 for _, file := range out { 131 if !strings.HasPrefix(file, prefix) { 132 t.Errorf("Dir file = %s, want prefix %s", file, prefix) 133 } 134 } 135 }