helpers_test.go 8.6 KB

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