aboutsummaryrefslogtreecommitdiffhomepage
path: root/server/tests/api/friends-advanced.ts
blob: 139019398f7b940963c4a2c0bb4453ece692b200 (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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
/* tslint:disable:no-unused-expression */

import 'mocha'
import * as chai from 'chai'
const expect = chai.expect

import {
  ServerInfo,
  flushTests,
  runServer,
  uploadVideo,
  quitFriends,
  getVideosList,
  wait,
  setAccessTokensToServers,
  flushAndRunMultipleServers,
  killallServers,
  makeFriends,
  getFriendsList,
  quitOneFriend
} from '../utils'

describe('Test advanced friends', function () {
  let servers: ServerInfo[] = []

  async function makeFriendsWrapper (podNumber: number) {
    const server = servers[podNumber - 1]
    return await makeFriends(server.url, server.accessToken)
  }

  async function quitFriendsWrapper (podNumber: number) {
    const server = servers[podNumber - 1]
    return await quitFriends(server.url, server.accessToken)
  }

  async function removeFriendWrapper (podNumber: number, podNumberToRemove: number) {
    const server = servers[podNumber - 1]
    const serverToRemove = servers[podNumberToRemove - 1]

    const res = await getFriendsList(server.url)

    let friendsList = res.body.data
    let podToRemove = friendsList.find(friend => (friend.host === serverToRemove.host))

    return await quitOneFriend(server.url, server.accessToken, podToRemove.id)
  }

  async function getFriendsListWrapper (podNumber: number) {
    const server = servers[podNumber - 1]
    return await getFriendsList(server.url)
  }

  async function uploadVideoWrapper (podNumber: number) {
    const videoAttributes = {
      tags: [ 'tag1', 'tag2' ]
    }
    const server = servers[podNumber - 1]

    return await uploadVideo(server.url, server.accessToken, videoAttributes)
  }

  async function getVideosWrapper (podNumber: number) {
    return await getVideosList(servers[podNumber - 1].url)
  }

  // ---------------------------------------------------------------

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

    servers = await flushAndRunMultipleServers(6)
    await setAccessTokensToServers(servers)
  })

  it('Should not make friends with two different groups', async function () {
    this.timeout(20000)

    // Pod 3 makes friend with the first one
    await makeFriendsWrapper(3)

    // Pod 4 makes friend with the second one
    await makeFriendsWrapper(4)

    // Now if the fifth wants to make friends with the third and the first
    await makeFriendsWrapper(5)

    await wait(11000)

      // It should have 0 friends
    const res = await getFriendsListWrapper(5)
    expect(res.body.data.length).to.equal(0)
  })

  it('Should quit all friends', async function () {
    this.timeout(10000)

    await quitFriendsWrapper(1)
    await quitFriendsWrapper(2)

    const serverNumbersToTest = [ 1, 2, 3, 4, 5, 6 ]
    for (const i of serverNumbersToTest) {
      const res = await getFriendsListWrapper(i)
      expect(res.body.data.length).to.equal(0)
    }
  })

  it('Should remove bad pod and new pod should not become friend with it', async function () {
    this.timeout(200000)

    // Pods 1, 2, 3 and 4 become friends
    await makeFriendsWrapper(2)
    await makeFriendsWrapper(1)
    await makeFriendsWrapper(4)

    // Check the pods 1, 2, 3 and 4 are friends
    let serverNumbersToTest = [ 1, 2, 3, 4 ]
    for (const i of serverNumbersToTest) {
      const res = await getFriendsListWrapper(i)
      expect(res.body.data.length).to.equal(3)
    }

    // Wait initial video channel requests
    await wait(11000)

    // Kill pod 4
    servers[3].app.kill()

    // Remove pod 4 from pod 1 and 2
    await uploadVideoWrapper(1)
    await uploadVideoWrapper(2)

    await wait(11000)

    await uploadVideoWrapper(1)
    await uploadVideoWrapper(2)

    await wait(11000)

    await uploadVideoWrapper(1)
    await uploadVideoWrapper(2)

    await wait(11000)

    await uploadVideoWrapper(1)
    await uploadVideoWrapper(2)

    await wait(11000)

    serverNumbersToTest = [ 1, 2 ]

    for (const i of serverNumbersToTest) {
      const res = await getFriendsListWrapper(i)

      // Pod 4 should not be our friend
      const friends = res.body.data
      expect(friends.length).to.equal(2)

      for (const pod of friends) {
        expect(pod.host).not.equal(servers[3].host)
      }
    }

    // Rerun server 4
    const newServer = await runServer(4)
    servers[3].app = newServer.app
    servers[3].app

    // Pod 4 didn't know pod 1 and 2 removed it
    const res1 = await getFriendsListWrapper(4)
    expect(res1.body.data.length).to.equal(3)

    // Pod 3 didn't upload video, it's still friend with pod 3
    const res2 = await getFriendsListWrapper(3)
    expect(res2.body.data.length).to.equal(3)

    // Pod 6 asks pod 1, 2 and 3
    await makeFriendsWrapper(6)

    await wait(11000)

    const res3 = await getFriendsListWrapper(6)

    // Pod 4 should not be our friend
    const friends = res3.body.data
    expect(friends.length).to.equal(3)
    for (const pod of friends) {
      expect(pod.host).not.equal(servers[3].host)
    }
  })

  // Pod 1 is friend with : 2 3 6
  // Pod 2 is friend with : 1 3 6
  // Pod 3 is friend with : 1 2 4 6
  // Pod 4 is friend with : 1 2 3
  // Pod 6 is friend with : 1 2 3
  it('Should pod 1 quit friends', async function () {
    this.timeout(25000)

    // Upload a video on server 3 for additional tests
    await uploadVideoWrapper(3)

    await wait(15000)

    // Pod 1 remove friends
    await quitFriendsWrapper(1)

    const res1 = await getVideosWrapper(1)
    const videos1 = res1.body.data
    expect(videos1).to.be.an('array')
    expect(videos1.length).to.equal(4)

    const res2 = await getVideosWrapper(2)
    const videos2 = res2.body.data
    expect(videos2).to.be.an('array')
    expect(videos2.length).to.equal(5)
  })

  // Pod 1 is friend with nothing
  // Pod 2 is friend with : 3 6
  // Pod 3 is friend with : 2 4 6
  // Pod 4 is friend with : 2 3
  // Pod 6 is friend with : 2 3
  it('Should make friends between pod 1, 2, 3 and 6 and exchange their videos', async function () {
    this.timeout(30000)

    await makeFriendsWrapper(1)

    await wait(22000)

    const res = await getVideosWrapper(1)
    const videos = res.body.data
    expect(videos).to.be.an('array')
    expect(videos.length).to.equal(9)
  })

  // Pod 1 is friend with : 2 3 6
  // Pod 2 is friend with : 1 3 6
  // Pod 3 is friend with : 1 2 4 6
  // Pod 4 is friend with : 2 3
  // Pod 6 is friend with : 1 2 3
  it('Should allow pod 6 to quit pod 1, 2 and 3 and be friend with pod 3', async function () {
    this.timeout(30000)

    // Pod 3 should have 4 friends
    const res1 = await getFriendsListWrapper(3)
    const friendsList1 = res1.body.data
    expect(friendsList1).to.be.an('array')
    expect(friendsList1.length).to.equal(4)

    // Pod 1, 2, 6 should have 3 friends each
    let serverNumbersToTest = [ 1, 2, 6 ]
    for (const i of serverNumbersToTest) {
      const res = await getFriendsListWrapper(i)
      const friendsList = res.body.data
      expect(friendsList).to.be.an('array')
      expect(friendsList.length).to.equal(3)
    }

    await removeFriendWrapper(6, 1)
    await removeFriendWrapper(6, 2)

    // Pod 6 should now have only 1 friend (and it should be Pod 3)
    const res2 = await getFriendsListWrapper(6)
    const friendsList2 = res2.body.data
    expect(friendsList2).to.be.an('array')
    expect(friendsList2.length).to.equal(1)
    expect(friendsList2[0].host).to.equal(servers[2].host)

    // Pod 1 & 2 should not know friend 6 anymore
    serverNumbersToTest = [ 1, 2 ]
    for (const i of serverNumbersToTest) {
      const res = await getFriendsListWrapper(i)
      const friendsList = res.body.data
      expect(friendsList).to.be.an('array')
      expect(friendsList.length).to.equal(2)
    }

    // Pod 3 should know every pod
    const res3 = await getFriendsListWrapper(3)
    const friendsList3 = res3.body.data
    expect(friendsList3).to.be.an('array')
    expect(friendsList3.length).to.equal(4)
  })

  after(async function () {
    killallServers(servers)

    if (this['ok']) {
      await flushTests()
    }
  })
})