File: task.yaml

package info (click to toggle)
snapd 2.71-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 79,536 kB
  • sloc: ansic: 16,114; sh: 16,105; python: 9,941; makefile: 1,890; exp: 190; awk: 40; xml: 22
file content (107 lines) | stat: -rw-r--r-- 5,460 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
summary: Check that `snap connect` runs interface hooks

details: |
    Snapd hooks are programs that run in response to certain actions. The test
    exercises the full suite of hooks that correspond to interface connections.
    One important detail is that interface hooks can interact with plug and slot
    attributes, both static and dynamically created.

environment:
    CONSUMER_DATA: /var/snap/basic-iface-hooks-consumer/common
    PRODUCER_DATA: /var/snap/basic-iface-hooks-producer/common

prepare: |
    echo "Install test hooks snaps"
    "$TESTSTOOLS"/snaps-state install-local basic-iface-hooks-consumer
    "$TESTSTOOLS"/snaps-state install-local basic-iface-hooks-producer

restore: |
    rm -f "$CONSUMER_DATA/prepare-plug-consumer-done"
    rm -f "$PRODUCER_DATA/prepare-slot-producer-done"
    rm -f "$CONSUMER_DATA/connect-plug-consumer-done"
    rm -f "$PRODUCER_DATA/connect-slot-producer-done"
    rm -f "$CONSUMER_DATA/disconnect-plug-consumer-done"
    rm -f "$PRODUCER_DATA/disconnect-slot-producer-done"
    rm -f "$CONSUMER_DATA/unprepare-plug-consumer-done"
    rm -f "$PRODUCER_DATA/unprepare-slot-producer-done"
    snap remove --purge basic-iface-hooks-consumer
    snap remove --purge basic-iface-hooks-producer

execute: |
    remove_markers() {
        rm -f "$CONSUMER_DATA"/*-plug-*done
        rm -f "$PRODUCER_DATA"/*-slot-*done
    }
    check_attributes(){
        # static values should have the values defined in snap's yaml
        gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["plug-static"]["consumer-attr-1"]' \
            /var/lib/snapd/state.json | MATCH "consumer-value-1"
        gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["plug-static"]["consumer-attr-2"]' \
            /var/lib/snapd/state.json | MATCH "consumer-value-2"
        gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["slot-static"]["producer-attr-1"]' \
            /var/lib/snapd/state.json | MATCH "producer-value-1"
        gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["slot-static"]["producer-attr-2"]' \
            /var/lib/snapd/state.json | MATCH "producer-value-2"
        # dynamic attributes have values created by the hooks, the "-validated" suffix is added by our test interface
        gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["plug-dynamic"]["before-connect"]' \
            /var/lib/snapd/state.json | MATCH 'plug-changed\(consumer-value\)'
        gojq -r '.data["conns"]["basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer"]["slot-dynamic"]["before-connect"]' \
            /var/lib/snapd/state.json | MATCH 'slot-changed\(producer-value\)'
    }

    check_hooks_were_run(){
        # producer/consumer hooks dump marker files, check if they exist to verify hooks were run
        test -f "$CONSUMER_DATA/prepare-plug-consumer-done"
        test -f "$PRODUCER_DATA/prepare-slot-producer-done"
        test -f "$CONSUMER_DATA/connect-plug-consumer-done"
        test -f "$PRODUCER_DATA/connect-slot-producer-done"
    }

    echo "Test that snap connect with plug and slot hooks succeeds"
    snap connect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer

    echo "Ensure the hooks were actually executed"
    check_hooks_were_run
  
    # stop snapd before inspecting state.json
    systemctl stop snapd.service snapd.socket

    echo "Verify static and dynamic attributes have expected values"
    check_attributes
    systemctl start snapd.service snapd.socket

    remove_markers

    echo "Make sure that disconnect hooks are executed when disconnecting the interface"
    snap disconnect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer
    snap change --last=disconnect | MATCH "Run hook disconnect-slot-producer of snap \"basic-iface-hooks-producer"
    snap change --last=disconnect | MATCH "Run hook disconnect-plug-consumer of snap \"basic-iface-hooks-consumer"

    test -f "$CONSUMER_DATA/disconnect-plug-consumer-done"
    test -f "$PRODUCER_DATA/disconnect-slot-producer-done"

    remove_markers

    echo "Make connect hooks fail and check that undo hooks were executed"
    snap set basic-iface-hooks-consumer fail=connect
    if snap connect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer ; then
        echo "Expected snap connect to fail"
        exit 1
    fi

    test -f "$CONSUMER_DATA/unprepare-plug-consumer-done"
    test -f "$PRODUCER_DATA/unprepare-slot-producer-done"
    test -f "$PRODUCER_DATA/connect-slot-producer-done"
    test -f "$PRODUCER_DATA/disconnect-slot-producer-done"

    MATCH "plug-changed.consumer-value" < "$CONSUMER_DATA/unprepare-plug-consumer-done" 

    remove_markers

    echo "Check disconnect hooks are executed on snap removal"
    snap set basic-iface-hooks-consumer fail=none
    snap connect basic-iface-hooks-consumer:consumer basic-iface-hooks-producer:producer
    snap remove --purge basic-iface-hooks-consumer
    test -f "$PRODUCER_DATA/disconnect-slot-producer-done"
    snap change --last=remove | MATCH "Run hook disconnect-slot-producer of snap \"basic-iface-hooks-producer"
    snap change --last=remove | MATCH "Run hook disconnect-plug-consumer of snap \"basic-iface-hooks-consumer"