Content-Length: 386969 | pFad | http://github.com/muxinc/mux-player-swift/pull/40/commits/664217901040f025cf084fd896700a4aa742c338

77 maint: Add Unit Tests for FairPlaySessionManager + good DRM errors + small testability changes by daytime-em · Pull Request #40 · muxinc/mux-player-swift · GitHub
Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

maint: Add Unit Tests for FairPlaySessionManager + good DRM errors + small testability changes #40

Merged
merged 48 commits into from
May 8, 2024
Merged
Changes from 1 commit
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
8575dec
Ok here we go
daytime-em May 2, 2024
5a527ee
different URLSessions
daytime-em May 2, 2024
2e505ff
Fairplay -> FairPlay
daytime-em May 2, 2024
539955a
move helpers out of the protocol
daytime-em May 2, 2024
431d01e
root domain testable
daytime-em May 2, 2024
cb21da1
file for fpssm tests
daytime-em May 2, 2024
8314aa6
warnings
daytime-em May 2, 2024
01280e7
there we go. one test
daytime-em May 2, 2024
02cb9af
Rename FairPlaySessionManagerImpl to DefaultFPSMangaer
daytime-em May 2, 2024
fd322af
Ok that's the trivial tests
daytime-em May 2, 2024
5069fff
do the URLProtcol thing
daytime-em May 2, 2024
683c95b
Mock URLSession
daytime-em May 2, 2024
89e5a65
Test success case for requestLicense
daytime-em May 3, 2024
66f5460
Errors
daytime-em May 3, 2024
271ae6c
Error
daytime-em May 3, 2024
23c0e5c
ok there's license almost done
daytime-em May 3, 2024
510e327
some tests
daytime-em May 3, 2024
5b17a2d
Tests added
daytime-em May 3, 2024
6642179
So far so good
daytime-em May 3, 2024
34db8cf
now throw the right errors
daytime-em May 3, 2024
92f64dc
Added tests, need to update license error returns
daytime-em May 3, 2024
b8636b5
Ok now that's some good error handling
daytime-em May 3, 2024
2f98343
Finished Cert and license tests
daytime-em May 3, 2024
6e52902
test app cert request
daytime-em May 3, 2024
10352fc
no more warnings
daytime-em May 3, 2024
2cadbe4
Ok removed TempError
daytime-em May 3, 2024
6092925
cleanup a little
daytime-em May 3, 2024
b4ce340
little note
daytime-em May 3, 2024
96ebf7c
Cleanup more
daytime-em May 3, 2024
3252d03
Oops forgot ckc request headers
daytime-em May 3, 2024
2494757
refactor: redirect singleton calls to injected dependencies
andrewjl-mux May 3, 2024
7ce571f
Rename abbreviated identifiers and split apart protocols
andrewjl-mux May 4, 2024
d667eb2
Remove test session delegate
andrewjl-mux May 4, 2024
0db869e
turns out we do not need this
andrewjl-mux May 4, 2024
f114f2e
refactor: minimize implicit singleton calls
andrewjl-mux May 4, 2024
553402d
test: validate DRM registration when drm token provided
andrewjl-mux May 4, 2024
2e560f2
Non-public API, use extension to initialize URL
andrewjl-mux May 4, 2024
af5c3be
avoid tripping up docc for internal extensions
andrewjl-mux May 4, 2024
f18c24f
cleaner test
andrewjl-mux May 4, 2024
96a29e4
route calls to one chokepoint for simplicity
andrewjl-mux May 4, 2024
c12d8b2
We can use generics instead I think
andrewjl-mux May 4, 2024
6fe1bf6
add a few comments
andrewjl-mux May 4, 2024
6264654
some comments
daytime-em May 6, 2024
6ed858b
some comments
daytime-em May 6, 2024
d786452
Merge branch 'maint/drm-unit-tests' of github.com:muxinc/mux-player-s…
daytime-em May 6, 2024
18877d0
Need to set ContentKeyDelegate
daytime-em May 7, 2024
c21421d
Merge branch 'push-drm-mocking' into maint/drm-unit-tests
daytime-em May 7, 2024
18b1065
Tests for ContentKeySessionDelegate + Testability Tweaks (#44)
daytime-em May 8, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
So far so good
  • Loading branch information
daytime-em committed May 3, 2024
commit 664217901040f025cf084fd896700a4aa742c338
190 changes: 190 additions & 0 deletions Tests/MuxPlayerSwift/FairPlay/FairPlaySessionManagerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -273,4 +273,194 @@ class FairPlaySessionManagerTests : XCTestCase {
return
}
}

func testRequestLicenseSuccess() throws {
let fakeRootDomain = "custom.domain.com"
let fakePlaybackId = "fake_playback_id"
let fakeDrmToken = "fake_drm_token"
let fakeSpcData = "fake-spc-data".data(using: .utf8)!

// to be returned by call under test
let fakeLicense = "fake-license-binary-data".data(using: .utf8)

let requestSuccess = XCTestExpectation(description: "request license successfully")
MockURLProtocol.requestHandler = { request in
let response = HTTPURLResponse(
url: request.url!,
statusCode: 200,
httpVersion: "HTTP/1.1",
headerFields: nil
)!

return (response, fakeLicense)
}

var foundAppCert: Data?
sessionManager.requestLicense(
spcData: fakeSpcData,
playbackID: fakePlaybackId,
drmToken: fakeDrmToken,
rootDomain: fakeRootDomain,
offline: false
) { result in
guard let result = try? result.get() else {
XCTFail("Should not report failure for the given request")
return
}

foundAppCert = result
requestSuccess.fulfill()
}
wait(for: [requestSuccess])
XCTAssertEqual(foundAppCert, fakeLicense)
}

func testRequestHttpError() throws {
let fakeRootDomain = "custom.domain.com"
let fakePlaybackId = "fake_playback_id"
let fakeDrmToken = "fake_drm_token"
let fakeHTTPStatus = 500 // all codes are handled the same way, by failing
// real app certs are opaque binary to us, the fake one can be whatever

let requestFails = XCTestExpectation(description: "request certificate successfully")
MockURLProtocol.requestHandler = { request in
let response = HTTPURLResponse(
url: request.url!,
statusCode: fakeHTTPStatus,
httpVersion: "HTTP/1.1",
headerFields: nil
)!

// failed requests proxied from our drm vendor have response bodies with
// base64 text, which we should treat as opaque (not parse or decode),
// since can't do anything with them and Cast logs them on the backend
let errorBody = "failed request source text"
let errorData = errorBody.data(using: .utf8) // crashes if processed probably
return (
response,
errorData
)
}

var reqError: Error?
sessionManager.requestCertificate(
fromDomain: fakeRootDomain,
playbackID: fakePlaybackId,
drmToken: fakeDrmToken
) { result in
do {
let result = try result.get()
XCTFail("failure should have been reported")
} catch {
reqError = error
}
requestFails.fulfill()

}
wait(for: [requestFails])

guard let reqError = reqError,
let fpsError = reqError as? FairPlaySessionError
else {
XCTFail("Request error was wrong type")
return
}

if case .httpFailed(let code) = fpsError {
XCTAssertEqual(code, fakeHTTPStatus)
} else {
XCTFail("HTTP failure not reported with .httpFailed()")
}
}

func testRequestCertificateIOError() throws {
let fakeRootDomain = "custom.domain.com"
let fakePlaybackId = "fake_playback_id"
let fakeDrmToken = "fake_drm_token"
let fakeError = FakeError(tag: "some io fail")
// real app certs are opaque binary to us, the fake one can be whatever

let requestFails = XCTestExpectation(description: "request certificate successfully")
MockURLProtocol.requestHandler = { request in
throw FakeError()
}

var reqError: Error?
sessionManager.requestCertificate(
fromDomain: fakeRootDomain,
playbackID: fakePlaybackId,
drmToken: fakeDrmToken
) { result in
do {
try result.get()
XCTFail("failure should have been reported")
} catch {
reqError = error
}
requestFails.fulfill()
}
wait(for: [requestFails])

guard let reqError = reqError,
let fpsError = reqError as? FairPlaySessionError
else {
XCTFail("Request error was wrong type")
return
}

guard case .because(let cause) = fpsError else {
XCTFail("I/O Failure should report a cause")
return
}

// If we make it here, we succeeded
}

func testRequestCertificateBlankWithSusStatusCode() throws {
let fakeRootDomain = "custom.domain.com"
let fakePlaybackId = "fake_playback_id"
let fakeDrmToken = "fake_drm_token"
// In this case, there's a successful response but no body

let requestFails = XCTestExpectation(description: "request certificate suspicious 200/OK should be treated as failure")
MockURLProtocol.requestHandler = { request in
let response = HTTPURLResponse(
url: request.url!,
statusCode: 200,
httpVersion: "HTTP/1.1",
headerFields: nil
)!

return (response, nil)
}

// Expected behavior: URLTask does something odd, requestCertificate returns error
var reqError: Error?
sessionManager.requestCertificate(
fromDomain: fakeRootDomain,
playbackID: fakePlaybackId,
drmToken: fakeDrmToken
) { result in
do {
try result.get()
XCTFail("failure should have been reported")
} catch {
reqError = error
requestFails.fulfill()
}
}
wait(for: [requestFails])

guard let reqError = reqError,
let fpsError = reqError as? FairPlaySessionError
else {
XCTFail("Request error was wrong type")
return
}

guard case .unexpected(_) = fpsError else {
XCTFail("I/O Failure should report a cause")
return
}
}
}








ApplySandwichStrip

pFad - (p)hone/(F)rame/(a)nonymizer/(d)eclutterfier!      Saves Data!


--- a PPN by Garber Painting Akron. With Image Size Reduction included!

Fetched URL: http://github.com/muxinc/mux-player-swift/pull/40/commits/664217901040f025cf084fd896700a4aa742c338

Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy