Files
AudioStreaming/AudioStreamingTests/Streaming/PlayerQueueEntriesTest.swift
T
2020-11-15 20:14:59 +00:00

179 lines
5.9 KiB
Swift

//
// Created by Dimitrios Chatzieleftheriou on 04/06/2020.
// Copyright © 2020 Decimal. All rights reserved.
//
import AVFoundation
import XCTest
@testable import AudioStreaming
class PlayerQueueEntriesTest: XCTestCase {
func testPlayerQueueEntriesInitsEmpty() {
let queue = PlayerQueueEntries()
XCTAssertTrue(queue.isEmpty)
XCTAssertEqual(queue.count, 0)
XCTAssertEqual(queue.count(for: .buffering), 0)
XCTAssertEqual(queue.count(for: .upcoming), 0)
}
func testPlayerQueueCanEnqueueAndDequeueOnCorrectType() {
// given
let queue = PlayerQueueEntries()
let firstEntry = audioEntry(id: "1")
// when
queue.enqueue(item: firstEntry, type: .upcoming)
let entry = queue.dequeue(type: .upcoming)
let entry1 = queue.dequeue(type: .buffering)
// then
XCTAssertNotNil(entry)
XCTAssertNil(entry1)
XCTAssertEqual(firstEntry, entry)
}
func testPlayerQueueCanEnqueueAndDequeue() {
// given
let queue = PlayerQueueEntries()
let firstEntry = audioEntry(id: "1")
let secondEntry = audioEntry(id: "2")
// when
queue.enqueue(item: firstEntry, type: .upcoming)
queue.enqueue(item: secondEntry, type: .buffering)
let entry = queue.dequeue(type: .upcoming)
let entry1 = queue.dequeue(type: .buffering)
// then
XCTAssertNotNil(entry)
XCTAssertNotNil(entry1)
XCTAssertEqual(firstEntry, entry)
}
func testPlayerQueueCanOutputPendingAudioEntryIds() {
// given
let queue = PlayerQueueEntries()
let firstEntry = audioEntry(id: "1")
let secondEntry = audioEntry(id: "2")
// when
queue.enqueue(item: firstEntry, type: .upcoming)
queue.enqueue(item: secondEntry, type: .buffering)
// then
let expected = [firstEntry.id, secondEntry.id]
let entries = queue.pendingEntriesId()
XCTAssertFalse(entries.isEmpty)
XCTAssertEqual(entries, expected)
}
func testPlayerQueueEntriesCanSkipQueues() {
let queue = PlayerQueueEntries()
let firstEntry = audioEntry(id: "1")
let secondEntry = audioEntry(id: "2")
let batchEntries = [audioEntry(id: "3"), audioEntry(id: "4")]
queue.enqueue(item: firstEntry, type: .buffering)
queue.skip(item: secondEntry, type: .buffering)
let entry = queue.dequeue(type: .buffering)
XCTAssertEqual(entry, secondEntry)
queue.skip(items: batchEntries, type: .buffering)
let entry1 = queue.dequeue(type: .buffering)
XCTAssertEqual(entry1, batchEntries.last!)
}
func testPlayerQueueCountReturnsCorrectValue() {
let queue = PlayerQueueEntries()
queue.enqueue(item: audioEntry(id: "1"), type: .buffering)
XCTAssertEqual(queue.count, 1)
XCTAssertEqual(queue.count(for: .buffering), 1)
XCTAssertEqual(queue.count(for: .upcoming), 0)
queue.enqueue(item: audioEntry(id: "2"), type: .upcoming)
XCTAssertEqual(queue.count, 2)
XCTAssertEqual(queue.count(for: .buffering), 1)
XCTAssertEqual(queue.count(for: .upcoming), 1)
queue.enqueue(item: audioEntry(id: "3"), type: .buffering)
XCTAssertEqual(queue.count, 3)
XCTAssertEqual(queue.count(for: .buffering), 2)
XCTAssertEqual(queue.count(for: .upcoming), 1)
queue.enqueue(item: audioEntry(id: "4"), type: .upcoming)
XCTAssertEqual(queue.count, 4)
XCTAssertEqual(queue.count(for: .buffering), 2)
XCTAssertEqual(queue.count(for: .upcoming), 2)
_ = queue.dequeue(type: .upcoming)
XCTAssertEqual(queue.count, 3)
XCTAssertEqual(queue.count(for: .buffering), 2)
XCTAssertEqual(queue.count(for: .upcoming), 1)
}
func testPlayerQueueCanRemoveAllElemenets() {
let queue = PlayerQueueEntries()
for i in 0 ..< 10 {
queue.enqueue(item: audioEntry(id: "\(i)"), type: .buffering)
queue.enqueue(item: audioEntry(id: "\(i)"), type: .upcoming)
}
queue.removeAll(for: .buffering)
XCTAssertEqual(queue.count(for: .buffering), 0)
XCTAssertEqual(queue.count(for: .upcoming), 10)
queue.removeAll(for: .upcoming)
XCTAssertEqual(queue.count(for: .upcoming), 0)
}
func testPlayerQueueThreadSafety() {
var queue = PlayerQueueEntries()
DispatchQueue.concurrentPerform(iterations: 100) { i in
queue.enqueue(item: audioEntry(id: "\(i))"), type: .buffering)
queue.enqueue(item: audioEntry(id: "\(i))"), type: .upcoming)
_ = queue.dequeue(type: .buffering)
_ = queue.dequeue(type: .upcoming)
}
XCTAssertTrue(queue.isEmpty)
queue = PlayerQueueEntries()
DispatchQueue.concurrentPerform(iterations: 100) { i in
let entry = audioEntry(id: "\(i))")
queue.enqueue(item: entry, type: .buffering)
_ = queue.count(for: .buffering)
}
XCTAssertEqual(queue.count(for: .buffering), 100)
queue = PlayerQueueEntries()
DispatchQueue.concurrentPerform(iterations: 100) { i in
let entry = audioEntry(id: "\(i))")
queue.enqueue(item: entry, type: .buffering)
_ = queue.pendingEntriesId()
}
XCTAssertEqual(queue.pendingEntriesId().count, 100)
}
}
private let networkingClient = NetworkingClient(configuration: .ephemeral)
private func audioEntry(id: String) -> AudioEntry {
let source =
RemoteAudioSource(networking: networkingClient,
url: URL(string: "www.a-url.com")!,
underlyingQueue: DispatchQueue(label: "some-queue"),
httpHeaders: [:])
let outputFormat = AVAudioFormat()
return AudioEntry(source: source, entryId: AudioEntryId(id: id), outputAudioFormat: outputFormat)
}