Skip to content

Commit f297b7a

Browse files
committed
Update regex used by e2e to extract address
The address was recently changed to use URL which seems to add a trailing slash when using toString, causing the regex match to fail.
1 parent a343efe commit f297b7a

File tree

2 files changed

+34
-5
lines changed

2 files changed

+34
-5
lines changed

test/e2e/models/CodeServer.ts

Lines changed: 15 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
import { Logger, logger } from "@coder/logger"
1+
import { field, Logger, logger } from "@coder/logger"
22
import * as cp from "child_process"
33
import { promises as fs } from "fs"
44
import * as path from "path"
55
import { Page } from "playwright"
66
import { onLine } from "../../../src/node/util"
77
import { PASSWORD, workspaceDir } from "../../utils/constants"
8-
import { tmpdir } from "../../utils/helpers"
8+
import { idleTimer, tmpdir } from "../../utils/helpers"
99

1010
interface CodeServerProcess {
1111
process: cp.ChildProcess
@@ -99,34 +99,44 @@ export class CodeServer {
9999
},
100100
)
101101

102+
const timer = idleTimer("Failed to extract address; did the format change?", reject)
103+
102104
proc.on("error", (error) => {
103105
this.logger.error(error.message)
106+
timer.dispose()
104107
reject(error)
105108
})
106109

107-
proc.on("close", () => {
110+
proc.on("close", (code) => {
108111
const error = new Error("closed unexpectedly")
109112
if (!this.closed) {
110-
this.logger.error(error.message)
113+
this.logger.error(error.message, field("code", code))
111114
}
115+
timer.dispose()
112116
reject(error)
113117
})
114118

115119
let resolved = false
116120
proc.stdout.setEncoding("utf8")
117121
onLine(proc, (line) => {
122+
// As long as we are actively getting input reset the timer. If we stop
123+
// getting input and still have not found the address the timer will
124+
// reject.
125+
timer.reset()
126+
118127
// Log the line without the timestamp.
119128
this.logger.trace(line.replace(/\[.+\]/, ""))
120129
if (resolved) {
121130
return
122131
}
123-
const match = line.trim().match(/HTTP server listening on (https?:\/\/[.:\d]+)$/)
132+
const match = line.trim().match(/HTTP server listening on (https?:\/\/[.:\d]+)\/?$/)
124133
if (match) {
125134
// Cookies don't seem to work on IP address so swap to localhost.
126135
// TODO: Investigate whether this is a bug with code-server.
127136
const address = match[1].replace("127.0.0.1", "localhost")
128137
this.logger.debug(`spawned on ${address}`)
129138
resolved = true
139+
timer.dispose()
130140
resolve({ process: proc, address })
131141
}
132142
})

test/utils/helpers.ts

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,3 +82,22 @@ export const getAvailablePort = (options?: net.ListenOptions): Promise<number> =
8282
})
8383
})
8484
})
85+
86+
/**
87+
* Return a timer that will not reject as long as it is disposed or continually
88+
* reset before the delay elapses.
89+
*/
90+
export function idleTimer(message: string, reject: () => void, delay = 1000) {
91+
let timeout: undefined | NodeJS.Timeout
92+
const timer = {
93+
reset: () => {
94+
clearTimeout(timeout)
95+
timeout = setTimeout(() => reject(new Error(message)), delay)
96+
},
97+
dispose: () => {
98+
clearTimeout(timeout)
99+
},
100+
}
101+
timer.reset()
102+
return timer
103+
}

0 commit comments

Comments
 (0)