| // Copyright 2020 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 ( |
| "android/soong/ui/logger" |
| "bytes" |
| "io/ioutil" |
| "os" |
| "path/filepath" |
| "reflect" |
| "sort" |
| "strings" |
| "testing" |
| ) |
| |
| func TestCleanOldFiles(t *testing.T) { |
| dir, err := ioutil.TempDir("", "testcleanoldfiles") |
| if err != nil { |
| t.Fatal(err) |
| } |
| defer os.RemoveAll(dir) |
| |
| ctx := testContext() |
| logBuf := &bytes.Buffer{} |
| ctx.Logger = logger.New(logBuf) |
| |
| touch := func(names ...string) { |
| for _, name := range names { |
| if f, err := os.Create(filepath.Join(dir, name)); err != nil { |
| t.Fatal(err) |
| } else { |
| f.Close() |
| } |
| } |
| } |
| runCleanOldFiles := func(names ...string) { |
| data := []byte(strings.Join(names, " ")) |
| if err := ioutil.WriteFile(filepath.Join(dir, ".installed"), data, 0666); err != nil { |
| t.Fatal(err) |
| } |
| |
| cleanOldFiles(ctx, dir, ".installed") |
| } |
| |
| assertFileList := func(names ...string) { |
| t.Helper() |
| |
| sort.Strings(names) |
| |
| var foundNames []string |
| if foundFiles, err := ioutil.ReadDir(dir); err == nil { |
| for _, fi := range foundFiles { |
| foundNames = append(foundNames, fi.Name()) |
| } |
| } else { |
| t.Fatal(err) |
| } |
| |
| if !reflect.DeepEqual(names, foundNames) { |
| t.Errorf("Expected a different list of files:\nwant: %v\n got: %v", names, foundNames) |
| t.Error("Log: ", logBuf.String()) |
| logBuf.Reset() |
| } |
| } |
| |
| // Initial list of potential files |
| runCleanOldFiles("foo", "bar") |
| touch("foo", "bar", "baz") |
| assertFileList("foo", "bar", "baz", ".installed.previous") |
| |
| // This should be a no-op, as the list hasn't changed |
| runCleanOldFiles("foo", "bar") |
| assertFileList("foo", "bar", "baz", ".installed", ".installed.previous") |
| |
| // This should be a no-op, as only a file was added |
| runCleanOldFiles("foo", "bar", "foo2") |
| assertFileList("foo", "bar", "baz", ".installed.previous") |
| |
| // "bar" should be removed, foo2 should be ignored as it was never there |
| runCleanOldFiles("foo") |
| assertFileList("foo", "baz", ".installed.previous") |
| |
| // Recreate bar, and create foo2. Ensure that they aren't removed |
| touch("bar", "foo2") |
| runCleanOldFiles("foo", "baz") |
| assertFileList("foo", "bar", "baz", "foo2", ".installed.previous") |
| } |