test(upserver): 归档存档迁移与玩法闭环回归工具
This commit is contained in:
139
CodexOutput/upserver/KVGameLoadTests/ServiceHost/Stubs.cs
Normal file
139
CodexOutput/upserver/KVGameLoadTests/ServiceHost/Stubs.cs
Normal file
@@ -0,0 +1,139 @@
|
||||
// Only SDK/engine/business dependencies are replaced. Four service sources are linked unchanged.
|
||||
using PlayFab.ClientModels;
|
||||
using Newtonsoft.Json;
|
||||
// Legacy desktop fallback names AndroidDeviceId on CustomID request (unreachable with validated CustomId).
|
||||
// Keep this compatibility DTO local; do not silently change the pre-existing PF branch in production.
|
||||
namespace PlayFab.ClientModels { public class LoginWithCustomIDRequest { public string CustomId,AndroidDeviceId;public bool CreateAccount;public GetPlayerCombinedInfoRequestParams InfoRequestParameters; } }
|
||||
static class Effects
|
||||
{
|
||||
internal static int SDK,Prefs,Events,Subscriptions,Helpers,Rewards,UI,Timers,Account;
|
||||
internal static void Clear() { SDK=Prefs=Events=Subscriptions=Helpers=Rewards=UI=Timers=Account=0; }
|
||||
internal static int Total => SDK+Prefs+Events+Subscriptions+Helpers+Rewards+UI+Timers+Account;
|
||||
}
|
||||
namespace UnityEngine
|
||||
{
|
||||
public class Object { public static implicit operator bool(Object value)=>value!=null; public static void DontDestroyOnLoad(Object o){} }
|
||||
public class GameObject:Object
|
||||
{
|
||||
public static object Found;
|
||||
public static T FindObjectOfType<T>() where T:class =>Found as T;
|
||||
public T AddComponent<T>() where T:new(){Effects.Helpers++;return new T();}
|
||||
}
|
||||
public class MonoBehaviour:Object { public GameObject gameObject=new(); public T GetComponent<T>() where T:class=>null; }
|
||||
public static class Debug { public static void Log(object o){} public static void LogWarning(object o){} public static void LogError(object o){} }
|
||||
public static class Application { public static string version="synthetic",identifier="101",persistentDataPath=Path.GetTempPath(); }
|
||||
public static class SystemInfo { public static string deviceUniqueIdentifier="101",deviceModel="stub"; }
|
||||
public static class PlayerPrefs
|
||||
{
|
||||
public static readonly Dictionary<string,string> Data=new();
|
||||
public static string GetString(string key,string fallback=""){Effects.Prefs++;return Data.GetValueOrDefault(key,fallback);}
|
||||
public static void SetString(string key,string value){Effects.Prefs++;Data[key]=value;}
|
||||
public static void Save(){Effects.Prefs++;}
|
||||
}
|
||||
}
|
||||
namespace asap.core
|
||||
{
|
||||
public class InjectAttribute:Attribute{}
|
||||
public interface IConfig { T Get<T>(string key,T fallback); void Set(string key,object value); }
|
||||
public static class Awaiters { public static Task NextFrame=>Task.CompletedTask; }
|
||||
}
|
||||
sealed class Config:asap.core.IConfig
|
||||
{
|
||||
internal readonly Dictionary<string,object> Values=new();
|
||||
public T Get<T>(string key,T fallback)=>Values.TryGetValue(key,out var v)?(T)v:fallback;
|
||||
public void Set(string key,object value)=>Values[key]=value;
|
||||
}
|
||||
namespace UniRx
|
||||
{
|
||||
public sealed class Stream<T>
|
||||
{ internal static Action<T> Handlers; public IDisposable Subscribe(Action<T> action){Effects.Subscriptions++;Handlers+=action;return new Subscription(()=>Handlers-=action);} }
|
||||
public sealed class Subscription:IDisposable { readonly Action action; public Subscription(Action action)=>this.action=action;public void Dispose()=>action(); }
|
||||
}
|
||||
public static class GContext
|
||||
{
|
||||
public static readonly Container container=new();
|
||||
public static UniRx.Stream<T> OnEvent<T>()=>new();
|
||||
public static void Publish<T>(T value){Effects.Events++;UniRx.Stream<T>.Handlers?.Invoke(value);}
|
||||
}
|
||||
public sealed class Container
|
||||
{ public readonly Dictionary<Type,object> Values=new();public T Resolve<T>()=> (T)Values[typeof(T)]; }
|
||||
public static class GameDebug { public static void LogError(string s,params object[] a){} }
|
||||
public static class ZZTimeHelper { public static DateTime UtcNow()=>new(2026,9,23,0,0,0,DateTimeKind.Utc); public static bool Adjusted; public static void AdjustTime(DateTime t)=>Adjusted=true;public static void WathForcusChange(){} }
|
||||
public static class GConstant { public const string K_Event_API_URL="EventApiURL",K_AssetVersion="AssetVersion",Yidun_GooglePlayChannel="stub",Yidun_AndroidBusinessId="stub",K_PlayFab_Title="PFTitle",V_Debug_PF_Title="stub",K_PlayFab_TimeOut="PFTimeout"; }
|
||||
namespace LitJson { public static class JsonMapper { public static string ToJson(object o)=>JsonConvert.SerializeObject(o);public static T ToObject<T>(string s)=>JsonConvert.DeserializeObject<T>(s); } }
|
||||
namespace GameCore { }
|
||||
namespace YiDun.Protector { public class YiDunManager { } }
|
||||
namespace PlayFab
|
||||
{
|
||||
public static class PlayFabClientAPI
|
||||
{
|
||||
public static bool Logged;
|
||||
public static bool IsClientLoggedIn(){Effects.SDK++;return Logged;}
|
||||
public static void ForgetAllCredentials(){Effects.SDK++;Logged=false;}
|
||||
public static void UpdateUserData(UpdateUserDataRequest r,Action<UpdateUserDataResult> ok,Action<PlayFabError> fail){Effects.SDK++;ok?.Invoke(new());}
|
||||
}
|
||||
public static class PlayFabSettings { public static string TitleId;public static int RequestTimeout; }
|
||||
}
|
||||
namespace PlayFab.Internal { public static class PlayFabWebRequest { public static void SkipCertificateValidation(){Effects.SDK++;} } }
|
||||
namespace asap.playfab.async
|
||||
{
|
||||
public static class PlayFabClientAsyncAPI
|
||||
{
|
||||
internal static LoginResult Result;
|
||||
internal static Func<Task<LoginResult>> LoginOverride;
|
||||
public static Task<T> ExecuteWithRetryAsync<T>(Func<Task<T>> call)=>call();
|
||||
public static Task<LoginResult> LoginWithCustomIDAsync(LoginWithCustomIDRequest r){Effects.SDK++;PlayFab.PlayFabClientAPI.Logged=Result!=null;return LoginOverride?.Invoke() ?? Task.FromResult(Result);}
|
||||
public static Task<LoginResult> LoginWithAndroidDeviceIDAsync(LoginWithAndroidDeviceIDRequest r)=>LoginWithCustomIDAsync(new());
|
||||
public static Task<GetPlayerProfileResult> GetPlayerProfileAsync(GetPlayerProfileRequest r){Effects.SDK++;return Task.FromResult(new GetPlayerProfileResult{PlayerProfile=new PlayerProfileModel{Locations=new(){new LocationModel()}}});}
|
||||
public static Task<UpdateUserTitleDisplayNameResult> UpdateUserTitleDisplayNameAsync(UpdateUserTitleDisplayNameRequest r){Effects.SDK++;return Task.FromResult(new UpdateUserTitleDisplayNameResult{DisplayName=r.DisplayName});}
|
||||
public static Task<EmptyResponse> UpdateAvatarUrlAsync(UpdateAvatarUrlRequest r){Effects.SDK++;return Task.FromResult(new EmptyResponse());}
|
||||
public static Task<GetUserDataResult> GetUserDataAsync(GetUserDataRequest r){Effects.SDK++;return Task.FromResult(new GetUserDataResult{Data=new()});}
|
||||
}
|
||||
public static class PlayFabProfilesAsyncAPI
|
||||
{ public static Task<PlayFab.ProfilesModels.SetProfileLanguageResponse> SetProfileLanguageAsync(PlayFab.ProfilesModels.SetProfileLanguageRequest r){Effects.SDK++;return Task.FromResult(new PlayFab.ProfilesModels.SetProfileLanguageResponse());} }
|
||||
}
|
||||
namespace tysdk
|
||||
{
|
||||
public enum EAccoutType {hwGoogle,hwFacebook,hwGuest,hwVkid,Apple,none}
|
||||
public class LoginInfo { public bool isSuccess; public int userId;public string StrUserId=>userId.ToString(); }
|
||||
public sealed class TYSdkFacade
|
||||
{
|
||||
public sealed class AccountInfo {public EAccoutType channel;public string userName,avatar;public int userId;public List<EAccoutType> linkedAccout=new();}
|
||||
public static AccountInfo TYAccountInfo=new(){userId=101,channel=EAccoutType.hwGuest};
|
||||
public static bool IsLoggedIn;
|
||||
public static TYSdkFacade Instance=new();
|
||||
internal static Func<Task<LoginInfo>> LoginOverride;
|
||||
public Task<LoginInfo> LoginBySns(){Effects.SDK++;return LoginOverride?.Invoke() ?? Task.FromResult(new LoginInfo{isSuccess=true,userId=101});}
|
||||
public Task<LoginInfo> LoginByToken()=>LoginBySns();public Task<LoginInfo> Login(EAccoutType type)=>LoginBySns();
|
||||
public void Logout(){Effects.SDK++;IsLoggedIn=false;}
|
||||
public Task<bool> LinkCheck(EAccoutType t){Effects.SDK++;return Task.FromResult(false);}
|
||||
public Task<(int code,int userId)> LinkAccount(EAccoutType t){Effects.SDK++;return Task.FromResult((1,0));}
|
||||
}
|
||||
}
|
||||
public static class ChannelManager { public static bool IsRustoreStore=>false; }
|
||||
public class AFHelper { public static AFHelper Instance=new();public bool GetDLReferer(out string pid,out string uid){pid=uid=null;return false;} }
|
||||
public static class GEvent
|
||||
{
|
||||
public sealed class Event:IDisposable { public Event AddContent(string k,object v)=>this;public void Dispose(){} }
|
||||
public static Event GameEvent(string name){Effects.Events++;return new();}
|
||||
public static Event LoginEvent()=>GameEvent("login");public static Event CompleteRegistrationEvent()=>GameEvent("registration");
|
||||
public static void SetProp(string k,object v){Effects.Events++;}public static void SetUserProp(string k,object v,bool b){Effects.Events++;}
|
||||
public static void SetProps(Dictionary<string,object> p){Effects.Events++;}public static void SetUserProps(Dictionary<string,object> p){Effects.Events++;}
|
||||
public static void OnLogin(string a,string b){Effects.Events++;}
|
||||
}
|
||||
namespace game
|
||||
{
|
||||
public interface IChatService { void WaitingForLogin(); }
|
||||
public interface ISettingService { string Lang {get;} }
|
||||
public class MMTService { public string Init(int value){Effects.Events++;return value.ToString();} }
|
||||
public class PlayerData { public int lv=1;public int Loads;public void LoadPlayerData(IDictionary<string,string> data){if(!ZZTimeHelper.Adjusted)throw new Exception("PF time not adjusted");Loads++;} }
|
||||
public class ChangeAvatarEvent{}
|
||||
public class GetClubPlayInfoEvent { public string id,name,avatarUrl; }
|
||||
public class ItemData {public int id,count;public ulong curCount;}
|
||||
public enum RewardType {NormalOne}
|
||||
public class ShowData {public ShowData(){}public ShowData(List<ItemData> items,RewardType t){Effects.UI++;}}
|
||||
public class PlayerItemData {public int GetItemCount(int id)=>0;public void AddItem(ItemData i,object o){Effects.Rewards++;}}
|
||||
public class TapjoyHelper:UnityEngine.MonoBehaviour {public void Init(int balance,Action<string,int> earn,Action<string,int> changed){Effects.Helpers++;}}
|
||||
}
|
||||
namespace TapjoyUnity.Internal { public class TapjoyComponent:UnityEngine.MonoBehaviour{} }
|
||||
|
||||
Reference in New Issue
Block a user