aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/tests/api/live/live-views.ts
blob: 9186af8e740f1e310cb1bc9fcf36630ec7339878 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
/* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */

import 'mocha'
import * as chai from 'chai'
import { FfmpegCommand } from 'fluent-ffmpeg'
import { VideoPrivacy } from '@shared/models'
import {
  cleanupTests,
  createMultipleServers,
  doubleFollow,
  PeerTubeServer,
  setAccessTokensToServers,
  setDefaultVideoChannel,
  stopFfmpeg,
  wait,
  waitJobs,
  waitUntilLivePublishedOnAllServers
} from '../../../../shared/extra-utils'

const expect = chai.expect

describe('Live views', function () {
  let servers: PeerTubeServer[] = []

  before(async function () {
    this.timeout(120000)

    servers = await createMultipleServers(2)

    // Get the access tokens
    await setAccessTokensToServers(servers)
    await setDefaultVideoChannel(servers)

    await servers[0].config.updateCustomSubConfig({
      newConfig: {
        live: {
          enabled: true,
          allowReplay: true,
          transcoding: {
            enabled: false
          }
        }
      }
    })

    // Server 1 and server 2 follow each other
    await doubleFollow(servers[0], servers[1])
  })

  let liveVideoId: string
  let command: FfmpegCommand

  async function countViewers (expectedViewers: number) {
    for (const server of servers) {
      const video = await server.videos.get({ id: liveVideoId })
      expect(video.viewers).to.equal(expectedViewers)
    }
  }

  async function countViews (expectedViews: number) {
    for (const server of servers) {
      const video = await server.videos.get({ id: liveVideoId })
      expect(video.views).to.equal(expectedViews)
    }
  }

  before(async function () {
    this.timeout(30000)

    const liveAttributes = {
      name: 'live video',
      channelId: servers[0].store.channel.id,
      privacy: VideoPrivacy.PUBLIC
    }

    const live = await servers[0].live.create({ fields: liveAttributes })
    liveVideoId = live.uuid

    command = await servers[0].live.sendRTMPStreamInVideo({ videoId: liveVideoId })
    await waitUntilLivePublishedOnAllServers(servers, liveVideoId)
    await waitJobs(servers)
  })

  it('Should display no views and viewers for a live', async function () {
    await countViews(0)
    await countViewers(0)
  })

  it('Should view a live twice and display 1 view/viewer', async function () {
    this.timeout(30000)

    await servers[0].videos.view({ id: liveVideoId })
    await servers[0].videos.view({ id: liveVideoId })

    await waitJobs(servers)
    await countViewers(1)

    await wait(7000)
    await countViews(1)
  })

  it('Should wait and display 0 viewers while still have 1 view', async function () {
    this.timeout(30000)

    await wait(12000)
    await waitJobs(servers)

    await countViews(1)
    await countViewers(0)
  })

  it('Should view a live on a remote and on local and display 2 viewers and 3 views', async function () {
    this.timeout(30000)

    await servers[0].videos.view({ id: liveVideoId })
    await servers[1].videos.view({ id: liveVideoId })
    await servers[1].videos.view({ id: liveVideoId })
    await waitJobs(servers)

    await countViewers(2)

    await wait(7000)
    await waitJobs(servers)

    await countViews(3)
  })

  after(async function () {
    await stopFfmpeg(command)
    await cleanupTests(servers)
  })
})