Skip to content

Conversation

@tirkarthi
Copy link
Member

@tirkarthi tirkarthi commented May 14, 2019

At the end of test BytesIO destructor is called that calls flush and close. Closing the object when the internal counter in FakeSocket gets to zero causes flush to be called on closed object in destructor. Mock the close function and let destructor do the work instead.

https://bugs.python.org/issue36918

@bedevere-bot bedevere-bot added tests Tests in the Lib/test dir awaiting review labels May 14, 2019
@tirkarthi tirkarthi changed the title bpo-18478: Don't close the object which is again closed by destructor bpo-18748: Don't close the object which is again closed by destructor May 14, 2019
@tirkarthi tirkarthi changed the title bpo-18748: Don't close the object which is again closed by destructor bpo-36918: Don't close the object which is again closed by destructor May 14, 2019
''')
try:
# Silence destructor error
http.client.HTTPConnection.close = lambda self: None
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This will affect all instances of HTTPConnection.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

fakehttp replaces http.client.HTTPConnection with FakeHTTPConnection and unfakehttp restores the old value of http.client.HTTPConnection at the end of test. So I guess it's changing close on FakeHTTPConnection which is generated per test.

https://github.com/python/cpython/pull/13317/files#diff-618652ed25a24a1b635417b4264c9533L101

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think @tirkarthi is right.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why not adding a close() method to FakeHTTPConnection?

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are no test case failures on changing close in FakeHTTPConnection but I haven't had time to analyze it well to see if there are any other cases it affects. So I kept the change minimal to have reported tests silenced.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

After I wrote a similar change, I now understand this change and I agree that it's correct. But the change is surprising :-) I wrote PR #13996 which adds a "mock_close" attribute to fake_http(): if mock_close is true, a close() method which does nothing is defined. IMHO it's less surprising, since it's more explicitly that only the mock is affected.

@tirkarthi
Copy link
Member Author

@asvetlov I would wait since Serhiy had a different opinion on this at https://bugs.python.org/msg342709

@vstinner
Copy link
Member

I wrote a simpler change: PR #13955.

@vstinner
Copy link
Member

I wrote a simpler change: PR #13955.

This PR was wrong. I wrote PR #13996 which is very similar to this PR but is more explicit that only the mock is affected.

@vstinner
Copy link
Member

Thanks a lot @tirkarthi for proposing this PR and identifying the root cause of these new errors. I merged PR #13996 which is similar (but different :-)) than your PR.

@vstinner vstinner closed this Jun 12, 2019
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

awaiting merge skip news tests Tests in the Lib/test dir

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants