11// gencopy is a utility program that copies bazel outputs back into the
22// workspace source tree. Ideally, you don't have any generated files committed
33// to VCS, but sometimes you do.
4- //
54package main
65
76import (
87 "os"
8+ "path/filepath"
99 "testing"
1010
11+ "github.com/bazelbuild/bazel-gazelle/testtools"
1112 "github.com/google/go-cmp/cmp"
1213)
1314
@@ -56,6 +57,12 @@ func TestMakePkgSrcDstPair(t *testing.T) {
5657 dst : "file.txt" ,
5758 want : SrcDst {Src : "file.txt" , Dst : "/home/file.txt" },
5859 },
60+ "WorkspaceSubDirectory" : {
61+ cfg : Config {WorkspaceRootDirectory : "/home" },
62+ src : "subdir/file.txt" ,
63+ dst : "subdir/file.txt" ,
64+ want : SrcDst {Src : "subdir/file.txt" , Dst : "/home/subdir/file.txt" },
65+ },
5966 "TargetWorkspaceRoot" : {
6067 cfg : Config {WorkspaceRootDirectory : "/home" },
6168 pkg : PackageConfig {TargetWorkspaceRoot : "external/foo" },
@@ -73,3 +80,79 @@ func TestMakePkgSrcDstPair(t *testing.T) {
7380 })
7481 }
7582}
83+
84+ func TestRunPkg (t * testing.T ) {
85+ for name , tc := range map [string ]struct {
86+ cfg Config
87+ files , want []testtools.FileSpec
88+ }{
89+ "degenerate" : {},
90+ "simple" : {
91+ // {"extension":"","fileMode":"0644","mode":"update","packageConfigs":[{"generatedFiles":["api/v1/v1_pb2.py"],"sourceFiles":["api/v1/v1_pb2.py"],"targetLabel":"@//api/v1:api_v1_python_compiled_sources","targetPackage":"api/v1","targetWorkspaceRoot":""}],"updateTargetLabelName":"api_v1_python_compiled_sources.update"}
92+ cfg : Config {
93+ Extension : "" ,
94+ FileMode : "0644" ,
95+ Mode : "update" ,
96+ WorkspaceRootDirectory : "workspace" ,
97+ UpdateTargetLabelName : "api_v1_python_compiled_sources.update" ,
98+ PackageConfigs : []* PackageConfig {
99+ {
100+ GeneratedFiles : []string {"api/v1/v1_pb2.py" },
101+ SourceFiles : []string {"api/v1/v1_pb2.py" },
102+ TargetLabel : "@//api/v1:api_v1_python_compiled_sources" ,
103+ TargetPackage : "api/v1" ,
104+ TargetWorkspaceRoot : "gen" ,
105+ },
106+ },
107+ },
108+ files : []testtools.FileSpec {
109+ {
110+ Path : "workspace/api/v1/v1_pb2.py" ,
111+ Content : "# generated file api/v1/v1_pb2.py" ,
112+ },
113+ },
114+ want : []testtools.FileSpec {
115+ {
116+ Path : "api/v1/v1_pb2.py" ,
117+ Content : "# generated file api/v1/v1_pb2.py" ,
118+ },
119+ },
120+ },
121+ } {
122+ t .Run (name , func (t * testing.T ) {
123+ dir , cleanup := testtools .CreateFiles (t , tc .files )
124+ defer cleanup ()
125+
126+ if err := os .Chdir (dir ); err != nil {
127+ t .Fatal (err )
128+ }
129+ listFiles (t , "." )
130+ if err := run (& tc .cfg , t .Logf ); err != nil {
131+ t .Fatal (err )
132+ }
133+
134+ testtools .CheckFiles (t , dir , tc .want )
135+ })
136+ }
137+ }
138+
139+ // listFiles - convenience debugging function to log the files under a given dir
140+ func listFiles (t * testing.T , dir string ) error {
141+ return filepath .Walk (dir , func (path string , info os.FileInfo , err error ) error {
142+ if err != nil {
143+ t .Logf ("%v\n " , err )
144+ return err
145+ }
146+ if info .Mode ()& os .ModeSymlink > 0 {
147+ link , err := os .Readlink (path )
148+ if err != nil {
149+ return err
150+ }
151+ t .Logf ("%s -> %s" , path , link )
152+ return nil
153+ }
154+
155+ t .Log (path )
156+ return nil
157+ })
158+ }
0 commit comments