Skip to content
This repository has been archived by the owner on Apr 26, 2023. It is now read-only.

CPM implementation #7

Merged
merged 4 commits into from
Dec 19, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
6 changes: 5 additions & 1 deletion .travis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,12 +2,15 @@ cache:
bundler: true
directories:
- Carthage/Build

git:
depth: 1

install:
- bundle install
- brew install sourcery
- carthage update --platform iOS

matrix:
include:
- os: osx
Expand All @@ -17,9 +20,10 @@ matrix:
script:
- bundle exec fastlane test
- bundle exec danger || true

notifications:
email: false
slack:
secure: KvNEEFAstBqYij4/AXkZGQUbYH++l+hQvDbrAxl4i1U/DWX+w5LcnPJ9gHedXIzgSedSsQjXQJDzyS/+uWAiauIYoiUcdHVEB/X+K3XCQj1bntS80s6epay2PrdPUnZ3V0p4G4KKabBSZK9VgmjrAKz33JX0uwCKc70ugq7B7iaPmTwkmiRbtaInIy8xUhJfypEw19PpMznkW/2R0RkJL3tNpBYolv96eMMYZ6lKJQbNZpmlkMuit8rgDJMHCDTX9W16lYx1Xb7lsRJzTSXGuPj3xSv14dExyUaXPTaeuSzrMz3jJJ+M679rIviiKKJybe+q37CMopzNwkSTZy349qcjyZzdakSpFG8MJ2IB/R8Uo+EcBLzi/RiAXd9+7UTmefijw6k6rLYNpNeYO2f00B+WppgnoyTKnTTSQbX4eekiIr4E7AQusz78r133UKmz4fUHVAj53GYCvSDxxRmPpSofB1BBTIFMZJPFN1a0AzRFP6dDYaOP0Ebsjv9ONViJtrZ8ZjQrQV8EsnogN5A8+Dg1yDzfXspke28892mSYq1lZmcGbrxkSjBpejP6FDJNZ4ytnHoQVPW4fJowqKXkyrFZ92gOAqvI+vS/x6adkidwd1zG8JroHDK2hw5aAuXN1/ktVBsDbyO5TYE0Mi76dMan5WZNjbWGGG2CBZvjXoo=
secure: HY+kZDjc2HSg+Ernsqvq8simGa7bZUW2DA4G6Rxiuy29jeVNifY3Yqqr61YFRU/Y0ppcqEK/+K37/l+j/GvmGZaW0ICPObe1uUXfx6KIcPBfjNiEfOKdYkUJc6aa4rI7PpbyCe1ja6mOxyvolD8aqOyi77K5j5x7/h/l4UprnKhzDYvTLcEpMoqEQv+s64zccs9X5hXMdHi08yqfiJ8xaUTydIU3UIuOI2vJi7MYhTOVuLfdvby0fr1Q76O8DPTm1T0utP50iovy1pKmF2LYmxV7U+l85SkMmxSLK4C5DAHWZhl17Bk7EQFWBfrTWkJ24KVQHzLCZcLJXcGw64SRrDr+xeIkW/wA3hivPw5NXn/4UOGbSdOmX+29sSey9R93Tp2DC8jlbGHs4r5Xkz8uhkxlaw+Q9pbOB9dk8yUv4Bsdfj0JAdq3DPOLDJaVY2sRU6Tx9oiCD5T3yME9yPEwQpO7gmIhdgFq/8tyzDKGNnJySZVE5KXnjrLndMUsVRRaxM+vTm+/3tAo5eMeA76ulNfxdX0LJ2kHlNe31w6eKI5TJNni8ZJ7DLhbsrW0JFi3fmGZyW+wxG0vA2nAUgRJ5UNn5YHNlg6Tns5YwUxUxy8NQyXKNEyONUh84u8X3c6ccqPWoQi66i22I+Icj6A4NPWS/8j/g1SU6Sy/apmP2/Q=
on_success: never
on_failure: always
52 changes: 52 additions & 0 deletions OathVideoPartnerSDK.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -361,6 +361,34 @@
remoteGlobalIDString = 50582F5A1E65C41900B18908;
remoteInfo = PlayerControls;
};
50AC123821C414E400B428D1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = DE611A791E9D40F200D253B2 /* PlayerControls.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 50582F5A1E65C41900B18908;
remoteInfo = PlayerControls;
};
50AC123A21C414E400B428D1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = DE2BBB281E8BEE2F00CA4296 /* VideoRenderer.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = DEA993831E83FE0600EB3B8A;
remoteInfo = VideoRenderer;
};
50AC123C21C414E400B428D1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 06E6F4CC213DA6FF008BAA23 /* PlayerCore.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 06CD5298213D8D0700C5B783;
remoteInfo = PlayerCore;
};
50AC124421C414ED00B428D1 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = 06E6F4CC213DA6FF008BAA23 /* PlayerCore.xcodeproj */;
proxyType = 1;
remoteGlobalIDString = 06CD5298213D8D0700C5B783;
remoteInfo = PlayerCore;
};
DE4C51261C8071D500BFFB0B /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = DEF3CBAE1C7F12D200CB5A74 /* Project object */;
Expand Down Expand Up @@ -1329,6 +1357,7 @@
buildRules = (
);
dependencies = (
50AC124521C414ED00B428D1 /* PBXTargetDependency */,
);
name = OathVideoPartnerSDK_tvOS;
productName = OneSDK;
Expand All @@ -1349,6 +1378,9 @@
buildRules = (
);
dependencies = (
50AC123921C414E400B428D1 /* PBXTargetDependency */,
50AC123B21C414E400B428D1 /* PBXTargetDependency */,
50AC123D21C414E400B428D1 /* PBXTargetDependency */,
5033927A1E96AFCA002562D9 /* PBXTargetDependency */,
);
name = OathVideoPartnerSDK_iOS;
Expand Down Expand Up @@ -1889,6 +1921,26 @@
name = PlayerControls;
targetProxy = 503392791E96AFCA002562D9 /* PBXContainerItemProxy */;
};
50AC123921C414E400B428D1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = PlayerControls;
targetProxy = 50AC123821C414E400B428D1 /* PBXContainerItemProxy */;
};
50AC123B21C414E400B428D1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = VideoRenderer;
targetProxy = 50AC123A21C414E400B428D1 /* PBXContainerItemProxy */;
};
50AC123D21C414E400B428D1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = PlayerCore;
targetProxy = 50AC123C21C414E400B428D1 /* PBXContainerItemProxy */;
};
50AC124521C414ED00B428D1 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
name = PlayerCore;
targetProxy = 50AC124421C414ED00B428D1 /* PBXContainerItemProxy */;
};
DE4C51271C8071D500BFFB0B /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = DE4C511A1C8071D500BFFB0B /* OathVideoPartnerSDK_iOS */;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,34 @@
ReferencedContainer = "container:PlayerCore/PlayerCore.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "50582F9D1E65D78C00B18908"
BuildableName = "PlayerControlsTests.xctest"
BlueprintName = "PlayerControlsTests"
ReferencedContainer = "container:PlayerControls/PlayerControls/PlayerControls.xcodeproj">
</BuildableReference>
</BuildActionEntry>
<BuildActionEntry
buildForTesting = "YES"
buildForRunning = "YES"
buildForProfiling = "YES"
buildForArchiving = "YES"
buildForAnalyzing = "YES">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DEA9938C1E83FE0600EB3B8A"
BuildableName = "VideoRendererTests.xctest"
BlueprintName = "VideoRendererTests"
ReferencedContainer = "container:VideoRenderer/VideoRenderer/VideoRenderer.xcodeproj">
</BuildableReference>
</BuildActionEntry>
</BuildActionEntries>
</BuildAction>
<TestAction
Expand Down Expand Up @@ -70,26 +98,6 @@
ReferencedContainer = "container:OathVideoPartnerSDK.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "50582F9D1E65D78C00B18908"
BuildableName = "PlayerControlsTests.xctest"
BlueprintName = "PlayerControlsTests"
ReferencedContainer = "container:Carthage/Checkouts/OneMobileSDK-controls-ios/PlayerControls/PlayerControls.xcodeproj">
</BuildableReference>
</TestableReference>
<TestableReference
skipped = "NO">
<BuildableReference
BuildableIdentifier = "primary"
BlueprintIdentifier = "DEA9938C1E83FE0600EB3B8A"
BuildableName = "VideoRendererTests.xctest"
BlueprintName = "VideoRendererTests"
ReferencedContainer = "container:Carthage/Checkouts/OneMobileSDK-videorenderer-ios/VideoRenderer/VideoRenderer.xcodeproj">
</BuildableReference>
</TestableReference>
</Testables>
<MacroExpansion>
<BuildableReference
Expand Down
2 changes: 1 addition & 1 deletion PlayerCore
10 changes: 5 additions & 5 deletions sources/advertisements/AdURLProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@ import Foundation
import PlayerCore

struct AdURLProvider {
let groupsFetch: (URL) -> Future<[[VRMProvider.Item]]?>
let groupsFetch: (URL) -> Future<VRMProvider.Response?>
let processItem: (VRMProvider.Item) -> Future<PlayerCore.Ad.VASTModel?>
let softTimeoutAction: (TimeInterval, @escaping Action<Void>) -> Void
let hardTimeoutAction: (TimeInterval, @escaping Action<Void>) -> Void
let softTimeoutValue: TimeInterval
let hardTimeoutValue: TimeInterval

init(groupsFetch: @escaping (URL) -> Future<[[VRMProvider.Item]]?>,
init(groupsFetch: @escaping (URL) -> Future<VRMProvider.Response?>,
processItem: @escaping (VRMProvider.Item) -> Future<PlayerCore.Ad.VASTModel?>,
softTimeoutAction: @escaping (TimeInterval, @escaping Action<Void>) -> Void,
hardTimeoutAction: @escaping (TimeInterval, @escaping Action<Void>) -> Void,
Expand Down Expand Up @@ -53,11 +53,11 @@ struct AdURLProvider {
func requestGroups() {
process.requestGroups()
self.groupsFetch(url).onComplete { result in
if let groups = result {
if let response = result {
self.queue.async {
if !isStopped {
process.didReceiveGroups(groups)
request.inputs.didReceiveGroups(groups)
process.didReceiveGroups(response.items)
request.inputs.didReceiveGroups(response.items)

self.softTimeoutAction(self.softTimeoutValue) {
self.queue.async {
Expand Down
8 changes: 6 additions & 2 deletions sources/advertisements/AdURLProviderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class AdURLProviderTests: XCTestCase {
}
}

let groupsContext = AsyncContext<URL, [[VRMProvider.Item]]?>()
let groupsContext = AsyncContext<URL, VRMProvider.Response?>()
let itemContext = AsyncContext<VRMProvider.Item, PlayerCore.Ad.VASTModel?>()
let softTimeoutContext = AsyncContext<TimeInterval, Void>()
let hardTimeoutContext = AsyncContext<TimeInterval, Void>()
Expand Down Expand Up @@ -75,8 +75,12 @@ class AdURLProviderTests: XCTestCase {
[ item ],
[ item ]
]
let response = VRMProvider.Response(transactionId: nil,
slot: "slot",
cpm: "cpm",
items:groups)

groupsContext.callbacks[0](groups)
groupsContext.callbacks[0](response)
provider.queue.sync {}

XCTAssertEqual(softTimeoutContext.callbacks.count, 1)
Expand Down
9 changes: 5 additions & 4 deletions sources/advertisements/AdVRMEngine.swift
Original file line number Diff line number Diff line change
Expand Up @@ -11,14 +11,15 @@ class AdVRMEngine {
self.dispatcher = dispatcher
}

func requestAds(using request: @escaping (URL) -> Future<VRMProvider.Response?>) -> (URL) -> Future<[[VRMProvider.Item]]?> {
func requestAds(using request: @escaping (URL) -> Future<VRMProvider.Response?>) -> (URL) -> Future<VRMProvider.Response?> {
return { url in
return request(url).map { [weak self] result in
return request(url).map { [weak self] result -> VRMProvider.Response? in
guard let `self` = self else { return nil }
guard let response = result else { return nil }
self.dispatcher(PlayerCore.adProcessGroup(transactionId: response.transactionId,
slot: response.slot))
return response.items
slot: response.slot,
cpm: response.cpm))
return response
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ class VRMRequestControllerTest: XCTestCase {

return Future(value: VRMProvider.Response(transactionId: "transactionId",
slot: "slot",
cpm: "cpm",
items: self.itemsResponse)) })


Expand Down
6 changes: 6 additions & 0 deletions sources/advertisements/VRMProvider.swift
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ struct VRMProvider {
struct Response {
let transactionId: String?
let slot: String
let cpm: CostPerMille?
let items: [[Item]]
}

Expand All @@ -24,10 +25,15 @@ struct VRMProvider {
return try json.parse("aeg")
}

static func parseCpm(from json: JSON) throws -> CostPerMille? {
return json.parse("cpm")
}

static func parse(json: JSON) throws -> Response {
return Response(
transactionId: parseTransactionId(from: json),
slot: try parseSlot(from: json),
cpm: try parseCpm(from: json),
items: try parseGroups(from: json).map { try $0.map(parseItem) })
}

Expand Down
21 changes: 20 additions & 1 deletion sources/advertisements/VRMProviderTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import Quick
import Nimble
@testable import OathVideoPartnerSDK

class VRMCallTests: QuickSpec {
class VRMProviderTests: QuickSpec {
override func spec() { //swiftlint:disable:this function_body_length
describe("groups parsing") {
let parse = VRMProvider.parseGroups
Expand Down Expand Up @@ -60,6 +60,25 @@ class VRMCallTests: QuickSpec {
}
}

describe("cpm parsing") {
it("should be successful even if value is missing") {
expect {
let result = try VRMProvider.parseCpm(from: [:])
expect(result).to(beNil())
return result
}.toNot(throwError())
}

it("should parse succesful if there is cpm value") {
expect {
let result = try VRMProvider.parseCpm(from: ["cpm" : "cpm"])
expect(result).toNot(beNil())
expect(result) == "cpm"
return result
}.toNot(throwError())
}
}

describe("url parsing") {
let parse = VRMProvider.parseURL
let url = URL(string: "http://test.com")!
Expand Down
Loading