// 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") }