Repository: cloudstack Updated Branches: refs/heads/master 47d6a64b3 -> 669aebf1b
Fix CID 1128968 Iterator modified during loop Project: http://git-wip-us.apache.org/repos/asf/cloudstack/repo Commit: http://git-wip-us.apache.org/repos/asf/cloudstack/commit/669aebf1 Tree: http://git-wip-us.apache.org/repos/asf/cloudstack/tree/669aebf1 Diff: http://git-wip-us.apache.org/repos/asf/cloudstack/diff/669aebf1 Branch: refs/heads/master Commit: 669aebf1bc7966a5079aa143f1621958609b7b7d Parents: 47d6a64 Author: Hugo Trippaers <htrippa...@schubergphilis.com> Authored: Fri Jul 25 11:55:04 2014 +0200 Committer: Hugo Trippaers <htrippa...@schubergphilis.com> Committed: Fri Jul 25 11:58:16 2014 +0200 ---------------------------------------------------------------------- .../src/main/java/streamer/BaseElement.java | 7 ++- .../src/test/java/streamer/BaseElementTest.java | 50 ++++++++++++++++++++ 2 files changed, 56 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cloudstack/blob/669aebf1/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java ---------------------------------------------------------------------- diff --git a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java index 1ca68ce..a93b037 100755 --- a/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java +++ b/services/console-proxy-rdp/rdpconsole/src/main/java/streamer/BaseElement.java @@ -149,7 +149,12 @@ public class BaseElement implements Element { */ @Override public void poll(boolean block) { - for (DataSource source : inputPads.values()) { + // inputPads can be changed in handleData (see switchOff in OneTimeSwitch) + // as this results in an undefined response from the iterator on inputPads + // use a copy of the map to iterate over. + Map<String, DataSource> pads = new HashMap<String, DataSource>(); + pads.putAll(inputPads); + for (DataSource source : pads.values()) { Link link = (Link)source; ByteBuffer buf = link.pull(block); http://git-wip-us.apache.org/repos/asf/cloudstack/blob/669aebf1/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java ---------------------------------------------------------------------- diff --git a/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java b/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java new file mode 100644 index 0000000..1521d2f --- /dev/null +++ b/services/console-proxy-rdp/rdpconsole/src/test/java/streamer/BaseElementTest.java @@ -0,0 +1,50 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package streamer; + +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import org.junit.Test; + +public class BaseElementTest { + + @Test + public void testPoll() { + BaseElement element = new BaseElement("test") { + + @Override + public void handleData(ByteBuffer buf, Link link) { + inputPads.remove("testpad1"); + inputPads.remove("testpad2"); + } + + }; + Link testLink1 = mock(Link.class); + when(testLink1.pull(anyBoolean())).thenReturn(new ByteBuffer("hello".getBytes())); + Link testLink2 = mock(Link.class); + when(testLink2.pull(anyBoolean())).thenReturn(new ByteBuffer("hello".getBytes())); + + element.setLink("testpad1", testLink1, streamer.Direction.IN); + element.setLink("testpad2", testLink2, streamer.Direction.IN); + element.poll(false); + } + +}