github.com/westcoastroms/westcoastroms-build@v0.0.0-20190928114312-2350e5a73030/build/blueprint/visit_test.go (about) 1 // Copyright 2016 Google Inc. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package blueprint 16 17 import ( 18 "fmt" 19 "testing" 20 ) 21 22 type visitModule struct { 23 SimpleName 24 properties struct { 25 Visit []string 26 VisitDepsDepthFirst string `blueprint:"mutated"` 27 VisitDepsDepthFirstIf string `blueprint:"mutated"` 28 VisitDirectDeps string `blueprint:"mutated"` 29 VisitDirectDepsIf string `blueprint:"mutated"` 30 } 31 } 32 33 func newVisitModule() (Module, []interface{}) { 34 m := &visitModule{} 35 return m, []interface{}{&m.properties, &m.SimpleName.Properties} 36 } 37 38 func (f *visitModule) GenerateBuildActions(ModuleContext) { 39 } 40 41 type visitTag struct { 42 BaseDependencyTag 43 } 44 45 var visitTagDep visitTag 46 47 func visitDepsMutator(ctx BottomUpMutatorContext) { 48 if m, ok := ctx.Module().(*visitModule); ok { 49 ctx.AddDependency(ctx.Module(), visitTagDep, m.properties.Visit...) 50 } 51 } 52 53 func visitMutator(ctx TopDownMutatorContext) { 54 if m, ok := ctx.Module().(*visitModule); ok { 55 ctx.VisitDepsDepthFirst(func(dep Module) { 56 if ctx.OtherModuleDependencyTag(dep) != visitTagDep { 57 panic(fmt.Errorf("unexpected dependency tag on %q", ctx.OtherModuleName(dep))) 58 } 59 m.properties.VisitDepsDepthFirst = m.properties.VisitDepsDepthFirst + ctx.OtherModuleName(dep) 60 }) 61 ctx.VisitDepsDepthFirstIf(func(dep Module) bool { 62 return ctx.OtherModuleName(dep) != "B" 63 }, func(dep Module) { 64 m.properties.VisitDepsDepthFirstIf = m.properties.VisitDepsDepthFirstIf + ctx.OtherModuleName(dep) 65 }) 66 ctx.VisitDirectDeps(func(dep Module) { 67 m.properties.VisitDirectDeps = m.properties.VisitDirectDeps + ctx.OtherModuleName(dep) 68 }) 69 ctx.VisitDirectDepsIf(func(dep Module) bool { 70 return ctx.OtherModuleName(dep) != "B" 71 }, func(dep Module) { 72 m.properties.VisitDirectDepsIf = m.properties.VisitDirectDepsIf + ctx.OtherModuleName(dep) 73 }) 74 } 75 } 76 77 // A 78 // | 79 // B 80 // |\ 81 // C \ 82 // \| 83 // D 84 // | 85 // E 86 func setupVisitTest(t *testing.T) *Context { 87 ctx := NewContext() 88 ctx.RegisterModuleType("visit_module", newVisitModule) 89 ctx.RegisterBottomUpMutator("visit_deps", visitDepsMutator) 90 ctx.RegisterTopDownMutator("visit", visitMutator) 91 92 ctx.MockFileSystem(map[string][]byte{ 93 "Blueprints": []byte(` 94 visit_module { 95 name: "A", 96 visit: ["B"], 97 } 98 99 visit_module { 100 name: "B", 101 visit: ["C", "D"], 102 } 103 104 visit_module { 105 name: "C", 106 visit: ["D"], 107 } 108 109 visit_module { 110 name: "D", 111 visit: ["E"], 112 } 113 114 visit_module { 115 name: "E", 116 } 117 `), 118 }) 119 120 _, errs := ctx.ParseBlueprintsFiles("Blueprints") 121 if len(errs) > 0 { 122 t.Errorf("unexpected parse errors:") 123 for _, err := range errs { 124 t.Errorf(" %s", err) 125 } 126 t.FailNow() 127 } 128 129 _, errs = ctx.ResolveDependencies(nil) 130 if len(errs) > 0 { 131 t.Errorf("unexpected dep errors:") 132 for _, err := range errs { 133 t.Errorf(" %s", err) 134 } 135 t.FailNow() 136 } 137 138 return ctx 139 } 140 141 func TestVisit(t *testing.T) { 142 ctx := setupVisitTest(t) 143 144 topModule := ctx.modulesFromName("A", nil)[0].logicModule.(*visitModule) 145 assertString(t, topModule.properties.VisitDepsDepthFirst, "EDCB") 146 assertString(t, topModule.properties.VisitDepsDepthFirstIf, "EDC") 147 assertString(t, topModule.properties.VisitDirectDeps, "B") 148 assertString(t, topModule.properties.VisitDirectDepsIf, "") 149 } 150 151 func assertString(t *testing.T, got, expected string) { 152 if got != expected { 153 t.Errorf("expected %q got %q", expected, got) 154 } 155 }