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