1// Go support for Protocol Buffers - Google's data interchange format 2// 3// Copyright 2012 The Go Authors. All rights reserved. 4// https://github.com/golang/protobuf 5// 6// Redistribution and use in source and binary forms, with or without 7// modification, are permitted provided that the following conditions are 8// met: 9// 10// * Redistributions of source code must retain the above copyright 11// notice, this list of conditions and the following disclaimer. 12// * Redistributions in binary form must reproduce the above 13// copyright notice, this list of conditions and the following disclaimer 14// in the documentation and/or other materials provided with the 15// distribution. 16// * Neither the name of Google Inc. nor the names of its 17// contributors may be used to endorse or promote products derived from 18// this software without specific prior written permission. 19// 20// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 23// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 24// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 25// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 26// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 30// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 32// Verify that the compiler output for test.proto is unchanged. 33 34package testdata 35 36import ( 37 "crypto/sha1" 38 "fmt" 39 "io/ioutil" 40 "os" 41 "os/exec" 42 "path/filepath" 43 "testing" 44) 45 46// sum returns in string form (for easy comparison) the SHA-1 hash of the named file. 47func sum(t *testing.T, name string) string { 48 data, err := ioutil.ReadFile(name) 49 if err != nil { 50 t.Fatal(err) 51 } 52 t.Logf("sum(%q): length is %d", name, len(data)) 53 hash := sha1.New() 54 _, err = hash.Write(data) 55 if err != nil { 56 t.Fatal(err) 57 } 58 return fmt.Sprintf("% x", hash.Sum(nil)) 59} 60 61func run(t *testing.T, name string, args ...string) { 62 cmd := exec.Command(name, args...) 63 cmd.Stdin = os.Stdin 64 cmd.Stdout = os.Stdout 65 cmd.Stderr = os.Stderr 66 err := cmd.Run() 67 if err != nil { 68 t.Fatal(err) 69 } 70} 71 72func TestGolden(t *testing.T) { 73 // Compute the original checksum. 74 goldenSum := sum(t, "test.pb.go") 75 // Run the proto compiler. 76 run(t, "protoc", "--go_out="+os.TempDir(), "test.proto") 77 newFile := filepath.Join(os.TempDir(), "test.pb.go") 78 defer os.Remove(newFile) 79 // Compute the new checksum. 80 newSum := sum(t, newFile) 81 // Verify 82 if newSum != goldenSum { 83 run(t, "diff", "-u", "test.pb.go", newFile) 84 t.Fatal("Code generated by protoc-gen-go has changed; update test.pb.go") 85 } 86} 87