@@ -197,102 +197,89 @@ publish_version() {
197197 --data-binary " @$pvs_path " > /dev/null
198198}
199199
200- start_version_monitor () {
201- local out_file=" $1 "
202- shift
203- : > " $out_file "
204- (
205- local expected
206- for expected in " $@ " ; do
207- local retries=200
208- while [ " $retries " -gt 0 ]; do
209- if curl -s --connect-timeout 1 --max-time 2 " $METRICS_URL " | tr -d ' \r' | \
210- grep -q " pavis_runtime_config_version{version=\" $expected \" }" ; then
211- printf ' %s\n' " $expected " >> " $out_file "
212- break
213- fi
214- retries=$(( retries - 1 ))
215- sleep 0.1
216- done
217- done
218- ) > /dev/null 2>&1 &
219- echo $!
220- }
221-
222- assert_versions_in_order () {
223- local out_file=" $1 "
224- local expected_sequence=" $2 "
225- local observed
226- observed=$( awk ' {
227- if ($0 != last) {
228- seq = seq $0 " "
229- last = $0
230- }
231- } END { print seq }' " $out_file " )
232- for expected in $expected_sequence ; do
233- case " $observed " in
234- * " $expected " * ) observed=" ${observed#* $expected } " ;;
235- * ) echo " ❌ Missing version $expected in monitor log" ; return 1 ;;
236- esac
237- done
238- return 0
239- }
240-
241- wait_for_monitor_log () {
242- local expected_version=" $1 "
243- local log_file=" $2 "
244- local timeout=" ${3:- 10} "
200+ verify_version_sequence () {
201+ local expected_sequence=" $1 "
202+ local timeout=" ${2:- 30} "
203+ local observed_versions=" "
204+ local last_seen=" "
245205 local retries=$(( timeout * 10 ))
246206
207+ echo " DEBUG: Verifying version sequence: $expected_sequence "
208+
247209 for _ in $( seq 1 $retries ) ; do
248- if grep -q " ^${expected_version} \$ " " $log_file " 2> /dev/null; then
210+ current=$( get_runtime_config_version " $METRICS_URL " 2> /dev/null || echo " " )
211+
212+ # Record version transition (deduplicate)
213+ if [ -n " $current " ] && [ " $current " != " $last_seen " ]; then
214+ if [ -z " $observed_versions " ]; then
215+ observed_versions=" $current "
216+ else
217+ observed_versions=" $observed_versions $current "
218+ fi
219+ last_seen=" $current "
220+ echo " DEBUG: Observed version transition: $observed_versions "
221+ fi
222+
223+ # Check if we've seen all expected versions in order
224+ local check_sequence=" $observed_versions "
225+ local all_found=true
226+ for expected in $expected_sequence ; do
227+ case " $check_sequence " in
228+ * " $expected " * )
229+ # Remove this version and everything before it
230+ check_sequence=" ${check_sequence#* $expected } "
231+ ;;
232+ * )
233+ all_found=false
234+ break
235+ ;;
236+ esac
237+ done
238+
239+ if [ " $all_found " = true ]; then
240+ echo " ✓ Verified version sequence: $observed_versions "
249241 return 0
250242 fi
243+
251244 sleep 0.1
252245 done
246+
247+ echo " ❌ Version sequence verification failed"
248+ echo " Expected: $expected_sequence "
249+ echo " Observed: $observed_versions "
253250 return 1
254251}
255252
256- monitor_pid=$( start_version_monitor " $TEST_TMP /runtime_versions.log" 2 3 4)
257- trap ' kill "$monitor_pid" 2>/dev/null || true' EXIT
253+ # Start observing version transitions from current state (v1)
254+ # This function will poll metrics and track version changes in real-time
255+ (
256+ verify_version_sequence " 2 3 4" 60 || exit 1
257+ ) &
258+ VERIFY_PID=$!
259+
260+ # Give verification process time to start monitoring
261+ sleep 0.5
258262
259263# Publish V2 -> V3 -> V4 serialized to ensure chain
260264echo " Publishing v2..v4"
261265publish_version 2 " $TEST_TMP /config_v2.pvs"
262266wait_for_version 2 10 || exit 1
263- wait_for_monitor_log 2 " $TEST_TMP /runtime_versions.log" 5 || echo " ⚠️ Monitor slow to log v2"
264267
265268publish_version 3 " $TEST_TMP /config_v3.pvs"
266269wait_for_version 3 10 || exit 1
267- wait_for_monitor_log 3 " $TEST_TMP /runtime_versions.log" 5 || echo " ⚠️ Monitor slow to log v3"
268270
269271publish_version 4 " $TEST_TMP /config_v4.pvs"
270272echo " Published v2..v4"
271273
272274if ! wait_for_version 4 20; then
273275 echo " ❌ Runtime did not apply version 4"
276+ kill " $VERIFY_PID " 2> /dev/null || true
274277 exit 1
275278fi
276279echo " Runtime reached version 4"
277280
278- # Wait for monitor to capture v4 (longer timeout for CI environments)
279- if ! wait_for_monitor_log 4 " $TEST_TMP /runtime_versions.log" 20; then
280- echo " ⚠️ Monitor failed to log v4 within 20s, checking if process exited"
281- if ! kill -0 " $monitor_pid " 2> /dev/null; then
282- echo " ❌ Monitor process exited prematurely"
283- exit 1
284- fi
285- fi
286-
287- # Give monitor extra time to flush writes in high-latency environments
288- sleep 1
289-
290- # Check if monitor is still running before waiting
291- if kill -0 " $monitor_pid " 2> /dev/null; then
292- wait " $monitor_pid " 2> /dev/null || true
293- fi
294-
295- if ! assert_versions_in_order " $TEST_TMP /runtime_versions.log" " 2 3 4" ; then
281+ # Wait for verification process to complete
282+ if ! wait " $VERIFY_PID " ; then
296283 echo " ❌ Runtime did not apply versions in order (2 -> 3 -> 4)"
297284 exit 1
298285fi
0 commit comments