SlideShare a Scribd company logo
1 of 84
Download to read offline
Testing In App Billing
The easy way
@rharter
Ryan Harter
In App Billing
AIDL
• Copy Google’s IInAppBillingService.aidl
• Connect to Play Store via Service Connection
• Manually manage connection
• Communicate directly with IAB service
IInAppBillingService
Play Billing LibraryServiceConnection
Google Play
Library Code
Your Code
AIDL
MyApp
IInAppBillingService
Play Billing LibraryServiceConnection
Google Play
Library Code
Your Code
AIDL
MyApp
Third Party Libs
Play Billing Library
• Support library
• Wraps AIDL service binding
• Based on abstract BillingClient class
• Now official solution
IInAppBillingService
Play Billing LibraryServiceConnection
Google Play
Library Code
Your Code
AIDL
MyApp
Google Play
Library Code
Your Code
Play Billing Library
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
Testing
Testing
Static SKUs
Test Accounts
Testing
Static SKUs
Test Accounts
Static SKUs
android.test.purchased
android.test.canceled
android.test.item_unavailable
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
Purchase com.sku.foo
Static SKUs
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
com.sku.foo
Static SKUs
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
com.sku.foo
android.test.purchased
Static SKUs
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
co
android.test.purchased
Static SKUs
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
co
android.test.purchased
Static SKUs
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
co
android.test.purchased
Success
Static SKUs
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
co
android.test.purchased
Success
Static SKUs
Google Play
Library Code
Your Code
IInAppBillingServicePlay Billing Library
MyApp
ServiceConnection
co
android.test.purchased
Success
Static SKUs
Google Play
Library Code
Your Code
Static SKUs
IInAppBillingServicePlay Billing LibraryServiceConnection
co
android.test.purchased
MyApp
Static SKUs - Problems
• No Inventory
• No Subscriptions
• No Consumption
• Not actual code (switcheroo)
Testing
Static SKUs
Test Accounts
Testing
Static SKUs
Test Accounts
Test Accounts
Test the actual purchase flow using real accounts.
Test Accounts
1. Add test user accounts in Google Play Console
Test Accounts
1. Add test user accounts in Google Play Console
2. Deploy your app on Google Play
Test Accounts
1. Add test user accounts in Google Play Console
2. Deploy your app on Google Play
3. Create products in the Google Play Console
Test Accounts
1. Add test user accounts in Google Play Console
2. Deploy your app on Google Play
3. Create products in the Google Play Console
4. Install Release build on a device
Test Accounts
1. Add test user accounts in Google Play Console
2. Deploy your app on Google Play
3. Create products in the Google Play Console
4. Install Release build on a device
5. Make a purchase with a test account
Test Accounts - Problems
• Must know test user accounts in advance
• Purchasable items must be published
• Must run on a device
• Must be signed with release keys
• Can’t manually manage subscription state
Test Accounts - Problems
• Must know test user accounts in advance
• Purchasable items must be published
• Must run on a device
• Must be signed with release keys
• Can’t manually manage subscription state
• Subscription testing is slow
Testing
Static SKUs
Test Accounts
Testing
Static SKUs Test Accounts
Early Development Release
Testing
Static SKUs Test Accounts
Early Development Release
???
???
Goals
• Easy integration with minimal code changes
• No debug code in production
• Allow easy inventory/transaction management
• Seamless user experience
Easily test in app purchases and subscriptions
BillingX
Easily test in app purchases and subscriptions
BillingStoreBillingX
Google Play
Library Code
Your Code
Play Billing Library
IInAppBillingServicePlay Billing Library
MyApp
BillingStoreBillingX
Google Play
Library Code
Your Code
Play Billing Library
IInAppBillingServicePlay Billing Library
MyApp
Release
BillingStore
Google Play
Library Code
Your Code
Play Billing Library
IInAppBillingServicePlay Billing Library
MyApp
BillingX
Debug Release
BillingX
Play Billing Library
BillingClient
BillingX
Play Billing Library
BillingClient
BillingClientImpl
BillingX
Play Billing Library
BillingClient
BillingClientImpl
BillingX
DebugBillingClient
Play Billing Library
BillingClient
BillingX
BillingClientImpl
BillingX
DebugBillingClient
My App
MyActivity
BillingX
class MyActivity : AppCompatActivity() {
private lateinit var billingClient: BillingClient
private val myPurchaseUpdatedListener: PurchasesUpdatedListener // = ...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
billingClient = BillingClient
.newBuilder(this)
.setListener(myPurchaseUpdatedListener)
.build()
billingClient.startConnection(object : BillingClientStateListener {
// ...
})
}
}
BillingX
class MyActivity : AppCompatActivity() {
private lateinit var billingClient: BillingClient
private val myPurchaseUpdatedListener: PurchasesUpdatedListener // = ...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
billingClient = BillingClient
.newBuilder(this)
.setListener(myPurchaseUpdatedListener)
.build()
billingClient.startConnection(object : BillingClientStateListener {
// ...
})
}
}
class MyActivity : AppCompatActivity() {
private lateinit var billingClient: BillingClient
private val myPurchaseUpdatedListener: PurchasesUpdatedListener // = ...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
billingClient = BillingClientFactory
.createBillingClient(this, myPurchaseUpdatedListener)
billingClient.startConnection(object : BillingClientStateListener {
// ...
})
}
}
BillingX
class MyActivity : AppCompatActivity() {
private lateinit var billingClient: BillingClient
private val myPurchaseUpdatedListener: PurchasesUpdatedListener // = ...
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
billingClient = BillingClientFactory
.createBillingClient(this, myPurchaseUpdatedListener)
billingClient.startConnection(object : BillingClientStateListener {
// ...
})
}
}
BillingX
BillingX
src/release/java/BillingClientFactory.kt
object BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
return BillingClient
.newBuilder(activity)
.setListener(updateListener)
.build()
}
}
src/debug/java/BillingClientFactory.kt
object BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
return DebugBillingClient(activity, updateListener)
}
}
BillingX
build.gradle
BillingX
dependencies {
implementation 'com.android.billingclient:billing:1.0'
debugImplementation 'com.pixiteapps.billingx:billingx:0.8.0'
}
build.gradle
BillingX
dependencies {
releaseImplementation 'com.android.billingclient:billing:1.0'
debugImplementation 'com.pixiteapps.billingx:billingx:0.8.0'
}
Goals
• Easy integration with minimal code changes
• No debug code in production
• Allow easy inventory/transaction management
• Seamless user experience
Easily test in app purchases and subscriptions
Goals
✓Easy integration with minimal code changes
• No debug code in production
• Allow easy inventory/transaction management
• Seamless user experience
Easily test in app purchases and subscriptions
Goals
✓Easy integration with minimal code changes
✓No debug code in production
• Allow easy inventory/transaction management
• Seamless user experience
Easily test in app purchases and subscriptions
BillingStore
Google Play
Library Code
Your Code
BillingStore
IInAppBillingServicePlay Billing Library
MyApp
BillingX
Debug Release
BillingStore Google Play
Library Code
Your Code
BillingStore
IInAppBillingServicePlay Billing Library
MyApp
BillingX
Debug Release
BillingStore
interface BillingStore {
fun getSkuDetails(params: SkuDetailsParams): List<SkuDetails>
fun getPurchases(skuType: String): Purchase.PurchasesResult
fun addProduct(skuDetails: SkuDetails): BillingStore
fun removeProduct(sku: String): BillingStore
fun clearProducts(): BillingStore
fun addPurchase(purchase: Purchase): BillingStore
fun removePurchase(sku: String): BillingStore
fun clearPurchases(): BillingStore
}
BillingStore
interface BillingStore {
fun getSkuDetails(params: SkuDetailsParams): List<SkuDetails>
fun getPurchases(skuType: String): Purchase.PurchasesResult
fun addProduct(skuDetails: SkuDetails): BillingStore
fun removeProduct(sku: String): BillingStore
fun clearProducts(): BillingStore
fun addPurchase(purchase: Purchase): BillingStore
fun removePurchase(sku: String): BillingStore
fun clearPurchases(): BillingStore
}
BillingStore
interface BillingStore {
fun getSkuDetails(params: SkuDetailsParams): List<SkuDetails>
fun getPurchases(skuType: String): Purchase.PurchasesResult
fun addProduct(skuDetails: SkuDetails): BillingStore
fun removeProduct(sku: String): BillingStore
fun clearProducts(): BillingStore
fun addPurchase(purchase: Purchase): BillingStore
fun removePurchase(sku: String): BillingStore
fun clearPurchases(): BillingStore
}
BillingStore
interface BillingStore {
fun getSkuDetails(params: SkuDetailsParams): List<SkuDetails>
fun getPurchases(skuType: String): Purchase.PurchasesResult
fun addProduct(skuDetails: SkuDetails): BillingStore
fun removeProduct(sku: String): BillingStore
fun clearProducts(): BillingStore
fun addPurchase(purchase: Purchase): BillingStore
fun removePurchase(sku: String): BillingStore
fun clearPurchases(): BillingStore
}
BillingStore
class BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
return DebugBillingClient(activity, updateListener)
}
}
BillingStore
class BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
initializeData(activity)
return DebugBillingClient(activity, updateListener)
}
}
BillingStore
class BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
initializeData(activity)
return DebugBillingClient(activity, updateListener)
}
private fun initializeData(context: Context) {
}
}
BillingStore
class BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
initializeData(activity)
return DebugBillingClient(activity, updateListener)
}
private fun initializeData(context: Context) {
runOnce(context, "init_inventory") {
}
}
}
BillingStore
class BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
initializeData(activity)
return DebugBillingClient(activity, updateListener)
}
private fun initializeData(context: Context) {
runOnce(context, "init_inventory") {
val store = BillingStore.defaultStore(context)
val inventory: List<SkuDetails> = loadInventory(context)
inventory.forEach { store.addProduct(it) }
}
}
}
BillingStore
class BillingClientFactory {
fun createBillingClient(activity: Activity,
updateListener: PurchasesUpdatedListener): BillingClient {
initializeData(activity)
return DebugBillingClient(activity, updateListener)
}
private fun initializeData(context: Context) {
runOnce(context, "init_inventory") {
val store = BillingStore.defaultStore(context)
val inventory: List<SkuDetails> = loadInventory(context)
inventory.forEach { store.addProduct(it) }
}
}
}
Google Play
Library Code
Your Code
BillingStore
IInAppBillingServicePlay Billing Library
MyApp
Debug Release
BillingStoreBillingStoreBillingStore
BillingX
BillingStoreBillingStoreBillingStore Google Play
Library Code
Your Code
BillingStore
IInAppBillingServicePlay Billing Library
MyApp
Debug Release
BillingX
BillingStore
BillingStoreBillingStoreBillingStore
BillingX
BillingStore
BillingStore BillingStore BillingStore
BillingX
BillingStoreSharedPrefsBillingStore BillingStore BillingStore
BillingStore
BillingX
BillingStoreSharedPrefsBillingStore BillingStoreRetrofitBillingStore BillingStore
BillingStore
BillingX
BillingStoreSharedPrefsBillingStore BillingStoreRetrofitBillingStore BillingStoreAmazonBillingStore
BillingStore
BillingX
AmazonBillingStoreRetrofitBillingStoreSharedPrefsBillingStoreBillingStoreBillingStoreBillingStore Google Play
Library Code
Your Code
BillingStore
IInAppBillingServicePlay Billing Library
MyApp
Debug Release
BillingX
Goals
✓Easy integration with minimal code changes
✓No debug code in production
• Allow easy inventory/transaction management
• Seamless user experience
Easily test in app purchases and subscriptions
Goals
✓Easy integration with minimal code changes
✓No debug code in production
✓Allow easy inventory/transaction management
• Seamless user experience
Easily test in app purchases and subscriptions
User Experience
User Experience
User Experience
Goals
✓Easy integration with minimal code changes
✓No debug code in production
✓Allow easy inventory/transaction management
• Seamless user experience
Easily test in app purchases and subscriptions
Goals
✓Easy integration with minimal code changes
✓No debug code in production
✓Allow easy inventory/transaction management
✓Seamless user experience
Easily test in app purchases and subscriptions
Testing In App Billing
The easy way
@rharter
Ryan Harter
https://github.com/pixiteapps/billingx

More Related Content

Similar to Testing In App Billing

Monetize your app_with_google_subscriptions_v3_services_intuit
Monetize your app_with_google_subscriptions_v3_services_intuitMonetize your app_with_google_subscriptions_v3_services_intuit
Monetize your app_with_google_subscriptions_v3_services_intuitManohar Mahapatra
 
IAP auto renewable in practice
IAP auto renewable  in practiceIAP auto renewable  in practice
IAP auto renewable in practiceHokila Jan
 
B2C-Commerce-Developer Dumps
B2C-Commerce-Developer DumpsB2C-Commerce-Developer Dumps
B2C-Commerce-Developer Dumpsaddisonkalven
 
Custom Automation Masterclass – Workshop 2: Email validation using kKckbox
Custom Automation Masterclass – Workshop 2: Email validation using kKckboxCustom Automation Masterclass – Workshop 2: Email validation using kKckbox
Custom Automation Masterclass – Workshop 2: Email validation using kKckboxJanBogaert8
 
Building a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesBuilding a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesCiaranMcNulty
 
13088674 oracle-adf-11g-learning-application-my-procurement-application
13088674 oracle-adf-11g-learning-application-my-procurement-application13088674 oracle-adf-11g-learning-application-my-procurement-application
13088674 oracle-adf-11g-learning-application-my-procurement-applicationmuzaffar1986
 
2012 SVCodeCamp: In App Payments with HTML5
2012 SVCodeCamp: In App Payments with HTML52012 SVCodeCamp: In App Payments with HTML5
2012 SVCodeCamp: In App Payments with HTML5Jonathan LeBlanc
 
Customer Automation Masterclass - Workshop 1: Data Enrichment using Clearbit
Customer Automation Masterclass - Workshop 1: Data Enrichment using ClearbitCustomer Automation Masterclass - Workshop 1: Data Enrichment using Clearbit
Customer Automation Masterclass - Workshop 1: Data Enrichment using ClearbitJanBogaert8
 
Cart creation-101217222728-phpapp01
Cart creation-101217222728-phpapp01Cart creation-101217222728-phpapp01
Cart creation-101217222728-phpapp01Jason Noble
 
AdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-MortemAdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-MortemPlayFab, Inc.
 
What I learned about firebase analytics
What I learned about firebase analyticsWhat I learned about firebase analytics
What I learned about firebase analyticsNick Guebhard
 
Shopify Theme Building Workshop
Shopify Theme Building WorkshopShopify Theme Building Workshop
Shopify Theme Building WorkshopKeir Whitaker
 
APIs for catalogs
APIs for catalogsAPIs for catalogs
APIs for catalogsX.commerce
 
Social Gold in-Flash Webinar Jan 2010
Social Gold in-Flash Webinar Jan 2010Social Gold in-Flash Webinar Jan 2010
Social Gold in-Flash Webinar Jan 2010Social Gold
 
Social Gold In-Flash Payments Webinar
Social Gold In-Flash Payments WebinarSocial Gold In-Flash Payments Webinar
Social Gold In-Flash Payments WebinarSocial Gold
 
Diversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectDiversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectŁukasz Chruściel
 

Similar to Testing In App Billing (20)

Monetize your app_with_google_subscriptions_v3_services_intuit
Monetize your app_with_google_subscriptions_v3_services_intuitMonetize your app_with_google_subscriptions_v3_services_intuit
Monetize your app_with_google_subscriptions_v3_services_intuit
 
IAP auto renewable in practice
IAP auto renewable  in practiceIAP auto renewable  in practice
IAP auto renewable in practice
 
In App Purchases
In  App  PurchasesIn  App  Purchases
In App Purchases
 
B2C-Commerce-Developer Dumps
B2C-Commerce-Developer DumpsB2C-Commerce-Developer Dumps
B2C-Commerce-Developer Dumps
 
Custom Automation Masterclass – Workshop 2: Email validation using kKckbox
Custom Automation Masterclass – Workshop 2: Email validation using kKckboxCustom Automation Masterclass – Workshop 2: Email validation using kKckbox
Custom Automation Masterclass – Workshop 2: Email validation using kKckbox
 
Building a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing StrategiesBuilding a Pyramid: Symfony Testing Strategies
Building a Pyramid: Symfony Testing Strategies
 
13088674 oracle-adf-11g-learning-application-my-procurement-application
13088674 oracle-adf-11g-learning-application-my-procurement-application13088674 oracle-adf-11g-learning-application-my-procurement-application
13088674 oracle-adf-11g-learning-application-my-procurement-application
 
2012 SVCodeCamp: In App Payments with HTML5
2012 SVCodeCamp: In App Payments with HTML52012 SVCodeCamp: In App Payments with HTML5
2012 SVCodeCamp: In App Payments with HTML5
 
Customer Automation Masterclass - Workshop 1: Data Enrichment using Clearbit
Customer Automation Masterclass - Workshop 1: Data Enrichment using ClearbitCustomer Automation Masterclass - Workshop 1: Data Enrichment using Clearbit
Customer Automation Masterclass - Workshop 1: Data Enrichment using Clearbit
 
PowerBI Embedded in D365 Finance and Operations
PowerBI Embedded in D365 Finance and OperationsPowerBI Embedded in D365 Finance and Operations
PowerBI Embedded in D365 Finance and Operations
 
Cart creation-101217222728-phpapp01
Cart creation-101217222728-phpapp01Cart creation-101217222728-phpapp01
Cart creation-101217222728-phpapp01
 
AdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-MortemAdVenture Capitalist Post-Mortem
AdVenture Capitalist Post-Mortem
 
What I learned about firebase analytics
What I learned about firebase analyticsWhat I learned about firebase analytics
What I learned about firebase analytics
 
Shopify Theme Building Workshop
Shopify Theme Building WorkshopShopify Theme Building Workshop
Shopify Theme Building Workshop
 
APIs for catalogs
APIs for catalogsAPIs for catalogs
APIs for catalogs
 
Social Gold in-Flash Webinar Jan 2010
Social Gold in-Flash Webinar Jan 2010Social Gold in-Flash Webinar Jan 2010
Social Gold in-Flash Webinar Jan 2010
 
Social Gold In-Flash Payments Webinar
Social Gold In-Flash Payments WebinarSocial Gold In-Flash Payments Webinar
Social Gold In-Flash Payments Webinar
 
Fire up your mobile app!
Fire up your mobile app!Fire up your mobile app!
Fire up your mobile app!
 
Diversified application testing based on a Sylius project
Diversified application testing based on a Sylius projectDiversified application testing based on a Sylius project
Diversified application testing based on a Sylius project
 
FinOps for private cloud
FinOps for private cloudFinOps for private cloud
FinOps for private cloud
 

Recently uploaded

[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypseTomasz Kowalczewski
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Eraconfluent
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2
 
WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...
WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...
WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...WSO2
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2
 
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & InnovationWSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & InnovationWSO2
 
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdfAzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdfryanfarris8
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIInflectra
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Bert Jan Schrijver
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2
 
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2
 
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)Roberto Bettazzoni
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationJuha-Pekka Tolvanen
 

Recently uploaded (20)

[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
[GeeCON2024] How I learned to stop worrying and love the dark silicon apocalypse
 
Evolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI EraEvolving Data Governance for the Real-time Streaming and AI Era
Evolving Data Governance for the Real-time Streaming and AI Era
 
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital TransformationWSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
WSO2Con2024 - WSO2's IAM Vision: Identity-Led Digital Transformation
 
WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...
WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...
WSO2CON 2024 - IoT Needs CIAM: The Importance of Centralized IAM in a Growing...
 
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
WSO2CON 2024 - WSO2's Digital Transformation Journey with Choreo: A Platforml...
 
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
WSO2Con2024 - From Blueprint to Brilliance: WSO2's Guide to API-First Enginee...
 
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & InnovationWSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
WSO2CON 2024 - OSU & WSO2: A Decade Journey in Integration & Innovation
 
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdfAzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
AzureNativeQumulo_HPC_Cloud_Native_Benchmarks.pdf
 
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of TransformationWSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
WSO2CON 2024 - Designing Event-Driven Enterprises: Stories of Transformation
 
WSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaSWSO2CON 2024 Slides - Open Source to SaaS
WSO2CON 2024 Slides - Open Source to SaaS
 
From Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST APIFrom Theory to Practice: Utilizing SpiraPlan's REST API
From Theory to Practice: Utilizing SpiraPlan's REST API
 
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
Devoxx UK 2024 - Going serverless with Quarkus, GraalVM native images and AWS...
 
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
WSO2CON 2024 - Navigating API Complexity: REST, GraphQL, gRPC, Websocket, Web...
 
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public AdministrationWSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
WSO2CON 2024 - How CSI Piemonte Is Apifying the Public Administration
 
WSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in UgandaWSO2CON 2024 - Building a Digital Government in Uganda
WSO2CON 2024 - Building a Digital Government in Uganda
 
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
WSO2CON 2024 - Not Just Microservices: Rightsize Your Services!
 
The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)The mythical technical debt. (Brooke, please, forgive me)
The mythical technical debt. (Brooke, please, forgive me)
 
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With SimplicityWSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
WSO2Con2024 - Enabling Transactional System's Exponential Growth With Simplicity
 
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
WSO2Con2024 - From Code To Cloud: Fast Track Your Cloud Native Journey with C...
 
What Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the SituationWhat Goes Wrong with Language Definitions and How to Improve the Situation
What Goes Wrong with Language Definitions and How to Improve the Situation
 

Testing In App Billing