173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*
273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Copyright (C) 2011 The Android Open Source Project
373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Licensed under the Apache License, Version 2.0 (the "License");
573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * you may not use this file except in compliance with the License.
673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * You may obtain a copy of the License at
773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *      http://www.apache.org/licenses/LICENSE-2.0
973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
1073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Unless requied by applicable law or agreed to in writing, software
1173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * distributed under the License is distributed on an "AS IS" BASIS,
1273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * See the License for the specific language governing permissions and
1473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * limitations under the License.
1573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall *
1673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */
17fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
1873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*
1973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This socket tagging test is to ensure that the
2073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * netfilter/xt_qtaguid kernel module somewhat behaves as expected
2173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * with respect to tagging sockets.
2273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */
2373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <assert.h>
2473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <errno.h>
2573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <fcntl.h>
2673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdio.h>
2773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <stdlib.h>
28fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang#include <gtest/gtest.h>
2973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/socket.h>
3073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <sys/types.h>
3173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <string>
3273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
3373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#define LOG_TAG "socketTagTest"
3473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <utils/Log.h>
3573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall#include <testUtil.h>
3673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
37fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuangnamespace android {
3873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
3973b89ae952174d04c34623ec40267829236dbcf9JP Abgrallclass SockInfo {
4073b89ae952174d04c34623ec40267829236dbcf9JP Abgrallpublic:
41fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    SockInfo() : fd(-1), addr(NULL) {};
42fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    int setup(uint64_t tag);
43fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    bool checkTag(uint64_t tag, uid_t uid);
44fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    int fd;
45fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    void *addr;
4673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall};
4773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
4873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
4973b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint openCtrl() {
5073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl;
5173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl = open("/proc/net/xt_qtaguid/ctrl", O_RDWR);
5273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!ctrl) {
5373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall       testPrintE("qtaguid ctrl open failed: %s", strerror(errno));
5473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
5573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return ctrl;
5673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
5773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
5873b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint doCtrlCommand(const char *fmt, ...) {
5973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *buff;
6073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl;
6173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
6273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    va_list argp;
6373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
6473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    va_start(argp, fmt);
6573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl = openCtrl();
6673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    vasprintf(&buff, fmt, argp);
6773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    errno = 0;
6873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = write(ctrl, buff, strlen(buff));
6973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("cmd: '%s' res=%d %d/%s", buff, res, errno, strerror(errno));
7073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(ctrl);
7173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    free(buff);
7273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    va_end(argp);
7373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return res;
7473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
7573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
7673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
7773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint writeModuleParam(const char *param, const char *data) {
7873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int param_fd;
7973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
8073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    std::string filename("/sys/module/xt_qtaguid/parameters/");
8173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
8273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    filename += param;
8373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    param_fd = open(filename.c_str(), O_WRONLY);
8473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (param_fd < 0) {
8573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("qtaguid param open failed: %s", strerror(errno));
8673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
8773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
8873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    res = write(param_fd, data, strlen(data));
8973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (res < 0) {
9073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("qtaguid param write failed: %s", strerror(errno));
9173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
9273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(param_fd);
9373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return res;
9473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
95fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
9673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/*----------------------------------------------------------------*/
9773b89ae952174d04c34623ec40267829236dbcf9JP Abgrallint SockInfo::setup(uint64_t tag) {
9873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    fd = socket(AF_INET, SOCK_STREAM, 0);
9973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (fd < 0) {
10073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket creation failed: %s", strerror(errno));
10173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
10273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
10373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (doCtrlCommand("t %d %llu", fd, tag) < 0) {
10473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup: failed to tag");
10573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(fd);
10673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
10773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
10873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (!checkTag(tag, getuid())) {
10973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup: Unexpected results: tag not found");
11073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(fd);
11173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
11273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
11373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (doCtrlCommand("u %d", fd) < 0) {
11473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        testPrintE("socket setup: Unexpected results");
11573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        close(fd);
11673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        return -1;
11773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
11873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return 0;
11973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
12073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
12173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall/* checkTag() also tries to lookup the socket address in the kernel and
12273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * return it when *addr  == NULL.
12373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * This allows for better look ups when another process is also setting the same
12473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * tag + uid. But it is not fool proof.
12573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Without the kernel reporting more info on who setup the socket tag, it is
12673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * not easily verifiable from user-space.
12773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall * Returns: true if tag found.
12873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall */
12973b89ae952174d04c34623ec40267829236dbcf9JP Abgrallbool SockInfo::checkTag(uint64_t acct_tag, uid_t uid) {
13073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int ctrl_fd;
13173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl_fd = openCtrl();
13273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char ctrl_data[1024];
13373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ssize_t read_size;
13473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *buff;
13573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *pos;
13673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    int res;
13773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    char *match_template;
13873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t k_tag;
13973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint32_t k_uid;
14073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    uint64_t full_tag;
14173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    long dummy_count;
14273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    pid_t dummy_pid;
14373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
14473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    read_size = read(ctrl_fd, ctrl_data, sizeof(ctrl_data));
14573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (read_size < 0) {
14673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall       testPrintE("Unable to read active tags from ctrl %d/%s",
14773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                  errno, strerror(errno));
14873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
14973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    ctrl_data[read_size] = '\0';
15073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("<ctrl_raw_data>\n%s</ctrl_raw_data>", ctrl_data);
15173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
15273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (addr) {
15373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        assert(sizeof(void*) == sizeof(long int));  // Why does %p use 0x? grrr. %lx.
15473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        asprintf(&match_template, "sock=%lx %s", addr, "tag=0x%llx (uid=%u)");
15573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
15673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    else {
15773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        /* Allocate for symmetry */
15873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        asprintf(&match_template, "%s", " tag=0x%llx (uid=%u)");
15973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
16073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
16173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    full_tag = acct_tag | uid;
16273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
16373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    asprintf(&buff, match_template, full_tag | uid, uid);
16473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    testPrintI("looking for '%s'", buff);
16573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    pos = strstr(ctrl_data, buff);
16673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
16773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    if (pos && !addr) {
16873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        assert(sizeof(void*) == sizeof(long int));  // Why does %p use 0x? grrr. %lx.
16973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        res = sscanf(pos - strlen("sock=1234abcd"),
17073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                     "sock=%lx tag=0x%llx (uid=%lu) pid=%u f_count=%lu",
17173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall                     &addr, &k_tag, &k_uid, &dummy_pid, &dummy_count );
17273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        if (!(res == 5 && k_tag == full_tag && k_uid == uid)) {
17373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintE("Unable to read sock addr res=%d", res);
17473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall           addr = 0;
17573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
17673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        else {
17773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall            testPrintI("Got sock_addr %lx", addr);
17873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall        }
17973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    }
18073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    free(buff);
18173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    free(match_template);
18273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    close(ctrl_fd);
18373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall    return pos != NULL;
18473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
18573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
18673b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
187fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuangclass SocketTaggingTest : public ::testing::Test {
188fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuangprotected:
189fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    virtual void SetUp() {
190fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        ctrl_fd = -1;
191fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        dev_fd = -1;
192fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        my_uid = getuid();
193fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        my_pid = getpid();
194fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        srand48(my_pid * my_uid);
195fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        // Adjust fake UIDs and tags so that multiple instances can run in parallel.
196fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        fake_uid = testRand();
197fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        fake_uid2 = testRand();
198fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        valid_tag1 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32);
199fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        valid_tag2 = ((uint64_t)my_pid << 48) | ((uint64_t)testRand() << 32);
200fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        valid_tag2 &= 0xffffff00ffffffffllu;  // Leave some room to make counts visible.
201fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        testPrintI("* start: pid=%lu uid=%lu uid1=0x%lx/%lu uid2=0x%lx/%lu"
202fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang                   " tag1=0x%llx/%llu tag2=0x%llx/%llu",
203fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang                   my_pid, my_uid, fake_uid, fake_uid, fake_uid2, fake_uid2,
204fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang                   valid_tag1, valid_tag1, valid_tag2, valid_tag2);
205fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        max_uint_tag = 0xffffffff00000000llu;
206fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        max_uint_tag = 1llu << 63 | (((uint64_t)my_pid << 48) ^ max_uint_tag);
207fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
208fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        testPrintI("kernel has qtaguid");
209fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        ctrl_fd = openCtrl();
210fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        ASSERT_GE(ctrl_fd, 0) << "qtaguid ctrl open failed";
211fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        close(ctrl_fd);
212fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        dev_fd = open("/dev/xt_qtaguid", O_RDONLY);
213fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        EXPECT_GE(dev_fd, 0) << "qtaguid dev open failed";
214fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
215fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        // We want to clean up any previous faulty test runs.
216fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        testPrintI("delete command does not fail");
217fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        EXPECT_GE(doCtrlCommand("d 0 %u", fake_uid), 0) << "Failed to delete fake_uid";
218fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        EXPECT_GE(doCtrlCommand("d 0 %u", fake_uid2), 0) << "Failed to delete fake_uid2";
219fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        EXPECT_GE(doCtrlCommand("d 0 %u", my_uid), 0) << "Failed to delete my_uid";
220fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
221fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        testPrintI("setup sock0 and addr via tag");
222fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        ASSERT_FALSE(sock0.setup(valid_tag1))  << "socket0 setup failed";
223fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        testPrintI("setup sock1 and addr via tag");
224fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        ASSERT_FALSE(sock1.setup(valid_tag1))  << "socket1 setup failed";
225fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    }
226fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
227fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   virtual void TearDown() {
228fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang       if (dev_fd >= 0) {
229fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang           close(dev_fd);
230fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang       }
231fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang       if (ctrl_fd >= 0) {
232fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang           close(ctrl_fd);
233fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang       }
234fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   }
235fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
236fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   SockInfo sock0;
237fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   SockInfo sock1;
238fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   int ctrl_fd;
239fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   int dev_fd;
240fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   uid_t fake_uid;
241fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   uid_t fake_uid2;
242fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   uid_t my_uid;
243fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   pid_t my_pid;
244fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   uint64_t valid_tag1;
245fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   uint64_t valid_tag2;
246fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   uint64_t max_uint_tag;
247fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   static const uint64_t invalid_tag1 = 0x0000000100000001llu;
248fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang   static const int max_tags = 5;
249fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang};
25073b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
251fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, TagData) {
252fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    max_uint_tag = 0xffffffff00000000llu;
253fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    char *max_tags_str;
25473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
255fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("setup tag limit");
256fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    asprintf(&max_tags_str, "%d", max_tags);
257fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    ASSERT_GE(writeModuleParam("max_sock_tags", max_tags_str), 0) << "Failed to setup tag limit";
25873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
259fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("tag quota reach limit");
260fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    for (int cnt = 0; cnt < max_tags; cnt++ ) {
261fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        uint64_t tag = valid_tag2 + ((uint64_t)cnt << 32);
262fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, tag , fake_uid2), 0)
263fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang            << "Tagging within limit failed";
264fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        EXPECT_TRUE(sock0.checkTag(tag, fake_uid2))<<  "Unexpected results: tag not found";
265fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    }
266fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
267fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("tag quota go over limit");
268fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    uint64_t new_tag = valid_tag2 + ((uint64_t)max_tags << 32);
269fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LT(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag , fake_uid2), 0);
270fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32),
271fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang                               fake_uid2)) << "Unexpected results: tag not found";
272fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
273fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("valid untag");
274fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("u %d", sock0.fd), 0);
275fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_FALSE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags - 1) << 32), fake_uid2))
276fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        << "Untagged tag should not be there";
277fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
278fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("tag after untag should not free up max tags");
279fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    uint64_t new_tag2 = valid_tag2 + ((uint64_t)max_tags << 32);
280fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LT(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag2 , fake_uid2), 0);
281fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_FALSE(sock0.checkTag(valid_tag2 + ((uint64_t)max_tags << 32), fake_uid2))
282fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        << "Tag should not be there";
283fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
284fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("delete one tag");
285fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    uint64_t new_tag3 = valid_tag2 + (((uint64_t)max_tags / 2) << 32);
286fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("d %llu %u", new_tag3, fake_uid2), 0);
287fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
288fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("2 tags after 1 delete pass/fail");
289fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    uint64_t new_tag4;
290fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    new_tag4 = valid_tag2 + (((uint64_t)max_tags + 1 ) << 32);
291fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag4 , fake_uid2), 0);
292fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 1) << 32), fake_uid2))
293fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        << "Tag not found";
294fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    new_tag4 = valid_tag2 + (((uint64_t)max_tags + 2 ) << 32);
295fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LT(doCtrlCommand("t %d %llu %u", sock0.fd, new_tag4 , fake_uid2), 0);
296fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_FALSE(sock0.checkTag(valid_tag2 + (((uint64_t)max_tags + 2) << 32), fake_uid2))
297fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang        << "Tag should not be there";
29873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
299fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    /* TODO(jpa): test tagging two different sockets with same tags and
300fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang     * check refcounts  the tag_node should be +2
301fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang     */
30273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
30373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
304fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, InsufficientArgsFails) {
305fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Insufficient args. Expected failure
306fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LE(doCtrlCommand("t"), 0) << "Insufficient args, should fail.";
307fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
30873b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
309fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, BadCommandFails) {
310fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Bad command. Expected failure";
311fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LE(doCtrlCommand("?"), 0) << "Bad command, should fail";
312fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
31373b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
314fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, NoTagNoUid) {
315fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // no tag, no uid
316fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d", sock0.fd), 0);
317fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    ASSERT_TRUE(sock0.checkTag(0, my_uid))  << "Tag not found";
318fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
31973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
320fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, InvalidTagFail) {
321fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Invalid tag. Expected failure
322fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LE(doCtrlCommand("t %d %llu", sock0.fd, invalid_tag1), 0);
323fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    ASSERT_FALSE(sock0.checkTag(invalid_tag1, my_uid)) << "Tag should not be there";
324fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
32573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
326fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidTagWithNoUid) {
327fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Valid tag with no uid
328fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, valid_tag1), 0);
329fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(valid_tag1, my_uid)) << "Tag not found";
330fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
33173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
332fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidUntag) {
333fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Valid untag
334fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, valid_tag1), 0);
335fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(valid_tag1, my_uid)) << "Tag not found";
336fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("u %d", sock0.fd), 0);
337fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_FALSE(sock0.checkTag(valid_tag1, my_uid)) << "Tag should be removed";
338fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
33973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
340fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidFirsttag) {
341fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Valid 1st tag
342fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0);
343fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(valid_tag2, fake_uid)) << "Tag not found.";
344fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
34573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
346fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidReTag) {
347fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Valid re-tag
348fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0);
349fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0);
350fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(valid_tag2, fake_uid)) << "Tag not found.";
351fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
35273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
353fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ValidReTagWithAcctTagChange) {
354fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Valid re-tag with acct_tag change
355fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid), 0);
356fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, fake_uid), 0);
357fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(valid_tag1, fake_uid)) << "Tag not found.";
358fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
35973b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
360fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, ReTagWithUidChange) {
361fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Re-tag with uid change
362fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, fake_uid), 0);
363fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag2, fake_uid2), 0);
364fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
36573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
366fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, Valid64BitAcctTag) {
367fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Valid 64bit acct tag
368fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, max_uint_tag), 0);
369fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock0.checkTag(max_uint_tag, my_uid)) << "Tag not found.";
370fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
37173b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
372fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, TagAnotherSocket) {
373fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("Tag two sockets");
374fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu", sock0.fd, max_uint_tag), 0);
375fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("t %d %llu %u", sock1.fd, valid_tag1, fake_uid2), 0);
376fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock1.checkTag(valid_tag1, fake_uid2)) << "Tag not found.";
377fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("Untag socket0 of them only.");
378fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("u %d", sock0.fd), 0);
379fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_FALSE(sock0.checkTag(max_uint_tag, fake_uid)) << "Tag should not be there";
380fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_TRUE(sock1.checkTag(valid_tag1, fake_uid2)) << "Tag not found";
381fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    testPrintI("Now untag socket1 as well.");
382fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_GE(doCtrlCommand("u %d", sock1.fd), 0);
383fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_FALSE(sock1.checkTag(valid_tag1, fake_uid2)) << "Tag should not be there";
38473b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
38573b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
386fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, TagInvalidSocketFail) {
387fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Invalid tag. Expected failure
388fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    close(sock0.fd);
389fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LE(doCtrlCommand("t %d %llu %u", sock0.fd, valid_tag1, my_uid), 0);
390fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_FALSE(sock0.checkTag(valid_tag1, my_uid)) << "Tag should not be there";
391fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}
39273b89ae952174d04c34623ec40267829236dbcf9JP Abgrall
393fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang ChuangTEST_F(SocketTaggingTest, UntagInvalidSocketFail) {
394fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    // Invalid untag. Expected failure";
395fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    close(sock1.fd);
396fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang    EXPECT_LE(doCtrlCommand("u %d", sock1.fd), 0);
39773b89ae952174d04c34623ec40267829236dbcf9JP Abgrall}
398fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang
399fa8469945ddaea6c5155d578aaeafb3b586c8084Tsu Chiang Chuang}  // namespace android
400