Path: blob/main/lib/libdevdctl/tests/libdevdctl_unittest.cc
39476 views
/*-1* Copyright (c) 2016 Spectra Logic Corporation2* All rights reserved.3*4* Redistribution and use in source and binary forms, with or without5* modification, are permitted provided that the following conditions6* are met:7* 1. Redistributions of source code must retain the above copyright8* notice, this list of conditions, and the following disclaimer,9* without modification.10* 2. Redistributions in binary form must reproduce at minimum a disclaimer11* substantially similar to the "NO WARRANTY" disclaimer below12* ("Disclaimer") and any redistribution must be conditioned upon13* including a substantially similar Disclaimer requirement for further14* binary redistribution.15*16* NO WARRANTY17* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS18* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT19* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR20* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT21* HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL22* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS23* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)24* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,25* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING26* IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE27* POSSIBILITY OF SUCH DAMAGES.28*29* Authors: Alan Somers (Spectra Logic Corporation)30*/3132#include <gtest/gtest.h>3334#include <list>35#include <map>36#include <string>3738#include <devdctl/guid.h>39#include <devdctl/event.h>40#include <devdctl/event_factory.h>4142using namespace DevdCtl;43using namespace std;44using namespace testing;4546#define REGISTRY_SIZE 24748struct DevNameTestParams49{50const char* evs;51bool is_disk;52const char* devname;53};5455class DevNameTest : public TestWithParam<DevNameTestParams>{56protected:57virtual void SetUp()58{59m_factory = new EventFactory();60m_factory->UpdateRegistry(s_registry, REGISTRY_SIZE);61}6263virtual void TearDown()64{65if (m_ev) delete m_ev;66if (m_factory) delete m_factory;67}6869EventFactory *m_factory;70Event *m_ev;71static EventFactory::Record s_registry[REGISTRY_SIZE];72};7374DevdCtl::EventFactory::Record DevNameTest::s_registry[REGISTRY_SIZE] = {75{ Event::NOTIFY, "DEVFS", &DevfsEvent::Builder },76{ Event::NOTIFY, "GEOM", &GeomEvent::Builder }77};7879TEST_P(DevNameTest, TestDevname) {80std::string devname;81DevNameTestParams param = GetParam();8283string evString(param.evs);84m_ev = Event::CreateEvent(*m_factory, evString);85m_ev->DevName(devname);86EXPECT_STREQ(param.devname, devname.c_str());87}8889TEST_P(DevNameTest, TestIsDiskDev) {90DevNameTestParams param = GetParam();9192string evString(param.evs);93m_ev = Event::CreateEvent(*m_factory, evString);94EXPECT_EQ(param.is_disk, m_ev->IsDiskDev());95}9697/* TODO: clean this up using C++-11 uniform initializers */98INSTANTIATE_TEST_CASE_P(IsDiskDevTestInstantiation, DevNameTest, Values(99(DevNameTestParams){100.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=da6\n",101.is_disk = true, .devname = "da6"},102(DevNameTestParams){.is_disk = false, .devname = "cuau0",103.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=cuau0\n"},104(DevNameTestParams){.is_disk = true, .devname = "ada6",105.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=ada6\n"},106(DevNameTestParams){.is_disk = true, .devname = "da6p1",107.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=da6p1\n"},108(DevNameTestParams){.is_disk = true, .devname = "ada6p1",109.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=ada6p1\n"},110(DevNameTestParams){.is_disk = true, .devname = "da6s0p1",111.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=da6s0p1\n"},112(DevNameTestParams){.is_disk = true, .devname = "ada6s0p1",113.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=ada6s0p1\n"},114/*115* Test physical path nodes. These are currently all set to false since116* physical path nodes are implemented with symlinks, and most CAM and117* ZFS operations can't use symlinked device nodes118*/119/* A SpectraBSD-style physical path node*/120(DevNameTestParams){.is_disk = false, .devname = "enc@50030480019f53fd/elmtype@array_device/slot@18/da",121.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=enc@50030480019f53fd/elmtype@array_device/slot@18/da\n"},122(DevNameTestParams){.is_disk = false, .devname = "enc@50030480019f53fd/elmtype@array_device/slot@18/pass",123.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=enc@50030480019f53fd/elmtype@array_device/slot@18/pass\n"},124/* A FreeBSD-style physical path node */125(DevNameTestParams){.is_disk = true, .devname = "enc@n50030480019f53fd/type@0/slot@18/elmdesc@ArrayDevice18/da6",126.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=enc@n50030480019f53fd/type@0/slot@18/elmdesc@ArrayDevice18/da6\n"},127(DevNameTestParams){.is_disk = false, .devname = "enc@n50030480019f53fd/type@0/slot@18/elmdesc@ArrayDevice18/pass6",128.evs = "!system=DEVFS subsystem=CDEV type=CREATE cdev=enc@n50030480019f53fd/type@0/slot@18/elmdesc@ArrayDevice18/pass6\n"},129130/*131* Test some GEOM events132*/133(DevNameTestParams){.is_disk = true, .devname = "da5",134.evs = "!system=GEOM subsystem=disk type=GEOM::physpath devname=da5\n"})135);136137138