|
@@ -0,0 +1,188 @@
|
|
|
+// Copyright 2023 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 build
|
|
|
+
|
|
|
+import (
|
|
|
+ "os"
|
|
|
+ "path/filepath"
|
|
|
+ "reflect"
|
|
|
+ "testing"
|
|
|
+)
|
|
|
+
|
|
|
+func assertDeepEqual(t *testing.T, expected interface{}, actual interface{}) {
|
|
|
+ if !reflect.DeepEqual(actual, expected) {
|
|
|
+ t.Fatalf("expected:\n %#v\n actual:\n %#v", expected, actual)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// Make a temp directory containing the supplied contents
|
|
|
+func makeTempDir(files []string, directories []string, symlinks []string) string {
|
|
|
+ temp, _ := os.MkdirTemp("", "soon_staging_snapshot_test_")
|
|
|
+
|
|
|
+ for _, file := range files {
|
|
|
+ os.MkdirAll(temp+"/"+filepath.Dir(file), 0700)
|
|
|
+ os.WriteFile(temp+"/"+file, []byte(file), 0600)
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, dir := range directories {
|
|
|
+ os.MkdirAll(temp+"/"+dir, 0770)
|
|
|
+ }
|
|
|
+
|
|
|
+ for _, symlink := range symlinks {
|
|
|
+ os.MkdirAll(temp+"/"+filepath.Dir(symlink), 0770)
|
|
|
+ os.Symlink(temp, temp+"/"+symlink)
|
|
|
+ }
|
|
|
+
|
|
|
+ return temp
|
|
|
+}
|
|
|
+
|
|
|
+// If this is a clean build, we won't have any preexisting files, make sure we get back an empty
|
|
|
+// list and not errors.
|
|
|
+func TestEmptyOut(t *testing.T) {
|
|
|
+ ctx := testContext()
|
|
|
+
|
|
|
+ temp := makeTempDir(nil, nil, nil)
|
|
|
+ defer os.RemoveAll(temp)
|
|
|
+
|
|
|
+ actual, _ := takeStagingSnapshot(ctx, temp, []string{"a", "e", "g"})
|
|
|
+
|
|
|
+ expected := []fileEntry{}
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|
|
|
+
|
|
|
+// Make sure only the listed directories are picked up, and only regular files
|
|
|
+func TestNoExtraSubdirs(t *testing.T) {
|
|
|
+ ctx := testContext()
|
|
|
+
|
|
|
+ temp := makeTempDir([]string{"a/b", "a/c", "d", "e/f"}, []string{"g/h"}, []string{"e/symlink"})
|
|
|
+ defer os.RemoveAll(temp)
|
|
|
+
|
|
|
+ actual, _ := takeStagingSnapshot(ctx, temp, []string{"a", "e", "g"})
|
|
|
+
|
|
|
+ expected := []fileEntry{
|
|
|
+ {"a/b", 0600, 3, "3ec69c85a4ff96830024afeef2d4e512181c8f7b"},
|
|
|
+ {"a/c", 0600, 3, "592d70e4e03ee6f6780c71b0bf3b9608dbf1e201"},
|
|
|
+ {"e/f", 0600, 3, "9e164bef74aceede0974b857170100409efe67f1"},
|
|
|
+ }
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|
|
|
+
|
|
|
+// Make sure diff handles empty lists
|
|
|
+func TestDiffEmpty(t *testing.T) {
|
|
|
+ actual := diffSnapshots(nil, []fileEntry{})
|
|
|
+
|
|
|
+ expected := snapshotDiff{
|
|
|
+ Added: []string{},
|
|
|
+ Changed: []string{},
|
|
|
+ Removed: []string{},
|
|
|
+ }
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|
|
|
+
|
|
|
+// Make sure diff handles adding
|
|
|
+func TestDiffAdd(t *testing.T) {
|
|
|
+ actual := diffSnapshots([]fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ }, []fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0700, 2, "5678"},
|
|
|
+ })
|
|
|
+
|
|
|
+ expected := snapshotDiff{
|
|
|
+ Added: []string{"b"},
|
|
|
+ Changed: []string{},
|
|
|
+ Removed: []string{},
|
|
|
+ }
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|
|
|
+
|
|
|
+// Make sure diff handles changing mode
|
|
|
+func TestDiffChangeMode(t *testing.T) {
|
|
|
+ actual := diffSnapshots([]fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0700, 2, "5678"},
|
|
|
+ }, []fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0600, 2, "5678"},
|
|
|
+ })
|
|
|
+
|
|
|
+ expected := snapshotDiff{
|
|
|
+ Added: []string{},
|
|
|
+ Changed: []string{"b"},
|
|
|
+ Removed: []string{},
|
|
|
+ }
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|
|
|
+
|
|
|
+// Make sure diff handles changing size
|
|
|
+func TestDiffChangeSize(t *testing.T) {
|
|
|
+ actual := diffSnapshots([]fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0700, 2, "5678"},
|
|
|
+ }, []fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0700, 3, "5678"},
|
|
|
+ })
|
|
|
+
|
|
|
+ expected := snapshotDiff{
|
|
|
+ Added: []string{},
|
|
|
+ Changed: []string{"b"},
|
|
|
+ Removed: []string{},
|
|
|
+ }
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|
|
|
+
|
|
|
+// Make sure diff handles changing contents
|
|
|
+func TestDiffChangeContents(t *testing.T) {
|
|
|
+ actual := diffSnapshots([]fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0700, 2, "5678"},
|
|
|
+ }, []fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0700, 2, "aaaa"},
|
|
|
+ })
|
|
|
+
|
|
|
+ expected := snapshotDiff{
|
|
|
+ Added: []string{},
|
|
|
+ Changed: []string{"b"},
|
|
|
+ Removed: []string{},
|
|
|
+ }
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|
|
|
+
|
|
|
+// Make sure diff handles removing
|
|
|
+func TestDiffRemove(t *testing.T) {
|
|
|
+ actual := diffSnapshots([]fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ {"b", 0700, 2, "5678"},
|
|
|
+ }, []fileEntry{
|
|
|
+ {"a", 0600, 1, "1234"},
|
|
|
+ })
|
|
|
+
|
|
|
+ expected := snapshotDiff{
|
|
|
+ Added: []string{},
|
|
|
+ Changed: []string{},
|
|
|
+ Removed: []string{"b"},
|
|
|
+ }
|
|
|
+
|
|
|
+ assertDeepEqual(t, expected, actual)
|
|
|
+}
|