The getExperienceNeeded function in GameUtils only defines the XP needed to reach a certain level.
When you reach the new level, then you can select a new promotion, so unless you mess alot in the SDK, it can't let you do b anyway, since you have to reach 10 for level 3 before you can select a new promotion, whether tier or normal.
Thus, the only solution will be rebate style.
Using BTS formula:
Total of 2 XP for first promotion
Total of 5 XP for 2nd promotion
Total of 10 XP for 3rd promotion
Total of 17 XP for 4th promotion
Let's say the XP needed for tier 1 promotion is fixed at 5 XP each.
Now this unit is level 3, XP needed to reach next level is 17 - 10 = 7
Then, if promotion chosen is normal promotion, do nothing new.
So level and threshold increases as per normal.
If promotion chosen is tier promotion, give it a rebate.
If chosing a tier promotion should NOT increase threshold for normal promotion:
1) Reduce level by 1, so that threshold remain the same.
2) Reduce XP by tier promotion XP needed (5 XP)
So you have used up 5 XP to gain a tier promotion, but that does not affect your next normal promotion.
End Result:
Back to level 3, 12/17 XP
Of course, this means that you still have to reach 17 XP to select the tier promotion, even though by right you should be able to learn it at 15.