137 lines
5.2 KiB
Swift
137 lines
5.2 KiB
Swift
//
|
|
// MetadataStreamProcessorTests.swift
|
|
// AudioStreamingTests
|
|
//
|
|
// Created by Dimitrios Chatzieleftheriou on 22/10/2020.
|
|
// Copyright © 2020 Decimal. All rights reserved.
|
|
//
|
|
|
|
@testable import AudioStreaming
|
|
|
|
import XCTest
|
|
|
|
class MetadataStreamProcessorTests: XCTestCase {
|
|
var metadataDelegateSpy = MetadataDelegateSpy()
|
|
|
|
let bundle = Bundle(for: MetadataStreamProcessorTests.self)
|
|
|
|
func test_Processor_SendsCorrectValues_IfItCanProcessMetadata() throws {
|
|
let parser = MetadataParser()
|
|
let processor = MetadataStreamProcessor(parser: parser.eraseToAnyParser())
|
|
|
|
// without calling `metadataAvailable(step:)` it should be false
|
|
XCTAssertFalse(processor.canProcessMetadata)
|
|
|
|
// calling `metadataAvailable(step:)` with zero
|
|
processor.metadataAvailable(step: 0)
|
|
|
|
// it should be false
|
|
XCTAssertFalse(processor.canProcessMetadata)
|
|
|
|
// calling `metadataAvailable(step:)` with greater zero
|
|
processor.metadataAvailable(step: 1)
|
|
|
|
// it should be true
|
|
XCTAssertTrue(processor.canProcessMetadata)
|
|
}
|
|
|
|
func test_Processor_Outputs_Correct_Metadata_ForStep_WithEmptyMetadata() throws {
|
|
let url = bundle.url(forResource: "raw-stream-audio-empty-metadata", withExtension: nil)!
|
|
|
|
let data = try Data(contentsOf: url)
|
|
|
|
let parser = MetadataParser()
|
|
let processor = MetadataStreamProcessor(parser: parser.eraseToAnyParser())
|
|
processor.delegate = metadataDelegateSpy
|
|
// this is the step value as received from the http headers
|
|
processor.metadataAvailable(step: 16000)
|
|
|
|
let audio = processor.processMetadata(data: data)
|
|
XCTAssertFalse(audio.isEmpty)
|
|
|
|
XCTAssertTrue(metadataDelegateSpy.receivedMetadata.called)
|
|
XCTAssertEqual(metadataDelegateSpy.receivedMetadata.result, .success(["StreamTitle": ""]))
|
|
}
|
|
|
|
func test_Processor_Outputs_Correct_Metadata_ForStep_WithMetadata() throws {
|
|
let url = bundle.url(forResource: "raw-stream-audio-normal-metadata", withExtension: nil)!
|
|
|
|
let data = try Data(contentsOf: url)
|
|
|
|
let parser = MetadataParser()
|
|
let processor = MetadataStreamProcessor(parser: parser.eraseToAnyParser())
|
|
processor.delegate = metadataDelegateSpy
|
|
// this is the step value as received from the http headers
|
|
processor.metadataAvailable(step: 16000)
|
|
|
|
let audio = processor.processMetadata(data: data)
|
|
XCTAssertFalse(audio.isEmpty)
|
|
|
|
XCTAssertTrue(metadataDelegateSpy.receivedMetadata.called)
|
|
XCTAssertEqual(metadataDelegateSpy.receivedMetadata.result, .success(["StreamTitle": "Anomalie - Notre"]))
|
|
}
|
|
|
|
func test_Processor_Outputs_Correct_Metadata_ForStep_WithMetadata_Alt() throws {
|
|
let url = bundle.url(forResource: "raw-stream-audio-normal-metadata-alt", withExtension: nil)!
|
|
|
|
let data = try Data(contentsOf: url)
|
|
|
|
let parser = MetadataParser()
|
|
let processor = MetadataStreamProcessor(parser: parser.eraseToAnyParser())
|
|
processor.delegate = metadataDelegateSpy
|
|
// this is the step value as received from the http headers
|
|
processor.metadataAvailable(step: 8000)
|
|
|
|
let audio = processor.processMetadata(data: data)
|
|
XCTAssertFalse(audio.isEmpty)
|
|
|
|
XCTAssertTrue(metadataDelegateSpy.receivedMetadata.called)
|
|
guard case .success = metadataDelegateSpy.receivedMetadata.result else {
|
|
XCTFail()
|
|
return
|
|
}
|
|
XCTAssertNotNil(metadataDelegateSpy.receivedMetadata.result)
|
|
}
|
|
|
|
func test_Processor_Outputs_Correct_Metadata_ForStep_NoMetadata() throws {
|
|
let url = bundle.url(forResource: "raw-stream-audio-no-metadata", withExtension: nil)!
|
|
|
|
let data = try Data(contentsOf: url)
|
|
|
|
let parser = MetadataParser()
|
|
let processor = MetadataStreamProcessor(parser: parser.eraseToAnyParser())
|
|
processor.delegate = metadataDelegateSpy
|
|
// this is the step value as received from the http headers
|
|
processor.metadataAvailable(step: 16000)
|
|
|
|
let audio = processor.processMetadata(data: data)
|
|
XCTAssertFalse(audio.isEmpty)
|
|
|
|
XCTAssertFalse(metadataDelegateSpy.receivedMetadata.called)
|
|
XCTAssertNil(metadataDelegateSpy.receivedMetadata.result)
|
|
}
|
|
|
|
func test_Processor_Outputs_SameDataAsInput_ForEmptyData() throws {
|
|
let data = Data()
|
|
|
|
let parser = MetadataParser()
|
|
let processor = MetadataStreamProcessor(parser: parser.eraseToAnyParser())
|
|
processor.delegate = metadataDelegateSpy
|
|
// this is the step value as received from the http headers
|
|
processor.metadataAvailable(step: 16000)
|
|
|
|
let audio = processor.processMetadata(data: data)
|
|
XCTAssertTrue(audio.isEmpty)
|
|
|
|
XCTAssertFalse(metadataDelegateSpy.receivedMetadata.called)
|
|
XCTAssertNil(metadataDelegateSpy.receivedMetadata.result)
|
|
}
|
|
}
|
|
|
|
class MetadataDelegateSpy: MetadataStreamSourceDelegate {
|
|
var receivedMetadata: (called: Bool, result: Result<[String: String], MetadataParsingError>?) = (false, nil)
|
|
func didReceiveMetadata(metadata: Result<[String: String], MetadataParsingError>) {
|
|
receivedMetadata = (true, metadata)
|
|
}
|
|
}
|