فهرست منبع

Fix indexing bug in SettingsFrame accessors.

Thanks to Qi Zhao from Google for the bug report.
Brad Fitzpatrick 11 سال پیش
والد
کامیت
2f1cccd09f
2فایلهای تغییر یافته به همراه23 افزوده شده و 3 حذف شده
  1. 2 2
      frame.go
  2. 21 1
      frame_test.go

+ 2 - 2
frame.go

@@ -480,7 +480,7 @@ func (f *SettingsFrame) Value(s SettingID) (v uint32, ok bool) {
 	for len(buf) > 0 {
 		settingID := SettingID(binary.BigEndian.Uint16(buf[:2]))
 		if settingID == s {
-			return binary.BigEndian.Uint32(buf[2:4]), true
+			return binary.BigEndian.Uint32(buf[2:6]), true
 		}
 		buf = buf[6:]
 	}
@@ -491,7 +491,7 @@ func (f *SettingsFrame) ForeachSetting(fn func(Setting)) {
 	f.checkValid()
 	buf := f.p
 	for len(buf) > 0 {
-		fn(Setting{SettingID(binary.BigEndian.Uint16(buf[:2])), binary.BigEndian.Uint32(buf[2:4])})
+		fn(Setting{SettingID(binary.BigEndian.Uint16(buf[:2])), binary.BigEndian.Uint32(buf[2:6])})
 		buf = buf[6:]
 	}
 }

+ 21 - 1
frame_test.go

@@ -317,11 +317,31 @@ func TestWritePriority(t *testing.T) {
 
 func TestWriteSettings(t *testing.T) {
 	fr, buf := testFramer()
-	fr.WriteSettings(Setting{1, 2}, Setting{3, 4})
+	settings := []Setting{{1, 2}, {3, 4}}
+	fr.WriteSettings(settings...)
 	const wantEnc = "\x00\x00\f\x04\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x02\x00\x03\x00\x00\x00\x04"
 	if buf.String() != wantEnc {
 		t.Errorf("encoded as %q; want %q", buf.Bytes(), wantEnc)
 	}
+	f, err := fr.ReadFrame()
+	if err != nil {
+		t.Fatal(err)
+	}
+	sf, ok := f.(*SettingsFrame)
+	if !ok {
+		t.Fatalf("Got a %T; want a SettingsFrame", f)
+	}
+	var got []Setting
+	sf.ForeachSetting(func(s Setting) {
+		got = append(got, s)
+		valBack, ok := sf.Value(s.ID)
+		if !ok || valBack != s.Val {
+			t.Errorf("Value(%d) = %v, %v; want %v, true", valBack, ok)
+		}
+	})
+	if !reflect.DeepEqual(settings, got) {
+		t.Errorf("Read settings %+v != written settings %+v", got, settings)
+	}
 }
 
 func TestWriteSettingsAck(t *testing.T) {