From fa8e9cc3a19c60e36945432fa8eece5a4a12c112 Mon Sep 17 00:00:00 2001 From: Colin Cross Date: Tue, 12 Apr 2022 17:26:58 -0700 Subject: [PATCH] sbox: fix typo when comparing files A typo caused one of the two files to be compared to itself if they both had the same size. Bug: 228496289 Test: Test_filesHaveSameContents Change-Id: Ie44f32e3c9b8ef725f0d9933c7e701340036710a --- cmd/sbox/sbox.go | 2 +- cmd/sbox/sbox_test.go | 127 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 128 insertions(+), 1 deletion(-) create mode 100644 cmd/sbox/sbox_test.go diff --git a/cmd/sbox/sbox.go b/cmd/sbox/sbox.go index 03ce2d522..4f7451d0c 100644 --- a/cmd/sbox/sbox.go +++ b/cmd/sbox/sbox.go @@ -750,7 +750,7 @@ func filesHaveSameContents(a, b string) bool { return false } defer fileA.Close() - fileB, err := os.Open(a) + fileB, err := os.Open(b) if err != nil { return false } diff --git a/cmd/sbox/sbox_test.go b/cmd/sbox/sbox_test.go new file mode 100644 index 000000000..3f13d2f1a --- /dev/null +++ b/cmd/sbox/sbox_test.go @@ -0,0 +1,127 @@ +// Copyright 2022 Google Inc. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package main + +import ( + "io/ioutil" + "os" + "path/filepath" + "strings" + "testing" +) + +func Test_filesHaveSameContents(t *testing.T) { + + tests := []struct { + name string + a string + b string + missingA bool + missingB bool + + equal bool + }{ + { + name: "empty", + a: "", + b: "", + equal: true, + }, + { + name: "equal", + a: "foo", + b: "foo", + equal: true, + }, + { + name: "unequal", + a: "foo", + b: "bar", + equal: false, + }, + { + name: "unequal different sizes", + a: "foo", + b: "foobar", + equal: false, + }, + { + name: "equal large", + a: strings.Repeat("a", 2*1024*1024), + b: strings.Repeat("a", 2*1024*1024), + equal: true, + }, + { + name: "equal large unaligned", + a: strings.Repeat("a", 2*1024*1024+10), + b: strings.Repeat("a", 2*1024*1024+10), + equal: true, + }, + { + name: "unequal large", + a: strings.Repeat("a", 2*1024*1024), + b: strings.Repeat("a", 2*1024*1024-1) + "b", + equal: false, + }, + { + name: "unequal large unaligned", + a: strings.Repeat("a", 2*1024*1024+10), + b: strings.Repeat("a", 2*1024*1024+9) + "b", + equal: false, + }, + { + name: "missing a", + missingA: true, + b: "foo", + equal: false, + }, + { + name: "missing b", + a: "foo", + missingB: true, + equal: false, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + tempDir, err := os.MkdirTemp("", "testFilesHaveSameContents") + if err != nil { + t.Fatalf("failed to create temp dir: %s", err) + } + defer os.RemoveAll(tempDir) + + fileA := filepath.Join(tempDir, "a") + fileB := filepath.Join(tempDir, "b") + + if !tt.missingA { + err := ioutil.WriteFile(fileA, []byte(tt.a), 0666) + if err != nil { + t.Fatalf("failed to write %s: %s", fileA, err) + } + } + + if !tt.missingB { + err := ioutil.WriteFile(fileB, []byte(tt.b), 0666) + if err != nil { + t.Fatalf("failed to write %s: %s", fileB, err) + } + } + + if got := filesHaveSameContents(fileA, fileB); got != tt.equal { + t.Errorf("filesHaveSameContents() = %v, want %v", got, tt.equal) + } + }) + } +}