Browse Source

Fix indexing bug in SettingsFrame accessors.

Thanks to Qi Zhao from Google for the bug report.
Brad Fitzpatrick 11 years ago
parent
commit
2f1cccd09f
2 changed files with 23 additions and 3 deletions
  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 {
 	for len(buf) > 0 {
 		settingID := SettingID(binary.BigEndian.Uint16(buf[:2]))
 		settingID := SettingID(binary.BigEndian.Uint16(buf[:2]))
 		if settingID == s {
 		if settingID == s {
-			return binary.BigEndian.Uint32(buf[2:4]), true
+			return binary.BigEndian.Uint32(buf[2:6]), true
 		}
 		}
 		buf = buf[6:]
 		buf = buf[6:]
 	}
 	}
@@ -491,7 +491,7 @@ func (f *SettingsFrame) ForeachSetting(fn func(Setting)) {
 	f.checkValid()
 	f.checkValid()
 	buf := f.p
 	buf := f.p
 	for len(buf) > 0 {
 	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:]
 		buf = buf[6:]
 	}
 	}
 }
 }

+ 21 - 1
frame_test.go

@@ -317,11 +317,31 @@ func TestWritePriority(t *testing.T) {
 
 
 func TestWriteSettings(t *testing.T) {
 func TestWriteSettings(t *testing.T) {
 	fr, buf := testFramer()
 	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"
 	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 {
 	if buf.String() != wantEnc {
 		t.Errorf("encoded as %q; want %q", buf.Bytes(), 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) {
 func TestWriteSettingsAck(t *testing.T) {