Skip to content

Commit

Permalink
fix filter manager crash (#6)
Browse files Browse the repository at this point in the history
upstream host needs to be available during filter destructors since filters
might use it for accessing stats, etc.
  • Loading branch information
mattklein123 authored Aug 11, 2016
1 parent 2eef417 commit 6e98864
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 9 deletions.
2 changes: 1 addition & 1 deletion source/common/network/filter_manager.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,9 +61,9 @@ class FilterManager {

Connection& connection_;
BufferSource& buffer_source_;
Upstream::HostDescriptionPtr host_description_;
std::list<ActiveReadFilterPtr> upstream_filters_;
std::list<WriteFilterPtr> downstream_filters_;
Upstream::HostDescriptionPtr host_description_;
};

} // Network
30 changes: 22 additions & 8 deletions test/common/network/filter_manager_test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include "test/mocks/upstream/host.h"

using testing::InSequence;
using testing::NiceMock;
using testing::Return;

namespace Network {
Expand All @@ -19,20 +20,33 @@ class NetworkFilterManagerTest : public testing::Test, public BufferSource {
Buffer::OwnedImpl write_buffer_;
};

class LocalMockFilter : public MockFilter {
public:
LocalMockFilter(const Upstream::HostDescription* host) : host_(host) {}
~LocalMockFilter() {
// Make sure the upstream host is still valid in the filter destructor.
callbacks_->upstreamHost()->url();
}

private:
const Upstream::HostDescription* host_;
};

TEST_F(NetworkFilterManagerTest, All) {
InSequence s;
std::shared_ptr<MockReadFilter> read_filter(new MockReadFilter());
std::shared_ptr<MockWriteFilter> write_filter(new MockWriteFilter());
std::shared_ptr<MockFilter> filter(new MockFilter());

Upstream::HostDescription* host_description(new NiceMock<Upstream::MockHostDescription>());
MockReadFilter* read_filter(new MockReadFilter());
MockWriteFilter* write_filter(new MockWriteFilter());
MockFilter* filter(new LocalMockFilter(host_description));

MockConnection connection;
FilterManager manager(connection, *this);
manager.addReadFilter(read_filter);
manager.addWriteFilter(write_filter);
manager.addFilter(filter);
manager.addReadFilter(ReadFilterPtr{read_filter});
manager.addWriteFilter(WriteFilterPtr{write_filter});
manager.addFilter(FilterPtr{filter});

Upstream::HostDescriptionPtr host_description(new Upstream::MockHostDescription());
read_filter->callbacks_->upstreamHost(host_description);
read_filter->callbacks_->upstreamHost(Upstream::HostDescriptionPtr{host_description});
EXPECT_EQ(read_filter->callbacks_->upstreamHost(), filter->callbacks_->upstreamHost());

read_buffer_.add("hello");
Expand Down

0 comments on commit 6e98864

Please sign in to comment.