179 lines
5.9 KiB
Swift
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)
|
|
}
|