| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887 |
- package foodgroup
- import (
- "bytes"
- "context"
- "io"
- "log/slog"
- "testing"
- "github.com/stretchr/testify/assert"
- "github.com/stretchr/testify/mock"
- "github.com/mk6i/open-oscar-server/state"
- "github.com/mk6i/open-oscar-server/wire"
- )
- func TestBARTService_UpsertItem(t *testing.T) {
- itemHash := []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed}
- itemData := []byte{'i', 't', 'e', 'm', 'd', 'a', 't', 'a'}
- cases := []struct {
- // name is the unit test name
- name string
- // instance is the session of the user adding to feedbag
- instance *state.SessionInstance
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC wire.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput wire.SNACMessage
- // wantErr is the expected error
- wantErr error
- // instanceMatch verifies the session state after completion
- instanceMatch func(instance *state.SessionInstance)
- }{
- {
- name: "insert new buddy icon for current session",
- instance: newTestInstance("user_screen_name", sessOptBuddyIcon(wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsUnknown,
- Hash: itemHash,
- },
- })),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x02_BARTUploadQuery{
- Type: wire.BARTTypesBuddyIcon,
- Data: itemData,
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerUpsertParams: bartItemManagerUpsertParams{
- {
- itemHash: itemHash,
- payload: itemData,
- bartType: wire.BARTTypesBuddyIcon,
- },
- },
- },
- buddyBroadcasterParams: buddyBroadcasterParams{
- broadcastBuddyArrivedParams: broadcastBuddyArrivedParams{
- {
- screenName: state.DisplayScreenName("user_screen_name"),
- bodyMatcher: func(tlvInfo wire.TLVUserInfo) bool {
- bartID, exists := tlvInfo.Bytes(wire.OServiceUserInfoBARTInfo)
- return exists &&
- tlvInfo.ScreenName == "user_screen_name" &&
- bytes.Contains(bartID, itemHash)
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- relayToScreenNameParams: relayToScreenNameParams{
- {
- screenName: state.NewIdentScreenName("user_screen_name"),
- message: wire.SNACMessage{
- Frame: wire.SNACFrame{
- FoodGroup: wire.OService,
- SubGroup: wire.OServiceUserInfoUpdate,
- },
- Body: func(val any) bool {
- snac, ok := val.(wire.SNAC_0x01_0x0F_OServiceUserInfoUpdate)
- if !ok {
- return false
- }
- bartID, exists := snac.UserInfo[0].Bytes(wire.OServiceUserInfoBARTInfo)
- return exists &&
- snac.UserInfo[0].ScreenName == "user_screen_name" &&
- bytes.Contains(bartID, itemHash)
- },
- },
- },
- },
- },
- },
- expectOutput: wire.SNACMessage{
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTUploadReply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x03_BARTUploadReply{
- Code: wire.BARTReplyCodesSuccess,
- ID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsKnown,
- Hash: itemHash,
- },
- },
- },
- },
- instanceMatch: func(instance *state.SessionInstance) {
- have, hasIcon := instance.Session().BuddyIcon()
- assert.True(t, hasIcon)
- want := wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsKnown,
- Hash: itemHash,
- },
- }
- assert.Equal(t, want, have)
- },
- },
- {
- name: "insert existing buddy icon for current session",
- instance: newTestInstance("user_screen_name", sessOptBuddyIcon(wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsUnknown,
- Hash: itemHash,
- },
- })),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x02_BARTUploadQuery{
- Type: wire.BARTTypesBuddyIcon,
- Data: itemData,
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerUpsertParams: bartItemManagerUpsertParams{
- {
- itemHash: itemHash,
- payload: itemData,
- bartType: wire.BARTTypesBuddyIcon,
- err: state.ErrBARTItemExists,
- },
- },
- },
- buddyBroadcasterParams: buddyBroadcasterParams{
- broadcastBuddyArrivedParams: broadcastBuddyArrivedParams{
- {
- screenName: state.DisplayScreenName("user_screen_name"),
- bodyMatcher: func(tlvInfo wire.TLVUserInfo) bool {
- bartID, exists := tlvInfo.Bytes(wire.OServiceUserInfoBARTInfo)
- return exists &&
- tlvInfo.ScreenName == "user_screen_name" &&
- bytes.Contains(bartID, itemHash)
- },
- },
- },
- },
- messageRelayerParams: messageRelayerParams{
- relayToScreenNameParams: relayToScreenNameParams{
- {
- screenName: state.NewIdentScreenName("user_screen_name"),
- message: wire.SNACMessage{
- Frame: wire.SNACFrame{
- FoodGroup: wire.OService,
- SubGroup: wire.OServiceUserInfoUpdate,
- },
- Body: func(val any) bool {
- snac, ok := val.(wire.SNAC_0x01_0x0F_OServiceUserInfoUpdate)
- if !ok {
- return false
- }
- bartID, exists := snac.UserInfo[0].Bytes(wire.OServiceUserInfoBARTInfo)
- return exists &&
- snac.UserInfo[0].ScreenName == "user_screen_name" &&
- bytes.Contains(bartID, itemHash)
- },
- },
- },
- },
- },
- },
- expectOutput: wire.SNACMessage{
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTUploadReply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x03_BARTUploadReply{
- Code: wire.BARTReplyCodesSuccess,
- ID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsKnown,
- Hash: itemHash,
- },
- },
- },
- },
- instanceMatch: func(instance *state.SessionInstance) {
- have, hasIcon := instance.Session().BuddyIcon()
- assert.True(t, hasIcon)
- want := wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsKnown,
- Hash: itemHash,
- },
- }
- assert.Equal(t, want, have)
- },
- },
- {
- name: "insert new buddy icon, get insertion error",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x02_BARTUploadQuery{
- Type: wire.BARTTypesBuddyIcon,
- Data: itemData,
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerUpsertParams: bartItemManagerUpsertParams{
- {
- itemHash: itemHash,
- payload: itemData,
- bartType: wire.BARTTypesBuddyIcon,
- err: io.EOF,
- },
- },
- },
- },
- expectOutput: wire.SNACMessage{},
- wantErr: io.EOF,
- },
- {
- name: "insert new buddy icon unrelated to current session",
- instance: newTestInstance("user_screen_name", sessOptBuddyIcon(wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsKnown,
- Hash: []byte("unrelated icon"),
- },
- })),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x02_BARTUploadQuery{
- Type: wire.BARTTypesBuddyIcon,
- Data: itemData,
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerUpsertParams: bartItemManagerUpsertParams{
- {
- itemHash: itemHash,
- payload: itemData,
- bartType: wire.BARTTypesBuddyIcon,
- },
- },
- },
- messageRelayerParams: messageRelayerParams{},
- },
- expectOutput: wire.SNACMessage{
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTUploadReply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x03_BARTUploadReply{
- Code: wire.BARTReplyCodesSuccess,
- ID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom,
- Hash: itemHash,
- },
- },
- },
- },
- instanceMatch: func(instance *state.SessionInstance) {
- // assert session icon didn't change
- have, hasIcon := instance.Session().BuddyIcon()
- assert.True(t, hasIcon)
- want := wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsCustom | wire.BARTFlagsKnown,
- Hash: []byte("unrelated icon"),
- },
- }
- assert.Equal(t, want, have)
- },
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- bartItemManager := newMockBARTItemManager(t)
- for _, params := range tc.mockParams.bartItemManagerUpsertParams {
- bartItemManager.EXPECT().
- InsertBARTItem(matchContext(), params.itemHash, params.payload, params.bartType).
- Return(params.err)
- }
- buddyUpdateBroadcaster := newMockbuddyBroadcaster(t)
- for _, params := range tc.mockParams.broadcastBuddyArrivedParams {
- buddyUpdateBroadcaster.EXPECT().
- BroadcastBuddyArrived(mock.Anything,
- state.NewIdentScreenName(params.screenName.String()),
- mock.MatchedBy(params.bodyMatcher)).
- Return(params.err)
- }
- messageRelayer := newMockMessageRelayer(t)
- for _, params := range tc.mockParams.relayToScreenNameParams {
- messageRelayer.EXPECT().
- RelayToScreenName(matchContext(), params.screenName, mock.MatchedBy(func(message wire.SNACMessage) bool {
- return params.message.Frame == message.Frame &&
- params.message.Body.(func(any) bool)(message.Body)
- }))
- }
- svc := NewBARTService(slog.Default(), bartItemManager, messageRelayer, nil, nil)
- svc.buddyUpdateBroadcaster = buddyUpdateBroadcaster
- output, err := svc.UpsertItem(context.Background(), tc.instance, tc.inputSNAC.Frame,
- tc.inputSNAC.Body.(wire.SNAC_0x10_0x02_BARTUploadQuery))
- assert.ErrorIs(t, err, tc.wantErr)
- assert.Equal(t, output, tc.expectOutput)
- if tc.instanceMatch != nil {
- tc.instanceMatch(tc.instance)
- }
- })
- }
- }
- func TestBARTService_RetrieveItem(t *testing.T) {
- cases := []struct {
- // name is the unit test name
- name string
- // instance is the session of the user adding to feedbag
- instance *state.SessionInstance
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC wire.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput wire.SNACMessage
- // expectErr is the expected error
- expectErr error
- }{
- {
- name: "retrieve buddy icon",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x04_BARTDownloadQuery{
- ScreenName: "user_screen_name",
- Command: 1,
- BARTID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerRetrieveParams: bartItemManagerRetrieveParams{
- {
- itemHash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- result: []byte{'i', 't', 'e', 'm', 'd', 'a', 't', 'a'},
- },
- },
- },
- },
- expectOutput: wire.SNACMessage{
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTDownloadReply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x05_BARTDownloadReply{
- ScreenName: "user_screen_name",
- BARTID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- Data: []byte{'i', 't', 'e', 'm', 'd', 'a', 't', 'a'},
- },
- },
- },
- {
- name: "retrieve blank icon used for clearing buddy icon",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x04_BARTDownloadQuery{
- ScreenName: "user_screen_name",
- Command: 1,
- BARTID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: wire.GetClearIconHash(),
- },
- },
- },
- },
- expectOutput: wire.SNACMessage{
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTDownloadReply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x05_BARTDownloadReply{
- ScreenName: "user_screen_name",
- BARTID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: wire.GetClearIconHash(),
- },
- },
- Data: blankGIF,
- },
- },
- },
- {
- name: "retrieve item with error",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x04_BARTDownloadQuery{
- ScreenName: "user_screen_name",
- Command: 1,
- BARTID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerRetrieveParams: bartItemManagerRetrieveParams{
- {
- itemHash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- result: nil,
- err: assert.AnError,
- },
- },
- },
- },
- expectOutput: wire.SNACMessage{},
- expectErr: assert.AnError,
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- bartItemManager := newMockBARTItemManager(t)
- for _, params := range tc.mockParams.bartItemManagerRetrieveParams {
- bartItemManager.EXPECT().
- BARTItem(matchContext(), params.itemHash).
- Return(params.result, params.err)
- }
- svc := NewBARTService(slog.Default(), bartItemManager, nil, nil, nil)
- output, err := svc.RetrieveItem(context.Background(), tc.inputSNAC.Frame, tc.inputSNAC.Body.(wire.SNAC_0x10_0x04_BARTDownloadQuery))
- assert.ErrorIs(t, err, tc.expectErr)
- assert.Equal(t, output, tc.expectOutput)
- })
- }
- }
- func TestBARTService_RetrieveItemV2(t *testing.T) {
- cases := []struct {
- // name is the unit test name
- name string
- // instance is the session of the user adding to feedbag
- instance *state.SessionInstance
- // inputSNAC is the SNAC sent from the client to the server
- inputSNAC wire.SNACMessage
- // mockParams is the list of params sent to mocks that satisfy this
- // method's dependencies
- mockParams mockParams
- // expectOutput is the SNAC sent from the server to client
- expectOutput []wire.SNACMessage
- // expectErr is the expected error
- expectErr error
- }{
- {
- name: "retrieve single buddy icon",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x06_BARTDownload2Query{
- ScreenName: "user_screen_name",
- IDs: []wire.BARTID{
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- },
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerRetrieveParams: bartItemManagerRetrieveParams{
- {
- itemHash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- result: []byte{'i', 't', 'e', 'm', 'd', 'a', 't', 'a'},
- },
- },
- },
- },
- expectOutput: []wire.SNACMessage{
- {
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTDownload2Reply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x07_BARTDownload2Reply{
- ScreenName: "user_screen_name",
- ReplyID: wire.BartQueryReplyID{
- QueryID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- Code: 0x00, // found
- ReplyID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- },
- Data: []byte{'i', 't', 'e', 'm', 'd', 'a', 't', 'a'},
- },
- },
- },
- },
- {
- name: "retrieve multiple buddy icons",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x06_BARTDownload2Query{
- ScreenName: "user_screen_name",
- IDs: []wire.BARTID{
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x5f, 0xea, 0xd2, 0xa7, 0x56, 0xec, 0x6b, 0xfd, 0xec, 0x06, 0xd8, 0xb3, 0x5f, 0x9f, 0xb1, 0xfe},
- },
- },
- },
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerRetrieveParams: bartItemManagerRetrieveParams{
- {
- itemHash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- result: []byte{'f', 'i', 'r', 's', 't', 'i', 'c', 'o', 'n'},
- },
- {
- itemHash: []byte{0x5f, 0xea, 0xd2, 0xa7, 0x56, 0xec, 0x6b, 0xfd, 0xec, 0x06, 0xd8, 0xb3, 0x5f, 0x9f, 0xb1, 0xfe},
- result: []byte{'s', 'e', 'c', 'o', 'n', 'd', 'i', 'c', 'o', 'n'},
- },
- },
- },
- },
- expectOutput: []wire.SNACMessage{
- {
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTDownload2Reply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x07_BARTDownload2Reply{
- ScreenName: "user_screen_name",
- ReplyID: wire.BartQueryReplyID{
- QueryID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- Code: 0x00, // found
- ReplyID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- },
- Data: []byte{'f', 'i', 'r', 's', 't', 'i', 'c', 'o', 'n'},
- },
- },
- {
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTDownload2Reply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x07_BARTDownload2Reply{
- ScreenName: "user_screen_name",
- ReplyID: wire.BartQueryReplyID{
- QueryID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x5f, 0xea, 0xd2, 0xa7, 0x56, 0xec, 0x6b, 0xfd, 0xec, 0x06, 0xd8, 0xb3, 0x5f, 0x9f, 0xb1, 0xfe},
- },
- },
- Code: 0x00, // found
- ReplyID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x5f, 0xea, 0xd2, 0xa7, 0x56, 0xec, 0x6b, 0xfd, 0xec, 0x06, 0xd8, 0xb3, 0x5f, 0x9f, 0xb1, 0xfe},
- },
- },
- },
- Data: []byte{'s', 'e', 'c', 'o', 'n', 'd', 'i', 'c', 'o', 'n'},
- },
- },
- },
- },
- {
- name: "retrieve single item with error",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x06_BARTDownload2Query{
- ScreenName: "user_screen_name",
- IDs: []wire.BARTID{
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- },
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerRetrieveParams: bartItemManagerRetrieveParams{
- {
- itemHash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- result: nil,
- err: assert.AnError,
- },
- },
- },
- },
- expectOutput: nil,
- expectErr: assert.AnError,
- },
- {
- name: "retrieve multiple items with error on second item",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x06_BARTDownload2Query{
- ScreenName: "user_screen_name",
- IDs: []wire.BARTID{
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x5f, 0xea, 0xd2, 0xa7, 0x56, 0xec, 0x6b, 0xfd, 0xec, 0x06, 0xd8, 0xb3, 0x5f, 0x9f, 0xb1, 0xfe},
- },
- },
- },
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerRetrieveParams: bartItemManagerRetrieveParams{
- {
- itemHash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- result: []byte{'f', 'i', 'r', 's', 't', 'i', 'c', 'o', 'n'},
- err: nil,
- },
- {
- itemHash: []byte{0x5f, 0xea, 0xd2, 0xa7, 0x56, 0xec, 0x6b, 0xfd, 0xec, 0x06, 0xd8, 0xb3, 0x5f, 0x9f, 0xb1, 0xfe},
- result: nil,
- err: assert.AnError,
- },
- },
- },
- },
- expectOutput: nil,
- expectErr: assert.AnError,
- },
- {
- name: "retrieve mixed items (regular icon and clear icon)",
- instance: newTestInstance("user_screen_name"),
- inputSNAC: wire.SNACMessage{
- Frame: wire.SNACFrame{
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x06_BARTDownload2Query{
- ScreenName: "user_screen_name",
- IDs: []wire.BARTID{
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- {
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: wire.GetClearIconHash(),
- },
- },
- },
- },
- },
- mockParams: mockParams{
- bartItemManagerParams: bartItemManagerParams{
- bartItemManagerRetrieveParams: bartItemManagerRetrieveParams{
- {
- itemHash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- result: []byte{'r', 'e', 'g', 'u', 'l', 'a', 'r', 'i', 'c', 'o', 'n'},
- },
- },
- },
- },
- expectOutput: []wire.SNACMessage{
- {
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTDownload2Reply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x07_BARTDownload2Reply{
- ScreenName: "user_screen_name",
- ReplyID: wire.BartQueryReplyID{
- QueryID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- Code: 0x00, // found
- ReplyID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: []byte{0x4e, 0xd9, 0xc1, 0x96, 0x45, 0xdb, 0x5a, 0xec, 0xdb, 0xf5, 0xc7, 0xa2, 0x4e, 0x8e, 0xa0, 0xed},
- },
- },
- },
- Data: []byte{'r', 'e', 'g', 'u', 'l', 'a', 'r', 'i', 'c', 'o', 'n'},
- },
- },
- {
- Frame: wire.SNACFrame{
- FoodGroup: wire.BART,
- SubGroup: wire.BARTDownload2Reply,
- RequestID: 1234,
- },
- Body: wire.SNAC_0x10_0x07_BARTDownload2Reply{
- ScreenName: "user_screen_name",
- ReplyID: wire.BartQueryReplyID{
- QueryID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: wire.GetClearIconHash(),
- },
- },
- Code: 0x00, // found
- ReplyID: wire.BARTID{
- Type: wire.BARTTypesBuddyIcon,
- BARTInfo: wire.BARTInfo{
- Flags: wire.BARTFlagsKnown,
- Hash: wire.GetClearIconHash(),
- },
- },
- },
- Data: blankGIF,
- },
- },
- },
- },
- }
- for _, tc := range cases {
- t.Run(tc.name, func(t *testing.T) {
- bartItemManager := newMockBARTItemManager(t)
- for _, params := range tc.mockParams.bartItemManagerRetrieveParams {
- bartItemManager.EXPECT().
- BARTItem(matchContext(), params.itemHash).
- Return(params.result, params.err)
- }
- svc := NewBARTService(slog.Default(), bartItemManager, nil, nil, nil)
- output, err := svc.RetrieveItemV2(context.Background(), tc.inputSNAC.Frame, tc.inputSNAC.Body.(wire.SNAC_0x10_0x06_BARTDownload2Query))
- assert.ErrorIs(t, err, tc.expectErr)
- assert.Equal(t, output, tc.expectOutput)
- })
- }
- }
|