فهرست منبع

boost test coverage on newOServiceUserInfoUpdate

Mike 3 ماه پیش
والد
کامیت
0f72fcb6e7
2فایلهای تغییر یافته به همراه79 افزوده شده و 17 حذف شده
  1. 13 17
      foodgroup/oservice.go
  2. 66 0
      foodgroup/oservice_test.go

+ 13 - 17
foodgroup/oservice.go

@@ -837,32 +837,32 @@ func newOServiceUserInfoUpdate(instance *state.SessionInstance) wire.SNAC_0x01_0
 
 		userInfo[0].Append(wire.NewTLVBE(wire.OServiceUserInfoMyInstanceNum, []byte{instance.Num()}))
 
-		for _, instance := range instance.Session().Instances() {
+		for _, cur := range instance.Session().Instances() {
 			instanceInfo := wire.TLVUserInfo{
-				ScreenName:   instance.DisplayScreenName().String(),
-				WarningLevel: instance.Warning(),
+				ScreenName:   cur.DisplayScreenName().String(),
+				WarningLevel: cur.Warning(),
 			}
 
 			// sign-in timestamp
-			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoSignonTOD, uint32(instance.SignonTime().Unix())))
+			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoSignonTOD, uint32(cur.SignonTime().Unix())))
 
 			// use the first instance as a template
-			uFlags := instance.UserInfoBitmask()
+			uFlags := cur.UserInfoBitmask()
 
-			if instance.Session().Away() {
+			if cur.Session().Away() {
 				uFlags |= wire.OServiceUserFlagUnavailable
 			}
 			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoUserFlags, uFlags))
 
 			// user status flags - user-level (shared)
 			var statusBitmask uint32
-			if instance.Invisible() {
+			if cur.Invisible() {
 				statusBitmask |= wire.OServiceUserStatusInvisible
 			}
 			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoStatus, statusBitmask))
 
-			if instance == instance {
-				if icon, hasIcon := instance.Session().BuddyIcon(); hasIcon {
+			if cur == instance {
+				if icon, hasIcon := cur.Session().BuddyIcon(); hasIcon {
 					// set buddy icon metadata, if user has buddy icon
 					if icon.Type != 0 {
 						instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoBARTInfo, icon))
@@ -870,22 +870,18 @@ func newOServiceUserInfoUpdate(instance *state.SessionInstance) wire.SNAC_0x01_0
 				}
 			}
 
-			//Get the best instance for each TLV value
-			//mostCapableCaps := instance.getMostCapableCaps()
-			//capabilities - show most capable instance (union of all capabilities)
-			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoOscarCaps, instance.Session().Caps()))
-
+			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoOscarCaps, cur.Session().Caps()))
 			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoMySubscriptions, uint32(0)))
 
-			if instance == instance {
-				profile := instance.Profile()
+			if cur == instance {
+				profile := cur.Profile()
 				if !profile.UpdateTime.IsZero() {
 					// set profile update time if the profile was set
 					instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoSigTime, uint32(profile.UpdateTime.Unix())))
 				}
 			}
 
-			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoPrimaryInstance, []byte{instance.Num()}))
+			instanceInfo.Append(wire.NewTLVBE(wire.OServiceUserInfoPrimaryInstance, []byte{cur.Num()}))
 
 			userInfo = append(userInfo, instanceInfo)
 		}

+ 66 - 0
foodgroup/oservice_test.go

@@ -1985,6 +1985,72 @@ func TestNewOServiceUserInfoUpdate(t *testing.T) {
 		require.Equal(t, []byte{0x02}, primary2Bytes)
 		require.Equal(t, got.UserInfo[0].ScreenName, got.UserInfo[2].ScreenName)
 	})
+
+	t.Run("marks instance user flags unavailable when session is away", func(t *testing.T) {
+		session := newTestInstance("me",
+			sessOptUserInfoFlag(wire.OServiceUserFlagUnavailable),
+			sessOptSetFoodGroupVersion(wire.OService, 4))
+
+		got := newOServiceUserInfoUpdate(session)
+
+		require.Len(t, got.UserInfo, 2)
+		flags, ok := got.UserInfo[1].Uint16BE(wire.OServiceUserInfoUserFlags)
+		require.True(t, ok)
+		require.Equal(t, wire.OServiceUserFlagOSCARFree|wire.OServiceUserFlagUnavailable, flags)
+	})
+
+	t.Run("marks instance status invisible when current instance is invisible", func(t *testing.T) {
+		session := newTestInstance("me",
+			sessOptInvisible,
+			sessOptSetFoodGroupVersion(wire.OService, 4))
+
+		got := newOServiceUserInfoUpdate(session)
+
+		require.Len(t, got.UserInfo, 2)
+		status, ok := got.UserInfo[1].Uint32BE(wire.OServiceUserInfoStatus)
+		require.True(t, ok)
+		require.Equal(t, wire.OServiceUserStatusInvisible, status)
+	})
+
+	t.Run("adds buddy icon and profile sig time only for current instance", func(t *testing.T) {
+		icon := wire.BARTID{
+			Type: 1,
+			BARTInfo: wire.BARTInfo{
+				Flags: 1,
+				Hash:  []byte{0xAA, 0xBB, 0xCC},
+			},
+		}
+		session := newTestInstance("me",
+			sessOptSetFoodGroupVersion(wire.OService, 4),
+			sessOptBuddyIcon(icon),
+			sessOptProfile(state.UserProfile{UpdateTime: profileUpdated}))
+		session.Session().AddInstance()
+
+		got := newOServiceUserInfoUpdate(session)
+
+		require.Len(t, got.UserInfo, 3)
+		require.True(t, got.UserInfo[1].HasTag(wire.OServiceUserInfoBARTInfo))
+		require.True(t, got.UserInfo[1].HasTag(wire.OServiceUserInfoSigTime))
+		require.False(t, got.UserInfo[2].HasTag(wire.OServiceUserInfoBARTInfo))
+		require.False(t, got.UserInfo[2].HasTag(wire.OServiceUserInfoSigTime))
+	})
+
+	t.Run("does not add buddy icon when icon type is zero", func(t *testing.T) {
+		session := newTestInstance("me",
+			sessOptSetFoodGroupVersion(wire.OService, 4),
+			sessOptBuddyIcon(wire.BARTID{
+				Type: 0,
+				BARTInfo: wire.BARTInfo{
+					Flags: 1,
+					Hash:  []byte{0x10, 0x20, 0x30},
+				},
+			}))
+
+		got := newOServiceUserInfoUpdate(session)
+
+		require.Len(t, got.UserInfo, 2)
+		require.False(t, got.UserInfo[1].HasTag(wire.OServiceUserInfoBARTInfo))
+	})
 }
 
 func TestOServiceService_UserInfoQuery(t *testing.T) {