@@ -78,6 +78,7 @@ var dapBuildTests = []func(t *testing.T, sb integration.Sandbox){
7878 testDapBuild ,
7979 testDapBuildStopOnEntry ,
8080 testDapBuildSetBreakpoints ,
81+ testDapBuildEntryBreakpoint ,
8182 testDapBuildVerifiedBreakpoints ,
8283 testDapBuildLoadedSource ,
8384 testDapBuildStepIn ,
@@ -121,17 +122,19 @@ func testDapBuildStopOnEntry(t *testing.T, sb integration.Sandbox) {
121122 })
122123
123124 stopped := waitForInterrupt [* dap.StoppedEvent ](t , interruptCh )
125+ require .Equal (t , "step" , stopped .Body .Reason )
126+
124127 threads := doThreads (t , client )
125128 require .ElementsMatch (t , []int {stopped .Body .ThreadId }, threads )
126129
127- stackTraceResp := <- daptest .DoRequest [* dap.StackTraceResponse ](t , client , & dap.StackTraceRequest {
128- Request : dap.Request {Command : "stackTrace" },
129- Arguments : dap.StackTraceArguments {
130- ThreadId : stopped .Body .ThreadId ,
130+ stackFrames := doStackTrace (t , client , stopped .Body .ThreadId )
131+ assertStackTrace (t , stackFrames , []stackFrameMatcher {
132+ {
133+ SourceName : "Dockerfile" ,
134+ Line : 7 ,
135+ Name : `^\[stage-1 .*\] COPY` ,
131136 },
132137 })
133- require .True (t , stackTraceResp .Success )
134- require .Len (t , stackTraceResp .Body .StackFrames , 1 )
135138
136139 var exitErr * exec.ExitError
137140 require .ErrorAs (t , done (true ), & exitErr )
@@ -202,6 +205,39 @@ func testDapBuildSetBreakpoints(t *testing.T, sb integration.Sandbox) {
202205 require .NoError (t , done (false ))
203206}
204207
208+ // testDapBuildEntryBreakpoint checks that the entrypoint is a valid breakpoint.
209+ func testDapBuildEntryBreakpoint (t * testing.T , sb integration.Sandbox ) {
210+ dir := createTestProject (t )
211+ client , done , err := dapBuildCmd (t , sb , withArgs (dir ))
212+ require .NoError (t , err )
213+
214+ interruptCh := pollInterruptEvents (client )
215+ doLaunch (t , client , commands.LaunchConfig {
216+ Dockerfile : path .Join (dir , "Dockerfile" ),
217+ ContextPath : dir ,
218+ },
219+ dap.SourceBreakpoint {Line : 7 },
220+ )
221+
222+ stopped := waitForInterrupt [* dap.StoppedEvent ](t , interruptCh )
223+ require .Equal (t , "breakpoint" , stopped .Body .Reason )
224+
225+ threads := doThreads (t , client )
226+ require .ElementsMatch (t , []int {stopped .Body .ThreadId }, threads )
227+
228+ stackFrames := doStackTrace (t , client , stopped .Body .ThreadId )
229+ assertStackTrace (t , stackFrames , []stackFrameMatcher {
230+ {
231+ SourceName : "Dockerfile" ,
232+ Line : 7 ,
233+ Name : `^\[stage-1 .*\] COPY` ,
234+ },
235+ })
236+
237+ var exitErr * exec.ExitError
238+ require .ErrorAs (t , done (true ), & exitErr )
239+ }
240+
205241func testDapBuildVerifiedBreakpoints (t * testing.T , sb integration.Sandbox ) {
206242 dir := createTestProject (t )
207243 client , done , err := dapBuildCmd (t , sb , withArgs (dir ))
0 commit comments