Merge lp:~charlesk/indicator-display/adbd-client-test-failure into lp:indicator-display

Proposed by Charles Kerr
Status: Merged
Approved by: dobey
Approved revision: 40
Merged at revision: 21
Proposed branch: lp:~charlesk/indicator-display/adbd-client-test-failure
Merge into: lp:indicator-display
Diff against target: 1012 lines (+474/-170)
14 files modified
src/adbd-client.cpp (+16/-9)
src/greeter.cpp (+132/-82)
src/greeter.h (+8/-2)
src/usb-manager.cpp (+65/-48)
src/usb-snap.cpp (+1/-0)
tests/integration/usb-manager-test.cpp (+11/-5)
tests/unit/CMakeLists.txt (+5/-0)
tests/unit/adbd-client-test.cpp (+3/-2)
tests/unit/greeter-test.cpp (+159/-0)
tests/unit/usb-snap-test.cpp (+4/-9)
tests/utils/adbd-server.h (+9/-11)
tests/utils/gtest-print-helpers.h (+18/-0)
tests/utils/mock-greeter.h (+2/-2)
tests/utils/mock-unity-greeter.py (+41/-0)
To merge this branch: bzr merge lp:~charlesk/indicator-display/adbd-client-test-failure
Reviewer Review Type Date Requested Status
dobey (community) Approve
unity-api-1-bot continuous-integration Approve
Review via email: mp+306399@code.launchpad.net

Commit message

Fix test error in adbd-client-test

Description of the change

1. port Greeter communication bugfix from 15.04 branch

2. adbd-client thread improvements:
- use a std::atomic for m_pkresponse_ready
- check for thread.joinable() before calling thread.join()
- remove pessimization of getting mutex lock before calling condition variable.notify_one() (see http://en.cppreference.com/w/cpp/thread/condition_variable/notify_one)

To post a comment you must log in.
Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

FAILED: Continuous integration, rev:20
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/4/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build/719/console
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/725
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/533
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/533/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/533
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/533/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/533/console
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/533
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/533/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/533
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/533/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/533/console
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/533
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/533/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/533
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/533/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/533/console

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/4/rebuild

review: Needs Fixing (continuous-integration)
21. By Charles Kerr

in PKIdleData, take the std::string argument as a const& to make cppcheck happy on yakkety

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/6/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/722
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/728
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/536/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/536
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/536/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/6/rebuild

review: Approve (continuous-integration)
22. By Charles Kerr

in adbd-client's dtor, check the worker thread's joinable() state before calling join() on it

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

FAILED: Continuous integration, rev:21
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/5/
Executed test runs:
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build/721/console
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/727
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/535/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/535/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/535/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/535/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/535/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/535/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/535/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/535
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/535/artifact/output/*zip*/output.zip
    FAILURE: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/535/console

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/5/rebuild

review: Needs Fixing (continuous-integration)
Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:22
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/7/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/723
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/729
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/537/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/537
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/537/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/7/rebuild

review: Approve (continuous-integration)
23. By Charles Kerr

adbd-client's std::condition_variable::wait() call seems to be the system_error culprit, so wrapping in try-catch to be cautious

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:23
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/8/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/725
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/731
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/539/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/539
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/539/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/8/rebuild

review: Approve (continuous-integration)
24. By Charles Kerr

add a plethora of log statements to help figure out what's causing the silo test failures

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:24
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/9/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/732
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/738
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/546/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/546
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/546/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/9/rebuild

review: Approve (continuous-integration)
25. By Charles Kerr

GAdbdClient::Impl::on_public_key_response() doesn't need a condition variable wait, so use std::lock_guard rather than std::unique_lock

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:25
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/10/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/736
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/742
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/550/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/550
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/550/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/10/rebuild

review: Approve (continuous-integration)
26. By Charles Kerr

fix r25 copypaste error, lock on the correct mutex

27. By Charles Kerr

The notifying thread does not need to hold the lock on the same mutex as the one held by the waiting thread(s); in fact doing so is a pessimization.

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:27
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/11/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/738
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/744
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/552/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/552
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/552/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/11/rebuild

review: Approve (continuous-integration)
28. By Charles Kerr

more g_debug() tracers

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:28
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/12/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/740
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/746
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/554/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/554
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/554/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/12/rebuild

review: Approve (continuous-integration)
29. By Charles Kerr

in AdbdClientDest, explicitly disconnect the core::Signals at the end of the test

30. By Charles Kerr

in AdbdClientTest, raise the test timeout interval from 2s to 5s

31. By Charles Kerr

in UsbSnapTest, explicitly disconnect the core::Signals at the end of the test

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:31
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/13/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/742
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/748
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/556/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/556
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/556/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/13/rebuild

review: Approve (continuous-integration)
32. By Charles Kerr

more g_debug() tracers

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:32
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/14/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/743
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/749
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/557/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/557
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/557/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/14/rebuild

review: Approve (continuous-integration)
33. By Charles Kerr

tweak the debug tracers

34. By Charles Kerr

keep piling 'em on

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:34
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/15/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/745
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/751
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/559/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/559
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/559/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/15/rebuild

review: Approve (continuous-integration)
35. By Charles Kerr

sync with lp:~charlesk/indicator-display/lp-1572545-prompt-in-lockscreen

36. By Charles Kerr

fix tyop

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :
review: Needs Fixing (continuous-integration)
Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:36
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/18/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/748
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/754
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/562/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/562
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/562/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/18/rebuild

review: Approve (continuous-integration)
37. By Charles Kerr

use a std::atomic for adbd-client's m_pkresponse_ready

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:37
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/19/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/750
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/756
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/564/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/564
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/564/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/19/rebuild

review: Approve (continuous-integration)
38. By Charles Kerr

remove the temporary tracers from r34 and r35

39. By Charles Kerr

remove dead code

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:39
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/20/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/903
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/910
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/713/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/713
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/713/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/20/rebuild

review: Approve (continuous-integration)
Revision history for this message
dobey (dobey) wrote :

Generally looks OK to me, but I noticed many uses of if or if/else without curly braces around a single result statement. I think it'd be better to use braces or convert these statements to the ternary operator.

40. By Charles Kerr

add block braces as suggested by dobey

Revision history for this message
unity-api-1-bot (unity-api-1-bot) wrote :

PASSED: Continuous integration, rev:40
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/21/
Executed test runs:
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build/907
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-0-fetch/914
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=vivid+overlay/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=xenial+overlay/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=amd64,release=yakkety/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=vivid+overlay/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=xenial+overlay/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=armhf,release=yakkety/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=vivid+overlay/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=xenial+overlay/717/artifact/output/*zip*/output.zip
    SUCCESS: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/717
        deb: https://jenkins.canonical.com/unity-api-1/job/build-2-binpkg/arch=i386,release=yakkety/717/artifact/output/*zip*/output.zip

Click here to trigger a rebuild:
https://jenkins.canonical.com/unity-api-1/job/lp-indicator-display-ci/21/rebuild

review: Approve (continuous-integration)
Revision history for this message
dobey (dobey) wrote :

LGTM. Ship it.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/adbd-client.cpp'
2--- src/adbd-client.cpp 2016-03-24 16:01:16 +0000
3+++ src/adbd-client.cpp 2016-10-21 11:40:57 +0000
4@@ -23,6 +23,7 @@
5 #include <gio/gunixsocketaddress.h>
6
7 #include <algorithm>
8+#include <atomic>
9 #include <cctype>
10 #include <cstring>
11 #include <chrono>
12@@ -48,7 +49,9 @@
13 g_cancellable_cancel(m_cancellable);
14 m_pkresponse_cv.notify_one();
15 m_sleep_cv.notify_one();
16- m_worker_thread.join();
17+ if (m_worker_thread.joinable()) {
18+ m_worker_thread.join();
19+ }
20 g_clear_object(&m_cancellable);
21 }
22
23@@ -66,7 +69,7 @@
24 GCancellable* cancellable = nullptr;
25 const std::string public_key;
26
27- PKIdleData(Impl* self_, GCancellable* cancellable_, std::string public_key_):
28+ PKIdleData(Impl* self_, GCancellable* cancellable_, const std::string& public_key_):
29 self(self_),
30 cancellable(G_CANCELLABLE(g_object_ref(cancellable_))),
31 public_key(public_key_) {}
32@@ -104,8 +107,9 @@
33
34 void on_public_key_response(PKResponse response)
35 {
36+ g_debug("%s thread %p got response %d", G_STRLOC, g_thread_self(), int(response));
37+
38 // set m_pkresponse and wake up the waiting worker thread
39- std::unique_lock<std::mutex> lk(m_pkresponse_mutex);
40 m_pkresponse = response;
41 m_pkresponse_ready = true;
42 m_pkresponse_cv.notify_one();
43@@ -121,11 +125,11 @@
44
45 while (!g_cancellable_is_cancelled(m_cancellable))
46 {
47- g_debug("%s creating a client socket to '%s'", G_STRLOC, socket_path.c_str());
48+ g_debug("%s thread %p creating a client socket to '%s'", G_STRLOC, g_thread_self(), socket_path.c_str());
49 auto socket = create_client_socket(socket_path);
50 bool got_valid_req = false;
51
52- g_debug("%s calling read_request", G_STRLOC);
53+ g_debug("%s thread %p calling read_request", g_thread_self(), G_STRLOC);
54 std::string reqstr;
55 if (socket != nullptr)
56 reqstr = read_request(socket);
57@@ -135,22 +139,25 @@
58 if (reqstr.substr(0,2) == "PK") {
59 PKResponse response = PKResponse::DENY;
60 const auto public_key = reqstr.substr(2);
61- g_debug("%s got pk [%s]", G_STRLOC, public_key.c_str());
62+ g_debug("%s thread %p got pk [%s]", G_STRLOC, g_thread_self(), public_key.c_str());
63 if (!public_key.empty()) {
64 got_valid_req = true;
65 std::unique_lock<std::mutex> lk(m_pkresponse_mutex);
66 m_pkresponse_ready = false;
67+ m_pkresponse = AdbdClient::PKResponse::DENY;
68 pass_public_key_to_main_thread(public_key);
69 m_pkresponse_cv.wait(lk, [this](){
70 return m_pkresponse_ready || g_cancellable_is_cancelled(m_cancellable);
71 });
72 response = m_pkresponse;
73- g_debug("%s got response '%d', is-cancelled %d", G_STRLOC,
74+ g_debug("%s thread %p got response '%d', is-cancelled %d", G_STRLOC,
75+ g_thread_self(),
76 int(response),
77 int(g_cancellable_is_cancelled(m_cancellable)));
78 }
79- if (!g_cancellable_is_cancelled(m_cancellable))
80+ if (!g_cancellable_is_cancelled(m_cancellable)) {
81 send_pk_response(socket, response);
82+ }
83 } else if (!reqstr.empty()) {
84 g_warning("Invalid ADB request: [%s]", reqstr.c_str());
85 }
86@@ -270,7 +277,7 @@
87
88 std::mutex m_pkresponse_mutex;
89 std::condition_variable m_pkresponse_cv;
90- bool m_pkresponse_ready = false;
91+ std::atomic<bool> m_pkresponse_ready {false};
92 PKResponse m_pkresponse = PKResponse::DENY;
93 };
94
95
96=== modified file 'src/greeter.cpp'
97--- src/greeter.cpp 2016-03-22 13:15:38 +0000
98+++ src/greeter.cpp 2016-10-21 11:40:57 +0000
99@@ -26,117 +26,167 @@
100 {
101 public:
102
103- Impl():
104- m_cancellable{g_cancellable_new()}
105- {
106- g_bus_get(G_BUS_TYPE_SESSION, m_cancellable, on_bus_ready_static, this);
107- }
108-
109- ~Impl()
110- {
111- g_cancellable_cancel(m_cancellable);
112- g_clear_object(&m_cancellable);
113-
114- if (m_subscription_id != 0)
115- g_dbus_connection_signal_unsubscribe (m_bus, m_subscription_id);
116-
117- g_clear_object(&m_bus);
118- }
119-
120- core::Property<bool>& is_active()
121- {
122- return m_is_active;
123+ Impl()
124+ {
125+ m_cancellable.reset(
126+ g_cancellable_new(),
127+ [](GCancellable* o){
128+ g_cancellable_cancel(o);
129+ g_clear_object(&o);
130+ }
131+ );
132+
133+ g_bus_get(G_BUS_TYPE_SESSION, m_cancellable.get(), on_bus_ready, this);
134+ }
135+
136+ ~Impl() =default;
137+
138+ core::Property<State>& state()
139+ {
140+ return m_state;
141 }
142
143 private:
144
145- static void on_bus_ready_static(GObject* /*source*/, GAsyncResult* res, gpointer gself)
146+ void set_state(const State& state)
147+ {
148+ m_state.set(state);
149+ }
150+
151+ static void on_bus_ready(
152+ GObject* /*source*/,
153+ GAsyncResult* res,
154+ gpointer gself)
155 {
156 GError* error {};
157- auto bus = g_bus_get_finish (res, &error);
158- if (error != nullptr) {
159+ auto bus = g_bus_get_finish(res, &error);
160+ if (error != nullptr)
161+ {
162 if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
163- g_warning("UsbSnap: Error getting session bus: %s", error->message);
164+ g_warning("Greeter: Error getting bus: %s", error->message);
165 g_clear_error(&error);
166- } else {
167- static_cast<Impl*>(gself)->on_bus_ready(bus);
168- }
169- g_clear_object(&bus);
170- }
171-
172- void on_bus_ready(GDBusConnection* bus)
173- {
174- m_bus = G_DBUS_CONNECTION(g_object_ref(G_OBJECT(bus)));
175-
176- g_dbus_connection_call(m_bus,
177- DBusNames::UnityGreeter::NAME,
178- DBusNames::UnityGreeter::PATH,
179- DBusNames::Properties::INTERFACE,
180- "Get",
181- g_variant_new("(ss)", DBusNames::UnityGreeter::INTERFACE, "IsActive"),
182- G_VARIANT_TYPE("(v)"),
183- G_DBUS_CALL_FLAGS_NONE,
184- -1,
185- m_cancellable,
186- on_get_is_active_ready,
187- this);
188-
189- m_subscription_id = g_dbus_connection_signal_subscribe(m_bus,
190- DBusNames::UnityGreeter::NAME,
191- DBusNames::Properties::INTERFACE,
192- DBusNames::Properties::PropertiesChanged::NAME,
193- DBusNames::UnityGreeter::PATH,
194- DBusNames::UnityGreeter::INTERFACE,
195- G_DBUS_SIGNAL_FLAGS_NONE,
196- on_properties_changed_signal,
197- this,
198- nullptr);
199- }
200-
201- static void on_get_is_active_ready(GObject* source, GAsyncResult* res, gpointer gself)
202+ }
203+ else
204+ {
205+ auto self = static_cast<Impl*>(gself);
206+
207+ const auto watcher_id = g_bus_watch_name_on_connection(
208+ bus,
209+ DBusNames::UnityGreeter::NAME,
210+ G_BUS_NAME_WATCHER_FLAGS_AUTO_START,
211+ on_greeter_appeared,
212+ on_greeter_vanished,
213+ gself,
214+ nullptr);
215+
216+ const auto subscription_id = g_dbus_connection_signal_subscribe(
217+ bus,
218+ DBusNames::UnityGreeter::NAME,
219+ DBusNames::Properties::INTERFACE,
220+ DBusNames::Properties::PropertiesChanged::NAME,
221+ DBusNames::UnityGreeter::PATH,
222+ DBusNames::UnityGreeter::INTERFACE,
223+ G_DBUS_SIGNAL_FLAGS_NONE,
224+ on_properties_changed_signal,
225+ gself,
226+ nullptr);
227+
228+ self->m_bus.reset(
229+ bus,
230+ [watcher_id, subscription_id](GDBusConnection* o){
231+ g_bus_unwatch_name(watcher_id);
232+ g_dbus_connection_signal_unsubscribe(o, subscription_id);
233+ g_clear_object(&o);
234+ }
235+ );
236+ }
237+ }
238+
239+ static void on_greeter_appeared(
240+ GDBusConnection* bus,
241+ const char* /*name*/,
242+ const char* name_owner,
243+ gpointer gself)
244+ {
245+ auto self = static_cast<Impl*>(gself);
246+
247+ self->m_owner = name_owner;
248+
249+ g_dbus_connection_call(
250+ bus,
251+ DBusNames::UnityGreeter::NAME,
252+ DBusNames::UnityGreeter::PATH,
253+ DBusNames::Properties::INTERFACE,
254+ "Get",
255+ g_variant_new("(ss)", DBusNames::UnityGreeter::INTERFACE, "IsActive"),
256+ G_VARIANT_TYPE("(v)"),
257+ G_DBUS_CALL_FLAGS_NONE,
258+ -1,
259+ self->m_cancellable.get(),
260+ on_get_is_active_ready,
261+ gself);
262+ }
263+
264+ static void on_greeter_vanished(
265+ GDBusConnection* /*bus*/,
266+ const char* /*name*/,
267+ gpointer gself)
268+ {
269+ auto self = static_cast<Impl*>(gself);
270+
271+ self->m_owner.clear();
272+ self->set_state(State::UNAVAILABLE);
273+ }
274+
275+ static void on_get_is_active_ready(
276+ GObject* source,
277+ GAsyncResult* res,
278+ gpointer gself)
279 {
280 GError* error {};
281 auto v = g_dbus_connection_call_finish(G_DBUS_CONNECTION(source), res, &error);
282 if (error != nullptr) {
283- if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
284- g_warning("UsbSnap: Error getting session bus: %s", error->message);
285+ if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) {
286+ g_warning("Greeter: Error getting IsActive property: %s", error->message);
287+ }
288 g_clear_error(&error);
289 } else {
290 GVariant* is_active {};
291 g_variant_get_child(v, 0, "v", &is_active);
292- static_cast<Impl*>(gself)->m_is_active.set(g_variant_get_boolean(is_active));
293+ static_cast<Impl*>(gself)->set_state(g_variant_get_boolean(is_active) ? State::ACTIVE : State::INACTIVE);
294 g_clear_pointer(&is_active, g_variant_unref);
295 }
296 g_clear_pointer(&v, g_variant_unref);
297 }
298
299- static void on_properties_changed_signal(GDBusConnection* /*connection*/,
300- const gchar* /*sender_name*/,
301- const gchar* object_path,
302- const gchar* interface_name,
303- const gchar* signal_name,
304- GVariant* parameters,
305- gpointer gself)
306+ static void on_properties_changed_signal(
307+ GDBusConnection* /*bus*/,
308+ const gchar* sender_name,
309+ const gchar* object_path,
310+ const gchar* interface_name,
311+ const gchar* signal_name,
312+ GVariant* parameters,
313+ gpointer gself)
314 {
315+ auto self = static_cast<Impl*>(gself);
316+
317+ g_return_if_fail(!g_strcmp0(sender_name, self->m_owner.c_str()));
318 g_return_if_fail(!g_strcmp0(object_path, DBusNames::UnityGreeter::PATH));
319 g_return_if_fail(!g_strcmp0(interface_name, DBusNames::Properties::INTERFACE));
320 g_return_if_fail(!g_strcmp0(signal_name, DBusNames::Properties::PropertiesChanged::NAME));
321 g_return_if_fail(g_variant_is_of_type(parameters, G_VARIANT_TYPE(DBusNames::Properties::PropertiesChanged::ARGS_VARIANT_TYPE)));
322
323- auto v = g_variant_get_child_value (parameters, 1);
324+ auto v = g_variant_get_child_value(parameters, 1);
325 gboolean is_active {};
326 if (g_variant_lookup(v, "IsActive", "b", &is_active))
327- {
328- g_debug("%s is_active changed to %d", G_STRLOC, int(is_active));
329- static_cast<Impl*>(gself)->m_is_active.set(is_active);
330- }
331+ self->set_state(is_active ? State::ACTIVE : State::INACTIVE);
332 g_clear_pointer(&v, g_variant_unref);
333 }
334
335- core::Property<bool> m_is_active;
336- GCancellable* m_cancellable {};
337- GDBusConnection* m_bus {};
338- unsigned int m_subscription_id {};
339+ core::Property<State> m_state {State::UNAVAILABLE};
340+ std::shared_ptr<GCancellable> m_cancellable;
341+ std::shared_ptr<GDBusConnection> m_bus;
342+ std::string m_owner;
343 };
344
345 /***
346@@ -154,8 +204,8 @@
347
348 UnityGreeter::~UnityGreeter() =default;
349
350-core::Property<bool>&
351-UnityGreeter::is_active()
352+core::Property<Greeter::State>&
353+UnityGreeter::state()
354 {
355- return impl->is_active();
356+ return impl->state();
357 }
358
359=== modified file 'src/greeter.h'
360--- src/greeter.h 2016-03-21 23:15:05 +0000
361+++ src/greeter.h 2016-10-21 11:40:57 +0000
362@@ -29,7 +29,13 @@
363 public:
364 Greeter();
365 virtual ~Greeter();
366- virtual core::Property<bool>& is_active() =0;
367+
368+ enum class State { UNAVAILABLE, INACTIVE, ACTIVE };
369+static inline const char* state_str(const State& state) {
370+ static constexpr char const * state_str[] = { "Unavailable", "Inactive", "Active" };
371+ return state_str[int(state)];
372+}
373+ virtual core::Property<State>& state() =0;
374 };
375
376
377@@ -38,7 +44,7 @@
378 public:
379 UnityGreeter();
380 virtual ~UnityGreeter();
381- core::Property<bool>& is_active() override;
382+ core::Property<State>& state() override;
383
384 protected:
385 class Impl;
386
387=== modified file 'src/usb-manager.cpp'
388--- src/usb-manager.cpp 2016-03-23 19:44:23 +0000
389+++ src/usb-manager.cpp 2016-10-21 11:40:57 +0000
390@@ -46,72 +46,89 @@
391 m_greeter{greeter}
392 {
393 m_usb_monitor->on_usb_disconnected().connect([this](const std::string& /*usb_name*/) {
394- restart();
395- });
396-
397- m_greeter->is_active().changed().connect([this](bool /*is_active*/) {
398- maybe_snap();
399- });
400-
401- restart();
402+ m_req.reset();
403+ });
404+
405+ m_greeter->state().changed().connect([this](const Greeter::State& state) {
406+ if (state == Greeter::State::INACTIVE) {
407+ maybe_snap();
408+ } else {
409+ stop_snap();
410+ }
411+ });
412+
413+ // create a new adbd client
414+ m_adbd_client.reset(new GAdbdClient{m_socket_path});
415+ m_adbd_client->on_pk_request().connect(
416+ [this](const AdbdClient::PKRequest& req) {
417+ g_debug("%s got pk request: %s, calling maybe_snap()", G_STRLOC, req.fingerprint.c_str());
418+
419+ m_response = AdbdClient::PKResponse::DENY; // set the fallback response
420+ m_req.reset(
421+ new AdbdClient::PKRequest(req),
422+ [this](AdbdClient::PKRequest* r) {
423+ stop_snap();
424+ r->respond(m_response);
425+ delete r;
426+ }
427+ );
428+ maybe_snap();
429+ }
430+ );
431 }
432
433 ~Impl()
434 {
435- if (m_restart_idle_tag)
436- g_source_remove(m_restart_idle_tag);
437-
438- clear();
439+ if (m_request_complete_idle_tag) {
440+ g_source_remove(m_request_complete_idle_tag);
441+ }
442 }
443
444 private:
445
446- void clear()
447+ void stop_snap()
448 {
449- // clear out old state
450 m_snap_connections.clear();
451 m_snap.reset();
452- m_req = decltype(m_req)();
453- m_adbd_client.reset();
454- }
455-
456- void restart()
457- {
458- clear();
459-
460- // set a new client
461- m_adbd_client.reset(new GAdbdClient{m_socket_path});
462- m_adbd_client->on_pk_request().connect(
463- [this](const AdbdClient::PKRequest& req) {
464- g_debug("%s got pk request: %s", G_STRLOC, req.fingerprint.c_str());
465- m_req = req;
466- maybe_snap();
467- }
468- );
469 }
470
471 void maybe_snap()
472 {
473- // don't prompt in the greeter!
474- if (!m_req.public_key.empty() && !m_greeter->is_active().get())
475- snap();
476+ // only prompt if there's something to prompt about
477+ if (!m_req) {
478+ return;
479+ }
480+
481+ // only prompt in an unlocked session
482+ if (m_greeter->state().get() != Greeter::State::INACTIVE) {
483+ return;
484+ }
485+
486+ snap();
487 }
488
489 void snap()
490 {
491- m_snap = std::make_shared<UsbSnap>(m_req.fingerprint);
492+ m_snap = std::make_shared<UsbSnap>(m_req->fingerprint);
493 m_snap_connections.insert((*m_snap).on_user_response().connect(
494 [this](AdbdClient::PKResponse response, bool remember_choice){
495- g_debug("%s user responded! response %d, remember %d", G_STRLOC, int(response), int(remember_choice));
496- m_req.respond(response);
497- if (remember_choice && (response == AdbdClient::PKResponse::ALLOW))
498- write_public_key(m_req.public_key);
499- m_restart_idle_tag = g_idle_add([](gpointer gself){
500- auto self = static_cast<Impl*>(gself);
501- self->m_restart_idle_tag = 0;
502- self->restart();
503- return G_SOURCE_REMOVE;
504- }, this);
505+
506+ if (remember_choice && (response == AdbdClient::PKResponse::ALLOW)) {
507+ write_public_key(m_req->public_key);
508+ }
509+
510+ m_response = response;
511+
512+ // defer finishing the request into an idle func because
513+ // ScopedConnections can't be destroyed inside their callbacks
514+ if (m_request_complete_idle_tag == 0) {
515+ m_request_complete_idle_tag = g_idle_add([](gpointer gself){
516+ auto self = static_cast<Impl*>(gself);
517+ self->m_request_complete_idle_tag = 0;
518+ self->m_req.reset();
519+ return G_SOURCE_REMOVE;
520+ }, this);
521+ }
522 }
523 ));
524 }
525@@ -152,12 +169,13 @@
526 const std::shared_ptr<UsbMonitor> m_usb_monitor;
527 const std::shared_ptr<Greeter> m_greeter;
528
529- unsigned int m_restart_idle_tag {};
530+ unsigned int m_request_complete_idle_tag {};
531
532 std::shared_ptr<GAdbdClient> m_adbd_client;
533- AdbdClient::PKRequest m_req;
534 std::shared_ptr<UsbSnap> m_snap;
535 std::set<core::ScopedConnection> m_snap_connections;
536+ AdbdClient::PKResponse m_response {AdbdClient::PKResponse::DENY};
537+ std::shared_ptr<AdbdClient::PKRequest> m_req;
538 };
539
540 /***
541@@ -177,4 +195,3 @@
542 UsbManager::~UsbManager()
543 {
544 }
545-
546
547=== modified file 'src/usb-snap.cpp'
548--- src/usb-snap.cpp 2016-03-23 17:16:06 +0000
549+++ src/usb-snap.cpp 2016-10-21 11:40:57 +0000
550@@ -208,6 +208,7 @@
551 const bool remember_this_choice = response == AdbdClient::PKResponse::ALLOW;
552
553 m_on_user_response(response, remember_this_choice);
554+ m_notification_id = 0;
555 }
556
557 void on_notification_closed(uint32_t close_reason)
558
559=== modified file 'tests/integration/usb-manager-test.cpp'
560--- tests/integration/usb-manager-test.cpp 2016-03-23 17:16:06 +0000
561+++ tests/integration/usb-manager-test.cpp 2016-10-21 11:40:57 +0000
562@@ -143,7 +143,7 @@
563 );
564
565 // confirm that the AdbdServer got the right response
566- wait_for([adbd_server](){return !adbd_server->m_responses.empty();}, 2000);
567+ wait_for([adbd_server](){return !adbd_server->m_responses.empty();}, 5000);
568 ASSERT_EQ(1, adbd_server->m_responses.size());
569 EXPECT_EQ("OK", adbd_server->m_responses.front());
570
571@@ -163,13 +163,16 @@
572 const std::shared_ptr<std::string> public_keys_path {new std::string{*m_tmpdir+"/adb_keys"}, file_deleter};
573
574 // start a mock AdbdServer ready to submit a request
575+ const size_t N_TESTS {3};
576 const std::string public_key {"public_key"};
577- auto adbd_server = std::make_shared<GAdbdServer>(*socket_path, std::vector<std::string>{"PK"+public_key});
578+ const std::vector<std::string> requests(N_TESTS, "PK"+public_key);
579+ const std::vector<std::string> expected_responses(N_TESTS, "NO");
580+ auto adbd_server = std::make_shared<GAdbdServer>(*socket_path, requests);
581
582 // set up a UsbManager to process the request
583 auto usb_manager = std::make_shared<UsbManager>(*socket_path, *public_keys_path, m_usb_monitor, m_greeter);
584
585- for (int i=0; i<3; i++)
586+ for (std::remove_const<decltype(N_TESTS)>::type i=0; i<N_TESTS; ++i)
587 {
588 // add a signal spy to listen to the notification daemon
589 QSignalSpy notificationsSpy(
590@@ -194,6 +197,9 @@
591 EXPECT_EQ("CloseNotification", notificationsSpy.at(0).at(0));
592 notificationsSpy.clear();
593 }
594+
595+ EXPECT_TRUE(wait_for([adbd_server, N_TESTS](){return adbd_server->m_responses.size() == N_TESTS;}, 5000));
596+ EXPECT_EQ(expected_responses, adbd_server->m_responses);
597 }
598
599 TEST_F(UsbManagerFixture, Greeter)
600@@ -206,7 +212,7 @@
601 auto adbd_server = std::make_shared<GAdbdServer>(*socket_path, std::vector<std::string>{"PK"+public_key});
602
603 // set up a UsbManager to process the request
604- m_greeter->m_is_active.set(true);
605+ m_greeter->m_state.set(Greeter::State::ACTIVE);
606 auto usb_manager = std::make_shared<UsbManager>(*socket_path, *public_keys_path, m_usb_monitor, m_greeter);
607
608 // add a signal spy to listen to the notification daemon
609@@ -219,7 +225,7 @@
610 EXPECT_FALSE(notificationsSpy.wait(2000));
611
612 // disable the greeter, the notification should appear
613- m_greeter->m_is_active.set(false);
614+ m_greeter->m_state.set(Greeter::State::INACTIVE);
615 wait_for_signals(notificationsSpy, 1);
616 EXPECT_EQ("Notify", notificationsSpy.at(0).at(0));
617 notificationsSpy.clear();
618
619=== modified file 'tests/unit/CMakeLists.txt'
620--- tests/unit/CMakeLists.txt 2016-03-16 00:25:33 +0000
621+++ tests/unit/CMakeLists.txt 2016-10-21 11:40:57 +0000
622@@ -14,6 +14,10 @@
623 ${GMOCK_LIBRARIES}
624 )
625
626+add_definitions(
627+ -DGREETER_TEMPLATE="${CMAKE_SOURCE_DIR}/tests/utils/mock-unity-greeter.py"
628+)
629+
630 function(add_test_by_name name)
631 set(TEST_NAME ${name})
632 add_executable (${TEST_NAME} ${TEST_NAME}.cpp)
633@@ -31,4 +35,5 @@
634 set_property(TEST ${TEST_NAME} APPEND PROPERTY ENVIRONMENT ${CTEST_ENVIRONMENT})
635 target_link_libraries(${TEST_NAME} ${SERVICE_LINK_LIBRARIES} ${QT_LINK_LIBRARIES} ${TEST_LINK_LIBRARIES} ${THREAD_LINK_LIBRARIES})
636 endfunction()
637+add_qt_test_by_name(greeter-test)
638 add_qt_test_by_name(usb-snap-test)
639
640=== modified file 'tests/unit/adbd-client-test.cpp'
641--- tests/unit/adbd-client-test.cpp 2016-03-17 15:24:41 +0000
642+++ tests/unit/adbd-client-test.cpp 2016-10-21 11:40:57 +0000
643@@ -73,7 +73,7 @@
644 // start an AdbdClient that listens for PKRequests
645 std::string pk;
646 auto adbd_client = std::make_shared<GAdbdClient>(socket_path);
647- adbd_client->on_pk_request().connect([&pk, main_thread, test](const AdbdClient::PKRequest& req){
648+ auto connection = adbd_client->on_pk_request().connect([&pk, main_thread, test](const AdbdClient::PKRequest& req){
649 EXPECT_EQ(main_thread, g_thread_self());
650 g_message("in on_pk_request with %s", req.public_key.c_str());
651 pk = req.public_key;
652@@ -82,12 +82,13 @@
653
654 // start a mock AdbdServer with to fire test key requests and wait for a response
655 auto adbd_server = std::make_shared<GAdbdServer>(socket_path, std::vector<std::string>{test.request});
656- wait_for([adbd_server](){return !adbd_server->m_responses.empty();}, 2000);
657+ wait_for([adbd_server](){return !adbd_server->m_responses.empty();}, 5000);
658 EXPECT_EQ(test.expected_pk, pk);
659 ASSERT_EQ(1, adbd_server->m_responses.size());
660 EXPECT_EQ(test.expected_response, adbd_server->m_responses.front());
661
662 // cleanup
663+ connection.disconnect();
664 adbd_client.reset();
665 adbd_server.reset();
666 g_unlink(socket_path.c_str());
667
668=== added file 'tests/unit/greeter-test.cpp'
669--- tests/unit/greeter-test.cpp 1970-01-01 00:00:00 +0000
670+++ tests/unit/greeter-test.cpp 2016-10-21 11:40:57 +0000
671@@ -0,0 +1,159 @@
672+/*
673+ * Copyright 2016 Canonical Ltd.
674+ *
675+ * This program is free software: you can redistribute it and/or modify it
676+ * under the terms of the GNU General Public License version 3, as published
677+ * by the Free Software Foundation.
678+ *
679+ * This program is distributed in the hope that it will be useful, but
680+ * WITHOUT ANY WARRANTY; without even the implied warranties of
681+ * MERCHANTABILITY, SATISFACTORY QUALITY, or FITNESS FOR A PARTICULAR
682+ * PURPOSE. See the GNU General Public License for more details.
683+ *
684+ * You should have received a copy of the GNU General Public License along
685+ * with this program. If not, see <http://www.gnu.org/licenses/>.
686+ *
687+ * Authors:
688+ * Charles Kerr <charles.kerr@canonical.com>
689+ */
690+
691+#include <tests/utils/qt-fixture.h>
692+#include <tests/utils/gtest-print-helpers.h>
693+
694+#include <src/dbus-names.h>
695+#include <src/greeter.h>
696+
697+#include <libqtdbustest/DBusTestRunner.h>
698+#include <libqtdbustest/QProcessDBusService.h>
699+#include <libqtdbusmock/DBusMock.h>
700+
701+class GreeterFixture: public QtFixture
702+{
703+private:
704+
705+ using super = QtFixture;
706+
707+public:
708+
709+ GreeterFixture() =default;
710+ ~GreeterFixture() =default;
711+
712+protected:
713+
714+ std::shared_ptr<QtDBusTest::DBusTestRunner> m_dbus_runner;
715+ std::shared_ptr<QtDBusMock::DBusMock> m_dbus_mock;
716+ GDBusConnection* m_bus {};
717+
718+ void SetUp() override
719+ {
720+ super::SetUp();
721+
722+ // use a fresh bus for each test run
723+ m_dbus_runner.reset(new QtDBusTest::DBusTestRunner());
724+ m_dbus_mock.reset(new QtDBusMock::DBusMock(*m_dbus_runner.get()));
725+
726+ GError* error {};
727+ m_bus = g_bus_get_sync (G_BUS_TYPE_SESSION, nullptr, &error);
728+ g_assert_no_error(error);
729+ g_dbus_connection_set_exit_on_close(m_bus, FALSE);
730+ }
731+
732+ void TearDown() override
733+ {
734+ g_clear_object(&m_bus);
735+
736+ super::TearDown();
737+ }
738+
739+ void start_greeter_service(bool is_active)
740+ {
741+ // set a watcher to look for our mock greeter to appear
742+ bool owned {};
743+ QDBusServiceWatcher watcher(
744+ DBusNames::UnityGreeter::NAME,
745+ m_dbus_runner->sessionConnection()
746+ );
747+ QObject::connect(
748+ &watcher,
749+ &QDBusServiceWatcher::serviceRegistered,
750+ [&owned](const QString&){owned = true;}
751+ );
752+
753+ // start the mock greeter
754+ QVariantMap parameters;
755+ parameters["IsActive"] = QVariant(is_active);
756+ m_dbus_mock->registerTemplate(
757+ DBusNames::UnityGreeter::NAME,
758+ GREETER_TEMPLATE,
759+ parameters,
760+ QDBusConnection::SessionBus
761+ );
762+ m_dbus_runner->startServices();
763+
764+ // wait for the watcher
765+ ASSERT_TRUE(wait_for([&owned]{return owned;}));
766+ }
767+};
768+
769+#define ASSERT_PROPERTY_EQ_EVENTUALLY(expected_in, property_in) \
770+ do { \
771+ const auto& e = expected_in; \
772+ const auto& p = property_in; \
773+ ASSERT_TRUE(wait_for([e, &p](){return e == p.get();})) \
774+ << "expected " << e << " but got " << p.get(); \
775+ } while(0)
776+
777+/**
778+ * Test startup timing by looking at four different cases:
779+ * [unity greeter shows up on bus (before, after) we start listening]
780+ * x [unity greeter is (active, inactive)]
781+ */
782+
783+TEST_F(GreeterFixture, ActiveServiceStartsBeforeWatcher)
784+{
785+ constexpr bool is_active {true};
786+ constexpr Greeter::State expected {Greeter::State::ACTIVE};
787+
788+ start_greeter_service(is_active);
789+
790+ UnityGreeter greeter;
791+
792+ ASSERT_PROPERTY_EQ_EVENTUALLY(expected, greeter.state());
793+}
794+
795+TEST_F(GreeterFixture, WatcherStartsBeforeActiveService)
796+{
797+ constexpr bool is_active {true};
798+ constexpr Greeter::State expected {Greeter::State::ACTIVE};
799+
800+ UnityGreeter greeter;
801+
802+ start_greeter_service(is_active);
803+
804+ ASSERT_PROPERTY_EQ_EVENTUALLY(expected, greeter.state());
805+}
806+
807+TEST_F(GreeterFixture, InactiveServiceStartsBeforeWatcher)
808+{
809+ constexpr bool is_active {false};
810+ constexpr Greeter::State expected {Greeter::State::INACTIVE};
811+
812+ start_greeter_service(is_active);
813+
814+ UnityGreeter greeter;
815+
816+ ASSERT_PROPERTY_EQ_EVENTUALLY(expected, greeter.state());
817+}
818+
819+TEST_F(GreeterFixture, WatcherStartsBeforeInactiveService)
820+{
821+ constexpr bool is_active {false};
822+ constexpr Greeter::State expected {Greeter::State::INACTIVE};
823+
824+ UnityGreeter greeter;
825+
826+ start_greeter_service(is_active);
827+
828+ ASSERT_PROPERTY_EQ_EVENTUALLY(expected, greeter.state());
829+}
830+
831
832=== modified file 'tests/unit/usb-snap-test.cpp'
833--- tests/unit/usb-snap-test.cpp 2016-03-23 17:16:06 +0000
834+++ tests/unit/usb-snap-test.cpp 2016-10-21 11:40:57 +0000
835@@ -88,7 +88,7 @@
836 auto snap = std::make_shared<UsbSnap>(test.fingerprint);
837 AdbdClient::PKResponse user_response {};
838 bool user_response_set = false;
839- snap->on_user_response().connect([&user_response,&user_response_set](AdbdClient::PKResponse response, bool /*remember*/){
840+ auto connection = snap->on_user_response().connect([&user_response,&user_response_set](AdbdClient::PKResponse response, bool /*remember*/){
841 user_response = response;
842 user_response_set = true;
843 });
844@@ -130,14 +130,9 @@
845 EXPECT_TRUE(user_response_set);
846 ASSERT_EQ(test.expected_response, user_response);
847
848- // confirm that the snap dtor cleans up the notification
849+ // confirm that the snap dtor doesn't try to close
850+ // the notification that's already been closed by user choice
851 snap.reset();
852- wait_for_signals(notificationsSpy, 1);
853- {
854- QVariantList const& call(notificationsSpy.at(0));
855- EXPECT_EQ("CloseNotification", call.at(0));
856- QVariantList const& args(call.at(1).toList());
857- EXPECT_EQ(id, args.at(0));
858- }
859+ EXPECT_FALSE(notificationsSpy.wait(1000));
860 }
861 }
862
863=== modified file 'tests/utils/adbd-server.h'
864--- tests/utils/adbd-server.h 2016-03-24 16:01:16 +0000
865+++ tests/utils/adbd-server.h 2016-10-21 11:40:57 +0000
866@@ -38,7 +38,7 @@
867 GAdbdServer(const std::string& socket_path,
868 const std::vector<std::string>& requests):
869 m_requests{requests},
870- m_socket_path{socket_path},
871+ m_server_socket{create_server_socket(socket_path)},
872 m_cancellable{g_cancellable_new()},
873 m_worker_thread{&GAdbdServer::worker_func, this}
874 {
875@@ -50,6 +50,7 @@
876 g_cancellable_cancel(m_cancellable);
877 m_worker_thread.join();
878 g_clear_object(&m_cancellable);
879+ g_clear_object(&m_server_socket);
880 }
881
882 const std::vector<std::string> m_requests;
883@@ -59,18 +60,14 @@
884
885 void worker_func() // runs in worker thread
886 {
887- auto server_socket = create_server_socket(m_socket_path);
888 auto requests = m_requests;
889
890- GError* error {};
891- g_socket_listen (server_socket, &error);
892- g_assert_no_error (error);
893-
894 while (!g_cancellable_is_cancelled(m_cancellable) && !requests.empty())
895 {
896 // wait for a client connection
897 g_message("GAdbdServer::Impl::worker_func() calling g_socket_accept()");
898- auto client_socket = g_socket_accept(server_socket, m_cancellable, &error);
899+ GError* error {};
900+ auto client_socket = g_socket_accept(m_server_socket, m_cancellable, &error);
901 if (error != nullptr) {
902 if (!g_error_matches(error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
903 g_message("GAdbdServer: Error accepting socket connection: %s", error->message);
904@@ -121,8 +118,6 @@
905 // cleanup
906 g_clear_object(&client_socket);
907 }
908-
909- g_clear_object(&server_socket);
910 }
911
912 // bind to a local domain socket
913@@ -139,11 +134,14 @@
914 g_assert_no_error (error);
915 g_clear_object (&address);
916
917+ g_socket_listen (socket, &error);
918+ g_assert_no_error (error);
919+
920 return socket;
921 }
922
923- const std::string m_socket_path;
924- GCancellable* m_cancellable = nullptr;
925+ GSocket* m_server_socket {};
926+ GCancellable* m_cancellable {};
927 std::thread m_worker_thread;
928 };
929
930
931=== added file 'tests/utils/gtest-print-helpers.h'
932--- tests/utils/gtest-print-helpers.h 1970-01-01 00:00:00 +0000
933+++ tests/utils/gtest-print-helpers.h 2016-10-21 11:40:57 +0000
934@@ -0,0 +1,18 @@
935+
936+#pragma once
937+
938+#include <src/greeter.h>
939+
940+inline void PrintTo(const Greeter::State& state, std::ostream* os) {
941+ switch(state) {
942+ case Greeter::State::ACTIVE: *os << "Active"; break;
943+ case Greeter::State::INACTIVE: *os << "Inactive"; break;
944+ case Greeter::State::UNAVAILABLE: *os << "Unavailable"; break;
945+ }
946+}
947+
948+inline std::ostream& operator<<(std::ostream& os, const Greeter::State& state) {
949+ PrintTo(state, &os);
950+ return os;
951+}
952+
953
954=== modified file 'tests/utils/mock-greeter.h'
955--- tests/utils/mock-greeter.h 2016-03-22 20:39:36 +0000
956+++ tests/utils/mock-greeter.h 2016-10-21 11:40:57 +0000
957@@ -26,7 +26,7 @@
958 public:
959 MockGreeter() =default;
960 virtual ~MockGreeter() =default;
961- core::Property<bool>& is_active() override {return m_is_active;}
962- core::Property<bool> m_is_active {false};
963+ core::Property<Greeter::State>& state() override {return m_state;}
964+ core::Property<Greeter::State> m_state {State::INACTIVE};
965 };
966
967
968=== added file 'tests/utils/mock-unity-greeter.py'
969--- tests/utils/mock-unity-greeter.py 1970-01-01 00:00:00 +0000
970+++ tests/utils/mock-unity-greeter.py 2016-10-21 11:40:57 +0000
971@@ -0,0 +1,41 @@
972+'''unity greeter mock template
973+
974+Very basic template that just mocks the greeter is-active flag
975+'''
976+
977+# This program is free software; you can redistribute it and/or modify it under
978+# the terms of the GNU Lesser General Public License as published by the Free
979+# Software Foundation; either version 3 of the License, or (at your option) any
980+# later version. See http://www.gnu.org/copyleft/lgpl.html for the full text
981+# of the license.
982+
983+__author__ = 'Charles Kerr'
984+__email__ = 'charles.kerr@canonical.com'
985+__copyright__ = '(c) 2016 Canonical Ltd.'
986+__license__ = 'LGPL 3+'
987+
988+import dbus
989+import os
990+
991+from dbusmock import MOCK_IFACE, mockobject
992+
993+BUS_NAME = 'com.canonical.UnityGreeter'
994+MAIN_OBJ = '/'
995+MAIN_IFACE = 'com.canonical.UnityGreeter'
996+SYSTEM_BUS = False
997+
998+
999+def load(mock, parameters):
1000+ mock.AddMethods(
1001+ MAIN_IFACE, [
1002+ ('HideGreeter', '', '', 'self.Set("com.canonical.UnityGreeter", "IsActive", False)'),
1003+ ('ShowGreeter', '', '', 'self.Set("com.canonical.UnityGreeter", "IsActive", True)')
1004+ ]
1005+ )
1006+ mock.AddProperties(
1007+ MAIN_IFACE,
1008+ dbus.Dictionary({
1009+ 'IsActive': parameters.get('IsActive', False),
1010+ }, signature='sv')
1011+ )
1012+

Subscribers

People subscribed via source and target branches