helpers_test.go 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. package toc
  2. import (
  3. "context"
  4. "time"
  5. "github.com/stretchr/testify/mock"
  6. "github.com/mk6i/open-oscar-server/state"
  7. "github.com/mk6i/open-oscar-server/wire"
  8. )
  9. type adminParams struct {
  10. infoChangeRequestParams
  11. }
  12. type infoChangeRequestParams []struct {
  13. me state.IdentScreenName
  14. inBody wire.SNAC_0x07_0x04_AdminInfoChangeRequest
  15. msg wire.SNACMessage
  16. err error
  17. }
  18. type addBuddiesParams []struct {
  19. me state.IdentScreenName
  20. inBody wire.SNAC_0x03_0x04_BuddyAddBuddies
  21. err error
  22. }
  23. type broadcastBuddyDepartedParams []struct {
  24. me state.IdentScreenName
  25. err error
  26. }
  27. type delBuddiesParams []struct {
  28. me state.IdentScreenName
  29. inBody wire.SNAC_0x03_0x05_BuddyDelBuddies
  30. err error
  31. }
  32. type buddyParams struct {
  33. addBuddiesParams
  34. broadcastBuddyDepartedParams
  35. delBuddiesParams
  36. }
  37. type chatParams struct {
  38. channelMsgToHostParamsChat
  39. }
  40. type createRoomParams []struct {
  41. me state.IdentScreenName
  42. inBody wire.SNAC_0x0E_0x02_ChatRoomInfoUpdate
  43. msg wire.SNACMessage
  44. err error
  45. }
  46. type requestRoomInfoParams []struct {
  47. inBody wire.SNAC_0x0D_0x04_ChatNavRequestRoomInfo
  48. msg wire.SNACMessage
  49. err error
  50. }
  51. type chatNavParams struct {
  52. createRoomParams
  53. requestRoomInfoParams
  54. }
  55. type channelMsgToHostParamsChat []struct {
  56. sender state.IdentScreenName
  57. inBody wire.SNAC_0x0E_0x05_ChatChannelMsgToHost
  58. result *wire.SNACMessage
  59. err error
  60. }
  61. type channelMsgToHostParamsICBM []struct {
  62. sender state.IdentScreenName
  63. inFrame wire.SNACFrame
  64. inBody wire.SNAC_0x04_0x06_ICBMChannelMsgToHost
  65. result *wire.SNACMessage
  66. err error
  67. }
  68. type clientEventParams []struct {
  69. sender state.IdentScreenName
  70. inBody wire.SNAC_0x04_0x14_ICBMClientEvent
  71. err error
  72. }
  73. type evilRequestParams []struct {
  74. me state.IdentScreenName
  75. inBody wire.SNAC_0x04_0x08_ICBMEvilRequest
  76. msg wire.SNACMessage
  77. err error
  78. }
  79. type icbmParams struct {
  80. channelMsgToHostParamsICBM
  81. clientEventParams
  82. evilRequestParams
  83. }
  84. type clientOnlineParams []struct {
  85. body wire.SNAC_0x01_0x02_OServiceClientOnline
  86. me state.IdentScreenName
  87. service uint16
  88. err error
  89. }
  90. type idleNotificationParams []struct {
  91. me state.IdentScreenName
  92. bodyIn wire.SNAC_0x01_0x11_OServiceIdleNotification
  93. err error
  94. }
  95. type serviceRequestParams []struct {
  96. me state.IdentScreenName
  97. bodyIn wire.SNAC_0x01_0x04_OServiceServiceRequest
  98. msg wire.SNACMessage
  99. err error
  100. }
  101. type oServiceParams struct {
  102. clientOnlineParams
  103. idleNotificationParams
  104. serviceRequestParams
  105. }
  106. type flapLoginParams []struct {
  107. frame wire.FLAPSignonFrame
  108. tlv wire.TLVRestBlock
  109. err error
  110. }
  111. type registerBOSSessionParams []struct {
  112. authCookie state.ServerCookie
  113. instance *state.SessionInstance
  114. err error
  115. }
  116. type registerChatSessionParams []struct {
  117. authCookie state.ServerCookie
  118. instance *state.SessionInstance
  119. err error
  120. }
  121. type signoutParams []struct {
  122. me state.IdentScreenName
  123. }
  124. type signoutChatParams []struct {
  125. me state.IdentScreenName
  126. }
  127. type authParams struct {
  128. crackCookieParams
  129. flapLoginParams
  130. registerBOSSessionParams
  131. registerChatSessionParams
  132. signoutParams
  133. signoutChatParams
  134. }
  135. type crackCookieParams []struct {
  136. cookieIn []byte
  137. cookieOut state.ServerCookie
  138. err error
  139. }
  140. type setDirInfoParams []struct {
  141. me state.IdentScreenName
  142. inBody wire.SNAC_0x02_0x09_LocateSetDirInfo
  143. msg wire.SNACMessage
  144. err error
  145. }
  146. type setInfoParams []struct {
  147. me state.IdentScreenName
  148. inBody wire.SNAC_0x02_0x04_LocateSetInfo
  149. err error
  150. }
  151. type userInfoQueryParams []struct {
  152. me state.IdentScreenName
  153. inBody wire.SNAC_0x02_0x05_LocateUserInfoQuery
  154. msg wire.SNACMessage
  155. err error
  156. }
  157. type dirInfoParams []struct {
  158. body wire.SNAC_0x02_0x0B_LocateGetDirInfo
  159. msg wire.SNACMessage
  160. err error
  161. }
  162. type locateParams struct {
  163. setDirInfoParams
  164. setInfoParams
  165. userInfoQueryParams
  166. dirInfoParams
  167. }
  168. type infoQueryParams []struct {
  169. inBody wire.SNAC_0x0F_0x02_InfoQuery
  170. msg wire.SNACMessage
  171. err error
  172. }
  173. type dirSearchParams struct {
  174. infoQueryParams
  175. }
  176. type addDenyListEntriesParams []struct {
  177. me state.IdentScreenName
  178. body wire.SNAC_0x09_0x07_PermitDenyAddDenyListEntries
  179. err error
  180. }
  181. type addPermListEntriesParams []struct {
  182. me state.IdentScreenName
  183. body wire.SNAC_0x09_0x05_PermitDenyAddPermListEntries
  184. err error
  185. }
  186. type permitDenyParams struct {
  187. addDenyListEntriesParams
  188. addPermListEntriesParams
  189. }
  190. type registerBuddyListParams []struct {
  191. user state.IdentScreenName
  192. err error
  193. }
  194. type unregisterBuddyListParams []struct {
  195. user state.IdentScreenName
  196. err error
  197. }
  198. type buddyListRegistryParams struct {
  199. registerBuddyListParams
  200. unregisterBuddyListParams
  201. }
  202. type setTOCConfigParams []struct {
  203. user state.IdentScreenName
  204. config string
  205. err error
  206. }
  207. type userParams []struct {
  208. screenName state.IdentScreenName
  209. returnedUser *state.User
  210. err error
  211. }
  212. type retrieveSessionParams []struct {
  213. screenName state.IdentScreenName
  214. returnedSession *state.Session
  215. }
  216. type sessionRetrieverParams struct {
  217. retrieveSessionParams
  218. }
  219. type tocConfigParams struct {
  220. setTOCConfigParams
  221. userParams
  222. }
  223. type feedBagParams struct {
  224. useFeedbagParams
  225. feedbagParams
  226. feedbagServiceUseParams
  227. feedbagServiceUpsertItemParams
  228. feedbagServiceDeleteItemParams
  229. }
  230. // feedbagServiceUseParams is the list of parameters for each expected
  231. // FeedbagService.Use call (e.g. for TOC2 Signon).
  232. type feedbagServiceUseParams []struct {
  233. err error
  234. }
  235. type useFeedbagParams []struct {
  236. me state.IdentScreenName
  237. err error
  238. }
  239. // feedbagParams is the list of parameters passed at the mock
  240. // FeedbagManager.Feedbag call site (e.g. for NewBuddies).
  241. type feedbagParams []struct {
  242. screenName state.IdentScreenName
  243. results []wire.FeedbagItem
  244. err error
  245. }
  246. // feedbagServiceUpsertItemParams is the list of parameters for each expected
  247. // FeedbagService.UpsertItem call. Frame is the expected SNACFrame, items is the
  248. // exact slice of feedbag items (order of params = order of calls).
  249. type feedbagServiceUpsertItemParams []struct {
  250. frame wire.SNACFrame
  251. items []wire.FeedbagItem
  252. msg *wire.SNACMessage
  253. err error
  254. }
  255. // feedbagServiceDeleteItemParams is the list of parameters for each expected
  256. // FeedbagService.DeleteItem call.
  257. type feedbagServiceDeleteItemParams []struct {
  258. frame wire.SNACFrame
  259. inBody wire.SNAC_0x13_0x0A_FeedbagDeleteItem
  260. msg *wire.SNACMessage
  261. err error
  262. }
  263. // removeUserFromAllChatsParams is the list of parameters for each expected
  264. // ChatSessionManager.RemoveUserFromAllChats call.
  265. type removeUserFromAllChatsParams []struct {
  266. user state.IdentScreenName
  267. }
  268. // chatSessionManagerParams groups mock expectations for ChatSessionManager.
  269. type chatSessionManagerParams struct {
  270. removeUserFromAllChatsParams
  271. }
  272. type mockParams struct {
  273. adminParams
  274. authParams
  275. buddyListRegistryParams
  276. buddyParams
  277. chatNavParams
  278. chatParams
  279. chatSessionManagerParams
  280. cookieBakerParams
  281. dirSearchParams
  282. icbmParams
  283. locateParams
  284. oServiceParams
  285. feedBagParams
  286. permitDenyParams
  287. sessionRetrieverParams
  288. tocConfigParams
  289. }
  290. // issueParams holds multiple scenarios for the Issue method.
  291. type issueParams []struct {
  292. data []byte
  293. returnData []byte
  294. returnErr error
  295. }
  296. // cookieBakerParams groups the method scenarios for a CookieBaker.
  297. type cookieBakerParams struct {
  298. issueParams issueParams
  299. }
  300. // matchSession matches a mock call based session ident screen name.
  301. func matchSession(mustMatch state.IdentScreenName) interface{} {
  302. return mock.MatchedBy(func(s *state.SessionInstance) bool {
  303. return mustMatch == s.IdentScreenName()
  304. })
  305. }
  306. // newTestSession creates a session object with 0 or more functional options
  307. // applied
  308. func newTestSession(screenName state.DisplayScreenName, options ...func(instance *state.SessionInstance)) *state.SessionInstance {
  309. s := state.NewSession().AddInstance()
  310. s.Session().SetIdentScreenName(screenName.IdentScreenName())
  311. s.Session().SetDisplayScreenName(screenName)
  312. s.SetSignonComplete()
  313. s.Session().SetRateClasses(time.Now(), wire.NewRateLimitClasses([5]wire.RateClass{
  314. {
  315. ID: 1,
  316. WindowSize: 80,
  317. ClearLevel: 2500,
  318. AlertLevel: 2000,
  319. LimitLevel: 1500,
  320. DisconnectLevel: 800,
  321. MaxLevel: 6000,
  322. },
  323. {
  324. ID: 2,
  325. WindowSize: 80,
  326. ClearLevel: 3000,
  327. AlertLevel: 2000,
  328. LimitLevel: 1500,
  329. DisconnectLevel: 1000,
  330. MaxLevel: 6000,
  331. },
  332. {
  333. ID: 3,
  334. WindowSize: 20,
  335. ClearLevel: 5100,
  336. AlertLevel: 5000,
  337. LimitLevel: 4000,
  338. DisconnectLevel: 3000,
  339. MaxLevel: 6000,
  340. },
  341. {
  342. ID: 4,
  343. WindowSize: 20,
  344. ClearLevel: 5500,
  345. AlertLevel: 5300,
  346. LimitLevel: 4200,
  347. DisconnectLevel: 3000,
  348. MaxLevel: 8000,
  349. },
  350. {
  351. ID: 5,
  352. WindowSize: 10,
  353. ClearLevel: 5500,
  354. AlertLevel: 5300,
  355. LimitLevel: 4200,
  356. DisconnectLevel: 3000,
  357. MaxLevel: 8000,
  358. },
  359. }))
  360. for _, op := range options {
  361. op(s)
  362. }
  363. return s
  364. }
  365. // matchContext matches any instance of Context interface.
  366. func matchContext() interface{} {
  367. return mock.MatchedBy(func(ctx any) bool {
  368. _, ok := ctx.(context.Context)
  369. return ok
  370. })
  371. }