Skip to content

Commit

Permalink
Merge pull request #14 from flipkart-incubator/additionalAdLoadListeners
Browse files Browse the repository at this point in the history
support to add additional ad load listeners
  • Loading branch information
anirudhramanan authored Jun 9, 2020
2 parents 88152da + 2e29f6d commit e6ab7bf
Show file tree
Hide file tree
Showing 2 changed files with 183 additions and 10 deletions.
42 changes: 32 additions & 10 deletions madman/src/main/java/com/flipkart/madman/Madman.kt
Original file line number Diff line number Diff line change
Expand Up @@ -66,15 +66,16 @@ class Madman internal constructor(
context: Context
) {
private var networkLayer: NetworkLayer
private var adLoadListener: AdLoadListener
private var adLoadListeners: MutableList<AdLoadListener>
private var mainThreadHandler: Handler
private var xmlValidator: XmlValidator
private var xmlParser: XmlParser

init {
LogUtil.setLogger(builder.logger ?: DebugLevelLogger())
adLoadListener = builder.adLoadListener
?: throw IllegalStateException("adLoadListener cannot be null, implement AdLoadListener interface")
adLoadListeners = mutableListOf()
builder.adLoadListener?.let { adLoadListeners.add(it) }

networkLayer = builder.networkLayer
?: throw IllegalStateException("network layer cannot be null, implement NetworkLayer interface")
mainThreadHandler = builder.mainThreadHandler ?: Handler(Looper.getMainLooper())
Expand All @@ -86,6 +87,27 @@ class Madman internal constructor(
xmlValidator = builder.xmlValidator ?: DefaultXmlValidator()
}

/**
* Adds additional [AdLoadListener]
* This should be called before [requestAds]
*
* @param adLoadListener
*/
@MainThread
fun addAdLoadListener(adLoadListener: AdLoadListener) {
adLoadListeners.add(adLoadListener)
}

/**
* Removes already added [AdLoadListener]
*
* @param adLoadListener
*/
@MainThread
fun removeAdLoadListener(adLoadListener: AdLoadListener) {
adLoadListeners.remove(adLoadListener)
}

/**
* Call this method when the ads response is already present
*
Expand Down Expand Up @@ -126,19 +148,19 @@ class Madman internal constructor(
xmlValidator,
renderer
)
adLoadListener.onAdManagerLoaded(adsManager)
adLoadListeners.forEach { listener ->
listener.onAdManagerLoaded(adsManager)
}
}, { adErrorType: AdErrorType, message: String? ->
/**
* [VMAPData] is invalid due to the following error
* fire the onAdManagerLoadFailed event
*/
LogUtil.log("AdManager creation failed due to $adErrorType")
adLoadListener.onAdManagerLoadFailed(
AdError(
adErrorType,
message ?: Error.UNIDENTIFIED_ERROR.errorMessage
)
)
val adError = AdError(adErrorType, message ?: Error.UNIDENTIFIED_ERROR.errorMessage)
adLoadListeners.forEach { listener ->
listener.onAdManagerLoadFailed(adError)
}
})
}

Expand Down
151 changes: 151 additions & 0 deletions madman/src/test/java/com/flipkart/madman/MadmanTest.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
/*
* Copyright (C) 2020 Flipkart Internet Pvt Ltd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.flipkart.madman

import android.content.Context
import android.os.Handler
import com.flipkart.madman.listener.AdLoadListener
import com.flipkart.madman.network.NetworkLayer
import com.flipkart.madman.network.model.StringAdRequest
import com.flipkart.madman.parser.XmlParser
import com.flipkart.madman.renderer.AdRenderer
import com.flipkart.madman.testutils.CurrentThreadExecutor
import com.flipkart.madman.testutils.VMAPUtil
import com.flipkart.madman.testutils.anyObject
import com.flipkart.madman.validator.DefaultXmlValidator
import org.junit.Before
import org.junit.Test
import org.junit.runner.RunWith
import org.mockito.Mock
import org.mockito.Mockito
import org.mockito.Mockito.reset
import org.mockito.Mockito.times
import org.mockito.MockitoAnnotations
import org.robolectric.RobolectricTestRunner
import org.robolectric.annotation.Config

/**
* Test for [DefaultXmlValidator]
*/
@RunWith(RobolectricTestRunner::class)
@Config(sdk = [21])
class MadmanTest {

@Mock
private lateinit var mockAdLoadListener: AdLoadListener

@Mock
private lateinit var mockContext: Context

@Mock
private lateinit var mockAdRenderer: AdRenderer

@Mock
private lateinit var mockNetworkLayer: NetworkLayer

@Before
fun setUp() {
MockitoAnnotations.initMocks(this)
}

/**
* Test to verify that [AdLoadListener onAdManagerLoaded] is called for a valid request
*/
@Test
fun `testToVerifyAdLoadListeners's'OnAdManagerLoadedIsCalledOnValidRequest`() {
val mockParserBuilder = Mockito.spy(XmlParser.Builder::class.java)
val mockParser = mockParserBuilder.build(Handler(), CurrentThreadExecutor())
val validVMAP = VMAPUtil.readVMAPWithPreRoll()

val madman = Madman.Builder()
.setNetworkLayer(mockNetworkLayer)
.setXmlParser(mockParser)
.setAdLoadListener(mockAdLoadListener)
.build(mockContext)

madman.requestAds(StringAdRequest(validVMAP), mockAdRenderer)
/** verify the listener is called once **/
Mockito.verify(mockAdLoadListener, times(1)).onAdManagerLoaded(anyObject())
reset(mockAdLoadListener)

madman.addAdLoadListener(mockAdLoadListener)
madman.addAdLoadListener(mockAdLoadListener)

madman.requestAds(StringAdRequest(validVMAP), mockAdRenderer)
/** verify the listener is called thrice **/
Mockito.verify(mockAdLoadListener, times(3)).onAdManagerLoaded(anyObject())
reset(mockAdLoadListener)

madman.removeAdLoadListener(mockAdLoadListener)

madman.requestAds(StringAdRequest(validVMAP), mockAdRenderer)
/** verify the listener is called twice **/
Mockito.verify(mockAdLoadListener, times(2)).onAdManagerLoaded(anyObject())
reset(mockAdLoadListener)

madman.removeAdLoadListener(mockAdLoadListener)
madman.removeAdLoadListener(mockAdLoadListener)

madman.requestAds(StringAdRequest(validVMAP), mockAdRenderer)
/** verify the listener is not called as no listeners attached **/
Mockito.verify(mockAdLoadListener, times(0)).onAdManagerLoaded(anyObject())
reset(mockAdLoadListener)
}

/**
* Test to verify that [AdLoadListener onAdManagerLoadFailed] is called for a in valid request
*/
@Test
fun `testToVerifyAdLoadListeners's'OnAdManagerLoadFailedIsCalledOnValidRequest`() {
val mockParserBuilder = Mockito.spy(XmlParser.Builder::class.java)
val mockParser = mockParserBuilder.build(Handler(), CurrentThreadExecutor())
val corruptVMAP = VMAPUtil.readCorruptVMAP()

val madman = Madman.Builder()
.setNetworkLayer(mockNetworkLayer)
.setXmlParser(mockParser)
.setAdLoadListener(mockAdLoadListener)
.build(mockContext)

madman.requestAds(StringAdRequest(corruptVMAP), mockAdRenderer)
/** verify the listener is called once **/
Mockito.verify(mockAdLoadListener, times(1)).onAdManagerLoadFailed(anyObject())
reset(mockAdLoadListener)

madman.addAdLoadListener(mockAdLoadListener)
madman.addAdLoadListener(mockAdLoadListener)

madman.requestAds(StringAdRequest(corruptVMAP), mockAdRenderer)
/** verify the listener is called thrice **/
Mockito.verify(mockAdLoadListener, times(3)).onAdManagerLoadFailed(anyObject())
reset(mockAdLoadListener)

madman.removeAdLoadListener(mockAdLoadListener)

madman.requestAds(StringAdRequest(corruptVMAP), mockAdRenderer)
/** verify the listener is called twice **/
Mockito.verify(mockAdLoadListener, times(2)).onAdManagerLoadFailed(anyObject())
reset(mockAdLoadListener)

madman.removeAdLoadListener(mockAdLoadListener)
madman.removeAdLoadListener(mockAdLoadListener)

madman.requestAds(StringAdRequest(corruptVMAP), mockAdRenderer)
/** verify the listener is not called as no listeners attached **/
Mockito.verify(mockAdLoadListener, times(0)).onAdManagerLoadFailed(anyObject())
reset(mockAdLoadListener)
}
}

0 comments on commit e6ab7bf

Please sign in to comment.