]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
Try to have more robust live tests
authorChocobozzz <me@florianbigard.com>
Wed, 10 May 2023 07:28:42 +0000 (09:28 +0200)
committerChocobozzz <me@florianbigard.com>
Wed, 10 May 2023 07:30:33 +0000 (09:30 +0200)
server/tests/api/transcoding/create-transcoding.ts
server/tests/shared/live.ts
server/tests/shared/streaming-playlists.ts
shared/server-commands/videos/live-command.ts
shared/server-commands/videos/streaming-playlists-command.ts

index 85389a9493150f7c0f021dc827e15377aff6c495..5483c8dba6deb6ce704126a820bb2059cf9ce2af 100644 (file)
@@ -226,7 +226,7 @@ function runTests (objectStorage: boolean) {
         const resolutions = hlsPlaylist.files.map(f => f.resolution.id)
         await checkResolutionsInMasterPlaylist({ server: servers[0], playlistUrl: hlsPlaylist.playlistUrl, resolutions })
 
-        const shaBody = await servers[0].streamingPlaylists.getSegmentSha256({ url: hlsPlaylist.segmentsSha256Url })
+        const shaBody = await servers[0].streamingPlaylists.getSegmentSha256({ url: hlsPlaylist.segmentsSha256Url, withRetry: true })
         expect(Object.keys(shaBody)).to.have.lengthOf(5)
       }
     }
index 31f92ef19a568b5c5396d58d31eba97784b9924a..7935033110cff50e8324847454c0853bd692f9dc 100644 (file)
@@ -115,7 +115,8 @@ async function testLiveVideoResolutions (options: {
         baseUrlSegment: baseUrl,
         videoUUID: video.uuid,
         segmentName,
-        hlsPlaylist
+        hlsPlaylist,
+        withRetry: objectStorage // With object storage, the request may fail because of inconsistent data in S3
       })
 
       if (originServer.internalServerNumber === server.internalServerNumber) {
index acfb2b4085d54a8a2876304bfee8e35a81728cf2..e4f88bc25283b5a3c60e46b47f38c6beb496704c 100644 (file)
@@ -51,12 +51,13 @@ async function checkLiveSegmentHash (options: {
   videoUUID: string
   segmentName: string
   hlsPlaylist: VideoStreamingPlaylist
+  withRetry?: boolean
 }) {
-  const { server, baseUrlSegment, videoUUID, segmentName, hlsPlaylist } = options
+  const { server, baseUrlSegment, videoUUID, segmentName, hlsPlaylist, withRetry = false } = options
   const command = server.streamingPlaylists
 
-  const segmentBody = await command.getFragmentedSegment({ url: `${baseUrlSegment}/${videoUUID}/${segmentName}` })
-  const shaBody = await command.getSegmentSha256({ url: hlsPlaylist.segmentsSha256Url })
+  const segmentBody = await command.getFragmentedSegment({ url: `${baseUrlSegment}/${videoUUID}/${segmentName}`, withRetry })
+  const shaBody = await command.getSegmentSha256({ url: hlsPlaylist.segmentsSha256Url, withRetry })
 
   expect(sha256(segmentBody)).to.equal(shaBody[segmentName])
 }
index dc3c5a86ef8f45862665448648bcf47644633f00..2e4bc10b567e27d9e23914f72176e22c98f4bdb4 100644 (file)
@@ -224,7 +224,7 @@ export class LiveCommand extends AbstractCommand {
         const video = await server.videos.get({ id: videoUUID })
         const hlsPlaylist = video.streamingPlaylists[0]
 
-        const shaBody = await server.streamingPlaylists.getSegmentSha256({ url: hlsPlaylist.segmentsSha256Url })
+        const shaBody = await server.streamingPlaylists.getSegmentSha256({ url: hlsPlaylist.segmentsSha256Url, withRetry: objectStorage })
 
         if (!shaBody[segmentName]) {
           throw new Error('Segment SHA does not exist')
index 7b92dcc0a385834f22842262ffccb115673b8921..950808b6009912b6e0516ef07c9abe493b174105 100644 (file)
@@ -44,31 +44,71 @@ export class StreamingPlaylistsCommand extends AbstractCommand {
     }
   }
 
-  getFragmentedSegment (options: OverrideCommandOptions & {
+  async getFragmentedSegment (options: OverrideCommandOptions & {
     url: string
     range?: string
+
+    withRetry?: boolean // default false
+    currentRetry?: number
   }) {
-    return unwrapBody<Buffer>(this.getRawRequest({
-      ...options,
-
-      url: options.url,
-      range: options.range,
-      implicitToken: false,
-      responseType: 'application/octet-stream',
-      defaultExpectedStatus: HttpStatusCode.OK_200
-    }))
+    const { withRetry, currentRetry = 1 } = options
+
+    try {
+      const result = await unwrapBody<Buffer>(this.getRawRequest({
+        ...options,
+
+        url: options.url,
+        range: options.range,
+        implicitToken: false,
+        responseType: 'application/octet-stream',
+        defaultExpectedStatus: HttpStatusCode.OK_200
+      }))
+
+      return result
+    } catch (err) {
+      if (!withRetry || currentRetry > 5) throw err
+
+      await wait(100)
+
+      return this.getFragmentedSegment({
+        ...options,
+
+        withRetry,
+        currentRetry: currentRetry + 1
+      })
+    }
   }
 
-  getSegmentSha256 (options: OverrideCommandOptions & {
+  async getSegmentSha256 (options: OverrideCommandOptions & {
     url: string
+
+    withRetry?: boolean // default false
+    currentRetry?: number
   }) {
-    return unwrapBodyOrDecodeToJSON<{ [ id: string ]: string }>(this.getRawRequest({
-      ...options,
-
-      url: options.url,
-      contentType: 'application/json',
-      implicitToken: false,
-      defaultExpectedStatus: HttpStatusCode.OK_200
-    }))
+    const { withRetry, currentRetry = 1 } = options
+
+    try {
+      const result = await unwrapBodyOrDecodeToJSON<{ [ id: string ]: string }>(this.getRawRequest({
+        ...options,
+
+        url: options.url,
+        contentType: 'application/json',
+        implicitToken: false,
+        defaultExpectedStatus: HttpStatusCode.OK_200
+      }))
+
+      return result
+    } catch (err) {
+      if (!withRetry || currentRetry > 5) throw err
+
+      await wait(100)
+
+      return this.getSegmentSha256({
+        ...options,
+
+        withRetry,
+        currentRetry: currentRetry + 1
+      })
+    }
   }
 }